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
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
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
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"
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'
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())
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
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
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'
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"
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'
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'])
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
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
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
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'
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
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"
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)
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)
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
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"
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 )
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"
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"
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) )
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'), )
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())
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"), )
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())
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'], )
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"
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"