Parse Logbook Entries in the OrgNode parser for Org-Mode. Update tests

This commit is contained in:
Debanjum Singh Solanky 2022-07-21 00:15:30 +04:00
parent 70e70d4b15
commit d50bfb5188
2 changed files with 32 additions and 5 deletions

View file

@ -66,6 +66,7 @@ def makelist(filename):
closed_date = '' closed_date = ''
sched_date = '' sched_date = ''
deadline_date = '' deadline_date = ''
logbook = list()
nodelist = [] nodelist = []
propdict = dict() propdict = dict()
in_properties_drawer = False in_properties_drawer = False
@ -86,6 +87,9 @@ def makelist(filename):
if deadline_date: if deadline_date:
thisNode.setDeadline(deadline_date) thisNode.setDeadline(deadline_date)
deadline_date = '' deadline_date = ''
if logbook:
thisNode.setLogbook(logbook)
logbook = list()
thisNode.setProperties(propdict) thisNode.setProperties(propdict)
nodelist.append( thisNode ) nodelist.append( thisNode )
propdict = {'LINE': f'file:{normalize_filename(filename)}::{ctr}'} propdict = {'LINE': f'file:{normalize_filename(filename)}::{ctr}'}
@ -121,8 +125,14 @@ def makelist(filename):
in_logbook_drawer=False in_logbook_drawer=False
continue continue
# Ignore Clocking Lines # Extract Clocking Lines
if re.search(r'CLOCK: \[[0-9]{4}-[0-9]{2}-[0-9]{2}', line): clocked_re = re.search(r'CLOCK:\s*\[([0-9]{4}-[0-9]{2}-[0-9]{2} [a-zA-Z]{3} [0-9]{2}:[0-9]{2})\]--\[([0-9]{4}-[0-9]{2}-[0-9]{2} [a-zA-Z]{3} [0-9]{2}:[0-9]{2})\]', line)
if clocked_re:
# convert clock in, clock out strings to datetime objects
clocked_in = datetime.datetime.strptime(clocked_re.group(1), '%Y-%m-%d %a %H:%M')
clocked_out = datetime.datetime.strptime(clocked_re.group(2), '%Y-%m-%d %a %H:%M')
# add clocked time to the entries logbook list
logbook += [(clocked_in, clocked_out)]
line = "" line = ""
prop_srch = re.search(r'^\s*:([a-zA-Z0-9]+):\s*(.*?)\s*$', line) prop_srch = re.search(r'^\s*:([a-zA-Z0-9]+):\s*(.*?)\s*$', line)
@ -150,8 +160,8 @@ def makelist(filename):
int(dd_re.group(2)), int(dd_re.group(2)),
int(dd_re.group(3)) ) int(dd_re.group(3)) )
# Ignore property drawer, scheduled, closed, deadline and # lines from body # Ignore property drawer, scheduled, closed, deadline, logbook entries and # lines from body
if not in_properties_drawer and not cd_re and not sd_re and not dd_re and line[:1] != '#': if not in_properties_drawer and not cd_re and not sd_re and not dd_re and not clocked_re and line[:1] != '#':
bodytext = bodytext + line bodytext = bodytext + line
# write out last node # write out last node
@ -163,6 +173,8 @@ def makelist(filename):
thisNode.setDeadline(deadline_date) thisNode.setDeadline(deadline_date)
if closed_date: if closed_date:
thisNode.setClosed(closed_date) thisNode.setClosed(closed_date)
if logbook:
thisNode.setLogbook(logbook)
nodelist.append( thisNode ) nodelist.append( thisNode )
# using the list of TODO keywords found in the file # using the list of TODO keywords found in the file
@ -210,6 +222,7 @@ class Orgnode(object):
self.deadline = "" # Deadline date self.deadline = "" # Deadline date
self.closed = "" # Closed date self.closed = "" # Closed date
self.properties = dict() self.properties = dict()
self.logbook = list() # List of clock-in, clock-out tuples representing logbook entries
# Look for priority in headline and transfer to prty field # Look for priority in headline and transfer to prty field
@ -336,6 +349,18 @@ class Orgnode(object):
""" """
return self.closed return self.closed
def setLogbook(self, logbook):
"""
Set the logbook with list of clocked-in, clocked-out tuples for the entry
"""
self.logbook = logbook
def Logbook(self):
"""
Return the logbook with all clocked-in, clocked-out date object pairs or empty list if nonexistent
"""
return self.logbook
def __repr__(self): def __repr__(self):
""" """
Print the level, heading text and tag of a node and the body Print the level, heading text and tag of a node and the body

View file

@ -63,6 +63,7 @@ Body Line 2'''
assert entries[0].Closed() == datetime.date(1984,4,1) assert entries[0].Closed() == datetime.date(1984,4,1)
assert entries[0].Scheduled() == datetime.date(1984,4,1) assert entries[0].Scheduled() == datetime.date(1984,4,1)
assert entries[0].Deadline() == datetime.date(1984,4,1) assert entries[0].Deadline() == datetime.date(1984,4,1)
assert entries[0].Logbook() == [(datetime.datetime(1984,4,1,9,0,0), datetime.datetime(1984,4,1,12,0,0))]
# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
@ -140,7 +141,7 @@ CLOSED: [1984-04-02 Sun 12:00] SCHEDULED: <1984-04-02 Sun 09:00> DEADLINE: <1984
:ID: 123-456-789-4234-0002 :ID: 123-456-789-4234-0002
:END: :END:
:LOGBOOK: :LOGBOOK:
CLOCK: [1984-04-01 Sun 09:00]--[1984-04-01 Sun 12:00] => 3:00 CLOCK: [1984-04-02 Mon 09:00]--[1984-04-02 Mon 12:00] => 3:00
- Clocked Log 2 - Clocked Log 2
:END: :END:
Body 2 Body 2
@ -162,6 +163,7 @@ Body 2
assert entry.Closed() == datetime.date(1984,4,index+1) assert entry.Closed() == datetime.date(1984,4,index+1)
assert entry.Scheduled() == datetime.date(1984,4,index+1) assert entry.Scheduled() == datetime.date(1984,4,index+1)
assert entry.Deadline() == datetime.date(1984,4,index+1) assert entry.Deadline() == datetime.date(1984,4,index+1)
assert entry.Logbook() == [(datetime.datetime(1984,4,index+1,9,0,0), datetime.datetime(1984,4,index+1,12,0,0))]
# Helper Functions # Helper Functions