Esempio n. 1
0
def test_list_no_colour(tmpdir):
    tmpdir.join("default").mkdir()

    db = Database([tmpdir.join("default")], tmpdir.join("cache.sqlite3"))
    list_ = next(db.lists())

    assert list_.colour is None
Esempio n. 2
0
def test_retain_unknown_fields(tmpdir, create, default_database):
    """
    Test that we retain unknown fields after a load/save cycle.
    """
    create(
        'test.ics',
        'UID:AVERYUNIQUEID\n'
        'SUMMARY:RAWR\n'
        'X-RAWR-TYPE:Reptar\n'
    )

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    todo = db.todo(1, read_only=False)

    todo.description = 'Rawr means "I love you" in dinosaur.'
    default_database.save(todo)

    path = tmpdir.join('default').join('test.ics')
    with path.open() as f:
        vtodo = f.read()
    lines = vtodo.splitlines()

    assert 'SUMMARY:RAWR' in lines
    assert 'DESCRIPTION:Rawr means "I love you" in dinosaur.' in lines
    assert 'X-RAWR-TYPE:Reptar' in lines
Esempio n. 3
0
def test_list_no_colour(tmpdir):
    tmpdir.join('default').mkdir()

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite3'))
    list_ = next(db.lists())

    assert list_.color_raw is None
    assert list_.color_rgb is None
    assert list_.color_ansi is None
Esempio n. 4
0
def test_list_colour(tmpdir):
    tmpdir.join("default").mkdir()
    with tmpdir.join("default").join("color").open("w") as f:
        f.write("#8ab6d2")

    db = Database([tmpdir.join("default")], tmpdir.join("cache.sqlite3"))
    list_ = next(db.lists())

    assert list_.colour == "#8ab6d2"
Esempio n. 5
0
def test_list_colour(tmpdir):
    tmpdir.join('default').mkdir()
    with tmpdir.join('default').join('color').open('w') as f:
        f.write('#8ab6d2')

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite3'))
    list_ = next(db.lists())

    assert list_.colour == '#8ab6d2'
Esempio n. 6
0
def test_dtstamp(tmpdir, runner, create):
    """Test that we add the DTSTAMP to new entries as per RFC5545."""
    result = runner.invoke(cli, ["new", "-l", "default", "test event"])
    assert not result.exception

    db = Database([tmpdir.join("default")], tmpdir.join("/dtstamp_cache"))
    todo = list(db.todos())[0]
    assert todo.dtstamp is not None
    assert todo.dtstamp == datetime.datetime.now(tz=tzlocal())
Esempio n. 7
0
def test_default_priority(tmpdir, runner, create):
    """Test setting the due date using the default_due config parameter"""
    path = tmpdir.join('config')
    path.write('default_priority = 3\n', 'a')

    runner.invoke(cli, ['new', '-l', 'default', 'aaa'])
    db = Database([tmpdir.join('default')], tmpdir.join('/default_list'))
    todo = list(db.todos())[0]

    assert todo.priority == 3
Esempio n. 8
0
def test_default_priority(tmpdir, runner, create):
    """Test setting the due date using the default_due config parameter"""
    path = tmpdir.join("config")
    path.write("default_priority = 3\n", "a")

    runner.invoke(cli, ["new", "-l", "default", "aaa"])
    db = Database([tmpdir.join("default")], tmpdir.join("/default_list"))
    todo = list(db.todos())[0]

    assert todo.priority == 3
Esempio n. 9
0
def test_list_displayname(tmpdir):
    tmpdir.join('default').mkdir()
    with tmpdir.join('default').join('displayname').open('w') as f:
        f.write('personal')

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite3'))
    list_ = next(db.lists())

    assert list_.name == 'personal'
    assert str(list_) == 'personal'
Esempio n. 10
0
def test_list_displayname(tmpdir):
    tmpdir.join("default").mkdir()
    with tmpdir.join("default").join("displayname").open("w") as f:
        f.write("personal")

    db = Database([tmpdir.join("default")], tmpdir.join("cache.sqlite3"))
    list_ = next(db.lists())

    assert list_.name == "personal"
    assert str(list_) == "personal"
Esempio n. 11
0
def test_list_colour(tmpdir):
    tmpdir.join('default').mkdir()
    with tmpdir.join('default').join('color').open('w') as f:
        f.write('#8ab6d2')

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite3'))
    list_ = next(db.lists())

    assert list_.color_raw == '#8ab6d2'
    assert list_.color_rgb == (138, 182, 210)
    assert list_.color_ansi == '\x1b[38;2;138;182;210m'
Esempio n. 12
0
    def __init__(self):
        config = load_config()
        paths = [
            path for path in glob.iglob(expanduser(config['main']['path']))
            if isdir(path)
        ]

        if not paths:
            raise Exception('No todos found!')

        self.db = Database(paths, config['main']['cache_path'])
