Skip to content

Commit 32f8797

Browse files
Refactor conda package assembly
Signed-off-by: Ayan Sinha Mahapatra <[email protected]>
1 parent 20663f4 commit 32f8797

File tree

1 file changed

+95
-46
lines changed

1 file changed

+95
-46
lines changed

src/packagedcode/conda.py

Lines changed: 95 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)