feat: Simplify headline state setting. #12
@ -337,7 +337,7 @@ class Headline:
|
|||||||
self.priority = priority
|
self.priority = priority
|
||||||
self.title_start = title_start
|
self.title_start = title_start
|
||||||
self.title = parse_content_block([RawLine(linenum=start_line, line=title)])
|
self.title = parse_content_block([RawLine(linenum=start_line, line=title)])
|
||||||
self.state = state
|
self._state = state
|
||||||
self.tags_start = tags_start
|
self.tags_start = tags_start
|
||||||
self.shallow_tags = tags
|
self.shallow_tags = tags
|
||||||
self.contents = contents
|
self.contents = contents
|
||||||
@ -726,6 +726,42 @@ class Headline:
|
|||||||
def id(self, value):
|
def id(self, value):
|
||||||
self.set_property("ID", value)
|
self.set_property("ID", value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self) -> HeadlineState:
|
||||||
|
return self._state
|
||||||
|
|
||||||
|
@state.setter
|
||||||
|
def state(self, new_state: Union[None, str, HeadlineState]) -> None:
|
||||||
|
"""
|
||||||
|
Update the state of a Headline. If the state is a known one it will update it's TODO/DONE properties.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
new_state (str|HeadlineState): New state, either it's literal value or it's structure.
|
||||||
|
"""
|
||||||
|
if new_state is None:
|
||||||
|
self.is_todo = False
|
||||||
|
self.is_done = False
|
||||||
|
# TODO: Check & log if appropriate?
|
||||||
|
self._state = None
|
||||||
|
return
|
||||||
|
|
||||||
|
if isinstance(new_state, str):
|
||||||
|
new_state = HeadlineState(name=new_state)
|
||||||
|
|
||||||
|
state_name = new_state["name"]
|
||||||
|
if state_name in [kw["name"] for kw in self.doc.todo_keywords]:
|
||||||
|
self.is_todo = True
|
||||||
|
self.is_done = False
|
||||||
|
# TODO: Check & log if appropriate?
|
||||||
|
elif state_name in [kw["name"] for kw in self.doc.done_keywords]:
|
||||||
|
self.is_todo = False
|
||||||
|
self.is_done = True
|
||||||
|
# TODO: Check, log & if appropriate?
|
||||||
|
else:
|
||||||
|
# TODO: Should we raise a warning, raise an exception, update the is_todo/is_done?
|
||||||
|
pass
|
||||||
|
self._state = new_state
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def clock(self):
|
def clock(self):
|
||||||
times = []
|
times = []
|
||||||
@ -2378,8 +2414,8 @@ class OrgDoc:
|
|||||||
tags = ":" + ":".join(headline.shallow_tags) + ":"
|
tags = ":" + ":".join(headline.shallow_tags) + ":"
|
||||||
|
|
||||||
state = ""
|
state = ""
|
||||||
if headline.state:
|
if headline._state:
|
||||||
state = headline.state["name"] + " "
|
state = headline._state["name"] + " "
|
||||||
|
|
||||||
raw_title = token_list_to_raw(headline.title.contents)
|
raw_title = token_list_to_raw(headline.title.contents)
|
||||||
tags_padding = ""
|
tags_padding = ""
|
||||||
|
@ -955,6 +955,75 @@ class TestSerde(unittest.TestCase):
|
|||||||
h1_2_h2 = h1_2.children[0]
|
h1_2_h2 = h1_2.children[0]
|
||||||
self.assertEqual(sorted(h1_2_h2.tags), ["otherh2tag"])
|
self.assertEqual(sorted(h1_2_h2.tags), ["otherh2tag"])
|
||||||
|
|
||||||
|
def test_update_headline_from_none_to_todo(self):
|
||||||
|
orig = "* First entry"
|
||||||
|
doc = loads(orig)
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state, None)
|
||||||
|
|
||||||
|
doc.headlines[0].state = "TODO"
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, True)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "TODO")
|
||||||
|
|
||||||
|
self.assertEqual(dumps(doc), "* TODO First entry")
|
||||||
|
|
||||||
|
def test_update_headline_from_none_to_done(self):
|
||||||
|
orig = "* First entry"
|
||||||
|
doc = loads(orig)
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state, None)
|
||||||
|
|
||||||
|
doc.headlines[0].state = org_rw.HeadlineState(name="DONE")
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, True)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "DONE")
|
||||||
|
|
||||||
|
self.assertEqual(dumps(doc), "* DONE First entry")
|
||||||
|
|
||||||
|
def test_update_headline_from_todo_to_none(self):
|
||||||
|
orig = "* TODO First entry"
|
||||||
|
doc = loads(orig)
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, True)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "TODO")
|
||||||
|
|
||||||
|
doc.headlines[0].state = None
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state, None)
|
||||||
|
|
||||||
|
self.assertEqual(dumps(doc), "* First entry")
|
||||||
|
|
||||||
|
def test_update_headline_from_todo_to_done(self):
|
||||||
|
orig = "* TODO First entry"
|
||||||
|
doc = loads(orig)
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, True)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "TODO")
|
||||||
|
|
||||||
|
doc.headlines[0].state = "DONE"
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, True)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "DONE")
|
||||||
|
self.assertEqual(dumps(doc), "* DONE First entry")
|
||||||
|
|
||||||
|
def test_update_headline_from_done_to_todo(self):
|
||||||
|
orig = "* DONE First entry"
|
||||||
|
doc = loads(orig)
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, False)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, True)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "DONE")
|
||||||
|
|
||||||
|
doc.headlines[0].state = org_rw.HeadlineState(name="TODO")
|
||||||
|
self.assertEqual(doc.headlines[0].is_todo, True)
|
||||||
|
self.assertEqual(doc.headlines[0].is_done, False)
|
||||||
|
self.assertEqual(doc.headlines[0].state["name"], "TODO")
|
||||||
|
|
||||||
|
self.assertEqual(dumps(doc), "* TODO First entry")
|
||||||
|
|
||||||
|
|
||||||
def print_tree(tree, indentation=0, headline=None):
|
def print_tree(tree, indentation=0, headline=None):
|
||||||
for element in tree:
|
for element in tree:
|
||||||
|
Loading…
Reference in New Issue
Block a user