Esempio n. 13
0
def test_dtstamp(tmpdir, runner, create):
    """
    Test that we add the DTSTAMP to new entries as per RFC5545.
    """
    result = runner.invoke(cli, ['new', '-l', 'default', 'test event'])
    assert not result.exception

    db = Database([tmpdir.join('default')], tmpdir.join('/dtstamp_cache'))
    todo = list(db.todos())[0]
    assert todo.dtstamp is not None
    assert todo.dtstamp.tzinfo is pytz.utc
Esempio n. 14
0
def test_no_default_priority(tmpdir, runner, create):
    """Test setting the due date using the default_due config parameter"""

    runner.invoke(cli, ['new', '-l', 'default', 'aaa'])

    db = Database([tmpdir.join('default')], tmpdir.join('/default_list'))
    todo = list(db.todos())[0]
    assert todo.priority == 0

    todo_file = tmpdir.join('default').join(todo.filename)
    todo_ics = todo_file.read_text('utf-8')
    assert 'PRIORITY' not in todo_ics
Esempio n. 15
0
def test_dtstamp(tmpdir, runner, create):
    """
    Test that we add the DTSTAMP to new entries as per RFC5545.
    """
    result = runner.invoke(cli, ['new', '-l', 'default', 'test event'])
    assert not result.exception

    db = Database([tmpdir.join('default')],
                  tmpdir.join('/dtstamp_cache'))
    todo = list(db.todos())[0]
    assert todo.dtstamp is not None
    assert todo.dtstamp.tzinfo is pytz.utc
Esempio n. 16
0
def test_no_default_priority(tmpdir, runner, create):
    """Test setting the due date using the default_due config parameter"""

    runner.invoke(cli, ["new", "-l", "default", "aaa"])

    db = Database([tmpdir.join("default")], tmpdir.join("/default_list"))
    todo = list(db.todos())[0]
    assert todo.priority == 0

    todo_file = tmpdir.join("default").join(todo.filename)
    todo_ics = todo_file.read_text("utf-8")
    assert "PRIORITY" not in todo_ics
Esempio n. 17
0
def test_default_list(tmpdir, runner, create):
    """Test the default_list config parameter"""
    result = runner.invoke(cli, ['new', 'test default list'])
    assert result.exception

    path = tmpdir.join('config')
    path.write('default_list = default\n', 'a')

    result = runner.invoke(cli, ['new', 'test default list'])
    assert not result.exception

    db = Database([tmpdir.join('default')], tmpdir.join('/default_list'))
    todo = list(db.todos())[0]
    assert todo.summary == 'test default list'
Esempio n. 18
0
def test_querying(create, tmpdir):
    for list in 'abc':
        for i, location in enumerate('abc'):
            create('test{}.ics'.format(i),
                   ('SUMMARY:test_querying\r\n'
                    'LOCATION:{}\r\n').format(location),
                   list_name=list)

    db = Database([str(tmpdir.ensure_dir(l)) for l in 'abc'],
                  str(tmpdir.join('cache')))

    assert len(set(db.todos())) == 9
    assert len(set(db.todos(lists='ab'))) == 6
    assert len(set(db.todos(lists='ab', location='a'))) == 2
Esempio n. 19
0
def test_default_list(tmpdir, runner, create):
    """Test the default_list config parameter"""
    result = runner.invoke(cli, ["new", "test default list"])
    assert result.exception

    path = tmpdir.join("config")
    path.write("default_list = default\n", "a")

    result = runner.invoke(cli, ["new", "test default list"])
    assert not result.exception

    db = Database([tmpdir.join("default")], tmpdir.join("/default_list"))
    todo = list(db.todos())[0]
    assert todo.summary == "test default list"
Esempio n. 20
0
def test_default_list(tmpdir, runner, create):
    """Test the default_list config parameter"""
    result = runner.invoke(cli, ['new', 'test default list'])
    assert result.exception

    path = tmpdir.join('config')
    path.write('default_list = default\n', 'a')

    result = runner.invoke(cli, ['new', 'test default list'])
    assert not result.exception

    db = Database([tmpdir.join('default')],
                  tmpdir.join('/default_list'))
    todo = list(db.todos())[0]
    assert todo.summary == 'test default list'
Esempio n. 21
0
def test_default_due(tmpdir, runner, create, default_due, expected_due_hours):
    """Test setting the due date using the default_due config parameter"""
    if default_due is not None:
        path = tmpdir.join('config')
        path.write('default_due = {}\n'.format(default_due), 'a')

    runner.invoke(cli, ['new', '-l', 'default', 'aaa'])
    db = Database([tmpdir.join('default')], tmpdir.join('/default_list'))
    todo = list(db.todos())[0]

    if expected_due_hours is None:
        assert todo.due is None
    else:
        assert (todo.due - todo.created_at) == datetime.timedelta(
            hours=expected_due_hours)
