Пример #1
0
    def setUp(self):
        super().setUp()

        self.todo1 = "2015-12-19 With creation date."
        self.todo2 = "Without creation date."

        self.todos = [Todo(self.todo1), Todo(self.todo2)]
Пример #2
0
    def test_priority_color4(self):
        config("test/data/ColorsTest4.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, '')
        self.assertEqual(color_b, '')
        self.assertEqual(color_c, '')
Пример #3
0
    def add_list(self, p_srcs):
        todos = [Todo(src) for src in p_srcs]
        if config().auto_delete_whitespace():
            todos = [todo for todo in todos if re.search(r'\S', todo.source())]
        self.add_todos(todos)

        return todos
Пример #4
0
 def test_importance_ignore_weekends_due_not_next_monday(self):
     # Today is sunday
     # due on a monday, but over a month away.
     # So 2 + 0 (no priority) + 0 (no star) + 0 (due > 14 days)
     config(p_overrides={('sort', 'ignore_weekends'): '1'})
     todo = Todo("Foo " + config().tag_due() + ":" + "2016-11-28")
     self.assertEqual(importance(todo), 2)
Пример #5
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.assertEquals(todo.text(), "No number")
Пример #6
0
    def setUp(self):
        super().setUp()

        self.todo1 = "(A) Foo"
        self.todo2 = "(B) Bar"
        self.todo3 = "(C) Baz"
        self.todo4 = "(Z) FooBar"
        self.todo5 = "FooBaz"

        self.todos = [
            Todo(self.todo1),
            Todo(self.todo2),
            Todo(self.todo3),
            Todo(self.todo4),
            Todo(self.todo5),
        ]
Пример #7
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
Пример #8
0
    def test_json(self):
        """ Print a single todo item. """
        printer = JsonPrinter()
        todo = Todo('2015-06-06 Foo due:2015-05-32')

        result = printer.print_todo(todo)

        self.assertEqual(result, '{"completed": false, "completion_date": null, "contexts": [], "creation_date": "2015-06-06", "priority": null, "projects": [], "source": "2015-06-06 Foo due:2015-05-32", "tags": [["due", "2015-05-32"]], "text": "Foo"}')
Пример #9
0
    def test_edit_expr(self, mock_open_in_editor, mock_todos_from_temp, mock_is_edited):
        """ Edit todos matching expression. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Lazy Cat'),
                                             Todo('Lazy Dog')]
        mock_is_edited.return_value = True

        command = EditCommand(["-e", "@test"], self.todolist, self.out,
                              self.error, None)
        command.execute()

        expected = u"|  3| Lazy Cat\n|  4| Lazy Dog\n"

        self.assertEqual(self.errors, "")
        self.assertTrue(self.todolist.dirty)
        self.assertEqual(self.output, expected)
        self.assertEqual(self.todolist.print_todos(), u"Foo id:1\nFo\u00f3B\u0105\u017a\nLazy Cat\nLazy Dog")
Пример #10
0
    def _todos_from_temp(p_temp_file):
        with codecs.open(p_temp_file.name, encoding='utf-8') as temp:
            todos = temp.read().splitlines()

        todo_objs = []
        for todo in todos:
            todo_objs.append(Todo(todo))

        return todo_objs
Пример #11
0
    def _todos_from_temp(self, p_temp_file):
        p_temp_file.seek(0)
        todos = p_temp_file.read().decode('utf-8').splitlines()

        todo_objs = []
        for todo in todos:
            todo_objs.append(Todo(todo))

        return todo_objs
Пример #12
0
    def test_delete2(self):
        """ Try to remove a todo item that does not exist. """
        count = self.todolist.count()

        todo = Todo('Not in the list')
        self.todolist.delete(todo)

        self.assertEqual(self.todolist.count(), count)
        self.assertFalse(self.todolist.dirty)
Пример #13
0
    def test_edit_addnew(self, mock_open_in_editor, mock_todos_from_temp,
                         mock_is_edited):
        """ New todos are added in the process of editing. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [
            Todo('Bar (edited)'),
            Todo('New1'), Todo('New 2')
        ]
        mock_is_edited.return_value = True

        command = EditCommand(["2"], self.todolist, self.out, self.error, None)
        command.execute()

        self.assertEqual(self.errors, "")
        self.assertTrue(self.todolist.dirty)
        self.assertEqual(
            self.todolist.print_todos(),
            u"Foo id:1\nBar (edited)\nBaz @test\nFo\u00f3B\u0105\u017a\nNew1\nNew 2"
        )
Пример #14
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')
Пример #15
0
    def setUp(self):
        super(OrdinalTagFilterTest, self).setUp()

        today = date.today()
        tomorrow = today + timedelta(1)

        self.today = today.isoformat()
        self.tomorrow = tomorrow.isoformat()

        self.todo1 = "Foo due:{}".format(self.today)
        self.todo2 = "Bar due:{}".format(self.tomorrow)
        self.todo3 = "Baz due:nonsense"
        self.todo4 = "Fnord due:2014-10-32"

        self.todos = [
            Todo(self.todo1),
            Todo(self.todo2),
            Todo(self.todo3),
            Todo(self.todo4),
        ]
Пример #16
0
    def test_edit01(self, mock_open_in_editor, mock_todos_from_temp, mock_is_edited):
        """ Preserve dependencies after editing. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Foo id:1')]
        mock_is_edited.return_value = True

        command = EditCommand(["1"], self.todolist, self.out, self.error, None)
        command.execute()

        self.assertEqual(self.errors, "")
        self.assertTrue(self.todolist.dirty)
        self.assertEqual(self.todolist.print_todos(), u"Bar p:1 @test\nBaz @test\nFo\u00f3B\u0105\u017a\nFoo id:1")
Пример #17
0
    def test_edit7(self, mock_open_in_editor, mock_todos_from_temp):
        """ Edit todo with special characters. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Lazy Cat')]

        command = EditCommand([u("Fo\u00f3B\u0105\u017a")], self.todolist,
                              self.out, self.error, None)
        command.execute()

        self.assertTrue(self.todolist.is_dirty())
        self.assertEqual(self.errors, "")
        self.assertEqual(self.todolist.print_todos(),
                         u("Foo id:1\nBar p:1 @test\nBaz @test\nLazy Cat"))
Пример #18
0
    def test_edit07(self, mock_open_in_editor, mock_todos_from_temp, mock_is_edited):
        """ Don't perform write if tempfile is unchanged """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Only one line')]
        mock_is_edited.return_value = False

        command = EditCommand(["1", "Bar"], self.todolist, self.out,
                              self.error, None)
        command.execute()

        self.assertFalse(self.todolist.dirty)
        self.assertEqual(self.errors, "Editing aborted. Nothing to do.\n")
        self.assertEqual(self.todolist.print_todos(), u"Foo id:1\nBar p:1 @test\nBaz @test\nFo\u00f3B\u0105\u017a")
Пример #19
0
    def setUp(self):
        super().setUp()

        today = date.today()
        tomorrow = today + timedelta(1)

        self.today = today.isoformat()
        self.tomorrow = tomorrow.isoformat()

        self.todo1 = "Foo due:{}".format(self.today)
        self.todo2 = "Bar due:{}".format(self.tomorrow)
        self.todo3 = "Baz due:Nonsense"
        self.todo4 = "Fnord due:2014-10-32"
        self.todo5 = "Double tags key:value1 key:value2"

        self.todos = [
            Todo(self.todo1),
            Todo(self.todo2),
            Todo(self.todo3),
            Todo(self.todo4),
            Todo(self.todo5),
        ]
Пример #20
0
    def test_edit02(self, mock_open_in_editor, mock_todos_from_temp, mock_is_edited):
        """ Edit some todo. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Lazy Cat')]
        mock_is_edited.return_value = True

        command = EditCommand(["Bar"], self.todolist, self.out, self.error,
                              None)
        command.execute()

        self.assertTrue(self.todolist.dirty)
        self.assertEqual(self.errors, "")
        self.assertEqual(self.todolist.print_todos(), u"Foo id:1\nBaz @test\nFo\u00f3B\u0105\u017a\nLazy Cat")
Пример #21
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, '')
Пример #22
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')
Пример #23
0
    def test_edit_remove(self, mock_open_in_editor, mock_todos_from_temp,
                         mock_is_edited):
        """ Some todos are removed in the process of editing. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Foo (edited)')]

        mock_is_edited.return_value = True

        command = EditCommand(["1", "2"], self.todolist, self.out, self.error,
                              None)
        command.execute()

        self.assertEqual(self.errors, "")
        self.assertTrue(self.todolist.dirty)
        self.assertEqual(self.todolist.print_todos(),
                         u"Foo (edited)\nBaz @test\nFo\u00f3B\u0105\u017a")
Пример #24
0
    def test_edit5(self, mock_open_in_editor, mock_todos_from_temp):
        """ Don't let to delete todos acidentally while editing. """
        mock_open_in_editor.return_value = 0
        mock_todos_from_temp.return_value = [Todo('Only one line')]

        command = EditCommand(["1", "Bar"], self.todolist, self.out,
                              self.error, None)
        command.execute()

        self.assertFalse(self.todolist.is_dirty())
        self.assertEqual(
            self.errors,
            "Number of edited todos is not equal to number of supplied todo IDs.\n"
        )
        self.assertEqual(
            self.todolist.print_todos(),
            u("Foo id:1\nBar p:1 @test\nBaz @test\nFo\u00f3B\u0105\u017a"))
Пример #25
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())

    if config().auto_creation_date():
        todo.set_creation_date(date.today())

    return todo
Пример #26
0
 def test_progress12(self):
     """ Due tomorrow (creation date) """
     set_256_colors()
     color = progress_color(Todo('2016-01-01 Foo due:2016-01-02'))
     self.assertEqual(color.color, 22)
Пример #27
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
Пример #28
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]
Пример #29
0
 def test_progress11(self):
     """ Due tomorrow (creation date) """
     color = progress_color(Todo('2016-01-01 Foo due:2016-01-02'))
     # a length of 14 days is assumed
     self.assertEqual(color.color, 2)
Пример #30
0
 def test_todo_number2(self):
     todo = Todo("Non-existent")
     self.assertRaises(InvalidTodoException, self.todolist.number, todo)