Example #1
0
def _advance_recurring_todo_helper(p_todo, p_offset):
    """
    Given a Todo item, return a new instance of a Todo item with the dates
    shifted according to the recurrence rule.

    The new date is calculated from the given p_offset value.

    When no recurrence tag is present, an exception is raised.
    """

    todo = Todo(p_todo.source())
    pattern = todo.tag_value('rec')

    if not pattern:
        raise NoRecurrenceException()

    length = todo.length()
    new_due = relative_date_to_date(pattern, p_offset)

    if not new_due:
        raise NoRecurrenceException()

    # pylint: disable=E1103
    todo.set_tag(config().tag_due(), new_due.isoformat())

    if todo.start_date():
        new_start = new_due - timedelta(length)
        todo.set_tag(config().tag_start(), new_start.isoformat())

    todo.set_creation_date(date.today())

    return todo
Example #2
0
    def test_todo_number1(self):
        todo = Todo("No number")
        self.todolist.add_todo(todo)

        todo = self.todolist.todo(6)
        self.assertIsInstance(todo, Todo)
        self.assertEqual(todo.text(), "No number")
Example #3
0
def advance_recurring_todo(p_todo, p_offset=None, p_strict=False):
    """
    Given a Todo item, return a new instance of a Todo item with the dates
    shifted according to the recurrence rule.

    Strict means that the real due date is taken as a offset, not today or a
    future date to determine the offset.

    When the todo item has no due date, then the date is used passed by the
    caller (defaulting to today).

    When no recurrence tag is present, an exception is raised.
    """
    todo = Todo(p_todo.source())
    pattern = todo.tag_value('rec')

    if not pattern:
        raise NoRecurrenceException()
    elif pattern.startswith('+'):
        p_strict = True
        # strip off the +
        pattern = pattern[1:]

    if p_strict:
        offset = p_todo.due_date() or p_offset or date.today()
    else:
        offset = p_offset or date.today()

    length = todo.length()
    new_due = relative_date_to_date(pattern, offset)

    if not new_due:
        raise NoRecurrenceException()

    # pylint: disable=E1103
    todo.set_tag(config().tag_due(), new_due.isoformat())

    if todo.start_date():
        new_start = new_due - timedelta(length)
        todo.set_tag(config().tag_start(), new_start.isoformat())

    todo.set_creation_date(date.today())

    return todo
Example #4
0
    def test_priority_color3(self):
        config("test/data/ColorsTest3.conf")
        todo_a = Todo('(A) Foo')
        todo_b = Todo('(B) Bar')
        todo_z = Todo('(Z) FooBar')
        todo_d = Todo('(D) Baz')
        todo_c = Todo('(C) FooBaz')

        color_a = config().priority_color(todo_a.priority()).as_ansi()
        color_b = config().priority_color(todo_b.priority()).as_ansi()
        color_z = config().priority_color(todo_z.priority()).as_ansi()
        color_d = config().priority_color(todo_d.priority()).as_ansi()
        color_c = config().priority_color(todo_c.priority()).as_ansi()

        self.assertEqual(color_a, '\033[0;35m')
        self.assertEqual(color_b, '\033[0;1;36m')
        self.assertEqual(color_z, NEUTRAL_COLOR)
        self.assertEqual(color_d, '\033[0;31m')
        self.assertEqual(color_c, '\033[0;37m')
Example #5
0
    def test_priority_color1(self):
        config("test/data/ColorsTest1.conf")
        todo_a = Todo('(A) Foo')
        todo_b = Todo('(B) Bar')
        todo_c = Todo('(C) FooBar')

        color_a = config().priority_color(todo_a.priority()).as_ansi()
        color_b = config().priority_color(todo_b.priority()).as_ansi()
        color_c = config().priority_color(todo_c.priority()).as_ansi()

        self.assertEqual(color_a, '\033[0;31m')
        self.assertEqual(color_b, '\033[0;32m')
        self.assertEqual(color_c, '\033[0;33m')
