Skip to content

Commit 4f85996

Browse files
author
notactuallyfinn
committed
improved ld_prov_list and adjusted the collection of provenance accordingly
1 parent a96821e commit 4f85996

2 files changed

Lines changed: 135 additions & 164 deletions

File tree

src/hermes/commands/harvest/base.py

Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from hermes.error import HermesPluginRunError, MisconfigurationError
1313
from hermes.model.context_manager import HermesContext
1414
from hermes.model import SoftwareMetadata
15-
from hermes.model.provenance.ld_prov import ld_prov_list, ld_prov_node
15+
from hermes.model.provenance.ld_prov import ld_prov_list
1616
from hermes.model.types.ld_context import ALL_CONTEXTS
1717

1818

@@ -50,7 +50,8 @@ class HermesHarvestCommand(HermesCommand):
5050
def __call__(self, args: argparse.Namespace) -> None:
5151
self.args = args
5252
self.log.info("# Load provenance from old harvest or create new document.")
53-
prov_doc, base_plugin = self.init_provenance_document()
53+
prov_doc = self.init_provenance_document()
54+
base_plugin = prov_doc.get_hermes_base_plugin("harvest")
5455

5556
self.log.info("# Metadata harvesting")
5657
if len(self.settings.sources) == 0:
@@ -92,60 +93,48 @@ def __call__(self, args: argparse.Namespace) -> None:
9293
outputs = []
9394
io_ops = []
9495
for plugin_io_operation in plugin_io_operations:
95-
loaded_source = prov_doc.add_entity()
96-
loaded_source.update(plugin_io_operation[0])
97-
io_op = prov_doc.add_activity()
98-
plugin_io_operation[1]["prov:wasAssociatedWith"] = [base_plugin.ref, plugin.ref]
99-
plugin_io_operation[1]["prov:used"] = loaded_source.ref
100-
io_op.update(plugin_io_operation[1])
101-
loaded_data = prov_doc.add_entity()
96+
loaded_source = prov_doc.add_entity(data=plugin_io_operation[0])
97+
plugin_io_operation[1].update(
98+
{"prov:wasAssociatedWith": [base_plugin.ref, plugin.ref], "prov:used": loaded_source.ref}
99+
)
100+
io_op = prov_doc.add_activity(data=plugin_io_operation[1])
102101
plugin_io_operation[2].update({
103102
"prov:wasAttributedTo": plugin.ref,
104103
"prov:wasDerivedFrom": loaded_source.ref,
105104
"prov:wasGeneratedBy": io_op.ref
106105
})
107-
loaded_data.update(plugin_io_operations[2])
106+
loaded_data = prov_doc.add_entity(data=plugin_io_operations[2])
108107
outputs.append(loaded_data.ref)
109108
io_ops.append(io_op.ref)
110109