Esempio n. 22
0
def test_default_due(tmpdir, runner, create, default_due, expected_due_hours):
    """Test setting the due date using the default_due config parameter"""
    if default_due is not None:
        path = tmpdir.join("config")
        path.write("default_due = {}\n".format(default_due), "a")

    runner.invoke(cli, ["new", "-l", "default", "aaa"])
    db = Database([tmpdir.join("default")], tmpdir.join("/default_list"))
    todo = list(db.todos())[0]

    if expected_due_hours is None:
        assert todo.due is None
    else:
        assert (todo.due - todo.created_at) == datetime.timedelta(
            hours=expected_due_hours)
Esempio n. 23
0
def test_querying(create, tmpdir):
    for list in "abc":
        for i, location in enumerate("abc"):
            create(
                "test{}.ics".format(i),
                ("SUMMARY:test_querying\r\nLOCATION:{}\r\n").format(location),
                list_name=list,
            )

    db = Database([str(tmpdir.ensure_dir(list_)) for list_ in "abc"],
                  str(tmpdir.join("cache")))

    assert len(set(db.todos())) == 9
    assert len(set(db.todos(lists="ab"))) == 6
    assert len(set(db.todos(lists="ab", location="a"))) == 2
Esempio n. 24
0
def test_due_naive(tmpdir, runner, create):
    now = datetime.now()

    for i in [1, 23, 25, 48]:
        due = now + timedelta(hours=i)
        create(
            'test_{}.ics'.format(i), 'SUMMARY:{}\n'
            'DUE;VALUE=DATE-TIME:{}\n'.format(
                i,
                due.strftime("%Y%m%dT%H%M%S"),
            ))

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    todos = list(db.todos(due=24))

    assert len(todos) == 2
    assert todos[0].summary == "23"
    assert todos[1].summary == "1"
Esempio n. 25
0
def test_default_due(
    tmpdir, runner, create, default_due, expected_due_hours
):
    """Test setting the due date using the default_due config parameter"""
    if default_due is not None:
        path = tmpdir.join('config')
        path.write('default_due = {}\n'.format(default_due), 'a')

    runner.invoke(cli, ['new', '-l', 'default', 'aaa'])
    db = Database([tmpdir.join('default')], tmpdir.join('/default_list'))
    todo = list(db.todos())[0]

    if expected_due_hours is None:
        assert todo.due is None
    else:
        assert (todo.due - todo.created_at) == datetime.timedelta(
            hours=expected_due_hours
        )
Esempio n. 26
0
def test_due_naive(tmpdir, runner, create):
    now = datetime.now()

    for i in [1, 23, 25, 48]:
        due = now + timedelta(hours=i)
        create(
            'test_{}.ics'.format(i),
            'SUMMARY:{}\n'
            'DUE;VALUE=DATE-TIME:{}\n'.format(
                i, due.strftime("%Y%m%dT%H%M%S"),
            )
        )

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    todos = list(db.todos(due=24))

    assert len(todos) == 2
    assert todos[0].summary == "23"
    assert todos[1].summary == "1"
Esempio n. 27
0
def test_due_aware(tmpdir, runner, create):
    now = datetime.now()

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    l = next(db.lists())

    for tz in ['CET', 'HST']:
        for i in [1, 23, 25, 48]:
            todo = FileTodo()
            todo.due = (now + timedelta(hours=i)).replace(tzinfo=tzlocal()) \
                .astimezone(pytz.timezone(tz))
            todo.summary = '{}'.format(i)

            db.save(todo, l)

    todos = list(db.todos(due=24))

    assert len(todos) == 4
    assert todos[0].summary == "23"
    assert todos[1].summary == "23"
    assert todos[2].summary == "1"
    assert todos[3].summary == "1"
Esempio n. 28
0
def test_retain_tz(tmpdir, create, default_database):
    create(
        'ar.ics',
        'SUMMARY:blah.ar\n'
        'DUE;VALUE=DATE-TIME;TZID=HST:20160102T000000\n'
    )
    create(
        'de.ics',
        'SUMMARY:blah.de\n'
        'DUE;VALUE=DATE-TIME;TZID=CET:20160102T000000\n'
    )

    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    todos = list(db.todos())

    assert len(todos) == 2
    assert todos[0].due == datetime(
        2016, 1, 2, 0, 0, tzinfo=tzoffset(None, -36000)
    )
    assert todos[1].due == datetime(
        2016, 1, 2, 0, 0, tzinfo=tzoffset(None, 3600)
    )