Example #6
0
    def test_empty_color_values(self):
        config("test/data/ColorsTest5.conf")
        project_color = config().project_color().as_ansi(p_decoration='bold')
        context_color = config().context_color().as_ansi(p_decoration='bold')
        link_color = config().link_color().as_ansi(p_decoration='underline')
        metadata_color = config().metadata_color().as_ansi(p_decoration='bold')

        todo_a = Todo('(A) Foo')
        todo_b = Todo('(B) Bar')
        todo_c = Todo('(C) FooBar')

        color_a = config().priority_color(todo_a.priority()).as_ansi()
        color_b = config().priority_color(todo_b.priority()).as_ansi()
        color_c = config().priority_color(todo_c.priority()).as_ansi()

        self.assertEqual(color_a, NEUTRAL_COLOR)
        self.assertEqual(color_b, NEUTRAL_COLOR)
        self.assertEqual(color_c, NEUTRAL_COLOR)
        self.assertEqual(project_color, '')
        self.assertEqual(context_color, '')
        self.assertEqual(link_color, '')
        self.assertEqual(metadata_color, '')
Example #7
0
    def test_empty_colorscheme(self):
        config("test/data/config1")
        project_color = config().project_color().as_ansi(p_decoration='bold')
        context_color = config().context_color().as_ansi(p_decoration='bold')
        link_color = config().link_color().as_ansi(p_decoration='underline')
        metadata_color = config().metadata_color().as_ansi(p_decoration='bold')

        todo_a = Todo('(A) Foo')
        todo_b = Todo('(B) Bar')
        todo_c = Todo('(C) FooBar')

        color_a = config().priority_color(todo_a.priority()).as_ansi()
        color_b = config().priority_color(todo_b.priority()).as_ansi()
        color_c = config().priority_color(todo_c.priority()).as_ansi()

        self.assertEqual(color_a, '\033[0;36m')
        self.assertEqual(color_b, '\033[0;33m')
        self.assertEqual(color_c, '\033[0;34m')
        self.assertEqual(project_color, '\033[1;31m')
        self.assertEqual(context_color, '\033[1;35m')
        self.assertEqual(link_color, '\033[4;36m')
        self.assertEqual(metadata_color, '\033[1;32m')
Example #8
0
 def test_length10(self):
     todo = Todo("(C) Foo t:2017-06-30")
     self.assertEqual(todo.length(), 0)
Example #9
0
 def setUp(self):
     super(RecurrenceTest, self).setUp()
     self.todo = Todo("Test rec:1w")
Example #10
0
 def test_importance07(self):
     config(p_overrides={('sort', 'ignore_weekends'): '1'})
     todo = Todo("(C) Foo " + config().tag_due() + ":" + "2015-11-09")
     self.assertEqual(importance(todo), 6)
Example #11
0
 def test_importance06(self):
     todo = Todo("(C) Foo " + config().tag_due() + ":" + "2015-11-10")
     self.assertEqual(importance(todo), 5)
Example #12
0
 def test_length3(self):
     todo = Todo("(C) Foo t:2014-01-01 due:2014-01-02")
     self.assertEqual(todo.length(), 1)
Example #13
0
 def test_overdue2(self):
     todo = Todo("(C) Foo due:" + tomorrow_date())
     self.assertFalse(todo.is_overdue())
Example #14
0
 def test_active3(self):
     todo = Todo("x 2014-06-09 Foo t:2014-01-01")
     self.assertFalse(todo.is_active())
Example #15
0
 def test_length8(self):
     todo = Todo("(C) 2015-11-18 Foo t:2015-11-19 due:2015-11-20)")
     self.assertEqual(todo.length(), 1)
Example #16
0
 def test_length6(self):
     todo = Todo("(C) 2015-11-18 Foo due:2015-11-19)")
     self.assertEqual(todo.length(), 1)
Example #17
0
    def test_filter03(self):
        todo = Todo("(C) Relevant")
        relevance = Filter.RelevanceFilter()
        result = relevance.filter([todo])

        self.assertEqual(result, [todo])
Example #18
0
def load_file(p_filename):
    """
    Loads a todo file from the given filename and returns a list of todos.
    """
    todolist = load_file_to_raw_list(p_filename)
    return [Todo(src) for src in todolist]
Example #19
0
 def test_importance03(self):
     todo = Todo("(A) Foo " + config().tag_star() + ":1")
     self.assertEqual(importance(todo), 6)
Example #20
0
    def add_list(self, p_srcs):
        todos = [Todo(src) for src in p_srcs if re.search(r'\S', src)]
        self.add_todos(todos)

        return todos
Example #21
0
    def test_due_date1(self):
        todo = Todo("(C) Foo due:2014-06-09")
        due = date(2014, 6, 9)

        self.assertEqual(todo.due_date(), due)
