Skip to content

Commit

Permalink
Fix package name normalization for package pypi json view
Browse files Browse the repository at this point in the history
Merge pull request #717 from gerrod3/normalize-name-pypi
(cherry picked from commit fc43b4b)
  • Loading branch information
gerrod3 committed Aug 19, 2024
1 parent b90aa94 commit 957f60c
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGES/716.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed package name normalization issue preventing syncing packages with "." or "_" in their names.
6 changes: 5 additions & 1 deletion pulp_python/app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

from pathlib import PurePath
from .utils import (
canonicalize_name,
get_project_metadata_from_artifact,
parse_project_metadata,
python_content_to_json,
Expand Down Expand Up @@ -84,6 +85,8 @@ def content_handler(self, path):
).latest("pulp_created")
except ObjectDoesNotExist:
return None
if len(path.parts) == 2:
path = PurePath(f"simple/{canonicalize_name(path.parts[1])}")
rel_path = f"{path}/index.html"
try:
ca = (
Expand All @@ -100,8 +103,9 @@ def content_handler(self, path):
return ArtifactResponse(ca.artifact, headers=headers)

if name:
normalized = canonicalize_name(name)
package_content = PythonPackageContent.objects.filter(
pk__in=self.publication.repository_version.content, name__iexact=name
pk__in=self.publication.repository_version.content, name__normalize=normalized
)
# TODO Change this value to the Repo's serial value when implemented
headers = {PYPI_LAST_SERIAL: str(PYPI_SERIAL_CONSTANT)}
Expand Down
3 changes: 2 additions & 1 deletion pulp_python/app/pypi/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ def retrieve(self, request, path, meta):
elif meta_path.match("*/json"):
name = meta_path.parts[0]
if name:
package_content = content.filter(name__iexact=name)
normalized = canonicalize_name(name)
package_content = content.filter(name__normalize=normalized)
# TODO Change this value to the Repo's serial value when implemented
headers = {PYPI_LAST_SERIAL: str(PYPI_SERIAL_CONSTANT)}
json_body = python_content_to_json(path, package_content, version=version)
Expand Down
30 changes: 30 additions & 0 deletions pulp_python/tests/functional/api/test_download_content.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# coding=utf-8
"""Tests that verify download of content served by Pulp."""
import pytest
import hashlib
from random import choice
from urllib.parse import urljoin
Expand Down Expand Up @@ -149,3 +150,32 @@ def test_full_pulp_to_pulp_sync(self):

repo3 = self._create_repo_and_sync_with_remote(remote)
self.assertEqual(get_content_summary(repo3.to_dict()), PYTHON_MD_FIXTURE_SUMMARY)


@pytest.mark.parallel
def test_pulp2pulp_sync_with_oddities(
python_repo_with_sync,
python_remote_factory,
python_publication_factory,
python_distribution_factory,
python_content_summary,
):
"""Test that Pulp can handle syncing packages with wierd names."""
remote = python_remote_factory(includes=["oslo.utils"], url="https://pypi.org")
repo = python_repo_with_sync(remote)
distro = python_distribution_factory(repository=repo.pulp_href)
summary = python_content_summary(repository_version=repo.latest_version_href)
# Test pulp 2 pulp full sync w/ live pypi apis
remote2 = python_remote_factory(includes=[], url=distro.base_url)
repo2 = python_repo_with_sync(remote2)
summary2 = python_content_summary(repository_version=repo2.latest_version_href)
assert summary2.present["python.python"]["count"] > 0
assert summary.present["python.python"]["count"] == summary2.present["python.python"]["count"]
# Test w/ publication
pub = python_publication_factory(repository=repo)
distro2 = python_distribution_factory(publication=pub.pulp_href)
remote3 = python_remote_factory(includes=[], url=distro2.base_url)
repo3 = python_repo_with_sync(remote3)
summary3 = python_content_summary(repository_version=repo3.latest_version_href)
assert summary3.present["python.python"]["count"] > 0
assert summary.present["python.python"]["count"] == summary3.present["python.python"]["count"]

0 comments on commit 957f60c

Please sign in to comment.