Skip to content

Commit

Permalink
Add root_packages and non_root_packages methods #1145
Browse files Browse the repository at this point in the history
Signed-off-by: tdruez <tdruez@nexb.com>
  • Loading branch information
tdruez committed Jul 29, 2024
1 parent 17d65fc commit 4218eb0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ doc8:
@${ACTIVATE} doc8 --max-line-length 100 --ignore-path docs/_build/ --quiet docs/

valid:
@echo "-> Run Ruff linter"
@${ACTIVATE} ruff check --fix
@echo "-> Run Ruff format"
@${ACTIVATE} ruff format
@echo "-> Run Ruff linter"
@${ACTIVATE} ruff check --fix

check:
@echo "-> Run Ruff linter validation (pycodestyle, bandit, isort, and more)"
Expand Down
14 changes: 14 additions & 0 deletions scanpipe/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2976,6 +2976,20 @@ def filter(self, *args, **kwargs):

return super().filter(*args, **kwargs)

def non_root_packages(self):
"""
Return packages that have at least one package parent.
Those are used as part of a ``Dependency.resolved_to`` FK.
"""
return self.filter(resolved_from_dependencies__isnull=False)

def root_packages(self):
"""
Return packages that are directly related to the Project.
Those packages are not used as part of a ``Dependency.resolved_to`` FK.
"""
return self.filter(resolved_from_dependencies__isnull=True)


class AbstractPackage(models.Model):
"""These fields should be kept in line with `packagedcode.models.PackageData`."""
Expand Down
17 changes: 17 additions & 0 deletions scanpipe/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1841,6 +1841,23 @@ def test_scanpipe_discovered_package_queryset_vulnerable(self):
self.assertNotIn(p1, DiscoveredPackage.objects.vulnerable())
self.assertIn(p2, DiscoveredPackage.objects.vulnerable())

def test_scanpipe_discovered_package_queryset_dependency_methods(self):
project = Project.objects.create(name="project")
a = make_package(project, "pkg:type/a")
b = make_package(project, "pkg:type/b")
c = make_package(project, "pkg:type/c")
z = make_package(project, "pkg:type/z")
# Project -> A -> B -> C
# Project -> Z
make_dependency(project, for_package=a, resolved_to_package=b)
make_dependency(project, for_package=b, resolved_to_package=c)

project_packages_qs = project.discoveredpackages.order_by("name")
root_packages = project_packages_qs.root_packages()
self.assertEqual([a, z], list(root_packages))
non_root_packages = project_packages_qs.non_root_packages()
self.assertEqual([b, c], list(non_root_packages))

@skipIf(sys.platform != "linux", "Ordering differs on macOS.")
def test_scanpipe_codebase_resource_model_walk_method(self):
fixtures = self.data / "asgiref" / "asgiref-3.3.0_walk_test_fixtures.json"
Expand Down

0 comments on commit 4218eb0

Please sign in to comment.