Example #22
0
 def test_active1(self):
     todo = Todo("(C) Foo due:2014-01-01")
     self.assertTrue(todo.is_active())
Example #23
0
 def test_length10(self):
     todo = Todo("(C) Foo t:2017-06-30")
     self.assertEqual(todo.length(), 0)
Example #24
0
 def test_active5(self):
     todo = Todo("(C) Foo t:2014-02-29")
     self.assertTrue(todo.is_active())
Example #25
0
 def test_length11(self):
     todo = Todo("(C) Foo t:2017-06-31 due:2017-07-01")
     self.assertEqual(todo.length(), 0)
Example #26
0
 def days_till_due(self):
     todo = Todo("(C) due:" + tomorrow_date())
     self.assertEqual(todo.days_till_due(), 1)
Example #27
0
    def test_due_date1(self):
        todo = Todo("(C) Foo due:2014-06-09")
        due = date(2014, 6, 9)

        self.assertEqual(todo.due_date(), due)
Example #28
0
 def test_length5(self):
     todo = Todo("(C) 2015-11-18 Foo)")
     self.assertEqual(todo.length(), 0)
Example #29
0
 def test_false_date(self):
     todo = Todo("(C) Foo due:2014-04-31")
     self.assertEqual(todo.due_date(), None)
Example #30
0
 def test_length5(self):
     todo = Todo("(C) 2015-11-18 Foo)")
     self.assertEqual(todo.length(), 0)
Example #31
0
 def test_length6(self):
     todo = Todo("(C) 2015-11-18 Foo due:2015-11-19)")
     self.assertEqual(todo.length(), 1)
Example #32
0
 def test_active1(self):
     todo = Todo("(C) Foo due:2014-01-01")
     self.assertTrue(todo.is_active())
Example #33
0
class RecurrenceTest(TopydoTest):
    def setUp(self):
        super(RecurrenceTest, self).setUp()
        self.todo = Todo("Test rec:1w")

    def test_duedate1(self):
        """ Where due date is in the future. """
        future = date.today() + timedelta(1)
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), future.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_duedate2(self):
        """ Where due date is today. """
        today = date.today()
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), today.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_duedate3(self):
        """ Where due date is in the past. """
        past = date.today() - timedelta(8)
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), past.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_duedate4(self):
        """ Where due date is in the past. """
        past = date.today() - timedelta(8)
        new_due = date.today() - timedelta(1)

        self.todo.set_tag(config().tag_due(), past.isoformat())
        new_todo = strict_advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_duedate5(self):
        """ Where due date is in the future. """
        future = date.today() + timedelta(1)
        new_due = date.today() + timedelta(8)

        self.todo.set_tag(config().tag_due(), future.isoformat())
        new_todo = strict_advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_duedate6(self):
        """ Where due date is today. """
        today = date.today()
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), today.isoformat())
        new_todo = strict_advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.due_date(), new_due)

    def test_noduedate1(self):
        new_due = date.today() + timedelta(7)
        new_todo = advance_recurring_todo(self.todo)

        self.assertTrue(new_todo.has_tag(config().tag_due()))
        self.assertEquals(new_todo.due_date(), new_due)

    def test_noduedate2(self):
        new_due = date.today() + timedelta(7)
        new_todo = strict_advance_recurring_todo(self.todo)

        self.assertTrue(new_todo.has_tag(config().tag_due()))
        self.assertEquals(new_todo.due_date(), new_due)

    def test_startdate1(self):
        """ Start date is before due date. """
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        yesterday = date.today() - timedelta(1)
        self.todo.set_tag(config().tag_start(), yesterday.isoformat())

        new_start = date.today() + timedelta(6)
        new_todo = advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.start_date(), new_start)

    def test_startdate2(self):
        """ Strict recurrence. Start date is before due date. """
        due = date.today() - timedelta(1)
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        yesterday = due - timedelta(1)
        self.todo.set_tag(config().tag_start(), yesterday.isoformat())

        new_start = date.today() + timedelta(5)
        new_todo = strict_advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.start_date(), new_start)

    def test_startdate3(self):
        """ Start date equals due date. """
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        self.todo.set_tag(config().tag_start(), date.today().isoformat())

        new_start = date.today() + timedelta(7)
        new_todo = advance_recurring_todo(self.todo)

        self.assertEquals(new_todo.start_date(), new_start)

    def test_no_recurrence(self):
        self.todo.remove_tag('rec')
        self.assertRaises(NoRecurrenceException, advance_recurring_todo,
                          self.todo)

    def test_invalid_recurrence(self):
        """ Throw exception when 'rec' tag has an invalid value. """
        self.todo.set_tag('rec', '1')
        self.assertRaises(NoRecurrenceException, advance_recurring_todo,
                          self.todo)
