Ejemplo n.º 1
0
def test_dataset_shacl(tmpdir, runner, project, client):
    """Test dataset metadata structure."""
    force_dataset_path = Path(
        __file__
    ).parent.parent.parent / 'fixtures' / 'force_dataset_shacl.json'

    force_datasetfile_path = Path(
        __file__
    ).parent.parent.parent / 'fixtures' / 'force_datasetfile_shacl.json'

    force_datasettag_path = Path(
        __file__
    ).parent.parent.parent / 'fixtures' / 'force_datasettag_shacl.json'

    runner.invoke(cli, ['dataset', 'create', 'dataset'])

    paths = []
    for i in range(3):
        new_file = tmpdir.join('file_{0}'.format(i))
        new_file.write(str(i))
        paths.append(str(new_file))

    # add data
    runner.invoke(
        cli,
        ['dataset', 'add', 'dataset'] + paths,
        catch_exceptions=False,
    )

    runner.invoke(
        cli,
        ['dataset', 'tag', 'dataset', '1.0'],
        catch_exceptions=False,
    )

    with client.with_dataset('dataset') as dataset:
        g = dataset.asjsonld()
        rdf = pyld.jsonld.to_rdf(g,
                                 options={
                                     'format': 'application/n-quads',
                                     'produceGeneralizedRdf': True
                                 })

        r, _, t = validate_graph(rdf, shacl_path=str(force_dataset_path))
        assert r is True, t

        r, _, t = validate_graph(rdf, shacl_path=str(force_datasetfile_path))
        assert r is True, t

        r, _, t = validate_graph(rdf, shacl_path=str(force_datasettag_path))
        assert r is True, t

        r, _, t = validate_graph(rdf)
        assert r is True, t
Ejemplo n.º 2
0
def rdf(graph, strict=False):
    """Output the graph as RDF."""
    xml = _conjunctive_graph(graph).serialize(format="application/rdf+xml")
    if strict:
        r, _, t = validate_graph(xml, format="xml")

        if not r:
            raise SHACLValidationError("{}\nCouldn't get log: Invalid Knowledge Graph data".format(t))

    click.echo(xml)
Ejemplo n.º 3
0
def nt(graph, strict=False):
    """Format graph as n-tuples."""
    nt = _conjunctive_graph(graph).serialize(format="nt")
    if strict:
        r, _, t = validate_graph(nt, format="nt")

        if not r:
            raise SHACLValidationError("{}\nCouldn't get log: Invalid Knowledge Graph data".format(t))

    click.echo(nt)
Ejemplo n.º 4
0
def jsonld(graph, strict=False):
    """Format graph as JSON-LD file."""
    ld = _jsonld(graph, "expand")

    if strict:
        r, _, t = validate_graph(ld, format="json-ld")

        if not r:
            raise SHACLValidationError("{}\nCouldn't get log: Invalid Knowledge Graph data".format(t))
    click.echo(ld)
Ejemplo n.º 5
0
def check_shacl_structure(path):
    """Validates all metadata aginst the SHACL schema."""
    with path.open(mode='r') as fp:
        source = yaml.load(fp, Loader=NoDatesSafeLoader) or {}

    rdf = pyld.jsonld.to_rdf(source,
                             options={
                                 'format': 'application/n-quads',
                                 'produceGeneralizedRdf': True
                             })

    return validate_graph(rdf)
Ejemplo n.º 6
0
def test_project_shacl(project, client):
    """Test project metadata structure."""
    from renku.core.models.provenance.agents import Person

    path = Path(
        __file__
    ).parent.parent.parent / 'fixtures' / 'force_project_shacl.json'

    project = client.project
    project.creator = Person(email='*****@*****.**', name='Johnny Doe')

    g = project.as_jsonld()
    rdf = pyld.jsonld.to_rdf(g,
                             options={
                                 'format': 'application/n-quads',
                                 'produceGeneralizedRdf': False
                             })
    r, _, t = validate_graph(rdf, shacl_path=str(path))
    assert r is True, t

    r, _, t = validate_graph(rdf)
    assert r is True, t
