def test_runlog_integration(tmpdir):
    """RunLog system works as intended"""

    db = rl.RunLogDB(ArgsMock(workdir=tmpdir))
    log_handles_before = db.list()

    start_meta = {"begin": True}
    stop_meta = {"end": True}
    combined_meta = start_meta
    combined_meta.update(stop_meta)
    log_lines = [{"foo": 1}, {"foo": 2}, {"foo": 3, "nolog": True}]
    log = db.new_log()
    log.start(meta=start_meta,
              log_filter=lambda x: None if "nolog" in x else x)
    log.log(log_lines)
    log.stop(meta=stop_meta)

    log_handles_after = db.list()
    assert len(
        log_handles_after) == len(log_handles_before) + 1, "new log is listed"
    log = db.read_log(log_handles_after[-1])
    read_meta = log.get_meta()
    assert "log_lines" in read_meta and read_meta[
        "log_lines"] == 2, "has right number of lines in metadata"
    has_meta = True
    for k in combined_meta:
        if k not in read_meta or read_meta[k] != combined_meta[k]:
            has_meta = False
            break
    assert has_meta, "log metadata is correct"
    read_lines = [line for line in log]
    assert len(read_lines) == 2, "log has correct number of lines"
    assert read_lines == log_lines[:2], "log lines have correct content"
예제 #2
0
def test_tags_db_persistence(tmpdir):
    """TagsDB databases are persistent on disk"""

    db = tdb.TagsDB(ArgsMock(workdir=tmpdir))
    db["newnewtag"] = "newnewhandleA"  # Any modification should save the DB to disk
    db["newnewtag"] = "newnewhandleB"
    db["newnewtag"] = "newnewhandleC"
    db.remove("newnewtag", "newnewhandleC")

    del db
    assert tmpdir.join("tags.json").exists(), "TaskDB is written to disk"

    db = tdb.TagsDB(ArgsMock(workdir=tmpdir))
    assert "newnewtag" in db, "a TaskDB does not forget about tags"
    assert "newnewhandleA" in db["newnewtag"] and "newnewhandleB" in db[
        "newnewtag"], "a TaskDB does not forget handles"
    assert "newnewhandleC" not in db[
        "newnewtag"], "a TaskDB does not dream about deleted handles"
def test_runlog_db_instance(tmpdir):
    """RunLogDB can list log handles"""

    db = rl.RunLogDB(ArgsMock(workdir=tmpdir))
    handle_list = db.list()
    dir_list = db.list_logs()
    assert type(handle_list) is list, "handle listing is a python list"
    assert type(dir_list) is list, "dir listing is a python list"
    assert len(handle_list) == 0, "empty db yields empty handle list"
    assert len(dir_list) == 0, "empty db yields empty dir list"
def test_runlog_db_file_handling(tmpdir):
    """RunLogDB associates handles and directories"""

    db = rl.RunLogDB(ArgsMock(workdir=tmpdir))

    now = datetime.datetime.utcnow().strftime("%Y-%m-%dZ%H-%M-%S")
    dir_name = os.path.abspath(db.handle_to_dir_name(now))
    assert dir_name.startswith(
        str(tmpdir)), "log files are stored in the right location"
    handle_name = db.dir_name_to_handle(dir_name)
    assert now == handle_name, "converting between handles and file names works"
def test_runlog_db_rw(tmpdir):
    """RunLogDB can read and write"""

    db = rl.RunLogDB(ArgsMock(workdir=tmpdir))

    in_db_before = db.list()
    now = datetime.datetime.utcnow().strftime("%Y-%m-%dZ%H-%M-%S")
    assert now not in in_db_before, "database is not cluttered"
    test_data = "hello,test"
    db.write(now, "test", test_data)
    in_db_after = db.list()
    assert now in in_db_after, "written log appears in db listing"
    read_test_data = db.read(now, "test")
    assert test_data == read_test_data, "read data is same as data"
