Skip to content

Commit 2210921

Browse files
committed
Yield Packages before other yieldables #3028
* Update assembly method of cocoapods and pypi package handlers to yield Package objects before Resources and Dependencies Signed-off-by: Jono Yang <[email protected]>
1 parent 1d575e8 commit 2210921

File tree

5 files changed

+58
-40
lines changed

5 files changed

+58
-40
lines changed

src/packagedcode/alpine.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def assemble(cls, package_data, resource, codebase):
9292
for ref in package.file_references
9393
}
9494

95+
resources = []
9596
for res in root_resource.walk(codebase):
9697
ref = file_references_by_path.get(res.path)
9798
if not ref:
@@ -102,15 +103,15 @@ def assemble(cls, package_data, resource, codebase):
102103
del file_references_by_path[res.path]
103104
res.for_packages.append(package_uid)
104105
res.save(codebase)
105-
106-
yield res
106+
resources.append(res)
107107

108108
# if we have left over file references, add these to extra data
109109
if file_references_by_path:
110110
missing = sorted(file_references_by_path.values(), key=lambda r:r.path)
111111
package.extra_data['missing_file_references'] = missing
112112

113113
yield package
114+
yield from resources
114115

115116

116117
class AlpineApkbuildHandler(models.DatafileHandler):

src/packagedcode/cocoapods.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ def assemble(cls, package_data, resource, codebase):
164164

165165
for resource in sibling_podspecs:
166166
datafile_path = resource.path
167-
yield resource
168167
for package_data in resource.package_data:
169168
package_data = models.PackageData.from_dict(package_data)
170169
package = models.Package.from_package_data(
@@ -173,6 +172,7 @@ def assemble(cls, package_data, resource, codebase):
173172
)
174173
cls.assign_package_to_resources(package, resource, codebase)
175174
yield package
175+
yield resource
176176

177177
else:
178178
# has_no_podspec:

src/packagedcode/debian.py

+20-16
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ def assemble(cls, package_data, resource, codebase):
279279

280280
f'usr/share/doc/{package_name}/copyright',
281281
]))
282+
resources = []
282283
# TODO: keep track of missing files
283284
for res in root_resource.walk(codebase):
284285
if not res.path.endswith(assemblable_paths):
@@ -305,8 +306,7 @@ def assemble(cls, package_data, resource, codebase):
305306
package_uid=package_uid,
306307
)
307308

308-
# we yield this as we do not want this further processed
309-
yield res
309+
resources.append(res)
310310

311311
root_path = Path(root_resource.path)
312312

@@ -332,14 +332,15 @@ def assemble(cls, package_data, resource, codebase):
332332
res.for_packages.append(package_uid)
333333
res.save(codebase)
334334

335-
yield res
335+
resources.append(res)
336336

337337
# if we have left over file references, add these to extra data
338338
if file_references_by_path:
339339
missing = sorted(file_references_by_path.values(), key=lambda r:r.path)
340340
package.extra_data['missing_file_references'] = missing
341341

342342
yield package
343+
yield from resources
343344

344345

345346
class DebianDistrolessInstalledDatabaseHandler(models.DatafileHandler):
@@ -383,38 +384,41 @@ def assemble(cls, package_data, resource, codebase):
383384
)
384385
package_uid = package.package_uid
385386

386-
dependent_packages = package_data.dependencies
387-
if dependent_packages:
388-
yield from models.Dependency.from_dependent_packages(
389-
dependent_packages=dependent_packages,
390-
datafile_path=resource.path,
391-
datasource_id=package_data.datasource_id,
392-
package_uid=package_uid,
393-
)
394-
395387
# collect copyright file for this package
396388
# and merge in package data
397389
assemblable_paths = (
398390
f'usr/share/doc/{package_name}/copyright',
399391
)
392+
resources = []
400393
if package_uid:
401394
for res in root_resource.walk(codebase):
402395
if not res.path.endswith(assemblable_paths):
403396
continue
404-
397+
405398
for pkgdt in res.package_data:
406399
package.update(
407400
package_data=pkgdt,
408401
datafile_path=res.path,
409402
)
410-
403+
411404
res.for_packages.append(package_uid)
412405
res.save(codebase)
413-
414-
yield res
406+
407+
resources.append(res)
415408

416409
yield package
417410

411+
dependent_packages = package_data.dependencies
412+
if dependent_packages:
413+
yield from models.Dependency.from_dependent_packages(
414+
dependent_packages=dependent_packages,
415+
datafile_path=resource.path,
416+
datasource_id=package_data.datasource_id,
417+
package_uid=package_uid,
418+
)
419+
420+
yield from resources
421+
418422

