Skip to content

Add package_adder argument to assemble() #3034 #3035

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,12 @@ Package detection:
of the new format where there is no root conceptually, just a list of files for each
package.

- There is a new resource-level attribute `for_packages` which refers to packages
through package_uuids (pURL + uuid string).
- There is a new resource-level attribute `for_packages` which refers to
packages through package_uids (pURL + uuid string). A `package_adder`
function is now used to associate a Package to a Resource that is part of
it. This gives us the flexibility to use the packagedcode Package handlers
in other contexts where `for_packages` on Resource is not implemented in the
same way as scancode-toolkit.

- The package_data attribute `dependencies` (which is a list of DependentPackages),
now has a new attribute `resolved_package` with a package data mapping.
Expand Down Expand Up @@ -336,8 +340,8 @@ Miscellaneous

- Added support for usage of shortcut flags
- `-A` or `--about`
- `-q` or `--quiet`
- `-v` or `--verbose`
- `-q` or `--quiet`
- `-v` or `--verbose`
- `-V` or `--version` can be used.


Expand Down
8 changes: 3 additions & 5 deletions src/packagedcode/about.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def parse(cls, location):
)

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Yield a Package. Note that ABOUT files do not carry dependencies.
"""
Expand All @@ -122,8 +122,7 @@ def assemble(cls, package_data, resource, codebase):

# NOTE: we do not attach files to the Package level. Instead we
# update `for_package` in the file
resource.for_packages.append(package_uid)
resource.save(codebase)
package_adder(package_uid, resource, codebase)

if not package.license_expression:
package.license_expression = cls.compute_normalized_license(package)
Expand Down Expand Up @@ -151,8 +150,7 @@ def assemble(cls, package_data, resource, codebase):
# path is found and processed: remove it, so we can
# check if we found all of them
del file_references_by_path[res.path]
res.for_packages.append(package_uid)
res.save(codebase)
package_adder(package_uid, res, codebase)

yield res

Expand Down
8 changes: 4 additions & 4 deletions src/packagedcode/alpine.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def compute_normalized_license(cls, package):
return detected

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
# get the root resource of the rootfs
levels_up = len('lib/apk/db/installed'.split('/'))
root_resource = get_ancestor(
Expand Down Expand Up @@ -107,8 +107,7 @@ def assemble(cls, package_data, resource, codebase):
# path is found and processed: remove it, so we can check if we
# found all of them
del file_references_by_path[res.path]
res.for_packages.append(package_uid)
res.save(codebase)
package_adder(package_uid, res, codebase)
resources.append(res)

# if we have left over file references, add these to extra data
Expand Down Expand Up @@ -139,11 +138,12 @@ def compute_normalized_license(cls, package):
return detected

@classmethod
def assign_package_to_resources(cls, package, resource, codebase):
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
models.DatafileHandler.assign_package_to_parent_tree(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
)


Expand Down
20 changes: 12 additions & 8 deletions src/packagedcode/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ def parse(cls, location):
)

@classmethod
def assign_package_to_resources(cls, package, resource, codebase):
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
models.DatafileHandler.assign_package_to_parent_tree(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
)


Expand All @@ -75,7 +76,7 @@ class BaseStarlarkManifestHandler(models.DatafileHandler):
"""

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Given a ``package_data`` PackageData found in the ``resource`` datafile
of the ``codebase``, assemble package their files and dependencies
Expand All @@ -100,6 +101,7 @@ def assemble(cls, package_data, resource, codebase):
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder
)

yield package
Expand Down Expand Up @@ -175,14 +177,13 @@ def parse(cls, location):
)

@classmethod
def assign_package_to_resources(cls, package, resource, codebase, skip_name=None):
def assign_package_to_resources(cls, package, resource, codebase, package_adder, skip_name=None):
package_uid = package.package_uid
if not package_uid:
return
parent = resource.parent(codebase)
for res in walk_build(resource=parent, codebase=codebase, skip_name=skip_name):
res.for_packages.append(package_uid)
res.save(codebase)
package_adder(package_uid, res, codebase)


def walk_build(resource, codebase, skip_name):
Expand Down Expand Up @@ -235,11 +236,12 @@ class BazelBuildHandler(BaseStarlarkManifestHandler):
documentation_url = 'https://bazel.build/'

@classmethod
def assign_package_to_resources(cls, package, resource, codebase, skip_name='BUILD'):
def assign_package_to_resources(cls, package, resource, codebase, package_adder, skip_name='BUILD'):
return super().assign_package_to_resources(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
skip_name=skip_name,
)