Example #34
0
 def test_active2(self):
     todo = Todo("(C) Foo t:" + tomorrow_date())
     self.assertFalse(todo.is_active())
Example #35
0
 def test_active3(self):
     todo = Todo("x 2014-06-09 Foo t:2014-01-01")
     self.assertFalse(todo.is_active())
Example #36
0
 def test_length8(self):
     todo = Todo("(C) 2015-11-18 Foo t:2015-11-19 due:2015-11-20)")
     self.assertEqual(todo.length(), 1)
Example #37
0
 def test_active4(self):
     todo = Todo("(C) Foo t:" + today_date())
     self.assertTrue(todo.is_active())
Example #38
0
 def test_length11(self):
     todo = Todo("(C) Foo t:2017-06-31 due:2017-07-01")
     self.assertEqual(todo.length(), 0)
Example #39
0
 def test_active5(self):
     todo = Todo("(C) Foo t:2014-02-29")
     self.assertTrue(todo.is_active())
Example #40
0
 def test_false_date(self):
     todo = Todo("(C) Foo due:2014-04-31")
     self.assertEqual(todo.due_date(), None)
Example #41
0
 def test_overdue1(self):
     todo = Todo("(C) Foo due:2014-01-01")
     self.assertTrue(todo.is_overdue())
Example #42
0
 def test_active2(self):
     todo = Todo("(C) Foo t:" + tomorrow_date())
     self.assertFalse(todo.is_active())
Example #43
0
 def test_overdue2(self):
     todo = Todo("(C) Foo due:" + tomorrow_date())
     self.assertFalse(todo.is_overdue())
Example #44
0
 def test_active4(self):
     todo = Todo("(C) Foo t:" + today_date())
     self.assertTrue(todo.is_active())
Example #45
0
 def test_overdue3(self):
     todo = Todo("(C) Foo due:" + today_date())
     self.assertFalse(todo.is_overdue())
Example #46
0
 def test_overdue1(self):
     todo = Todo("(C) Foo due:2014-01-01")
     self.assertTrue(todo.is_overdue())
Example #47
0
 def days_till_due(self):
     todo = Todo("(C) due:" + tomorrow_date())
     self.assertEqual(todo.days_till_due(), 1)
Example #48
0
 def test_overdue3(self):
     todo = Todo("(C) Foo due:" + today_date())
     self.assertFalse(todo.is_overdue())
Example #49
0
 def setUp(self):
     super(RecurrenceTest, self).setUp()
     self.todo = Todo("Test rec:1w")
Example #50
0
 def test_length1(self):
     todo = Todo("(C) Foo t:2014-01-01 due:2013-12-31")
     self.assertEqual(todo.length(), 0)
Example #51
0
 def setUp(self):
     super().setUp()
     self.todo = Todo("Test rec:1w")
     self.stricttodo = Todo("Test rec:+1w")
Example #52
0
 def test_length4(self):
     todo = Todo("(C) Foo)")
     self.assertEqual(todo.length(), 0)
Example #53
0
 def test_importance02(self):
     todo = Todo("(A) Foo")
     self.assertEqual(importance(todo), 5)
Example #54
0
 def test_length1(self):
     todo = Todo("(C) Foo t:2014-01-01 due:2013-12-31")
     self.assertEqual(todo.length(), 0)
Example #55
0
 def test_importance04(self):
     today_str = date.today().isoformat()
     todo = Todo("(C) Foo " + config().tag_due() + ":" + today_str)
     self.assertEqual(importance(todo), 8)
