1212from hermes .error import HermesPluginRunError , MisconfigurationError
1313from hermes .model .context_manager import HermesContext
1414from 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
1616from 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