419423
class DebianInstalledFilelistHandler(models.DatafileHandler):
420424
# seen in installed rootfs in:

src/packagedcode/pypi.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ def assign_package_to_resources(cls, package, resource, codebase):
120120
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
121121

122122

123+
def create_package_from_package_data(package_data, datafile_path):
124+
package = models.Package.from_package_data(
125+
package_data=package_data,
126+
datafile_path=datafile_path,
127+
)
128+
if not package.license_expression:
129+
package.license_expression = compute_normalized_license(package.declared_license)
130+
return package
131+
132+
123133
class BaseExtractedPythonLayout(BasePypiHandler):
124134
"""
125135
Base class for development repos, sdist tarballs and other related extracted
@@ -152,10 +162,12 @@ def assemble(cls, package_data, resource, codebase):
152162
pkg_data = package_resource.package_data[0]
153163
pkg_data = models.PackageData.from_dict(pkg_data)
154164
if pkg_data.purl:
155-
package = models.Package.from_package_data(
165+
package = create_package_from_package_data(
156166
package_data=pkg_data,
157-
datafile_path=package_resource.path,
167+
datafile_path=package_resource.path
158168
)
169+
yield package
170+
159171
package_resource.for_packages.append(package.package_uid)
160172
package_resource.save(codebase)
161173
yield package_resource
@@ -183,10 +195,11 @@ def assemble(cls, package_data, resource, codebase):
183195
for setup_resource, setup_pkg_data in setup_package_data:
184196
if setup_pkg_data.purl:
185197
if not package:
186-
package = models.Package.from_package_data(
198+
package = create_package_from_package_data(
187199
package_data=setup_pkg_data,
188-
datafile_path=setup_resource.path,
200+
datafile_path=setup_resource.path
189201
)
202+
yield package
190203
package_resource = setup_resource
191204
else:
192205
package.update(setup_pkg_data, setup_resource.path)
@@ -203,8 +216,6 @@ def assemble(cls, package_data, resource, codebase):
203216
)
204217

205218
if package:
206-
if not package.license_expression:
207-
package.license_expression = compute_normalized_license(package.declared_license)
208219
package_uid = package.package_uid
209220

210221
root = package_resource.parent(codebase)
@@ -221,8 +232,6 @@ def assemble(cls, package_data, resource, codebase):
221232
package_resource.for_packages.append(package_uid)
222233
package_resource.save(codebase)
223234

224-
yield package
225-
226235
else:
227236
package_uid = None
228237

src/packagedcode/rpm.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -188,20 +188,8 @@ def assemble(cls, package_data, resource, codebase):
188188
_declared, detected = detect_declared_license(package.declared_license)
189189
package.license_expression = detected
190190

191-
# yield deps
192-
dependent_packages = package_data.dependencies
193-
if dependent_packages:
194-
for dep in models.Dependency.from_dependent_packages(
195-
dependent_packages=dependent_packages,
196-
datafile_path=resource.path,
197-
datasource_id=package_data.datasource_id,
198-
package_uid=package_uid,
199-
):
200-
if not dep.namespace:
201-
dep.namespace = namespace
202-
yield dep
203-
204191
# tag files from refs
192+
resources = []
205193
missing_file_references = []
206194
# a file ref extends from the root of the filesystem
207195
for ref in package.file_references:
@@ -215,6 +203,7 @@ def assemble(cls, package_data, resource, codebase):
215203
# found all of them
216204
res.for_packages.append(package_uid)
217205
res.save(codebase)
206+
resources.append(res)
218207

219208
# if we have left over file references, add these to extra data
220209
if missing_file_references:
@@ -223,6 +212,21 @@ def assemble(cls, package_data, resource, codebase):
223212

224213
yield package
225214

215+
# yield deps
216+
dependent_packages = package_data.dependencies
217+
if dependent_packages:
218+
for dep in models.Dependency.from_dependent_packages(
219+
dependent_packages=dependent_packages,
220+
datafile_path=resource.path,
221+
datasource_id=package_data.datasource_id,
222+
package_uid=package_uid,
223+
):
224+
if not dep.namespace:
225+
dep.namespace = namespace
226+
yield dep
227+
228+
yield from resources
229+
226230

227231
# TODO: add dependencies!!!
228232
class RpmInstalledNdbDatabaseHandler(BaseRpmInstalledDatabaseHandler):

0 commit comments

Comments
 (0)