From adff60ef7b88d5e6cf765700fc22888768e98506 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:28:52 -0500 Subject: [PATCH 1/3] Align variable name References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_validate/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py index 30a1124..de84989 100644 --- a/case_utils/case_validate/__init__.py +++ b/case_utils/case_validate/__init__.py @@ -56,7 +56,7 @@ def main() -> None: # parser. logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) - case_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] + built_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] # Add arguments specific to case_validate. parser.add_argument( @@ -67,7 +67,7 @@ def main() -> None: ) parser.add_argument( "--built-version", - choices=tuple(case_version_choices_list), + choices=tuple(built_version_choices_list), default="case-"+CURRENT_CASE_VERSION, help="Monolithic aggregation of CASE ontology files at certain versions. Does not require networking to use. Default is most recent CASE release." ) From e0ca0ce066047b765723a117e673308110d79366 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:31:12 -0500 Subject: [PATCH 2/3] Add multi-data-graph handling to case_validate References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- README.md | 2 +- case_utils/case_validate/__init__.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2f6a171..1367780 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ This repository provides `case_validate` as an adaptation of the `pyshacl` comma To see a human-readable validation report of an instance-data file: ```bash -case_validate input.json +case_validate input.json [input-2.json ...] ``` If `input.json` is not conformant, a report will be emitted, and `case_validate` will exit with status `1`. (This is a `pyshacl` behavior, where `0` and `1` report validation success. Status of >`1` is for other errors.) diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py index de84989..97f7e66 100644 --- a/case_utils/case_validate/__init__.py +++ b/case_utils/case_validate/__init__.py @@ -119,12 +119,14 @@ def main() -> None: default=sys.stdout, ) - parser.add_argument("in_graph") + parser.add_argument("in_graph", nargs="+") args = parser.parse_args() data_graph = rdflib.Graph() - data_graph.parse(args.in_graph) + for in_graph in args.in_graph: + _logger.debug("in_graph = %r.", in_graph) + data_graph.parse(in_graph) ontology_graph = rdflib.Graph() if args.built_version != "none": From 822d2a1069e688fbaa5e93594ce560592dd5758e Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:33:57 -0500 Subject: [PATCH 3/3] Test case_validate multi-data-graph handling References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- tests/case_utils/case_validate/cli/Makefile | 35 ++++++++++++++++++- .../case_validate/cli/split_data_graph_1.json | 16 +++++++++ .../case_validate/cli/split_data_graph_2.json | 13 +++++++ .../cli/split_data_graph_PASS.txt | 2 ++ .../cli/split_data_graph_XFAIL.txt | 10 ++++++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_1.json create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_2.json create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_PASS.txt create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt diff --git a/tests/case_utils/case_validate/cli/Makefile b/tests/case_utils/case_validate/cli/Makefile index ac10b28..f61d421 100644 --- a/tests/case_utils/case_validate/cli/Makefile +++ b/tests/case_utils/case_validate/cli/Makefile @@ -39,7 +39,9 @@ files_to_generate := \ format_unspecified_output_jsonld.jsonld \ format_unspecified_output_turtle.ttl \ format_unspecified_output_txt.txt \ - format_unspecified_output_unspecified.txt + format_unspecified_output_unspecified.txt \ + split_data_graph_PASS.txt \ + split_data_graph_XFAIL.txt all: \ $(files_to_generate) @@ -183,3 +185,34 @@ format_unspecified_output_unspecified.txt: \ $< \ > _$@ mv _$@ $@ + +split_data_graph_PASS.txt: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + split_data_graph_1.json \ + split_data_graph_2.json + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + split_data_graph_1.json \ + split_data_graph_2.json \ + > _$@ + mv _$@ $@ + +split_data_graph_XFAIL.txt: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + split_data_graph_1.json + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + split_data_graph_1.json \ + > _$@ \ + ; rc=$$? ; test 1 -eq $$rc + mv _$@ $@ diff --git a/tests/case_utils/case_validate/cli/split_data_graph_1.json b/tests/case_utils/case_validate/cli/split_data_graph_1.json new file mode 100644 index 0000000..04237ba --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_1.json @@ -0,0 +1,16 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "case-investigation": "https://ontology.caseontology.org/case/investigation/", + "uco-core": "https://unifiedcyberontology.org/ontology/uco/core#" + }, + "@graph": [ + { + "@id": "kb:provenance-record-1", + "@type": "case-investigation:ProvenanceRecord", + "uco-core:object": { + "@id": "kb:file-1" + } + } + ] +} diff --git a/tests/case_utils/case_validate/cli/split_data_graph_2.json b/tests/case_utils/case_validate/cli/split_data_graph_2.json new file mode 100644 index 0000000..54df483 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_2.json @@ -0,0 +1,13 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "uco-observable": "https://unifiedcyberontology.org/ontology/uco/observable#" + }, + "@graph": [ + { + "@id": "kb:file-1", + "@type": "uco-observable:File" + } + ] +} + diff --git a/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt b/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt b/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt new file mode 100644 index 0000000..f5fa2c7 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt @@ -0,0 +1,10 @@ +Validation Report +Conforms: False +Results (1): +Constraint Violation in ClassConstraintComponent (http://www.w3.org/ns/shacl#ClassConstraintComponent): + Severity: sh:Violation + Source Shape: [ sh:class core:UcoObject ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:nodeKind sh:BlankNodeOrIRI ; sh:path core:object ] + Focus Node: kb:provenance-record-1 + Value Node: kb:file-1 + Result Path: core:object + Message: Value does not have class core:UcoObject