111-
map_activity = prov_doc.add_activity()
112-
map_activity.update({
110+
map_activity = prov_doc.add_activity(data={
113111
"prov:wasInformedBy": io_ops,
114112
"prov:used": outputs,
115113
"prov:wasAssociatedWith": plugin.ref
116114
})
117-
data_output = prov_doc.add_entity()
118-
data_output.update({
115+
data_output = prov_doc.add_entity(data={
119116
"prov:wasAttributedTo": plugin.ref,
120117
"prov:wasGeneratedBy": map_activity.ref,
121118
"prov:wasDerivedFrom": outputs
122119
})
123120

124-
write = prov_doc.add_activity()
125-
write.update({
121+
write = prov_doc.add_activity(data={
126122
"prov:wasAssociatedWith": [
127-
prov_doc.shallow_search({
128-
"schema:name": lambda doc, node: node["schema:name"][0].find("harvest command") != -1
129-
})[0].ref,
130-
prov_doc.shallow_search({
131-
"schema:name": lambda doc, node: node["schema:name"][0].find(" cache") != -1
132-
})[0].ref,
123+
prov_doc.get_hermes_command("harvest").ref,
124+
prov_doc.get_hermes_cache().ref,
133125
plugin.ref
134126
],
135127
"prov:used": data_output.ref,
136128
"prov:wasInformedBy": map_activity.ref
137129
})
138130
# TODO: add more info
139-
write_output = prov_doc.add_entity()
140-
write_output.update({
131+
prov_doc.add_entity(data={
141132
"prov:wasGeneratedBy": write.ref, "prov:wasDerivedFrom": data_output.ref
142133
})
143-
write_output = prov_doc.add_entity()
144-
write_output.update({
134+
prov_doc.add_entity(data={
145135
"prov:wasGeneratedBy": write.ref, "prov:wasDerivedFrom": data_output.ref
146136
})
147-
write_output = prov_doc.add_entity()
148-
write_output.update({
137+
prov_doc.add_entity(data={
149138
"prov:wasGeneratedBy": write.ref, "prov:wasDerivedFrom": data_output.ref
150139
})
151140

@@ -157,39 +146,37 @@ def __call__(self, args: argparse.Namespace) -> None:
157146
self.log.critical("No harvest plugin ran successfully.")
158147
raise HermesPluginRunError("No harvest plugin ran successfully.")
159148

160-
def init_provenance_document(self) -> tuple[ld_prov_list, ld_prov_node]:
149+
def init_provenance_document(self) -> ld_prov_list:
161150
ctx = HermesContext()
162151
ctx.prepare_step("harvest")
163152
with ctx["provenance"] as cache:
164153
try:
165154
ld_prov_doc = ld_prov_list.from_list(cache["codemeta"], container_type="@graph", context=ALL_CONTEXTS)
166-
return ld_prov_doc, ld_prov_doc.shallow_search({
167-
"schema:name": lambda doc, node: node["schema:name"][0].find("harvest base plugin") != -1
168-
})[0]
155+
return ld_prov_doc
169156
except KeyError:
170157
pass
171158
prov_doc = ld_prov_list()
172159
prov_doc.init_hermes_agents()
173-
prov_doc.add_hermes_command("harvest")
174-
return prov_doc, prov_doc.add_hermes_base_plugin("harvest")
175-
176-
def remove_provenance_info_for_plugin(self, prov_doc, plugin) -> None:
177-
plugin = prov_doc.shallow_search({
178-
"schema:name": (lambda doc, node: f"harvest plugin {plugin}" in node["schema:name"]),
179-
})
180-
if len(plugin) == 0:
160+
return prov_doc
161+
162+
def remove_provenance_info_for_plugin(self, prov_doc: ld_prov_list, plugin) -> None:
163+
plugin = prov_doc.get_hermes_plugin("harvest", plugin)
164+
if plugin is None:
181165
return
182166
# two passes are needed because the nodes are nested exactly two levels
183-
related = prov_doc.shallow_search({
184-
"prov:wasAssociatedWith": (lambda doc, node: plugin.ref in node["prov:wasAssociatedWith"]),
185-
"prov:wasAttributedTo": (lambda doc, node: plugin.ref in node["prov:wasAttributedTo"])
186-
})
167+
related = prov_doc.shallow_search(lambda doc, node: (
168+
("prov:wasAssociatedWith" in node and plugin.ref in node["prov:wasAssociatedWith"]) or
169+
("prov:wasAttributedTo" in node and plugin.ref in node["prov:wasAttributedTo"])
170+
))
171+
if len(related) == 0:
172+
del prov_doc[plugin.index]
173+
return
187174
ids = [plugin.ref, *(rel.ref for rel in related)]
188-
related = prov_doc.shallow_search({
189-
f"prov:{key}": (lambda doc, node: any(id in node[f"prov:{key}"] for id in ids)) for key in [
175+
related = prov_doc.shallow_search(lambda doc, node: any(
176+
(f"prov:{key}" in node and id in node[f"prov:{key}"]) for id in ids for key in [
190177
"wasAssociatedWith", "wasAttributedTo", "wasGeneratedBy", "used", "wasDerivedFrom", "wasInformedBy"
191178
]
192-
})
179+
))
193180
for item in related:
194-
items = prov_doc.shallow_search({"@id": (lambda doc, node: node["@id"] == item["@id"])})
181+
items = prov_doc.shallow_search(lambda doc, node: ("@id" in node and node["@id"] == item["@id"]))
195182
del prov_doc[items[0].index]

0 commit comments

Comments
 (0)