From 6fd6f1a030a28b3ceb4fe0084ec0e83953c45ba0 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Mon, 1 Jul 2024 13:06:04 +0100 Subject: [PATCH 01/16] keep output if no inconsistencies found with validate plugin, fix provenance info in output graphs --- CHANGELOG.md | 15 +++++++++++++-- README.md | 6 +++++- cmem_plugin_reason/plugin_reason.py | 7 ++++--- cmem_plugin_reason/plugin_validate.py | 26 +++++++++----------------- cmem_plugin_reason/utils.py | 12 ++++-------- tests/test_elk.ttl | 2 +- tests/test_emr.ttl | 2 +- tests/test_hermit.ttl | 2 +- tests/test_jfact.ttl | 2 +- tests/test_structural.ttl | 2 +- tests/test_validate_output.ttl | 2 +- tests/test_whelk.ttl | 2 +- 12 files changed, 42 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98747bb..ee41293 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/) +## [Unreleased] + +### Fixed + +- `prov:generatedBy` in output graphs now refers to a plugin IRI instead of a literal + +### Changed + +- Keep original output ("No explanations found.") if no inconsistencies found with Validate plugin + + ## [1.0.0beta1] 2024-07-01 ### Fixed @@ -13,14 +24,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ### Changed - complete validation for IRI parameters -- Remove "Annnotate inferred subclass axioms" parameter +- remove "Annnotate inferred subclass axioms" parameter in Reason plugin ## [1.0.0alpha3] 2024-06-28 ### Added - "Annotate inferred axioms" parameter in Reason plugin -- "Maximum RAM percentage" parameter in Reason and Validate plugins +- "Maximum RAM percentage" parameter ### Changed diff --git a/README.md b/README.md index 370a27b..4aeae68 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Maximum heap size for the Java virtual machine in the DI container running the r # Validate -In case ontology inconsistencies are found, the plugin outputs the explanation as text in Markdown format using the path "text". +The plugin outputs the explanation as text in Markdown format using the path "text". ## Options @@ -122,6 +122,10 @@ The IRI of the output graph for the reasoning result. If enabled, an explanation markdown file is written to the project. +### Output filename + +The filename of the Markdown file with the explanation of inconsistencies. + :warning: Existing files will be overwritten. ### Stop at inconsistencies diff --git a/cmem_plugin_reason/plugin_reason.py b/cmem_plugin_reason/plugin_reason.py index ab5908c..969c81f 100644 --- a/cmem_plugin_reason/plugin_reason.py +++ b/cmem_plugin_reason/plugin_reason.py @@ -29,6 +29,8 @@ send_result, ) +PLUGIN_IRI = "https://plugin.eccenca.com/cmem-plugin-reason/reason" + @Plugin( label="Reason", @@ -266,8 +268,7 @@ def reason(self, graphs: dict) -> None: f"--language-annotation rdfs:comment " f'"Reasoning result set of <{self.data_graph_iri}> and ' f'<{self.ontology_graph_iri}>" en ' - f"--language-annotation prov:wasGeneratedBy " - f'"cmem-plugin-reason ({self.reasoner})" en ' + f'--link-annotation prov:wasGeneratedBy "{PLUGIN_IRI}/{self.reasoner}" ' f'--link-annotation prov:wasDerivedFrom "{self.data_graph_iri}" ' f"--link-annotation prov:wasDerivedFrom " f'"{self.ontology_graph_iri}" ' @@ -291,4 +292,4 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> None: # noqa: AR self.reason(graphs) setup_cmempy_user_access(context.user) send_result(self.result_graph_iri, Path(self.temp) / "result.ttl") - remove_temp(self, ["catalog-v001.xml", "result.ttl", *graphs.values()]) + remove_temp(self) diff --git a/cmem_plugin_reason/plugin_validate.py b/cmem_plugin_reason/plugin_validate.py index eea52ca..30b935a 100644 --- a/cmem_plugin_reason/plugin_validate.py +++ b/cmem_plugin_reason/plugin_validate.py @@ -36,9 +36,11 @@ send_result, ) +PLUGIN_IRI = "https://plugin.eccenca.com/cmem-plugin-reason/validate" + @Plugin( - label="Validate ontology consistency", + label="Validate", description="", documentation="""""", icon=Icon(package=__package__, file_name="obofoundry.png"), @@ -50,8 +52,7 @@ param_type=BoolParameterType(), name="write_md", label="Write Markdown explanation file", - description="Write Markdown file with explanation to project. ⚠️ Existing files will " - "be overwritten.", + description="Write Markdown file with explanation to project.", default_value=False, ), PluginParameter( @@ -73,7 +74,7 @@ name="md_filename", label="Output filename", description="The filename of the Markdown file with the explanation of " - "inconsistencies.", + "inconsistencies.⚠️ Existing files will be overwritten.", ), PluginParameter( param_type=BoolParameterType(), @@ -151,8 +152,7 @@ def validate(self, graphs: dict) -> None: f'--language-annotation rdfs:label "Ontology Validation Result {utctime}" en ' f"--language-annotation rdfs:comment " f'"Ontology validation of <{self.ontology_graph_iri}>" en ' - f"--language-annotation prov:wasGeneratedBy " - f'"cmem-plugin-validate ({self.reasoner})" en ' + f'--link-annotation prov:wasGeneratedBy "{PLUGIN_IRI}/{self.reasoner}" ' f'--link-annotation prov:wasDerivedFrom "{self.ontology_graph_iri}" ' f'--typed-annotation dc:created "{utctime}" xsd:dateTime ' f'--output "{self.temp}/output.ttl"' @@ -182,26 +182,18 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> Entities | None: self.get_graphs(graphs, context) create_xml_catalog_file(self.temp, graphs) self.validate(graphs) - files = ["catalog-v001.xml", self.md_filename, *graphs.values()] - if self.produce_graph: - files.append("output.ttl") - - text = (Path(self.temp) / self.md_filename).read_text() - if text == "No explanations found.": - remove_temp(self, files) - return None if self.produce_graph: setup_cmempy_user_access(context.user) send_result(self.output_graph_iri, Path(self.temp) / "output.ttl") - if self.write_md: setup_cmempy_user_access(context.user) self.make_resource(context) + text = (Path(self.temp) / self.md_filename).read_text() - remove_temp(self, files) + remove_temp(self) - if self.stop_at_inconsistencies: + if self.stop_at_inconsistencies and text != "No explanations found.": raise RuntimeError("Inconsistencies found in Ontology.") entities = [ diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index eea73a7..627b637 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -4,6 +4,7 @@ import unicodedata from collections import OrderedDict from pathlib import Path +from shutil import rmtree from xml.etree.ElementTree import Element, SubElement, tostring from cmem.cmempy.dp.proxy.graph import get_graph_import_tree, post_streamed @@ -108,14 +109,9 @@ def send_result(iri: str, filepath: Path) -> None: ) -def remove_temp(plugin: WorkflowPlugin, files: list) -> None: - """Remove temproray files""" - for file in files: - try: - (Path(plugin.temp) / file).unlink() - except (OSError, FileNotFoundError) as err: - plugin.log.warning(f"Cannot remove file {file} ({err})") +def remove_temp(plugin: WorkflowPlugin) -> None: + """Remove temporary files""" try: - Path(plugin.temp).rmdir() + rmtree(plugin.temp) except (OSError, FileNotFoundError) as err: plugin.log.warning(f"Cannot remove directory {plugin.temp} ({err})") diff --git a/tests/test_elk.ttl b/tests/test_elk.ttl index 8eb0e56..21dc22b 100644 --- a/tests/test_elk.ttl +++ b/tests/test_elk.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (elk)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals diff --git a/tests/test_emr.ttl b/tests/test_emr.ttl index bb10014..22130a0 100644 --- a/tests/test_emr.ttl +++ b/tests/test_emr.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (emr)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals diff --git a/tests/test_hermit.ttl b/tests/test_hermit.ttl index e1e865e..376fcf9 100644 --- a/tests/test_hermit.ttl +++ b/tests/test_hermit.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (hermit)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals diff --git a/tests/test_jfact.ttl b/tests/test_jfact.ttl index f13d8f3..6f8a857 100644 --- a/tests/test_jfact.ttl +++ b/tests/test_jfact.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (jfact)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals diff --git a/tests/test_structural.ttl b/tests/test_structural.ttl index 8d7f980..ce025bf 100644 --- a/tests/test_structural.ttl +++ b/tests/test_structural.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (structural)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals diff --git a/tests/test_validate_output.ttl b/tests/test_validate_output.ttl index 6c7508b..4b777ad 100644 --- a/tests/test_validate_output.ttl +++ b/tests/test_validate_output.ttl @@ -8,7 +8,7 @@ a owl:Ontology ; rdfs:comment "Ontology validation of "@en ; prov:wasDerivedFrom ; - prov:wasGeneratedBy "cmem-plugin-validate (elk)"@en . + prov:wasGeneratedBy . a owl:NamedIndividual, . diff --git a/tests/test_whelk.ttl b/tests/test_whelk.ttl index 8212b53..eccd0d9 100644 --- a/tests/test_whelk.ttl +++ b/tests/test_whelk.ttl @@ -13,7 +13,7 @@ rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom , ; - prov:wasGeneratedBy "cmem-plugin-reason (whelk)"@en . + prov:wasGeneratedBy . ################################################################# # Individuals From 7be776418ca5cf9b65e66db378aac110bb58e110 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Mon, 1 Jul 2024 14:09:34 +0100 Subject: [PATCH 02/16] TODO: post provenance with query --- cmem_plugin_reason/plugin_validate.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cmem_plugin_reason/plugin_validate.py b/cmem_plugin_reason/plugin_validate.py index 30b935a..c158e9f 100644 --- a/cmem_plugin_reason/plugin_validate.py +++ b/cmem_plugin_reason/plugin_validate.py @@ -175,6 +175,25 @@ def make_resource(self, context: ExecutionContext) -> None: replace=True, ) + def post_provenance(self, plugin_id: str, context: ExecutionContext) -> None: + """TODO: Post provenance with query""" + plugin_iri = f"http://dataintegration.eccenca.com/{context.task.project_id()}/{context.task.task_id()}" + project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" + construct = f""" + PREFIX dif: + CONSTRUCT {{ + GRAPH <{self.output_graph_iri}> {{ + <{self.output_graph_iri}> prov:generatedBy <{plugin_iri}> . + <{plugin_iri}> a . + <{plugin_iri}> ?p ?o . + }} + }} + FROM <{project_graph}> + WHERE {{ + <{plugin_iri}> ?p ?o . + FILTER((STRSTARTS(STR(?p), 'https://vocab.eccenca.com/di/functions/param_')) + }}""" # noqa: F841 + def execute(self, inputs: tuple, context: ExecutionContext) -> Entities | None: # noqa: ARG002 """Run the workflow operator.""" setup_cmempy_user_access(context.user) From 25e170a8171c5c725ffd7c30542fd486c9222210 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Mon, 1 Jul 2024 17:37:38 +0100 Subject: [PATCH 03/16] parameter settings in prov data --- CHANGELOG.md | 2 ++ cmem_plugin_reason/plugin_reason.py | 9 ++++++--- cmem_plugin_reason/plugin_validate.py | 29 +++++++-------------------- cmem_plugin_reason/utils.py | 27 ++++++++++++++++++++++++- tests/test_elk.ttl | 3 +-- tests/test_emr.ttl | 3 +-- tests/test_hermit.ttl | 3 +-- tests/test_jfact.ttl | 3 +-- tests/test_structural.ttl | 3 +-- tests/test_validate_output.ttl | 3 +-- tests/test_whelk.ttl | 3 +-- 11 files changed, 48 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee41293..8a74e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ## [Unreleased] + ### Fixed - `prov:generatedBy` in output graphs now refers to a plugin IRI instead of a literal @@ -13,6 +14,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ### Changed - Keep original output ("No explanations found.") if no inconsistencies found with Validate plugin +- Provenance data in output graphs now includes plugin parameter settings ## [1.0.0beta1] 2024-07-01 diff --git a/cmem_plugin_reason/plugin_reason.py b/cmem_plugin_reason/plugin_reason.py index 969c81f..f9f2578 100644 --- a/cmem_plugin_reason/plugin_reason.py +++ b/cmem_plugin_reason/plugin_reason.py @@ -25,12 +25,11 @@ ROBOT, create_xml_catalog_file, get_graphs_tree, + post_provenance, remove_temp, send_result, ) -PLUGIN_IRI = "https://plugin.eccenca.com/cmem-plugin-reason/reason" - @Plugin( label="Reason", @@ -268,7 +267,6 @@ def reason(self, graphs: dict) -> None: f"--language-annotation rdfs:comment " f'"Reasoning result set of <{self.data_graph_iri}> and ' f'<{self.ontology_graph_iri}>" en ' - f'--link-annotation prov:wasGeneratedBy "{PLUGIN_IRI}/{self.reasoner}" ' f'--link-annotation prov:wasDerivedFrom "{self.data_graph_iri}" ' f"--link-annotation prov:wasDerivedFrom " f'"{self.ontology_graph_iri}" ' @@ -292,4 +290,9 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> None: # noqa: AR self.reason(graphs) setup_cmempy_user_access(context.user) send_result(self.result_graph_iri, Path(self.temp) / "result.ttl") + post_provenance( + self.result_graph_iri, + "cmem_plugin_reason-plugin_reason-ReasonPlugin", + context, + ) remove_temp(self) diff --git a/cmem_plugin_reason/plugin_validate.py b/cmem_plugin_reason/plugin_validate.py index c158e9f..8920676 100644 --- a/cmem_plugin_reason/plugin_validate.py +++ b/cmem_plugin_reason/plugin_validate.py @@ -32,12 +32,11 @@ ROBOT, create_xml_catalog_file, get_graphs_tree, + post_provenance, remove_temp, send_result, ) -PLUGIN_IRI = "https://plugin.eccenca.com/cmem-plugin-reason/validate" - @Plugin( label="Validate", @@ -152,7 +151,6 @@ def validate(self, graphs: dict) -> None: f'--language-annotation rdfs:label "Ontology Validation Result {utctime}" en ' f"--language-annotation rdfs:comment " f'"Ontology validation of <{self.ontology_graph_iri}>" en ' - f'--link-annotation prov:wasGeneratedBy "{PLUGIN_IRI}/{self.reasoner}" ' f'--link-annotation prov:wasDerivedFrom "{self.ontology_graph_iri}" ' f'--typed-annotation dc:created "{utctime}" xsd:dateTime ' f'--output "{self.temp}/output.ttl"' @@ -175,25 +173,6 @@ def make_resource(self, context: ExecutionContext) -> None: replace=True, ) - def post_provenance(self, plugin_id: str, context: ExecutionContext) -> None: - """TODO: Post provenance with query""" - plugin_iri = f"http://dataintegration.eccenca.com/{context.task.project_id()}/{context.task.task_id()}" - project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" - construct = f""" - PREFIX dif: - CONSTRUCT {{ - GRAPH <{self.output_graph_iri}> {{ - <{self.output_graph_iri}> prov:generatedBy <{plugin_iri}> . - <{plugin_iri}> a . - <{plugin_iri}> ?p ?o . - }} - }} - FROM <{project_graph}> - WHERE {{ - <{plugin_iri}> ?p ?o . - FILTER((STRSTARTS(STR(?p), 'https://vocab.eccenca.com/di/functions/param_')) - }}""" # noqa: F841 - def execute(self, inputs: tuple, context: ExecutionContext) -> Entities | None: # noqa: ARG002 """Run the workflow operator.""" setup_cmempy_user_access(context.user) @@ -205,6 +184,12 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> Entities | None: if self.produce_graph: setup_cmempy_user_access(context.user) send_result(self.output_graph_iri, Path(self.temp) / "output.ttl") + post_provenance( + self.output_graph_iri, + "cmem_plugin_reason-plugin_validate-ValidatePlugin", + context, + ) + if self.write_md: setup_cmempy_user_access(context.user) self.make_resource(context) diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index 627b637..cb7561c 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -8,10 +8,11 @@ from xml.etree.ElementTree import Element, SubElement, tostring from cmem.cmempy.dp.proxy.graph import get_graph_import_tree, post_streamed +from cmem.cmempy.dp.proxy.update import post from cmem_plugin_base.dataintegration.description import PluginParameter from cmem_plugin_base.dataintegration.parameter.choice import ChoiceParameterType from cmem_plugin_base.dataintegration.parameter.graph import GraphParameterType -from cmem_plugin_base.dataintegration.plugins import WorkflowPlugin +from cmem_plugin_base.dataintegration.plugins import ExecutionContext, WorkflowPlugin from cmem_plugin_base.dataintegration.types import IntParameterType from defusedxml import minidom @@ -115,3 +116,27 @@ def remove_temp(plugin: WorkflowPlugin) -> None: rmtree(plugin.temp) except (OSError, FileNotFoundError) as err: plugin.log.warning(f"Cannot remove directory {plugin.temp} ({err})") + + +def post_provenance(graph: str, plugin_id: str, context: ExecutionContext) -> None: + """Insert provenance""" + plugin_iri = ( + f"http://dataintegration.eccenca.com/{context.task.project_id()}/{context.task.task_id()}" + ) + project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" + query = f""" + INSERT {{ + GRAPH <{graph}> {{ + <{graph}> <{plugin_iri}> . + <{plugin_iri}> a . + <{plugin_iri}> ?p ?o . + }} + }} + WHERE {{ + GRAPH <{project_graph}> {{ + <{plugin_iri}> ?p ?o . + FILTER(STRSTARTS(STR(?p), "https://vocab.eccenca.com/di/functions/param_")) + }} + }}""" + + post(query=query) diff --git a/tests/test_elk.ttl b/tests/test_elk.ttl index 21dc22b..0bac834 100644 --- a/tests/test_elk.ttl +++ b/tests/test_elk.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals diff --git a/tests/test_emr.ttl b/tests/test_emr.ttl index 22130a0..2ddd71a 100644 --- a/tests/test_emr.ttl +++ b/tests/test_emr.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals diff --git a/tests/test_hermit.ttl b/tests/test_hermit.ttl index 376fcf9..a81aaf7 100644 --- a/tests/test_hermit.ttl +++ b/tests/test_hermit.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals diff --git a/tests/test_jfact.ttl b/tests/test_jfact.ttl index 6f8a857..a81aaf7 100644 --- a/tests/test_jfact.ttl +++ b/tests/test_jfact.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals diff --git a/tests/test_structural.ttl b/tests/test_structural.ttl index ce025bf..587f20b 100644 --- a/tests/test_structural.ttl +++ b/tests/test_structural.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals diff --git a/tests/test_validate_output.ttl b/tests/test_validate_output.ttl index 4b777ad..b9b5886 100644 --- a/tests/test_validate_output.ttl +++ b/tests/test_validate_output.ttl @@ -7,8 +7,7 @@ a owl:Ontology ; rdfs:comment "Ontology validation of "@en ; - prov:wasDerivedFrom ; - prov:wasGeneratedBy . + prov:wasDerivedFrom . a owl:NamedIndividual, . diff --git a/tests/test_whelk.ttl b/tests/test_whelk.ttl index eccd0d9..2247138 100644 --- a/tests/test_whelk.ttl +++ b/tests/test_whelk.ttl @@ -12,8 +12,7 @@ owl:imports vocab: ; rdfs:comment "Reasoning result set of and "@en ; prov:wasDerivedFrom - , ; - prov:wasGeneratedBy . + , . ################################################################# # Individuals From a33553697b50c81fdba0d390b66a8dfb386d7eda Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:00:35 +0100 Subject: [PATCH 04/16] fix provenance data when parameters are set on config port --- cmem_plugin_reason/plugin_reason.py | 22 ++++----- cmem_plugin_reason/plugin_validate.py | 7 +-- cmem_plugin_reason/utils.py | 66 +++++++++++++++++++++------ tests/test_reason.py | 2 +- 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/cmem_plugin_reason/plugin_reason.py b/cmem_plugin_reason/plugin_reason.py index f9f2578..9f3dc76 100644 --- a/cmem_plugin_reason/plugin_reason.py +++ b/cmem_plugin_reason/plugin_reason.py @@ -57,7 +57,7 @@ ), PluginParameter( param_type=StringParameterType(), - name="result_graph_iri", + name="output_graph_iri", label="Result graph IRI", description="The IRI of the output graph for the reasoning result. ⚠️ Existing graphs " "will be overwritten.", @@ -169,7 +169,7 @@ def __init__( # noqa: PLR0913 self, data_graph_iri: str = "", ontology_graph_iri: str = "", - result_graph_iri: str = "", + output_graph_iri: str = "", reasoner: str = "elk", class_assertion: bool = False, data_property_characteristic: bool = False, @@ -208,11 +208,11 @@ def __init__( # noqa: PLR0913 errors += 'Invalid IRI for parameter "Data graph IRI". ' if not validators.url(ontology_graph_iri): errors += 'Invalid IRI for parameter "Ontology graph IRI". ' - if not validators.url(result_graph_iri): + if not validators.url(output_graph_iri): errors += 'Invalid IRI for parameter "Result graph IRI". ' - if result_graph_iri and result_graph_iri == data_graph_iri: + if output_graph_iri and output_graph_iri == data_graph_iri: errors += "Result graph IRI cannot be the same as the data graph IRI. " - if result_graph_iri and result_graph_iri == ontology_graph_iri: + if output_graph_iri and output_graph_iri == ontology_graph_iri: errors += "Result graph IRI cannot be the same as the ontology graph IRI. " if reasoner not in REASONERS: errors += 'Invalid value for parameter "Reasoner". ' @@ -224,7 +224,7 @@ def __init__( # noqa: PLR0913 raise ValueError(errors[:-1]) self.data_graph_iri = data_graph_iri self.ontology_graph_iri = ontology_graph_iri - self.result_graph_iri = result_graph_iri + self.output_graph_iri = output_graph_iri self.reasoner = reasoner self.max_ram_percentage = max_ram_percentage self.temp = f"reason_{uuid4().hex}" @@ -261,7 +261,7 @@ def reason(self, graphs: dict) -> None: f"--exclude-external-entities " f"reduce --reasoner {self.reasoner} " f'unmerge --input "{data_location}" ' - f'annotate --ontology-iri "{self.result_graph_iri}" ' + f'annotate --ontology-iri "{self.output_graph_iri}" ' f"--remove-annotations " f'--language-annotation rdfs:label "Eccenca Reasoning Result {utctime}" en ' f"--language-annotation rdfs:comment " @@ -289,10 +289,6 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> None: # noqa: AR create_xml_catalog_file(self.temp, graphs) self.reason(graphs) setup_cmempy_user_access(context.user) - send_result(self.result_graph_iri, Path(self.temp) / "result.ttl") - post_provenance( - self.result_graph_iri, - "cmem_plugin_reason-plugin_reason-ReasonPlugin", - context, - ) + send_result(self.output_graph_iri, Path(self.temp) / "result.ttl") + post_provenance(self, context) remove_temp(self) diff --git a/cmem_plugin_reason/plugin_validate.py b/cmem_plugin_reason/plugin_validate.py index 8920676..8172f89 100644 --- a/cmem_plugin_reason/plugin_validate.py +++ b/cmem_plugin_reason/plugin_validate.py @@ -184,11 +184,8 @@ def execute(self, inputs: tuple, context: ExecutionContext) -> Entities | None: if self.produce_graph: setup_cmempy_user_access(context.user) send_result(self.output_graph_iri, Path(self.temp) / "output.ttl") - post_provenance( - self.output_graph_iri, - "cmem_plugin_reason-plugin_validate-ValidatePlugin", - context, - ) + setup_cmempy_user_access(context.user) + post_provenance(self, context) if self.write_md: setup_cmempy_user_access(context.user) diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index cb7561c..d422c6c 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -1,5 +1,6 @@ """Common constants and functions""" +import json import re import unicodedata from collections import OrderedDict @@ -8,7 +9,8 @@ from xml.etree.ElementTree import Element, SubElement, tostring from cmem.cmempy.dp.proxy.graph import get_graph_import_tree, post_streamed -from cmem.cmempy.dp.proxy.update import post +from cmem.cmempy.dp.proxy.sparql import post as post_select +from cmem.cmempy.dp.proxy.update import post as post_update from cmem_plugin_base.dataintegration.description import PluginParameter from cmem_plugin_base.dataintegration.parameter.choice import ChoiceParameterType from cmem_plugin_base.dataintegration.parameter.graph import GraphParameterType @@ -118,25 +120,61 @@ def remove_temp(plugin: WorkflowPlugin) -> None: plugin.log.warning(f"Cannot remove directory {plugin.temp} ({err})") -def post_provenance(graph: str, plugin_id: str, context: ExecutionContext) -> None: +def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: """Insert provenance""" plugin_iri = ( f"http://dataintegration.eccenca.com/{context.task.project_id()}/{context.task.task_id()}" ) project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" - query = f""" - INSERT {{ - GRAPH <{graph}> {{ - <{graph}> <{plugin_iri}> . - <{plugin_iri}> a . - <{plugin_iri}> ?p ?o . - }} - }} - WHERE {{ + + type_query = f""" + SELECT ?parameter ?type {{ GRAPH <{project_graph}> {{ - <{plugin_iri}> ?p ?o . - FILTER(STRSTARTS(STR(?p), "https://vocab.eccenca.com/di/functions/param_")) + <{plugin_iri}> a ?type . + FILTER(STRSTARTS(STR(?type), "https://vocab.eccenca.com/di/functions/")) }} }}""" + result = json.loads(post_select(query=type_query)) + + try: + plugin_type = result["results"]["bindings"][0]["type"]["value"] + except IndexError: + plugin.log.warning("Could not add provenance data to output file") + return + + plugin.log.info(str(plugin_type)) + + parameter_query = f""" + SELECT ?parameter ?type {{ + GRAPH <{project_graph}> {{ + <{plugin_iri}> ?parameter ?o . + FILTER(STRSTARTS(STR(?parameter), "https://vocab.eccenca.com/di/functions/param_")) + }} + }}""" + + param_split = ( + plugin_type.replace( + "https://vocab.eccenca.com/di/functions/Plugin_", + "https://vocab.eccenca.com/di/functions/param_", + ) + + "_" + ) + + result = json.loads(post_select(query=parameter_query)) + param_sparql = f"<{plugin_iri}> a <{plugin_type}> . " + for binding in result["results"]["bindings"]: + param_iri = binding["parameter"]["value"] + param_val = plugin.__dict__[binding["parameter"]["value"].split(param_split)[1]] + param_sparql += f'\n<{plugin_iri}> <{param_iri}> "{param_val}" . ' + + insert_query = f""" + INSERT DATA {{ + GRAPH <{plugin.output_graph_iri}> {{ + <{plugin.output_graph_iri}> <{plugin_iri}> . + {param_sparql} + }} + }} + """ - post(query=query) + plugin.log.info(insert_query) + post_update(query=insert_query) diff --git a/tests/test_reason.py b/tests/test_reason.py index b3050c5..0a1d718 100644 --- a/tests/test_reason.py +++ b/tests/test_reason.py @@ -71,7 +71,7 @@ def test_reasoner(reasoner: str, err_list: list) -> list: ReasonPlugin( data_graph_iri=REASON_DATA_GRAPH_IRI, ontology_graph_iri=REASON_ONTOLOGY_GRAPH_IRI, - result_graph_iri=REASON_RESULT_GRAPH_IRI, + output_graph_iri=REASON_RESULT_GRAPH_IRI, reasoner=reasoner, sub_class=False, class_assertion=True, From 6c3687e33a8202acf34ce92a81afd4b411fa68d0 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:02:17 +0100 Subject: [PATCH 05/16] poetry update --- poetry.lock | 163 ++++++++++++++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 76 deletions(-) diff --git a/poetry.lock b/poetry.lock index 61c0e7c..81e5008 100644 --- a/poetry.lock +++ b/poetry.lock @@ -626,84 +626,95 @@ test = ["Faker (>=1.0.8)", "allpairspy (>=2)", "click (>=6.2)", "pytest (>=6.0.1 [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -1022,18 +1033,18 @@ setuptools = "*" [[package]] name = "setuptools" -version = "70.1.1" +version = "70.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" From 0ea55c4529386e1a222a2bc23020cda943df69bc Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:11:22 +0100 Subject: [PATCH 06/16] remove redundant lines --- cmem_plugin_reason/utils.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index d422c6c..fbcc9d2 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -128,12 +128,13 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" type_query = f""" - SELECT ?parameter ?type {{ + SELECT ?type {{ GRAPH <{project_graph}> {{ <{plugin_iri}> a ?type . FILTER(STRSTARTS(STR(?type), "https://vocab.eccenca.com/di/functions/")) }} }}""" + result = json.loads(post_select(query=type_query)) try: @@ -142,16 +143,6 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: plugin.log.warning("Could not add provenance data to output file") return - plugin.log.info(str(plugin_type)) - - parameter_query = f""" - SELECT ?parameter ?type {{ - GRAPH <{project_graph}> {{ - <{plugin_iri}> ?parameter ?o . - FILTER(STRSTARTS(STR(?parameter), "https://vocab.eccenca.com/di/functions/param_")) - }} - }}""" - param_split = ( plugin_type.replace( "https://vocab.eccenca.com/di/functions/Plugin_", @@ -160,6 +151,14 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: + "_" ) + parameter_query = f""" + SELECT ?parameter {{ + GRAPH <{project_graph}> {{ + <{plugin_iri}> ?parameter ?o . + FILTER(STRSTARTS(STR(?parameter), "https://vocab.eccenca.com/di/functions/param_")) + }} + }}""" + result = json.loads(post_select(query=parameter_query)) param_sparql = f"<{plugin_iri}> a <{plugin_type}> . " for binding in result["results"]["bindings"]: @@ -173,8 +172,6 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: <{plugin.output_graph_iri}> <{plugin_iri}> . {param_sparql} }} - }} - """ + }}""" - plugin.log.info(insert_query) post_update(query=insert_query) From 3600a493e5d02a8fe0851480938b2dac6978a02c Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:18:23 +0100 Subject: [PATCH 07/16] correct IndexError message --- cmem_plugin_reason/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index fbcc9d2..bc54abe 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -140,7 +140,7 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: try: plugin_type = result["results"]["bindings"][0]["type"]["value"] except IndexError: - plugin.log.warning("Could not add provenance data to output file") + plugin.log.warning("Could not add provenance data to output graph.") return param_split = ( From 796a8a56f3fda72cd9f35c282ecbd8a0953b0fd4 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:19:35 +0100 Subject: [PATCH 08/16] edit changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a74e3f..03a8d2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ### Fixed -- `prov:generatedBy` in output graphs now refers to a plugin IRI instead of a literal +- `prov:wasGeneratedBy` in output graphs now refers to a plugin IRI instead of a literal ### Changed From f835bf628c85984e5fc74b24ddb12c1a890f6a86 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 00:21:12 +0100 Subject: [PATCH 09/16] edit changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a8d2e..2ce8049 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ### Changed -- Keep original output ("No explanations found.") if no inconsistencies found with Validate plugin -- Provenance data in output graphs now includes plugin parameter settings +- keep original output ("No explanations found.") if no inconsistencies found with Validate plugin +- provenance data in output graphs now includes plugin parameter settings ## [1.0.0beta1] 2024-07-01 From dfac802954d2e780f7d36b143821e5844a239a97 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 12:53:05 +0100 Subject: [PATCH 10/16] fix Reason parameter provenance, new iri for plugin in provenance data --- cmem_plugin_reason/plugin_reason.py | 14 ++++++++++++++ cmem_plugin_reason/utils.py | 14 ++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/cmem_plugin_reason/plugin_reason.py b/cmem_plugin_reason/plugin_reason.py index 9f3dc76..7666285 100644 --- a/cmem_plugin_reason/plugin_reason.py +++ b/cmem_plugin_reason/plugin_reason.py @@ -187,6 +187,20 @@ def __init__( # noqa: PLR0913 sub_object_property: bool = False, max_ram_percentage: int = MAX_RAM_PERCENTAGE_DEFAULT, ) -> None: + self.sub_class = sub_class + self.equivalent_class = equivalent_class + self.disjoint_classes = disjoint_classes + self.data_property_characteristic = data_property_characteristic + self.equivalent_data_properties = equivalent_data_properties + self.sub_data_property = sub_data_property + self.class_assertion = class_assertion + self.property_assertion = property_assertion + self.equivalent_object_property = equivalent_object_property + self.inverse_object_properties = inverse_object_properties + self.object_property_characteristic = object_property_characteristic + self.sub_object_property = sub_object_property + self.object_property_range = object_property_range + self.object_property_domain = object_property_domain self.axioms = { "SubClass": sub_class, "EquivalentClass": equivalent_class, diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index bc54abe..c243d2e 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -5,6 +5,7 @@ import unicodedata from collections import OrderedDict from pathlib import Path +from secrets import token_hex from shutil import rmtree from xml.etree.ElementTree import Element, SubElement, tostring @@ -128,9 +129,10 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" type_query = f""" - SELECT ?type {{ + SELECT ?type ?label {{ GRAPH <{project_graph}> {{ <{plugin_iri}> a ?type . + <{plugin_iri}> ?label . FILTER(STRSTARTS(STR(?type), "https://vocab.eccenca.com/di/functions/")) }} }}""" @@ -142,6 +144,7 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: except IndexError: plugin.log.warning("Could not add provenance data to output graph.") return + plugin_label = result["results"]["bindings"][0]["label"]["value"] param_split = ( plugin_type.replace( @@ -159,17 +162,20 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: }} }}""" + new_plugin_iri = f'{"_".join(plugin_iri.split("_")[:-1])}_{token_hex(8)}' result = json.loads(post_select(query=parameter_query)) - param_sparql = f"<{plugin_iri}> a <{plugin_type}> . " + param_sparql = "" for binding in result["results"]["bindings"]: param_iri = binding["parameter"]["value"] param_val = plugin.__dict__[binding["parameter"]["value"].split(param_split)[1]] - param_sparql += f'\n<{plugin_iri}> <{param_iri}> "{param_val}" . ' + param_sparql += f'\n<{new_plugin_iri}> <{param_iri}> "{param_val}" .' insert_query = f""" INSERT DATA {{ GRAPH <{plugin.output_graph_iri}> {{ - <{plugin.output_graph_iri}> <{plugin_iri}> . + <{plugin.output_graph_iri}> <{new_plugin_iri}> . + <{new_plugin_iri}> a <{plugin_type}>, . + <{new_plugin_iri}> "{plugin_label}" . {param_sparql} }} }}""" From bb100fa57ae37d17f503cc951816613c006250f6 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Tue, 2 Jul 2024 13:00:33 +0100 Subject: [PATCH 11/16] fix line too long --- cmem_plugin_reason/utils.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index c243d2e..e0fd6f3 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -172,12 +172,13 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: insert_query = f""" INSERT DATA {{ - GRAPH <{plugin.output_graph_iri}> {{ - <{plugin.output_graph_iri}> <{new_plugin_iri}> . - <{new_plugin_iri}> a <{plugin_type}>, . - <{new_plugin_iri}> "{plugin_label}" . - {param_sparql} - }} + GRAPH <{plugin.output_graph_iri}> {{ + <{plugin.output_graph_iri}> + <{new_plugin_iri}> . + <{new_plugin_iri}> a <{plugin_type}>, . + <{new_plugin_iri}> "{plugin_label}" . + {param_sparql} + }} }}""" post_update(query=insert_query) From 98329423adb2a98599f416e54ab9c682306ed4d8 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Wed, 3 Jul 2024 08:55:33 +0100 Subject: [PATCH 12/16] refactor --- cmem_plugin_reason/plugin_reason.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cmem_plugin_reason/plugin_reason.py b/cmem_plugin_reason/plugin_reason.py index 7666285..9f46666 100644 --- a/cmem_plugin_reason/plugin_reason.py +++ b/cmem_plugin_reason/plugin_reason.py @@ -187,20 +187,6 @@ def __init__( # noqa: PLR0913 sub_object_property: bool = False, max_ram_percentage: int = MAX_RAM_PERCENTAGE_DEFAULT, ) -> None: - self.sub_class = sub_class - self.equivalent_class = equivalent_class - self.disjoint_classes = disjoint_classes - self.data_property_characteristic = data_property_characteristic - self.equivalent_data_properties = equivalent_data_properties - self.sub_data_property = sub_data_property - self.class_assertion = class_assertion - self.property_assertion = property_assertion - self.equivalent_object_property = equivalent_object_property - self.inverse_object_properties = inverse_object_properties - self.object_property_characteristic = object_property_characteristic - self.sub_object_property = sub_object_property - self.object_property_range = object_property_range - self.object_property_domain = object_property_domain self.axioms = { "SubClass": sub_class, "EquivalentClass": equivalent_class, @@ -236,6 +222,20 @@ def __init__( # noqa: PLR0913 errors += 'Invalid value for parameter "Maximum RAM Percentage". ' if errors: raise ValueError(errors[:-1]) + self.sub_class = sub_class + self.equivalent_class = equivalent_class + self.disjoint_classes = disjoint_classes + self.data_property_characteristic = data_property_characteristic + self.equivalent_data_properties = equivalent_data_properties + self.sub_data_property = sub_data_property + self.class_assertion = class_assertion + self.property_assertion = property_assertion + self.equivalent_object_property = equivalent_object_property + self.inverse_object_properties = inverse_object_properties + self.object_property_characteristic = object_property_characteristic + self.sub_object_property = sub_object_property + self.object_property_range = object_property_range + self.object_property_domain = object_property_domain self.data_graph_iri = data_graph_iri self.ontology_graph_iri = ontology_graph_iri self.output_graph_iri = output_graph_iri From 49009a4c4ae43088a4bbbd1255c0eecaa5341beb Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Thu, 4 Jul 2024 10:16:41 +0100 Subject: [PATCH 13/16] edit descriptions/labels, new icons --- CHANGELOG.md | 1 + cmem_plugin_reason/obofoundry.png | Bin 10037 -> 0 bytes cmem_plugin_reason/plugin_reason.py | 11 +++++------ cmem_plugin_reason/plugin_validate.py | 10 +++++++--- cmem_plugin_reason/reason.png | Bin 0 -> 2675 bytes cmem_plugin_reason/utils.py | 19 +++++++++++-------- cmem_plugin_reason/validate.png | Bin 0 -> 28412 bytes 7 files changed, 24 insertions(+), 17 deletions(-) delete mode 100644 cmem_plugin_reason/obofoundry.png create mode 100644 cmem_plugin_reason/reason.png create mode 100644 cmem_plugin_reason/validate.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ce8049..6f7683e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - complete validation for IRI parameters - remove "Annnotate inferred subclass axioms" parameter in Reason plugin +- new icons ## [1.0.0alpha3] 2024-06-28 diff --git a/cmem_plugin_reason/obofoundry.png b/cmem_plugin_reason/obofoundry.png deleted file mode 100644 index 0cdc0a1d3de6dfb1f6d3e11d77460b551d4e9d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10037 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 literal 0 HcmV?d00001 diff --git a/cmem_plugin_reason/utils.py b/cmem_plugin_reason/utils.py index e0fd6f3..71a788a 100644 --- a/cmem_plugin_reason/utils.py +++ b/cmem_plugin_reason/utils.py @@ -129,13 +129,14 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: project_graph = f"http://di.eccenca.com/project/{context.task.project_id()}" type_query = f""" - SELECT ?type ?label {{ - GRAPH <{project_graph}> {{ - <{plugin_iri}> a ?type . - <{plugin_iri}> ?label . - FILTER(STRSTARTS(STR(?type), "https://vocab.eccenca.com/di/functions/")) + SELECT ?type ?label {{ + GRAPH <{project_graph}> {{ + <{plugin_iri}> a ?type . + <{plugin_iri}> ?label . + FILTER(STRSTARTS(STR(?type), "https://vocab.eccenca.com/di/functions/")) + }} }} - }}""" + """ result = json.loads(post_select(query=type_query)) @@ -160,7 +161,8 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: <{plugin_iri}> ?parameter ?o . FILTER(STRSTARTS(STR(?parameter), "https://vocab.eccenca.com/di/functions/param_")) }} - }}""" + }} + """ new_plugin_iri = f'{"_".join(plugin_iri.split("_")[:-1])}_{token_hex(8)}' result = json.loads(post_select(query=parameter_query)) @@ -179,6 +181,7 @@ def post_provenance(plugin: WorkflowPlugin, context: ExecutionContext) -> None: <{new_plugin_iri}> "{plugin_label}" . {param_sparql} }} - }}""" + }} + """ post_update(query=insert_query) diff --git a/cmem_plugin_reason/validate.png b/cmem_plugin_reason/validate.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9fb8c8409a17280fd2b66c8421c8668ffc8eda GIT binary patch literal 28412 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 literal 0 HcmV?d00001 From 4776b225074e705f7a5eaaeefbdb353540ac590f Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Thu, 4 Jul 2024 10:18:18 +0100 Subject: [PATCH 14/16] poetry update --- poetry.lock | 82 ++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/poetry.lock b/poetry.lock index 81e5008..2db8076 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -485,48 +485,48 @@ files = [ [[package]] name = "memray" -version = "1.13.2" +version = "1.13.3" description = "A memory profiler for Python applications" optional = false python-versions = ">=3.7.0" files = [ - {file = "memray-1.13.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:a773eabc0a7dad693eec193e28027130ba1d82ffa5345143f49f4a0bdc1c6c65"}, - {file = "memray-1.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb1c75ae62c8aea7010df4d4ec5ddf057ebe0ac6e694d852bf1c732dc6b9febc"}, - {file = "memray-1.13.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9caec18ec308d126229053d366240271cca2186f3c1941ba9cba5ab787259a4e"}, - {file = "memray-1.13.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa2efe628159035ae39a458de81b6f0816eced2c10d66700cf84dacbe0a3bd6"}, - {file = "memray-1.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9852484e199c7111e6d571f4fef0e0360dde8f88449d9c5c8e6f1358bdb0ba10"}, - {file = "memray-1.13.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:99865a5e913337abaff03627be96c1924e5bdf41d716c3f3e30a29dae0c34dbc"}, - {file = "memray-1.13.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6f59d65392d3725770c136d2773b78d90a67a84041570773fed253991adc7f7a"}, - {file = "memray-1.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1b8d4f2bb000f526767004e065db59e403a1bf428c216576a168e54dac3f1e4"}, - {file = "memray-1.13.2-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ab90162027af022b14fa03420112efee7b1dbf110591d16b442701932c95f2c"}, - {file = "memray-1.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74c076899614eaae7e5b00473980dd75fecf09c22206db49f0861e076b460793"}, - {file = "memray-1.13.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39a1dd4a2004dfaa254bc5469cddfead716001290ad18705e9a39197ee3f529d"}, - {file = "memray-1.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd3bfb4d51d36d826fdec40079e527012e167ba1a4ff0dac843749c631164ed6"}, - {file = "memray-1.13.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b295a5046b9327852b9f2010cb721317ef61b2f5ed816651d135e971ece3044d"}, - {file = "memray-1.13.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:3855b81d1d8307a2209540011fb683f65854b01c92bf4fe3d34866a96bcd7fb9"}, - {file = "memray-1.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c87b688359de63a22308bb0879693cf9c81577a3c535d4a08d4c7130ed01871"}, - {file = "memray-1.13.2-cp312-cp312-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f441e05dc472a1be07fbcf1217f4572d682c5814fac083523d603bc418b70f07"}, - {file = "memray-1.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b9e35f1bdebe63bb719eac3866fd07ed8b9ffc1bdcbfff3e0d29140d335b8f1"}, - {file = "memray-1.13.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7880f21a2df374d6d95004e7f55075516e57892e4ab1e77f5df65dd2ad382a86"}, - {file = "memray-1.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9787b9f1a85fe29b0eb7b963201a4a608f8ec7de9b84bb72d672f2308a59cf33"}, - {file = "memray-1.13.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:326acdae17de17e7632598853774a7e09ad1b72eae2d3755f88a212e17ba7813"}, - {file = "memray-1.13.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c7ba0bd98323c71a5f2cafa81e74d232e9d1c7437682fdf1cb8833ec2c70f08"}, - {file = "memray-1.13.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d00ba714d6f8fe32fbfdf75f2d1b6755edcd7c6835efc4a65fa58943c0b53e62"}, - {file = "memray-1.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bef98aaf398cb7f47669808d5febdad4323050f32f6e73ec3bfc6f7c04aacb0"}, - {file = "memray-1.13.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:300c3710d6ddd291d6b53402e11c0de5818223e58e21ca1d42817f36dee29b24"}, - {file = "memray-1.13.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:5e63552376567283a388e67382534017909891df8500d92e2dad1ebd3762d5b1"}, - {file = "memray-1.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f09742556da269712cc89a7acaaa0825db15547ac1d03490f09ba3c2bf381f3"}, - {file = "memray-1.13.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c5595539579f3f662acf794d8ac2fd3f23d3a24c4aea893a15b307c2727c3c8"}, - {file = "memray-1.13.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60176bf3015a155233d8cfaf7a6141eedc3ce5e89231892a96e162c073fb42cd"}, - {file = "memray-1.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfa76dce73e6ee263d254345affc8bf7d4db8f899b7af396a0f5e37899f28aac"}, - {file = "memray-1.13.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:59bcb96af1a3462626575de4763c88217d9c1561d8c166c9a10f00a0c19ad8d1"}, - {file = "memray-1.13.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:cdd35bf96776c27ffb326c2c4b6f9b50d9461b25f98574df98771593768eb803"}, - {file = "memray-1.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48449deeb65de71c0fda4ce9b539a9f35fe2634af3bcac367167903bab25cff0"}, - {file = "memray-1.13.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71021329db86e03840fe210c5a6581500a069736e6f8835b2dae9c8e6be96302"}, - {file = "memray-1.13.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db87adfbf05cec117b75cdafb7e2627d649b72f15a191e106375ee0acdd54b53"}, - {file = "memray-1.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6305ea70ddd15b9897abcc6f234b8aa94d4135146381b3d68fc97ec2d8d3f7ec"}, - {file = "memray-1.13.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1f38100fedec5c318c00654864ff2e6e8b8ffdb472206047e300337c2d55bb37"}, - {file = "memray-1.13.2.tar.gz", hash = "sha256:355803182ea4a61dcb456c4c1e765f929123fc2b6998ba44efa4ae32b763e05b"}, + {file = "memray-1.13.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:47d2eb555d24e006cd6bac4390627ff227387a9e5cbc4257b08b2842ca202763"}, + {file = "memray-1.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b32061ef473c35feccf2b65771b3b803bd9f7c2b1c31499ce8dac892f6cb79b"}, + {file = "memray-1.13.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc5cdde5c0db11bb52ccffe0a155a4324db2d8ffe5a82d222cdc31eea09d927e"}, + {file = "memray-1.13.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8f2856d392e60de240cd024843a4a7902644a2064562390196ad11b87f08e5ed"}, + {file = "memray-1.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c644b9408bec95cd66bc1184c46a5dfc084e5305f2b764213bef3438bc75bf63"}, + {file = "memray-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e4637da6a98ba546daccc5d033d82f67e8ee1d3e683e8c4d92c4dae94ccf57e9"}, + {file = "memray-1.13.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:3d1bbe9208ad5f73c1e327fbe7c42cce4b22a2c656f876944449f817a6f2645c"}, + {file = "memray-1.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26849671728dfbd09c46cfe62e01acb51e6322bc33e3478143d91a5f6b19b6f8"}, + {file = "memray-1.13.3-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d6673df94ddb3216b3ea35ece621e496fcbbaf886edddd2390d63f896a625f55"}, + {file = "memray-1.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86f4ab3d99e3747da26a3ba18884db86ac231789133227a50a8925eceda75c1e"}, + {file = "memray-1.13.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c031896590c9b2ec68dcbe05d2d32f4dba1757a46aaffa725a1505afdf956eae"}, + {file = "memray-1.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a61155b9b562ffd8485bf171fc656bdb44d429036f90d1739b5d13f9b8c2e50d"}, + {file = "memray-1.13.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:348e06153a2a582019e07c2f773339d64fac6807a05e9c7569c3281215ce5ed4"}, + {file = "memray-1.13.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:7377760d9996e92a07bfa9ff4f1d9144c3bc64d144846363fe3b0a19594141f2"}, + {file = "memray-1.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb77a2b05e22496657cff0692161b2494da69b83d250754377861c484b0f58a6"}, + {file = "memray-1.13.3-cp312-cp312-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18fb9a6288fcdf054f9130eb94cf029bd69670b5cf961fd670ae02b8dad19331"}, + {file = "memray-1.13.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772139fbbe48d7a47946b0916ca7c1e20f2d4ae5112dc6e372cce7d997238d81"}, + {file = "memray-1.13.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd064c4bf3e58c872d597036c3c9d4cfd0e360e9b18c22a601864f484771ffd4"}, + {file = "memray-1.13.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5627ccca0b9b9fcc1a2596486f969d8505dcc7587c73d8b58710aff96ffe3b1"}, + {file = "memray-1.13.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1b5e5f33000fe454219f6d3ecc5179d3de667baf4de0438bba5524e7cee62c0"}, + {file = "memray-1.13.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5ef12dbe43815d2b362e32f7672cb8d4a4b89d3e16b1f6272ac34aa4f56ef97e"}, + {file = "memray-1.13.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c796471031ed8d300317141f96308abd6550c5b8d4dd4aebafa07d3c1d193ab8"}, + {file = "memray-1.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1b6569fdcc352bddf5433bd000b9db4bd5441e9c4afb0c15bdc409370e8cf3"}, + {file = "memray-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5828292b53e52c7b77872c351a97d85cc261d6c38f4b6af3b1943591e86151c1"}, + {file = "memray-1.13.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:3912adfd99dd8d37d15c5f1f4e2a7e6d9f06db03257a4f25e6da6b87d8dac604"}, + {file = "memray-1.13.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ec6ee4197304557c068e9cf0aef9299d9eea414e106d6aef6fb9bca32b88c5f"}, + {file = "memray-1.13.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c4160dd66cd69ef1ad2989b72394c71227b81178deba3ef3941af6055e41feec"}, + {file = "memray-1.13.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7fe9f9a19e22faa1a4101c6c0804b6d8cb6a0e6d040a6e91c4b4f07c88cad7d1"}, + {file = "memray-1.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d9bbd33856a47800301dbbc5ae51d499107a2cf41542a400d26d7be0ce3c74"}, + {file = "memray-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7419cd8acf5d2e460f70ae62396e65a79cfd3262a655b5fd753a0ef0dee4bc4"}, + {file = "memray-1.13.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:549cf4b6ab259bfefabe8b5c688c21d21e3ef6b5e7f9123deee54d84d1334c5d"}, + {file = "memray-1.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fcc112ed76c3e9d3b1d992fe97e079f51267c601b22bc292ed8a7bc961bd3af"}, + {file = "memray-1.13.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37b87a8ea3e2910286ff6f21dcef7a0044e753a18f6a987a085b728a0ded8f7b"}, + {file = "memray-1.13.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f17a4e7c1bd0ed1f890cdc3447567801296b2857b4250d1cd23c40ec929cc50f"}, + {file = "memray-1.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071c5b44ae52f583ba62af0a2cdaeea72a1c2c9513aba53873e32827becc4e1a"}, + {file = "memray-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b50ee1121b300371a5686a10fb3ed1a3711fa4fadacb198140e537beb43f176e"}, + {file = "memray-1.13.3.tar.gz", hash = "sha256:3810a5dbafdf91d967255d6ee1ed82928bcbfaf56821eb8745cd630947140281"}, ] [package.dependencies] From 3a7733d6e57053a8ea2363aed95222ff108f1247 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Thu, 4 Jul 2024 10:22:36 +0100 Subject: [PATCH 15/16] bump version 1.0.0beta2 --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f7683e..28e2069 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/) -## [Unreleased] - +## [1.0.0beta2] 2024-07-04 ### Fixed From 3123c821fcab8fb821949fc8314451c112b31b90 Mon Sep 17 00:00:00 2001 From: muddymudskipper Date: Thu, 4 Jul 2024 10:24:50 +0100 Subject: [PATCH 16/16] edit changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28e2069..2c13a6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - keep original output ("No explanations found.") if no inconsistencies found with Validate plugin - provenance data in output graphs now includes plugin parameter settings +- new icons ## [1.0.0beta1] 2024-07-01