Skip to content

Commit 6759958

Browse files
authored
Use "unknown" as the Package URL default type for missing data #1249 (#1251)
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent 64031ec commit 6759958

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

CHANGELOG.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ v34.6.0 (unreleased)
1212
- Add ability to filter by tag on the resource list view.
1313
https://github.com/nexB/scancode.io/issues/1217
1414

15+
- Use "unknown" as the Package URL default type when no values are provided for that
16+
field. This allows to create a discovered package instance instead of raising a
17+
Project error message.
18+
https://github.com/nexB/scancode.io/issues/1249
19+
1520
v34.5.0 (2024-05-22)
1621
--------------------
1722

scanpipe/models.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3106,27 +3106,25 @@ def extract_purl_data(cls, package_data):
31063106
@classmethod
31073107
def create_from_data(cls, project, package_data):
31083108
"""
3109-
Create and returns a DiscoveredPackage for a `project` from the `package_data`.
3110-
If one of the values of the required fields is not available, a "ProjectMessage"
3111-
is created instead of a new DiscoveredPackage instance.
3109+
Create and return a DiscoveredPackage for a given `project` based on
3110+
`package_data`.
3111+
3112+
If the required `name` field is missing in `package_data`, a `ProjectMessage`
3113+
is created instead of a DiscoveredPackage instance.
3114+
3115+
If the `type` field is missing in `package_data`, it defaults to "unknown"
3116+
before creating the DiscoveredPackage.
31123117
"""
31133118
package_data = package_data.copy()
3114-
required_fields = ["type", "name"]
3115-
missing_values = [
3116-
field_name
3117-
for field_name in required_fields
3118-
if not package_data.get(field_name)
3119-
]
3120-
3121-
if missing_values:
3122-
message = (
3123-
f"No values for the following required fields: "
3124-
f"{', '.join(missing_values)}"
3125-
)
31263119

3120+
if not package_data.get("name"):
3121+
message = 'No values provided for the required "name" field.'
31273122
project.add_warning(description=message, model=cls, details=package_data)
31283123
return
31293124

3125+
if not package_data.get("type"):
3126+
package_data["type"] = "unknown"
3127+
31303128
qualifiers = package_data.get("qualifiers")
31313129
if qualifiers:
31323130
package_data["qualifiers"] = normalize_qualifiers(qualifiers, encode=True)

scanpipe/tests/test_models.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2447,7 +2447,7 @@ def test_scanpipe_discovered_package_model_create_from_data(self):
24472447
self.assertEqual(package_count, DiscoveredPackage.objects.count())
24482448
error = project1.projectmessages.latest("created_date")
24492449
self.assertEqual("DiscoveredPackage", error.model)
2450-
expected_message = "No values for the following required fields: name"
2450+
expected_message = 'No values provided for the required "name" field.'
24512451
self.assertEqual(expected_message, error.description)
24522452
self.assertEqual(package_data1["purl"], error.details["purl"])
24532453
self.assertEqual("", error.details["name"])
@@ -2466,6 +2466,17 @@ def test_scanpipe_discovered_package_model_create_from_data(self):
24662466
self.assertEqual(package_count, DiscoveredPackage.objects.count())
24672467
self.assertEqual(project_message_count, ProjectMessage.objects.count())
24682468

2469+
def test_scanpipe_discovered_package_model_create_from_data_missing_type(self):
2470+
project1 = Project.objects.create(name="Analysis")
2471+
2472+
incomplete_data = dict(package_data1)
2473+
incomplete_data["type"] = ""
2474+
2475+
package = DiscoveredPackage.create_from_data(project1, incomplete_data)
2476+
self.assertEqual(project1, package.project)
2477+
self.assertEqual("pkg:unknown/debian/adduser@3.118?arch=all", str(package))
2478+
self.assertEqual("unknown", package.type)
2479+
24692480
@skipIf(connection.vendor == "sqlite", "No max_length constraints on SQLite.")
24702481
def test_scanpipe_discovered_dependency_model_create_from_data(self):
24712482
project1 = Project.objects.create(name="Analysis")

0 commit comments

Comments
 (0)