Ejemplo n.º 7
0
def test_update(runner, project, run):
    """Test automatic file update."""
    from renku.core.utils.shacl import validate_graph

    cwd = Path(project)
    data = cwd / 'data'
    data.mkdir(exist_ok=True, parents=True)
    source = cwd / 'source.txt'
    output = data / 'result.txt'

    repo = git.Repo(project)

    update_and_commit('1', source, repo)

    assert 0 == run(args=('run', 'wc', '-c'), stdin=source, stdout=output)

    with output.open('r') as f:
        assert f.read().strip() == '1'

    result = runner.invoke(cli, ['status'])
    assert 0 == result.exit_code

    update_and_commit('12', source, repo)

    result = runner.invoke(cli, ['status'])
    assert 1 == result.exit_code

    assert 0 == run()

    result = runner.invoke(cli, ['status'])
    assert 0 == result.exit_code

    with output.open('r') as f:
        assert f.read().strip() == '2'

    result = runner.invoke(cli, ['log'], catch_exceptions=False)
    assert '(part of' in result.output, result.output

    # Source has been updated but output is unchanged.
    update_and_commit('34', source, repo)

    result = runner.invoke(cli, ['status'])
    assert 1 == result.exit_code

    assert 0 == run()

    result = runner.invoke(cli, ['status'])
    assert 0 == result.exit_code

    with output.open('r') as f:
        assert f.read().strip() == '2'

    from renku.cli.log import FORMATS
    for output_format in FORMATS:
        # Make sure the log contains the original parent.
        result = runner.invoke(
            cli,
            ['log', '--format', output_format],
            catch_exceptions=False,
        )
        assert 0 == result.exit_code, result.output
        assert source.name in result.output, output_format

        if output_format == 'nt':
            r, _, t = validate_graph(result.output, format='nt')
            assert r is True, t
Ejemplo n.º 8
0
def test_update(runner, project, renku_cli, no_lfs_warning):
    """Test automatic file update."""
    from renku.core.utils.shacl import validate_graph

    cwd = Path(project)
    data = cwd / DATA_DIR
    data.mkdir(exist_ok=True, parents=True)
    source = cwd / "source.txt"
    output = data / "result.txt"

    repo = git.Repo(project)

    update_and_commit("1", source, repo)

    exit_code, run = renku_cli("run", "wc", "-c", stdin=source, stdout=output)
    assert 0 == exit_code
    assert 0 == len(run.subprocesses)
    previous_run_id = run._id

    with output.open("r") as f:
        assert f.read().strip() == "1"

    result = runner.invoke(cli, ["status"])
    assert 0 == result.exit_code

    update_and_commit("12", source, repo)

    result = runner.invoke(cli, ["status"])
    assert 1 == result.exit_code

    exit_code, run = renku_cli("update")
    assert 0 == exit_code
    assert 0 == len(run.subprocesses)
    assert previous_run_id == run._id
    previous_run_id = run._id

    result = runner.invoke(cli, ["status"])
    assert 0 == result.exit_code

    with output.open("r") as f:
        assert f.read().strip() == "2"

    # Source has been updated but output is unchanged.
    update_and_commit("34", source, repo)

    result = runner.invoke(cli, ["status"])
    assert 1 == result.exit_code

    exit_code, run = renku_cli("update")
    assert 0 == exit_code
    assert 0 == len(run.subprocesses)
    assert previous_run_id == run._id

    result = runner.invoke(cli, ["status"])
    assert 0 == result.exit_code

    with output.open("r") as f:
        assert f.read().strip() == "2"

    from renku.cli.log import FORMATS

    for output_format in FORMATS:
        # Make sure the log contains the original parent.
        result = runner.invoke(
            cli,
            ["log", "--format", output_format],
            catch_exceptions=False,
        )
        assert 0 == result.exit_code, result.output
        assert source.name in result.output, output_format

        if output_format == "nt":
            r, _, t = validate_graph(result.output, format="nt")
            assert r is True, t