Expand All @@ -252,11 +254,12 @@ class BuckPackageHandler(BaseStarlarkManifestHandler):
documentation_url = 'https://buck.build/'

@classmethod
def assign_package_to_resources(cls, package, resource, codebase, skip_name='BUCK'):
def assign_package_to_resources(cls, package, resource, codebase, package_adder, skip_name='BUCK'):
return super().assign_package_to_resources(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
skip_name=skip_name,
)

Expand Down Expand Up @@ -377,9 +380,10 @@ def compute_normalized_license(cls, package):
return models.compute_normalized_license(declared_license)

@classmethod
def assign_package_to_resources(cls, package, resource, codebase):
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
models.DatafileHandler.assign_package_to_parent_tree(
package_=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
)
3 changes: 2 additions & 1 deletion src/packagedcode/build_gradle.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,12 @@ def parse(cls, location):

# TODO: handle complex cases of nested builds with many packages
@classmethod
def assign_package_to_resources(cls, package, resource, codebase):
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
models.DatafileHandler.assign_package_to_parent_tree(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
)


Expand Down
6 changes: 4 additions & 2 deletions src/packagedcode/cargo.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,15 @@ def parse(cls, location):
)

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Assemble Cargo.toml and possible Cargo.lock datafiles
"""
yield from cls.assemble_from_many_datafiles(
datafile_name_patterns=('Cargo.toml', 'cargo.toml', 'Cargo.lock', 'cargo.lock'),
directory=resource.parent(codebase),
codebase=codebase,
package_adder=package_adder,
)


Expand Down Expand Up @@ -144,14 +145,15 @@ def parse(cls, location):
)

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Assemble Cargo.toml and possible Cargo.lock datafiles
"""
yield from cls.assemble_from_many_datafiles(
datafile_name_patterns=('Cargo.toml', 'Cargo.lock',),
directory=resource.parent(codebase),
codebase=codebase,
package_adder=package_adder,
)


Expand Down
3 changes: 2 additions & 1 deletion src/packagedcode/chef.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,14 +142,15 @@ def format(self, tokens, outfile):
class BaseChefMetadataHandler(models.DatafileHandler):

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Assemble Package from Chef metadata.rb, then from metadata.json files.
"""
yield from cls.assemble_from_many_datafiles(
datafile_name_patterns=('metadata.rb', 'metadata.json',),
directory=resource.parent(codebase),
codebase=codebase,
package_adder=package_adder,
)


Expand Down
12 changes: 10 additions & 2 deletions src/packagedcode/cocoapods.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ def get_first_three_md5_hash_characters(podname):
class BasePodHandler(models.DatafileHandler):

@classmethod
def assemble(cls, package_data, resource, codebase):
def assemble(cls, package_data, resource, codebase, package_adder):
"""
Assemble pod packages and dependencies and handle the specific cases where
there are more than one podspec in the same directory.
Expand Down Expand Up @@ -147,6 +147,7 @@ def assemble(cls, package_data, resource, codebase):
datafile_name_patterns=datafile_name_patterns,
directory=parent,
codebase=codebase,
package_adder=package_adder,
)

elif has_multiple_podspec:
Expand All @@ -160,6 +161,7 @@ def assemble(cls, package_data, resource, codebase):
datafile_name_patterns=datafile_name_patterns,
directory=parent,
codebase=codebase,
package_adder=package_adder,
)

for resource in sibling_podspecs:
Expand All @@ -170,7 +172,12 @@ def assemble(cls, package_data, resource, codebase):
package_data=package_data,
datafile_path=datafile_path,
)
cls.assign_package_to_resources(package, resource, codebase)
cls.assign_package_to_resources(
package=package,
resource=resource,
codebase=codebase,
package_adder=package_adder,
)
yield package
yield resource

Expand All @@ -180,6 +187,7 @@ def assemble(cls, package_data, resource, codebase):
datafile_name_patterns=datafile_name_patterns,
directory=parent,
codebase=codebase,
package_adder=package_adder,
)


Expand Down
3 changes: 2 additions & 1 deletion src/packagedcode/conda.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,12 @@ def get_conda_root(cls, resource, codebase):
return resource.parent(codebase)

@classmethod
def assign_package_to_resources(cls, package, resource, codebase):
def assign_package_to_resources(cls, package, resource, codebase, package_adder):
return models.DatafileHandler.assign_package_to_resources(
package=package,
resource=cls.get_conda_root(resource, codebase),
codebase=codebase,
package_adder=package_adder,
)

@classmethod
Expand Down
Loading