pulp-python 3.19.0__tar.gz → 3.19.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {pulp_python-3.19.0 → pulp_python-3.19.1}/CHANGES.md +9 -0
  2. {pulp_python-3.19.0 → pulp_python-3.19.1}/PKG-INFO +1 -1
  3. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/__init__.py +1 -1
  4. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/tasks/publish.py +7 -7
  5. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/pytest_plugin.py +1 -1
  6. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_crud_publications.py +27 -0
  7. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_pypi_apis.py +0 -20
  8. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/PKG-INFO +1 -1
  9. {pulp_python-3.19.0 → pulp_python-3.19.1}/pyproject.toml +2 -2
  10. {pulp_python-3.19.0 → pulp_python-3.19.1}/COMMITMENT +0 -0
  11. {pulp_python-3.19.0 → pulp_python-3.19.1}/COPYRIGHT +0 -0
  12. {pulp_python-3.19.0 → pulp_python-3.19.1}/LICENSE +0 -0
  13. {pulp_python-3.19.0 → pulp_python-3.19.1}/MANIFEST.in +0 -0
  14. {pulp_python-3.19.0 → pulp_python-3.19.1}/README.md +0 -0
  15. {pulp_python-3.19.0 → pulp_python-3.19.1}/functest_requirements.txt +0 -0
  16. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/__init__.py +0 -0
  17. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/global_access_conditions.py +0 -0
  18. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/management/__init__.py +0 -0
  19. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/management/commands/__init__.py +0 -0
  20. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/management/commands/repair-python-metadata.py +0 -0
  21. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0001_initial.py +0 -0
  22. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0001_squashed_0010_update_json_field.py +0 -0
  23. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0002_pythonpackagecontent_python_version.py +0 -0
  24. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0003_new_sync_filters.py +0 -0
  25. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0004_DATA_swap_distribution_model.py +0 -0
  26. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0005_pythonpackagecontent_sha256.py +0 -0
  27. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0006_pythonrepository_autopublish.py +0 -0
  28. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0007_pythonpackagecontent_mv-2-1.py +0 -0
  29. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0008_pythonpackagecontent_unique_sha256.py +0 -0
  30. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0009_pythondistribution_allow_uploads.py +0 -0
  31. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0010_update_json_field.py +0 -0
  32. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0011_alter_pythondistribution_distribution_ptr_and_more.py +0 -0
  33. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0012_add_domain.py +0 -0
  34. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0013_add_rbac_permissions.py +0 -0
  35. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0014_pythonpackagecontent_dynamic_and_more.py +0 -0
  36. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/0015_alter_pythonpackagecontent_options.py +0 -0
  37. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/migrations/__init__.py +0 -0
  38. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/modelresource.py +0 -0
  39. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/models.py +0 -0
  40. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/pypi/__init__.py +0 -0
  41. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/pypi/serializers.py +0 -0
  42. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/pypi/views.py +0 -0
  43. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/replica.py +0 -0
  44. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/serializers.py +0 -0
  45. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/settings.py +0 -0
  46. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/tasks/__init__.py +0 -0
  47. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/tasks/repair.py +0 -0
  48. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/tasks/sync.py +0 -0
  49. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/tasks/upload.py +0 -0
  50. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/urls.py +0 -0
  51. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/utils.py +0 -0
  52. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/viewsets.py +0 -0
  53. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/webserver_snippets/__init__.py +0 -0
  54. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/webserver_snippets/apache.conf +0 -0
  55. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/app/webserver_snippets/nginx.conf +0 -0
  56. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/__init__.py +0 -0
  57. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/__init__.py +0 -0
  58. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/__init__.py +0 -0
  59. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_auto_publish.py +0 -0
  60. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_consume_content.py +0 -0
  61. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_crud_content_unit.py +0 -0
  62. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_crud_remotes.py +0 -0
  63. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_domains.py +0 -0
  64. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_download_content.py +0 -0
  65. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_export_import.py +0 -0
  66. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_full_mirror.py +0 -0
  67. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_rbac.py +0 -0
  68. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_repair.py +0 -0
  69. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_sync.py +0 -0
  70. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/api/test_upload.py +0 -0
  71. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/constants.py +0 -0
  72. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/functional/utils.py +0 -0
  73. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/unit/__init__.py +0 -0
  74. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python/tests/unit/test_models.py +0 -0
  75. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/SOURCES.txt +0 -0
  76. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/dependency_links.txt +0 -0
  77. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/entry_points.txt +0 -0
  78. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/requires.txt +0 -0
  79. {pulp_python-3.19.0 → pulp_python-3.19.1}/pulp_python.egg-info/top_level.txt +0 -0
  80. {pulp_python-3.19.0 → pulp_python-3.19.1}/setup.cfg +0 -0
  81. {pulp_python-3.19.0 → pulp_python-3.19.1}/test_requirements.txt +0 -0
  82. {pulp_python-3.19.0 → pulp_python-3.19.1}/unittest_requirements.txt +0 -0