예제 #6
0
def test_sources_db_write_and_override(tmpdir):
    """SourcesDB databases can be written and overridden"""

    db = sdb.SourcesDB(ArgsMock(workdir=tmpdir))
    old = db.read("debug")
    old_default = db.default
    override = sdb.Sources("debug", True)
    row_one = {"foo": "bar", "baz": "bang", "boom": "bang"}
    row_two = {"foo": "bar2", "baz": "bang2", "boom": "bang2"}
    override.append(row_one)
    override.append(row_two)
    db.write(override)

    # New SourcesDB instance required to detect overrides
    db = sdb.SourcesDB(ArgsMock(workdir=tmpdir))
    assert os.path.exists(tmpdir.join("sources",
                                      "debug.csv")), "override file is written"
    assert db.default == "debug", "overriding the default works"
    assert old_default != db.default, "overridden default actually changes"
    new = db.read("debug")
    assert len(new) == 2, "number of overridden rows is correct"
    assert new[0] == row_one and new[
        1] == row_two, "new rows are written as expected"
    assert old[0] != new[0], "overridden rows actually change"
예제 #7
0
def test_tags_db_dangling(tmpdir):
    """TagDB discards of dangling references"""

    db = tdb.TagsDB(ArgsMock(workdir=tmpdir))
    db["tag"] = "handleA"
    db["tag"] = "handleB"
    db["tag"] = "handleC"
    db["newtag"] = "handleB"
    db["newtag"] = "handleC"
    db["newtag"] = "handleD"

    # Assume B and C were deleted elsewhere, so all their references should be dropped
    db.remove_dangling(["handleA", "handleD"])
    assert "handleA" in db["tag"] and "handleD" in db[
        "newtag"], "handles rememberd after un-dangling"
    assert "handleB" not in db["tag"] and "handleB" not in db[
        "newtag"], "handle B forgotten after un-dangling"
    assert "handleC" not in db["tag"] and "handleC" not in db[
        "newtag"], "handle C forgotten after un-dangling"
def test_runlog_rw(tmpdir):
    """RunLog objects can write and read"""

    db = rl.RunLogDB(ArgsMock(workdir=tmpdir))
    now = datetime.datetime.utcnow().strftime("%Y-%m-%dZ%H-%M-%S")
    log = rl.RunLog(now, "w", db)

    # Write something to log using the with statement
    with log:
        log.log({"foo": 5})
        log.update_meta({"just": "testing"})
        assert log.is_running, "log is running in with"
    assert not log.is_running, "log is not running after with"

    # Write something to log. Previous content will be overwritten
    log.start(meta={"first_meta": "one"})
    log.log([{"foo": 1}, {"foo": 2}])
    log.log({"foo": 3})
    assert not log.has_finished(), "log is not marked `finished` while logging"
    log.stop(meta={"last_meta": "two"})
    assert log.has_finished(), "log is marked `finished` after logging"

    test_log_dir = db.handle_to_dir_name(now)
    assert os.path.isdir(test_log_dir), "log directory is created"

    assert len(os.listdir(
        test_log_dir)) == 2, "log and meta files are written to disk"

    # Read from log
    log = rl.RunLog(now, "r", db)
    assert log.has_finished(), "completed log is marked as `finished`"
    meta = log.get_meta()
    # Metadata always has "format_revision", "log_lines" and "run_completed" keys
    assert len(list(meta.keys())) == 5, "log has correct number of meta data"
    log_lines = [line for line in log]
    assert len(log_lines) == 3, "log has correct number of lines"
예제 #9
0
def tags_db(tmpdir):
    """A TagsDB fixture"""
    return tdb.TagsDB(ArgsMock(workdir=tmpdir))
예제 #10
0
def sources_db(tmpdir):
    """A SourcesDB fixture"""
    return sdb.SourcesDB(ArgsMock(workdir=tmpdir))