Skip to content

Commit

Permalink
Merge pull request #717 from gerrod3/normalize-name-pypi
Browse files Browse the repository at this point in the history
Fix package name normalization for package pypi json view
  • Loading branch information
gerrod3 authored Aug 13, 2024
2 parents 9f9e6f3 + 4880949 commit fc43b4b
Show file tree
Hide file tree
Showing 4 changed files with 37 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 @@ -17,6 +17,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 @@ -87,6 +88,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 @@ -103,8 +106,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 @@ -327,7 +327,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)}
if settings.DOMAIN_ENABLED:
Expand Down
29 changes: 29 additions & 0 deletions pulp_python/tests/functional/api/test_download_content.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,32 @@ def test_full_pulp_to_pulp_sync(
repo3 = python_repo_with_sync(remote3)
summary2 = python_content_summary(repository_version=repo3.latest_version_href)
assert summary2.present["python.python"]["count"] == PYTHON_MD_PACKAGE_COUNT


@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)
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)
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 fc43b4b

Please sign in to comment.