@@ -8,6 +8,15 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.19.1 (2025-09-14) {: #3.19.1 }
12
+
13
+ #### Bugfixes {: #3.19.1-bugfix }
14
+
15
+ - Fixed publication error when package's dists contain differing versions of its name.
16
+ [#907](https://github.com/pulp/pulp_python/issues/907)
17
+
18
+ ---
19
+
11
20
  ## 3.19.0 (2025-08-26) {: #3.19.0 }
12
21
 
13
22
  #### Features {: #3.19.0-feature }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulp-python
3
- Version: 3.19.0
3
+ Version: 3.19.1
4
4
  Summary: pulp-python plugin for the Pulp Project
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  Project-URL: Homepage, https://pulpproject.org
@@ -10,7 +10,7 @@ class PulpPythonPluginAppConfig(PulpPluginAppConfig):
10
10
 
11
11
  name = "pulp_python.app"
12
12
  label = "python"
13
- version = "3.19.0"
13
+ version = "3.19.1"
14
14
  python_package_name = "pulp-python"
15
15
  domain_compatible = True
16
16
 
@@ -59,9 +59,9 @@ def write_simple_api(publication):
59
59
  python_models.PythonPackageContent.objects.filter(
60
60
  pk__in=publication.repository_version.content, _pulp_domain=domain
61
61
  )
62
- .order_by("name")
62
+ .order_by("name__normalize")
63
63
  .values_list("name", flat=True)
64
- .distinct()
64
+ .distinct("name__normalize")
65
65
  )
66
66
 
67
67
  # write the root index, which lists all of the projects for which there is a package available
@@ -80,22 +80,22 @@ def write_simple_api(publication):
80
80
  packages = python_models.PythonPackageContent.objects.filter(
81
81
  pk__in=publication.repository_version.content, _pulp_domain=domain
82
82
  )
83
- releases = packages.order_by("name").values("name", "filename", "sha256")
83
+ releases = packages.order_by("name__normalize").values("name", "filename", "sha256")
84
84
 
85
85
  ind = 0
86
- current_name = project_names[ind]
86
+ current_name = canonicalize_name(project_names[ind])
87
87
  package_releases = []
88
88
  for release in releases.iterator():
89
- if release["name"] != current_name:
89
+ if canonicalize_name(release["name"]) != current_name:
90
90
  write_project_page(
91
- name=canonicalize_name(current_name),
91
+ name=current_name,
92
92
  simple_dir=simple_dir,
93
93
  package_releases=package_releases,
94
94
  publication=publication,
95
95
  )
96
96
  package_releases = []
97
97
  ind += 1
98
- current_name = project_names[ind]
98
+ current_name = canonicalize_name(project_names[ind])
99
99
  relative_path = release["filename"]
100
100
  path = f"../../{relative_path}"
101
101
  checksum = release["sha256"]
@@ -178,7 +178,7 @@ def python_content_factory(python_bindings, download_python_file, monitor_task):
178
178
 
179
179
  task = python_bindings.ContentPackagesApi.create(**body).task
180
180
  response = monitor_task(task)
181
- return python_bindings.ContentPackagesApi.read(response.created_resources[0])
181
+ return python_bindings.ContentPackagesApi.read(response.created_resources[-1])
182
182
 
183
183
  yield _gen_python_content
184
184
 
@@ -1,5 +1,6 @@
1
1
  import pytest
2
2
  import random
3
+ from pypi_simple import PyPISimple
3
4
  from urllib.parse import urljoin
4
5
 
5
6
  from pulp_python.tests.functional.constants import (
@@ -109,3 +110,29 @@ def test_new_content_is_published(python_publication_workflow, python_distributi
109
110
  url = urljoin(distro.base_url, "simple/")
110
111
  proper, msgs = ensure_simple(url, {"shelf-reader": releases})
111
112
  assert proper is True, msgs
113
+
114
+
115
+ @pytest.mark.parallel
116
+ def test_non_matching_canonicalized_name(
117
+ python_repo, python_content_factory, python_publication_factory, python_distribution_factory
118
+ ):
119
+ """Ensures a package with dists that have non-matching canonicalized names is published."""
120
+ packages = []
121
+ filenames = ["msg_parser-1.0.0-py2.py3-none-any.whl", "msg_parser-1.0.0.tar.gz"]
122
+ with PyPISimple() as client:
123
+ page = client.get_project_page("msg-parser")
124
+ for pkg in page.packages:
125
+ if pkg.filename in filenames:
126
+ c = python_content_factory(pkg.filename, url=pkg.url, repository=python_repo)
127
+ if c.filename.endswith(".tar.gz"):
128
+ # The metadata name in the SDist is not the same as the Wheel's name
129
+ assert c.name == "msg_parser"
130
+ else:
131
+ assert c.name == "msg-parser"
132
+ packages.append(c)
133
+ pub = python_publication_factory(repository=python_repo)
134
+ distro = python_distribution_factory(publication=pub)
135
+
136
+ url = urljoin(distro.base_url, "simple/")
137
+ proper, msgs = ensure_simple(url, {"msg-parser": filenames})
138
+ assert proper is True, msgs
@@ -225,26 +225,6 @@ def test_twine_upload(
225
225
  check=True,
226
226
  )
227
227
 
228
- # Test re-uploading same packages with --skip-existing works
229
- output = subprocess.run(
230
- (
231
- "twine",
232
- "upload",
233
- "--repository-url",
234
- url,
235
- dist_dir / "*",
236
- "-u",
237
- username,
238
- "-p",
239
- password,
240
- "--skip-existing",
241
- ),
242
- capture_output=True,
243
- check=True,
244
- text=True,
245
- )
246
- assert output.stdout.count("Skipping") == 2
247
-
248
228
 
249
229
  @pytest.mark.parallel
250
230
  def test_simple_redirect_with_publications(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulp-python
3
- Version: 3.19.0
3
+ Version: 3.19.1
4
4
  Summary: pulp-python plugin for the Pulp Project
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  Project-URL: Homepage, https://pulpproject.org
@@ -7,7 +7,7 @@ build-backend = 'setuptools.build_meta'
7
7
 
8
8
  [project]
9
9
  name = "pulp-python"
10
- version = "3.19.0"
10
+ version = "3.19.1"
11
11
  description = "pulp-python plugin for the Pulp Project"
12
12
  readme = "README.md"
13
13
  authors = [
@@ -76,7 +76,7 @@ ignore = [
76
76
  [tool.bumpversion]
77
77
  # This section is managed by the plugin template. Do not edit manually.
78
78
 
79
- current_version = "3.19.0"
79
+ current_version = "3.19.1"
80
80
  commit = false
81
81
  tag = false
82
82
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<alpha>0a)?(?P<patch>\\d+)(\\.(?P<release>[a-z]+))?"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes