Skip to content

Commit b339542

Browse files
authored
Always display the full Package URL including pkg: #115 (#118)
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent 27c44e4 commit b339542

8 files changed

Lines changed: 34 additions & 26 deletions

File tree

CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ Release notes
6969
- Display Product inventory count on the Product list view.
7070
https://github.com/nexB/dejacode/issues/81
7171

72+
- Always display the full Package URL in the UI view including the "pkg:" prefix.
73+
https://github.com/nexB/dejacode/issues/115
74+
7275
### Version 5.0.1
7376

7477
- Improve the stability of the "Check for new Package versions" feature.

component_catalog/models.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,10 +1841,9 @@ def enforce_identifier(self):
18411841
def identifier(self):
18421842
"""
18431843
Provide a unique value to identify each Package.
1844-
It is the Package URL (minus the 'pkg:' prefix) if one exists;
1845-
otherwise it is the Package Filename.
1844+
It is the Package URL if one exists; otherwise it is the Package Filename.
18461845
"""
1847-
return self.short_package_url or self.filename
1846+
return self.plain_package_url or self.filename
18481847

18491848
@classmethod
18501849
def identifier_help(cls):
@@ -1875,8 +1874,8 @@ def package_url_filename(self):
18751874
Return the Package URL string as a valid filename.
18761875
Useful when `Package.filename` is not available.
18771876
"""
1878-
cleaned_package_url = self.short_package_url
1879-
for char in "/@?=#":
1877+
cleaned_package_url = self.plain_package_url
1878+
for char in "/@?=#:":
18801879
cleaned_package_url = cleaned_package_url.replace(char, "_")
18811880
return get_valid_filename(cleaned_package_url)
18821881

component_catalog/tests/test_admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2291,7 +2291,7 @@ def test_component_changeform_package_inline_autocomplete_field(self):
22912291
for term in search_queries:
22922292
response = self.client.get(url + f"&term={term}")
22932293
results = json.loads(response.content.decode())
2294-
self.assertEqual("pypi/djangoproject/django@3.1", results[0].get("label"))
2294+
self.assertEqual("pkg:pypi/djangoproject/django@3.1", results[0].get("label"))
22952295

22962296
def test_component_admin_get_initial_from_related_instance(self):
22972297
release_date = datetime.datetime(2018, 6, 21, 3, 38, 24, 139528)

component_catalog/tests/test_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ def test_api_package_endpoint_create(self):
11961196
for field_name, value in data.items():
11971197
self.assertEqual(str(value), str(getattr(package, field_name)))
11981198

1199-
expected = 'Added Package: "deb/debian/curl@7.50.3-1"'
1199+
expected = 'Added Package: "pkg:deb/debian/curl@7.50.3-1"'
12001200
self.assertEqual(expected, mail.outbox[0].subject)
12011201
body = mail.outbox[0].body
12021202
self.assertIn(package.get_admin_url(), body)

component_catalog/tests/test_filters.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,18 +310,18 @@ def sorted_results(qs):
310310
data = {"q": ""}
311311
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
312312
expected = [
313-
"deb/debian/curl@7.50.3-1",
314-
"git/curl",
315-
"deb/curl",
313+
"pkg:deb/debian/curl@7.50.3-1",
314+
"pkg:git/curl",
315+
"pkg:deb/curl",
316316
"setup.exe",
317317
]
318318
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
319319

320320
data = {"q": "deb/curl"}
321321
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
322322
expected = [
323-
"deb/curl",
324-
"deb/debian/curl@7.50.3-1",
323+
"pkg:deb/curl",
324+
"pkg:deb/debian/curl@7.50.3-1",
325325
]
326326
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
327327
data = {"q": "pkg:deb/curl"}
@@ -331,7 +331,7 @@ def sorted_results(qs):
331331
data = {"q": "deb/debian/curl@7.50.3-1"}
332332
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
333333
expected = [
334-
"deb/debian/curl@7.50.3-1",
334+
"pkg:deb/debian/curl@7.50.3-1",
335335
]
336336
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
337337
data = {"q": "pkg:deb/debian/curl@7.50.3-1"}
@@ -341,7 +341,7 @@ def sorted_results(qs):
341341
data = {"q": "git/curl"}
342342
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
343343
expected = [
344-
"git/curl",
344+
"pkg:git/curl",
345345
]
346346
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
347347
data = {"q": "pkg:git/curl"}

component_catalog/tests/test_models.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,11 +1670,11 @@ def test_package_model_get_url_methods(self):
16701670
dataspace=self.dataspace,
16711671
)
16721672
self.assertEqual(
1673-
"/packages/nexB/pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/",
1673+
"/packages/nexB/pkg:pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/",
16741674
package.get_absolute_url(),
16751675
)
16761676
self.assertEqual(
1677-
"/packages/nexB/pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/change/",
1677+
"/packages/nexB/pkg:pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/change/",
16781678
package.get_change_url(),
16791679
)
16801680

@@ -1706,8 +1706,8 @@ def test_package_model_package_str_repr(self):
17061706
dataspace=self.dataspace,
17071707
)
17081708

1709-
# 1. Short Package URL
1710-
expected = "deb/debian/curl@7.50.3-1"
1709+
# 1. Plain Package URL
1710+
expected = "pkg:deb/debian/curl@7.50.3-1"
17111711
self.assertEqual(expected, str(package))
17121712

17131713
# 2. Full Package URL
@@ -1742,10 +1742,13 @@ def test_package_model_package_url_properties(self):
17421742
expected = "pkg:deb/debian/curl@7.50.3-1?arch=i386#googleapis/api/annotations"
17431743
self.assertEqual(expected, package.package_url)
17441744

1745+
expected = "pkg:deb/debian/curl@7.50.3-1"
1746+
self.assertEqual(expected, package.plain_package_url)
1747+
17451748
expected = "deb/debian/curl@7.50.3-1"
17461749
self.assertEqual(expected, package.short_package_url)
17471750

1748-
expected = "deb_debian_curl_7.50.3-1"
1751+
expected = "pkg_deb_debian_curl_7.50.3-1"
17491752
self.assertEqual(expected, package.package_url_filename)
17501753

17511754
def test_package_model_set_package_url(self):
@@ -1824,7 +1827,7 @@ def test_package_model_as_about(self):
18241827
self.assertEqual(expected, package_purl_only.as_about())
18251828
expected = "about_resource: .\nname: name\npackage_url: pkg:type/name\n"
18261829
self.assertEqual(expected, package_purl_only.as_about_yaml())
1827-
self.assertEqual("type_name.ABOUT", package_purl_only.about_file_name)
1830+
self.assertEqual("pkg_type_name.ABOUT", package_purl_only.about_file_name)
18281831

18291832
package = Package.objects.create(
18301833
filename="package.zip",
@@ -1924,8 +1927,8 @@ def test_package_model_about_file_and_notice_file_filename(self):
19241927
version="1.0 beta",
19251928
dataspace=self.dataspace,
19261929
)
1927-
self.assertEqual("deb_name_1.020beta.ABOUT", p2.about_file_name)
1928-
self.assertEqual("deb_name_1.020beta.NOTICE", p2.notice_file_name)
1930+
self.assertEqual("pkg_deb_name_1.020beta.ABOUT", p2.about_file_name)
1931+
self.assertEqual("pkg_deb_name_1.020beta.NOTICE", p2.notice_file_name)
19291932

19301933
def test_package_model_get_about_files(self):
19311934
# Using a CRLF (windows) line endings to ensure it's converted to LF (unix) in the output

component_catalog/tests/test_views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,7 @@ def test_package_views_urls(self):
11871187

11881188
args = [p2.dataspace.name, p2.identifier, p2.uuid]
11891189
url = reverse("component_catalog:package_details", args=args)
1190-
expected = "/packages/Dataspace/pypi/django@1.0/0c895367-e565-426b-9a63-589432fffa8c/"
1190+
expected = "/packages/Dataspace/pkg:pypi/django@1.0/0c895367-e565-426b-9a63-589432fffa8c/"
11911191
self.assertEqual(expected, url)
11921192

11931193
def test_package_list_view_content(self):
@@ -1567,7 +1567,7 @@ def test_package_send_about_files_view(self):
15671567
response = self.client.get(about_url)
15681568
self.assertEqual("application/zip", response["content-type"])
15691569
self.assertEqual(
1570-
'attachment; filename="pypi/django_about.zip"', response["content-disposition"]
1570+
'attachment; filename="pkg_pypi_django_about.zip"', response["content-disposition"]
15711571
)
15721572

15731573
package.filename = "django.whl"
@@ -3240,7 +3240,7 @@ def test_package_details_view_get_vulnerability_fields(self):
32403240
fixed_package_values,
32413241
)
32423242
self.assertIn(
3243-
f'<a href="{self.package1.get_absolute_url()}">nginx/nginx@1.11.1</a>',
3243+
f'<a href="{self.package1.get_absolute_url()}">pkg:nginx/nginx@1.11.1</a>',
32443244
fixed_package_values,
32453245
)
32463246
self.assertEqual(

dje/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,10 @@ def get_filename(instance):
591591
Return the value from the "filename" field when available or fallback to
592592
the string representation of the object.
593593
"""
594-
return getattr(instance, "filename", None) or str(instance).replace(" ", "_")
594+
filename = getattr(instance, "filename", None) or str(instance)
595+
for char in "/@?=#: ":
596+
filename = filename.replace(char, "_")
597+
return filename
595598

596599
@staticmethod
597600
def get_zipped_response(about_files, filename):

0 commit comments

Comments
 (0)