Skip to content

Commit

Permalink
Always display the full Package URL including pkg: #115
Browse files Browse the repository at this point in the history
Signed-off-by: tdruez <tdruez@nexb.com>
  • Loading branch information
tdruez committed May 14, 2024
1 parent 27c44e4 commit 213bd4f
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 26 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ Release notes
- Display Product inventory count on the Product list view.
https://github.com/nexB/dejacode/issues/81

- Always display the full Package URL in the UI view including the "pkg:" prefix.
https://github.com/nexB/dejacode/issues/115

### Version 5.0.1

- Improve the stability of the "Check for new Package versions" feature.
Expand Down
9 changes: 4 additions & 5 deletions component_catalog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1841,10 +1841,9 @@ def enforce_identifier(self):
def identifier(self):
"""
Provide a unique value to identify each Package.
It is the Package URL (minus the 'pkg:' prefix) if one exists;
otherwise it is the Package Filename.
It is the Package URL if one exists; otherwise it is the Package Filename.
"""
return self.short_package_url or self.filename
return self.plain_package_url or self.filename

@classmethod
def identifier_help(cls):
Expand Down Expand Up @@ -1875,8 +1874,8 @@ def package_url_filename(self):
Return the Package URL string as a valid filename.
Useful when `Package.filename` is not available.
"""
cleaned_package_url = self.short_package_url
for char in "/@?=#":
cleaned_package_url = self.plain_package_url
for char in "/@?=#:":
cleaned_package_url = cleaned_package_url.replace(char, "_")
return get_valid_filename(cleaned_package_url)

Expand Down
2 changes: 1 addition & 1 deletion component_catalog/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2291,7 +2291,7 @@ def test_component_changeform_package_inline_autocomplete_field(self):
for term in search_queries:
response = self.client.get(url + f"&term={term}")
results = json.loads(response.content.decode())
self.assertEqual("pypi/djangoproject/django@3.1", results[0].get("label"))
self.assertEqual("pkg:pypi/djangoproject/django@3.1", results[0].get("label"))

def test_component_admin_get_initial_from_related_instance(self):
release_date = datetime.datetime(2018, 6, 21, 3, 38, 24, 139528)
Expand Down
2 changes: 1 addition & 1 deletion component_catalog/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1196,7 +1196,7 @@ def test_api_package_endpoint_create(self):
for field_name, value in data.items():
self.assertEqual(str(value), str(getattr(package, field_name)))

expected = 'Added Package: "deb/debian/curl@7.50.3-1"'
expected = 'Added Package: "pkg:deb/debian/curl@7.50.3-1"'
self.assertEqual(expected, mail.outbox[0].subject)
body = mail.outbox[0].body
self.assertIn(package.get_admin_url(), body)
Expand Down
14 changes: 7 additions & 7 deletions component_catalog/tests/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,18 +310,18 @@ def sorted_results(qs):
data = {"q": ""}
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
expected = [
"deb/debian/curl@7.50.3-1",
"git/curl",
"deb/curl",
"pkg:deb/debian/curl@7.50.3-1",
"pkg:git/curl",
"pkg:deb/curl",
"setup.exe",
]
self.assertEqual(sorted(expected), sorted_results(filterset.qs))

data = {"q": "deb/curl"}
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
expected = [
"deb/curl",
"deb/debian/curl@7.50.3-1",
"pkg:deb/curl",
"pkg:deb/debian/curl@7.50.3-1",
]
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
data = {"q": "pkg:deb/curl"}
Expand All @@ -331,7 +331,7 @@ def sorted_results(qs):
data = {"q": "deb/debian/curl@7.50.3-1"}
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
expected = [
"deb/debian/curl@7.50.3-1",
"pkg:deb/debian/curl@7.50.3-1",
]
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
data = {"q": "pkg:deb/debian/curl@7.50.3-1"}
Expand All @@ -341,7 +341,7 @@ def sorted_results(qs):
data = {"q": "git/curl"}
filterset = PackageFilterSet(dataspace=self.nexb_dataspace, data=data)
expected = [
"git/curl",
"pkg:git/curl",
]
self.assertEqual(sorted(expected), sorted_results(filterset.qs))
data = {"q": "pkg:git/curl"}
Expand Down
19 changes: 11 additions & 8 deletions component_catalog/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1670,11 +1670,11 @@ def test_package_model_get_url_methods(self):
dataspace=self.dataspace,
)
self.assertEqual(
"/packages/nexB/pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/",
"/packages/nexB/pkg:pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/",
package.get_absolute_url(),
)
self.assertEqual(
"/packages/nexB/pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/change/",
"/packages/nexB/pkg:pypi/django@1.0/dd0afd00-89bd-46d6-b1f0-57b553c44d32/change/",
package.get_change_url(),
)

Expand Down Expand Up @@ -1706,8 +1706,8 @@ def test_package_model_package_str_repr(self):
dataspace=self.dataspace,
)

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

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

expected = "pkg:deb/debian/curl@7.50.3-1"
self.assertEqual(expected, package.plain_package_url)

expected = "deb/debian/curl@7.50.3-1"
self.assertEqual(expected, package.short_package_url)

expected = "deb_debian_curl_7.50.3-1"
expected = "pkg_deb_debian_curl_7.50.3-1"
self.assertEqual(expected, package.package_url_filename)

def test_package_model_set_package_url(self):
Expand Down Expand Up @@ -1824,7 +1827,7 @@ def test_package_model_as_about(self):
self.assertEqual(expected, package_purl_only.as_about())
expected = "about_resource: .\nname: name\npackage_url: pkg:type/name\n"
self.assertEqual(expected, package_purl_only.as_about_yaml())
self.assertEqual("type_name.ABOUT", package_purl_only.about_file_name)
self.assertEqual("pkg_type_name.ABOUT", package_purl_only.about_file_name)

package = Package.objects.create(
filename="package.zip",
Expand Down Expand Up @@ -1924,8 +1927,8 @@ def test_package_model_about_file_and_notice_file_filename(self):
version="1.0 beta",
dataspace=self.dataspace,
)
self.assertEqual("deb_name_1.020beta.ABOUT", p2.about_file_name)
self.assertEqual("deb_name_1.020beta.NOTICE", p2.notice_file_name)
self.assertEqual("pkg_deb_name_1.020beta.ABOUT", p2.about_file_name)
self.assertEqual("pkg_deb_name_1.020beta.NOTICE", p2.notice_file_name)

def test_package_model_get_about_files(self):
# Using a CRLF (windows) line endings to ensure it's converted to LF (unix) in the output
Expand Down
6 changes: 3 additions & 3 deletions component_catalog/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1187,7 +1187,7 @@ def test_package_views_urls(self):

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

def test_package_list_view_content(self):
Expand Down Expand Up @@ -1567,7 +1567,7 @@ def test_package_send_about_files_view(self):
response = self.client.get(about_url)
self.assertEqual("application/zip", response["content-type"])
self.assertEqual(
'attachment; filename="pypi/django_about.zip"', response["content-disposition"]
'attachment; filename="pkg_pypi_django_about.zip"', response["content-disposition"]
)

package.filename = "django.whl"
Expand Down Expand Up @@ -3240,7 +3240,7 @@ def test_package_details_view_get_vulnerability_fields(self):
fixed_package_values,
)
self.assertIn(
f'<a href="{self.package1.get_absolute_url()}">nginx/nginx@1.11.1</a>',
f'<a href="{self.package1.get_absolute_url()}">pkg:nginx/nginx@1.11.1</a>',
fixed_package_values,
)
self.assertEqual(
Expand Down
5 changes: 4 additions & 1 deletion dje/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,10 @@ def get_filename(instance):
Return the value from the "filename" field when available or fallback to
the string representation of the object.
"""
return getattr(instance, "filename", None) or str(instance).replace(" ", "_")
filename = getattr(instance, "filename", None) or str(instance)
for char in "/@?=#: ":
filename = filename.replace(char, "_")
return filename

@staticmethod
def get_zipped_response(about_files, filename):
Expand Down

0 comments on commit 213bd4f

Please sign in to comment.