Example #56
0
class RecurrenceTest(TopydoTest):
    def setUp(self):
        super().setUp()
        self.todo = Todo("Test rec:1w")
        self.stricttodo = Todo("Test rec:+1w")

    def test_duedate1(self):
        """ Where due date is in the future. """
        future = date.today() + timedelta(1)
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), future.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_duedate2(self):
        """ Where due date is today. """
        today = date.today()
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), today.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_duedate3(self):
        """ Where due date is in the past. """
        past = date.today() - timedelta(8)
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), past.isoformat())
        new_todo = advance_recurring_todo(self.todo)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_duedate4(self):
        """ Where due date is in the past. """
        past = date.today() - timedelta(8)
        new_due = date.today() - timedelta(1)

        self.todo.set_tag(config().tag_due(), past.isoformat())
        new_todo = advance_recurring_todo(self.todo, p_strict=True)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_duedate5(self):
        """ Where due date is in the future. """
        future = date.today() + timedelta(1)
        new_due = date.today() + timedelta(8)

        self.todo.set_tag(config().tag_due(), future.isoformat())
        new_todo = advance_recurring_todo(self.todo, p_strict=True)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_duedate6(self):
        """ Where due date is today. """
        today = date.today()
        new_due = date.today() + timedelta(7)

        self.todo.set_tag(config().tag_due(), today.isoformat())
        new_todo = advance_recurring_todo(self.todo, p_strict=True)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_noduedate1(self):
        new_due = date.today() + timedelta(7)
        new_todo = advance_recurring_todo(self.todo)

        self.assertTrue(new_todo.has_tag(config().tag_due()))
        self.assertEqual(new_todo.due_date(), new_due)

    def test_noduedate2(self):
        new_due = date.today() + timedelta(7)
        new_todo = advance_recurring_todo(self.todo, p_strict=True)

        self.assertTrue(new_todo.has_tag(config().tag_due()))
        self.assertEqual(new_todo.due_date(), new_due)

    def test_startdate1(self):
        """ Start date is before due date. """
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        yesterday = date.today() - timedelta(1)
        self.todo.set_tag(config().tag_start(), yesterday.isoformat())

        new_start = date.today() + timedelta(6)
        new_todo = advance_recurring_todo(self.todo)

        self.assertEqual(new_todo.start_date(), new_start)

    def test_startdate2(self):
        """ Strict recurrence. Start date is before due date. """
        due = date.today() - timedelta(1)
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        yesterday = due - timedelta(1)
        # pylint: disable=E1103
        self.todo.set_tag(config().tag_start(), yesterday.isoformat())

        new_start = date.today() + timedelta(5)
        new_todo = advance_recurring_todo(self.todo, p_strict=True)

        self.assertEqual(new_todo.start_date(), new_start)

    def test_startdate3(self):
        """ Start date equals due date. """
        self.todo.set_tag(config().tag_due(), date.today().isoformat())
        self.todo.set_tag(config().tag_start(), date.today().isoformat())

        new_start = date.today() + timedelta(7)
        new_todo = advance_recurring_todo(self.todo)

        self.assertEqual(new_todo.start_date(), new_start)

    def test_strict_recurrence1(self):
        """
        Strict recurrence where due date is in the past, using + notation in
        expression.
        """
        past = date.today() - timedelta(8)
        new_due = date.today() - timedelta(1)

        self.stricttodo.set_tag(config().tag_due(), past.isoformat())
        new_todo = advance_recurring_todo(self.stricttodo, p_strict=True)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_strict_recurrence2(self):
        """
        Strict recurrence where due date is in the future, using + notation in
        expression.
        """
        future = date.today() + timedelta(1)
        new_due = date.today() + timedelta(8)

        self.stricttodo.set_tag(config().tag_due(), future.isoformat())
        new_todo = advance_recurring_todo(self.stricttodo, p_strict=True)

        self.assertEqual(new_todo.due_date(), new_due)

    def test_no_recurrence(self):
        self.todo.remove_tag('rec')
        self.assertRaises(NoRecurrenceException, advance_recurring_todo,
                          self.todo)

    def test_invalid_recurrence(self):
        """ Throw exception when 'rec' tag has an invalid value. """
        self.todo.set_tag('rec', '1')
        self.assertRaises(NoRecurrenceException, advance_recurring_todo,
                          self.todo)
Example #57
0
 def test_length3(self):
     todo = Todo("(C) Foo t:2014-01-01 due:2014-01-02")
     self.assertEqual(todo.length(), 1)
Example #58
0
 def test_length4(self):
     todo = Todo("(C) Foo)")
     self.assertEqual(todo.length(), 0)
Example #59
0
 def test_importance01(self):
     todo = Todo("Foo")
     self.assertEqual(importance(todo), 2)