Skip to content

Commit 4977d84

Browse files
authored
fix: refactor purldb data cleanup into a common method
2 parents a74fb3e + 5bc09ae commit 4977d84

4 files changed

Lines changed: 31 additions & 23 deletions

File tree

component_catalog/models.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2538,19 +2538,17 @@ def create_from_url(cls, url, user):
25382538
)
25392539

25402540
# Matching in PurlDB early to avoid more processing in case of a match.
2541-
purldb_data = None
2541+
purldb_entry = None
25422542
if user.dataspace.enable_purldb_access:
25432543
package_for_match = cls(download_url=download_url)
25442544
package_for_match.set_package_url(package_url)
25452545
purldb_entries = package_for_match.get_purldb_entries(user)
25462546
# Look for one with the same exact purl in that case
2547-
if purldb_data := pick_purldb_entry(purldb_entries, purl=url):
2548-
# The format from PurlDB is "2019-11-18T00:00:00Z" from DateTimeField
2549-
if release_date := purldb_data.get("release_date"):
2550-
purldb_data["release_date"] = release_date.split("T")[0]
2551-
package_data.update(purldb_data)
2547+
if purldb_entry := pick_purldb_entry(purldb_entries, purl=url):
2548+
cls.clean_purldb_entry(purldb_entry)
2549+
package_data.update(purldb_entry)
25522550

2553-
if download_url and not purldb_data:
2551+
if download_url and not purldb_entry:
25542552
package_data = download.collect_package_data(download_url)
25552553

25562554
# Check for existing package by hash fields with a single database query
@@ -2630,6 +2628,27 @@ def get_purldb_entries(self, user, max_request_call=0, timeout=10):
26302628

26312629
return purldb_entries
26322630

2631+
@classmethod
2632+
def normalize_purldb_release_date(cls, data):
2633+
"""Strip the time portion from a PurlDB DateTimeField value."""
2634+
if release_date := data.get("release_date"):
2635+
data["release_date"] = release_date.split("T")[0]
2636+
2637+
@classmethod
2638+
def convert_purldb_package_content_label(cls, data):
2639+
"""Convert package_content from a string label to its integer value in place."""
2640+
if content_label := data.get("package_content"):
2641+
if content_value := Package.get_package_content_value_from_label(content_label):
2642+
data["package_content"] = content_value
2643+
2644+
@classmethod
2645+
def clean_purldb_entry(cls, data):
2646+
"""Normalize PurlDB entry data for local use."""
2647+
cls.normalize_purldb_release_date(data)
2648+
cls.convert_purldb_package_content_label(data)
2649+
# Set the declared_license_expression as the "concluded" license_expression
2650+
data["license_expression"] = data.get("declared_license_expression")
2651+
26332652
def update_from_purldb(self, user):
26342653
"""
26352654
Update this Package instance with data from PurlDB.
@@ -2653,14 +2672,7 @@ def update_from_purldb(self, user):
26532672
else:
26542673
package_data = merge_common_non_empty_values(purldb_entries)
26552674

2656-
# The format from PURLDB is "2019-11-18T00:00:00Z"
2657-
if release_date := package_data.get("release_date"):
2658-
package_data["release_date"] = release_date.split("T")[0]
2659-
package_data["license_expression"] = package_data.get("declared_license_expression")
2660-
2661-
if package_content := package_data.get("package_content"):
2662-
package_content_value = Package.get_package_content_value_from_label(package_content)
2663-
package_data["package_content"] = package_content_value
2675+
self.clean_purldb_entry(package_data)
26642676

26652677
# Avoid raising an IntegrityError when the values in `package_data` for the
26662678
# identifier fields already exist on another Package instance.

component_catalog/tests/test_models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,7 @@ def test_package_model_create_from_url_enable_purldb_access(
17641764
"sha1": "a2363646a9dd05955633b450010b59a21af8a423",
17651765
"declared_license_expression": "bsd-new OR epl-1.0 OR apache-2.0",
17661766
"package_url": "pkg:maven/abbot/abbot@1.4.0",
1767+
"package_content": "source_archive",
17671768
}
17681769
mock_get_purldb_entries.return_value = [purldb_entry]
17691770

@@ -1773,6 +1774,7 @@ def test_package_model_create_from_url_enable_purldb_access(
17731774

17741775
self.assertEqual(self.user, package.created_by)
17751776
self.assertEqual(purldb_entry["declared_license_expression"], package.license_expression)
1777+
self.assertEqual("source_archive", package.get_package_content_display())
17761778

17771779
for field_name, value in purldb_entry.items():
17781780
self.assertEqual(value, getattr(package, field_name))

component_catalog/tests/test_views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3404,7 +3404,7 @@ def test_component_catalog_package_add_view_initial_data(
34043404
expected = {
34053405
"filename": "abbot-1.4.0.jar",
34063406
"keywords": ["keyword1", "keyword2"],
3407-
"release_date": "2010-05-24T00:00:00Z",
3407+
"release_date": "2010-05-24",
34083408
"type": "maven",
34093409
"namespace": "abbot",
34103410
"name": "abbot",

component_catalog/views.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,13 +1931,7 @@ def get_initial(self):
19311931
initial = super().get_initial()
19321932

19331933
if purldb_entry := self.get_entry_from_purldb():
1934-
# Duplicate the declared_license_expression as the "concluded" license_expression
1935-
purldb_entry["license_expression"] = purldb_entry.get("declared_license_expression")
1936-
1937-
# Convert package_content string label to integer value
1938-
if content_label := purldb_entry.pop("package_content", None):
1939-
if content_value := Package.get_package_content_value_from_label(content_label):
1940-
purldb_entry["package_content"] = content_value
1934+
self.model.clean_purldb_entry(purldb_entry)
19411935

19421936
model_fields = [field.name for field in Package._meta.get_fields()]
19431937
initial_from_purldb_entry = {

0 commit comments

Comments
 (0)