Skip to content

Commit 8428cb8

Browse files
authored
Merge pull request #183 from nexB/improve-vers-resolution
Improve version range resolution
2 parents 2e824e1 + b7d323b commit 8428cb8

3 files changed

Lines changed: 38 additions & 22 deletions

File tree

minecode/tests/testfiles/directories/ls-lr-expected.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"path":"README",
44
"type":"f",
55
"size":1499,
6-
"date":"2022-09",
6+
"date":"2023-09",
77
"target":null
88
},
99
{
@@ -17,7 +17,7 @@
1717
"path":"README.html",
1818
"type":"f",
1919
"size":3185,
20-
"date":"2022-09",
20+
"date":"2023-09",
2121
"target":null
2222
},
2323
{
@@ -45,7 +45,7 @@
4545
"path":"dists/README",
4646
"type":"f",
4747
"size":932,
48-
"date":"2022-09",
48+
"date":"2023-09",
4949
"target":null
5050
},
5151
{

packagedb/api.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99

10+
import logging
1011
from django.core.exceptions import ValidationError
1112
from django.db.models import Q
1213
from django_filters.rest_framework import FilterSet
@@ -45,9 +46,11 @@
4546

4647
from univers import versions
4748
from univers.version_range import RANGE_CLASS_BY_SCHEMES
48-
from univers.version_range import InvalidVersionRange
49+
from univers.versions import InvalidVersion
4950
from univers.version_range import VersionRange
51+
from univers.version_constraint import InvalidConstraintsError
5052

53+
logger = logging.getLogger(__name__)
5154

5255
class PackageResourcePurlFilter(Filter):
5356
def filter(self, qs, value):
@@ -405,8 +408,9 @@ def index_packages(self, request, *args, **kwargs):
405408
packages = request.data.get('packages') or []
406409
queued_packages = []
407410
unqueued_packages = []
411+
supported_ecosystems = ["maven", "npm"]
408412

409-
unique_purls, unsupported_packages, unsupported_vers = get_resolved_purls(packages)
413+
unique_purls, unsupported_packages, unsupported_vers = get_resolved_purls(packages, supported_ecosystems)
410414

411415
for purl in unique_purls:
412416
is_routable_purl = priority_router.is_routable(purl)
@@ -691,7 +695,7 @@ class PackageSetViewSet(viewsets.ReadOnlyModelViewSet):
691695
serializer_class = PackageSetAPISerializer
692696

693697

694-
def get_resolved_purls(packages):
698+
def get_resolved_purls(packages, supported_ecosystems):
695699
"""
696700
Take a list of dict containing purl or version-less purl along with vers
697701
and return a list of resolved purls, a list of unsupported purls, and a
@@ -718,7 +722,7 @@ def get_resolved_purls(packages):
718722
unique_resolved_purls.add(purl)
719723
continue
720724

721-
if not vers:
725+
if not vers or parsed_purl.type not in supported_ecosystems:
722726
unsupported_purls.add(purl)
723727
continue
724728

@@ -749,18 +753,22 @@ def resolve_versions(parsed_purl, vers):
749753

750754
all_versions = get_all_versions(parsed_purl) or []
751755

752-
return [
753-
str(
754-
PackageURL(
755-
type=parsed_purl.type,
756-
namespace=parsed_purl.namespace,
757-
name=parsed_purl.name,
758-
version=version.string,
759-
)
760-
)
761-
for version in all_versions
762-
if version in version_range
763-
]
756+
result = []
757+
for version in all_versions:
758+
try:
759+
if version in version_range:
760+
package_url = PackageURL(
761+
type=parsed_purl.type,
762+
namespace=parsed_purl.namespace,
763+
name=parsed_purl.name,
764+
version=version.string,
765+
)
766+
result.append(str(package_url))
767+
except InvalidConstraintsError:
768+
logger.warning(f"Invalid constraints sequence in '{vers}' for '{parsed_purl}'")
769+
return
770+
771+
return result
764772

765773
def get_all_versions(purl: PackageURL):
766774
"""
@@ -778,10 +786,18 @@ def get_all_versions(purl: PackageURL):
778786
if not package_name or not versionAPI:
779787
return
780788

781-
all_versions = versionAPI().fetch(package_name)
789+
all_versions = versionAPI().fetch(package_name) or []
782790
versionClass = VERSION_CLASS_BY_PACKAGE_TYPE.get(purl.type)
783791

784-
return [versionClass(package_version.value) for package_version in all_versions]
792+
result = []
793+
for package_version in all_versions:
794+
try:
795+
result.append(versionClass(package_version.value))
796+
except InvalidVersion:
797+
logger.warning(f"Invalid version '{package_version.value}' for '{purl}'")
798+
pass
799+
800+
return result
785801

786802

787803
VERSION_CLASS_BY_PACKAGE_TYPE = {pkg_type: range_class.version_class for pkg_type, range_class in RANGE_CLASS_BY_SCHEMES.items()}

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ install_requires =
5656
scancode-toolkit[full] == 32.0.6
5757
urlpy == 0.5
5858
matchcode-toolkit >= 1.1.1
59-
univers == 30.10.0
59+
univers == 30.11.0
6060
setup_requires = setuptools_scm[toml] >= 4
6161

6262
python_requires = >=3.8

0 commit comments

Comments
 (0)