Esempio n. 29
0
def test_duplicate_list(tmpdir):
    tmpdir.join('personal1').mkdir()
    with tmpdir.join('personal1').join('displayname').open('w') as f:
        f.write('personal')

    tmpdir.join('personal2').mkdir()
    with tmpdir.join('personal2').join('displayname').open('w') as f:
        f.write('personal')

    with pytest.raises(AlreadyExists):
        Database(
            [tmpdir.join('personal1'), tmpdir.join('personal2')],
            tmpdir.join('cache.sqlite3'),
        )
Esempio n. 30
0
def test_change_paths(tmpdir, create):
    old_todos = set("abcdefghijk")
    for x in old_todos:
        create("{}.ics".format(x), "SUMMARY:{}\n".format(x), x)

    tmpdir.mkdir("3")

    db = Database([tmpdir.join(x) for x in old_todos], tmpdir.join("cache.sqlite"))

    assert {t.summary for t in db.todos()} == old_todos

    db.paths = [str(tmpdir.join("3"))]
    db.update_cache()

    assert len(list(db.lists())) == 1
    assert not list(db.todos())
Esempio n. 31
0
def test_duplicate_list(tmpdir):
    tmpdir.join("personal1").mkdir()
    with tmpdir.join("personal1").join("displayname").open("w") as f:
        f.write("personal")

    tmpdir.join("personal2").mkdir()
    with tmpdir.join("personal2").join("displayname").open("w") as f:
        f.write("personal")

    with pytest.raises(AlreadyExists):
        Database(
            [tmpdir.join("personal1"), tmpdir.join("personal2")],
            tmpdir.join("cache.sqlite3"),
        )
Esempio n. 32
0
def test_change_paths(tmpdir, create):
    old_todos = set('abcdefghijk')
    for x in old_todos:
        create('{}.ics'.format(x), 'SUMMARY:{}\n'.format(x), x)

    tmpdir.mkdir('3')

    db = Database([tmpdir.join(x) for x in old_todos],
                  tmpdir.join('cache.sqlite'))

    assert {t.summary for t in db.todos()} == old_todos

    db.paths = [str(tmpdir.join('3'))]
    db.update_cache()

    assert len(list(db.lists())) == 1
    assert not list(db.todos())
Esempio n. 33
0
File: cli.py Progetto: hut/todoman
def cli(click_ctx, color, porcelain, humanize):
    ctx = click_ctx.ensure_object(AppContext)
    try:
        ctx.config = load_config()
    except ConfigurationException as e:
        raise click.ClickException(e.args[0])

    if porcelain and humanize:
        raise click.ClickException('--porcelain and --humanize cannot be used'
                                   ' at the same time.')

    if humanize is None:  # False means explicitly disabled
        humanize = ctx.config['main']['humanize']

    if porcelain:
        ctx.formatter_class = formatters.PorcelainFormatter
    elif humanize:
        ctx.formatter_class = formatters.HumanizedFormatter
    else:
        ctx.formatter_class = formatters.DefaultFormatter

    color = color or ctx.config['main']['color']
    if color == 'always':
        click_ctx.color = True
    elif color == 'never':
        click_ctx.color = False

    paths = [
        path for path in glob.iglob(expanduser(ctx.config["main"]["path"]))
        if isdir(path)
    ]
    if len(paths) == 0:
        raise exceptions.NoListsFound(ctx.config["main"]["path"])

    ctx.db = Database(paths, ctx.config['main']['cache_path'])

    # Make python actually use LC_TIME, or the user's locale settings
    locale.setlocale(locale.LC_TIME, "")

    if not click_ctx.invoked_subcommand:
        invoke_command(
            click_ctx,
            ctx.config['main']['default_command'],
        )
Esempio n. 34
0
def test_due_aware(tmpdir, runner, create, now_for_tz):
    db = Database([tmpdir.join('default')], tmpdir.join('cache.sqlite'))
    l = next(db.lists())

    for tz in ['CET', 'HST']:
        for i in [1, 23, 25, 48]:
            todo = FileTodo()
            todo.due = now_for_tz(tz) + timedelta(hours=i)
            todo.summary = '{}'.format(i)

            db.save(todo, l)

    todos = list(db.todos(due=24))

    assert len(todos) == 4
    assert todos[0].summary == "23"
    assert todos[1].summary == "23"
    assert todos[2].summary == "1"
    assert todos[3].summary == "1"
Esempio n. 35
0
def test_list_colour_cache_invalidation(tmpdir, sleep):
    tmpdir.join("default").mkdir()
    with tmpdir.join("default").join("color").open("w") as f:
        f.write("#8ab6d2")

    db = Database([tmpdir.join("default")], tmpdir.join("cache.sqlite3"))
    list_ = next(db.lists())

    assert list_.colour == "#8ab6d2"

    sleep()

    with tmpdir.join("default").join("color").open("w") as f:
        f.write("#f874fd")

    db = Database([tmpdir.join("default")], tmpdir.join("cache.sqlite3"))
    list_ = next(db.lists())

    assert list_.colour == "#f874fd"