@@ -63,36 +63,16 @@ def assemble(cls, package_data, resource, codebase, package_adder=models.add_to_
6363 )
6464
6565 # corresponding metadata JSON does not exist, so handle this meta.yaml
66- elif package_data . purl :
67- package = models . Package . from_package_data (
66+ else :
67+ yield from cls . assemble_from_meta_yaml_only (
6868 package_data = package_data ,
69- datafile_path = resource .path ,
70- )
71- package .populate_license_fields ()
72- yield package
73-
74- dependent_packages = package_data .dependencies
75- if dependent_packages :
76- yield from models .Dependency .from_dependent_packages (
77- dependent_packages = dependent_packages ,
78- datafile_path = resource .path ,
79- datasource_id = package_data .datasource_id ,
80- package_uid = package .package_uid ,
81- )
82-
83- CondaMetaYamlHandler .assign_package_to_resources (
84- package = package ,
8569 resource = resource ,
8670 codebase = codebase ,
8771 package_adder = package_adder ,
8872 )
89- yield resource
9073
9174 return
9275
93- # For a conda metadata JSON, try to find the corresponding meta.yaml and
94- # assemble a single package out of these if it exists
95- conda_meta_yaml = cls .find_conda_meta_yaml_resource (resource , codebase )
9676 if not package_data .purl :
9777 yield resource
9878 return
@@ -101,27 +81,12 @@ def assemble(cls, package_data, resource, codebase, package_adder=models.add_to_
10181 package_data = package_data ,
10282 datafile_path = resource .path ,
10383 )
104- if conda_meta_yaml :
105- conda_meta_yaml_package_data , = conda_meta_yaml .package_data
106- package .update (
107- package_data = conda_meta_yaml_package_data ,
108- datafile_path = conda_meta_yaml .path ,
109- )
110- cls .assign_package_to_resources (
111- package = package ,
112- resource = conda_meta_yaml ,
113- codebase = codebase ,
114- package_adder = package_adder ,
115- )
116- meta_yaml_package_data = models .PackageData .from_dict (conda_meta_yaml_package_data )
117- if meta_yaml_package_data .dependencies :
118- yield from models .Dependency .from_dependent_packages (
119- dependent_packages = meta_yaml_package_data .dependencies ,
120- datafile_path = conda_meta_yaml .path ,
121- datasource_id = meta_yaml_package_data .datasource_id ,
122- package_uid = package .package_uid ,
123- )
124- yield conda_meta_yaml
84+ yield from cls .get_and_assmeble_from_meta_yaml (
85+ package = package ,
86+ resource = resource ,
87+ codebase = codebase ,
88+ package_adder = package_adder ,
89+ )
12590
12691 package .populate_license_fields ()
12792 yield package
@@ -136,8 +101,27 @@ def assemble(cls, package_data, resource, codebase, package_adder=models.add_to_
136101 # we yield this as we do not want this further processed
137102 yield resource
138103
139- # Get the file paths present in the metadata JSON and assign them to
140- # the package created from it
104+ cls .assign_packages_to_resources_from_metadata_json (
105+ package = package ,
106+ package_data = package_data ,
107+ resource = resource ,
108+ codebase = codebase ,
109+ package_adder = package_adder ,
110+ )
111+
112+ @classmethod
113+ def assign_packages_to_resources_from_metadata_json (
114+ cls ,
115+ package ,
116+ package_data ,
117+ resource ,
118+ codebase ,
119+ package_adder = models .add_to_package ,
120+ ):
121+ """
122+ Get the file paths present in the `package_data` of a metadata JSON `resource`
123+ and assign them to the `package` created from the manifest.
124+ """
141125 extracted_package_dir = package_data .extra_data .get ('extracted_package_dir' )
142126 files = package_data .extra_data .get ('files' )
143127
@@ -175,7 +159,7 @@ def assemble(cls, package_data, resource, codebase, package_adder=models.add_to_
175159 codebase = codebase ,
176160 package_adder = package_adder ,
177161 )
178-
162+
179163 for file_path in files :
180164 full_file_path = f"{ conda_root_dir .path } /{ file_path } "
181165 file_resource = codebase .get_resource (path = full_file_path )
@@ -187,6 +171,71 @@ def assemble(cls, package_data, resource, codebase, package_adder=models.add_to_
187171 package_adder = package_adder ,
188172 )
189173
174+ @classmethod
175+ def get_and_assmeble_from_meta_yaml (cls , package , resource , codebase , package_adder = models .add_to_package ):
176+ """
177+ For a conda metadata JSON `resource`, try to find the corresponding meta.yaml and
178+ update the `package` from it. Also yield dependencies present in the meta.yaml,
179+ and the `resource` to complete assembling from this manifest.
180+ """
181+ conda_meta_yaml = cls .find_conda_meta_yaml_resource (resource , codebase )
182+
183+ if conda_meta_yaml :
184+ conda_meta_yaml_package_data , = conda_meta_yaml .package_data
185+ package .update (
186+ package_data = conda_meta_yaml_package_data ,
187+ datafile_path = conda_meta_yaml .path ,
188+ )
189+ cls .assign_package_to_resources (
190+ package = package ,
191+ resource = conda_meta_yaml ,
192+ codebase = codebase ,
193+ package_adder = package_adder ,
194+ )
195+ meta_yaml_package_data = models .PackageData .from_dict (conda_meta_yaml_package_data )
196+ if meta_yaml_package_data .dependencies :
197+ yield from models .Dependency .from_dependent_packages (
198+ dependent_packages = meta_yaml_package_data .dependencies ,
199+ datafile_path = conda_meta_yaml .path ,
200+ datasource_id = meta_yaml_package_data .datasource_id ,
201+ package_uid = package .package_uid ,
202+ )
203+
204+ yield conda_meta_yaml
205+
206+ @classmethod
207+ def assemble_from_meta_yaml_only (cls , package_data , resource , codebase , package_adder = models .add_to_package ):
208+ """
209+ Assemble and yeild package, dependencies and the meta YAML `resource` from
210+ it's `package_data`, and also assign resources to the package.
211+ """
212+ if not package_data .purl :
213+ return
214+
215+ package = models .Package .from_package_data (
216+ package_data = package_data ,
217+ datafile_path = resource .path ,
218+ )
219+ package .populate_license_fields ()
220+ yield package
221+
222+ dependent_packages = package_data .dependencies
223+ if dependent_packages :
224+ yield from models .Dependency .from_dependent_packages (
225+ dependent_packages = dependent_packages ,
226+ datafile_path = resource .path ,
227+ datasource_id = package_data .datasource_id ,
228+ package_uid = package .package_uid ,
229+ )
230+
231+ CondaMetaYamlHandler .assign_package_to_resources (
232+ package = package ,
233+ resource = resource ,
234+ codebase = codebase ,
235+ package_adder = package_adder ,
236+ )
237+ yield resource
238+
190239 @classmethod
191240 def check_valid_packages_dir_name (cls , package_dir_resource , resource , codebase ):
192241 """
0 commit comments