pulp-python 3.36.0__tar.gz → 3.36.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 (105) hide show
  1. {pulp_python-3.36.0 → pulp_python-3.36.1}/CHANGES.md +9 -0
  2. {pulp_python-3.36.0 → pulp_python-3.36.1}/PKG-INFO +1 -1
  3. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/__init__.py +1 -1
  4. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/pypi/views.py +11 -2
  5. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_pypi_simple_api.py +4 -2
  6. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_simple_cache.py +7 -8
  7. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/PKG-INFO +1 -1
  8. {pulp_python-3.36.0 → pulp_python-3.36.1}/pyproject.toml +2 -2
  9. {pulp_python-3.36.0 → pulp_python-3.36.1}/COMMITMENT +0 -0
  10. {pulp_python-3.36.0 → pulp_python-3.36.1}/COPYRIGHT +0 -0
  11. {pulp_python-3.36.0 → pulp_python-3.36.1}/LICENSE +0 -0
  12. {pulp_python-3.36.0 → pulp_python-3.36.1}/MANIFEST.in +0 -0
  13. {pulp_python-3.36.0 → pulp_python-3.36.1}/README.md +0 -0
  14. {pulp_python-3.36.0 → pulp_python-3.36.1}/functest_requirements.txt +0 -0
  15. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/__init__.py +0 -0
  16. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/cache.py +0 -0
  17. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/exceptions.py +0 -0
  18. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/global_access_conditions.py +0 -0
  19. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/management/__init__.py +0 -0
  20. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/management/commands/__init__.py +0 -0
  21. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/management/commands/repair-python-metadata.py +0 -0
  22. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0001_initial.py +0 -0
  23. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0001_squashed_0010_update_json_field.py +0 -0
  24. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0002_pythonpackagecontent_python_version.py +0 -0
  25. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0003_new_sync_filters.py +0 -0
  26. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0004_DATA_swap_distribution_model.py +0 -0
  27. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0005_pythonpackagecontent_sha256.py +0 -0
  28. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0006_pythonrepository_autopublish.py +0 -0
  29. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0007_pythonpackagecontent_mv-2-1.py +0 -0
  30. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0008_pythonpackagecontent_unique_sha256.py +0 -0
  31. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0009_pythondistribution_allow_uploads.py +0 -0
  32. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0010_update_json_field.py +0 -0
  33. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0011_alter_pythondistribution_distribution_ptr_and_more.py +0 -0
  34. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0012_add_domain.py +0 -0
  35. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0013_add_rbac_permissions.py +0 -0
  36. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0014_pythonpackagecontent_dynamic_and_more.py +0 -0
  37. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0015_alter_pythonpackagecontent_options.py +0 -0
  38. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0016_pythonpackagecontent_metadata_sha256.py +0 -0
  39. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0017_pythonpackagecontent_size.py +0 -0
  40. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0018_packageprovenance.py +0 -0
  41. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0019_create_missing_metadata_artifacts.py +0 -0
  42. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0020_pythonpackagecontent_name_normalized.py +0 -0
  43. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0021_pythonrepository_upload_duplicate_filenames.py +0 -0
  44. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0022_pythonblocklistentry.py +0 -0
  45. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0023_packageyank.py +0 -0
  46. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/0024_pythonrepository_error_on_reject.py +0 -0
  47. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/migrations/__init__.py +0 -0
  48. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/modelresource.py +0 -0
  49. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/models.py +0 -0
  50. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/provenance.py +0 -0
  51. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/pypi/__init__.py +0 -0
  52. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/pypi/feeds.py +0 -0
  53. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/pypi/serializers.py +0 -0
  54. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/replica.py +0 -0
  55. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/serializers.py +0 -0
  56. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/settings.py +0 -0
  57. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/__init__.py +0 -0
  58. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/publish.py +0 -0
  59. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/repair.py +0 -0
  60. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/sync.py +0 -0
  61. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/upload.py +0 -0
  62. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/vulnerability_report.py +0 -0
  63. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/tasks/yank.py +0 -0
  64. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/urls.py +0 -0
  65. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/utils.py +0 -0
  66. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/viewsets.py +0 -0
  67. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/webserver_snippets/__init__.py +0 -0
  68. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/webserver_snippets/apache.conf +0 -0
  69. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/app/webserver_snippets/nginx.conf +0 -0
  70. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/pytest_plugin.py +0 -0
  71. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/__init__.py +0 -0
  72. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/__init__.py +0 -0
  73. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/__init__.py +0 -0
  74. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_attestations.py +0 -0
  75. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_auto_publish.py +0 -0
  76. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_blocklist.py +0 -0
  77. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_consume_content.py +0 -0
  78. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_crud_content_unit.py +0 -0
  79. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_crud_publications.py +0 -0
  80. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_crud_remotes.py +0 -0
  81. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_domains.py +0 -0
  82. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_download_content.py +0 -0
  83. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_export_import.py +0 -0
  84. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_full_mirror.py +0 -0
  85. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_pypi_apis.py +0 -0
  86. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_pypi_feeds.py +0 -0
  87. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_rbac.py +0 -0
  88. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_repair.py +0 -0
  89. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_sync.py +0 -0
  90. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_upload.py +0 -0
  91. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_version_specifier_filter.py +0 -0
  92. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_vulnerability_report.py +0 -0
  93. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/api/test_yank.py +0 -0
  94. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/constants.py +0 -0
  95. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/functional/utils.py +0 -0
  96. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/unit/__init__.py +0 -0
  97. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python/tests/unit/test_models.py +0 -0
  98. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/SOURCES.txt +0 -0
  99. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/dependency_links.txt +0 -0
  100. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/entry_points.txt +0 -0
  101. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/requires.txt +0 -0
  102. {pulp_python-3.36.0 → pulp_python-3.36.1}/pulp_python.egg-info/top_level.txt +0 -0
  103. {pulp_python-3.36.0 → pulp_python-3.36.1}/setup.cfg +0 -0
  104. {pulp_python-3.36.0 → pulp_python-3.36.1}/test_requirements.txt +0 -0
  105. {pulp_python-3.36.0 → pulp_python-3.36.1}/unittest_requirements.txt +0 -0
@@ -8,6 +8,15 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.36.1 (2026-09-09) {: #3.36.1 }
12
+
13
+ #### Bugfixes {: #3.36.1-bugfix }
14
+
15
+ - Prefer the PyPI Simple API JSON response when clients such as pip and uv advertise JSON alongside HTML.
16
+ [#1370](https://github.com/pulp/pulp_python/issues/1370)
17
+
18
+ ---
19
+
11
20
  ## 3.36.0 (2026-09-03) {: #3.36.0 }
12
21
 
13
22
  #### Features {: #3.36.0-feature }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulp-python
3
- Version: 3.36.0
3
+ Version: 3.36.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
@@ -12,7 +12,7 @@ class PulpPythonPluginAppConfig(PulpPluginAppConfig):
12
12
 
13
13
  name = "pulp_python.app"
14
14
  label = "python"
15
- version = "3.36.0"
15
+ version = "3.36.1"
16
16
  python_package_name = "pulp-python"
17
17
  domain_compatible = True
18
18
 
@@ -318,8 +318,17 @@ class SimpleView(PackageUploadMixin, ViewSet):
318
318
  Uses custom renderers for PyPI Simple API endpoints, defaulting to standard ones.
319
319
  """
320
320
  if self.action in ["list", "retrieve"]:
321
- # Ordered by priority if multiple content types are present
322
- return [TemplateHTMLRenderer(), PyPISimpleHTMLRenderer(), PyPISimpleJSONRenderer()]
321
+ # DRF resolves equally-specific media types in renderer order and does not
322
+ # account for q-values. Put the PyPI JSON renderer first when the client
323
+ # explicitly advertises it (as pip and uv do), otherwise retain HTML as the
324
+ # default for browser and legacy clients.
325
+ accept = self.request.META.get("HTTP_ACCEPT", "").lower()
326
+ renderers = [TemplateHTMLRenderer(), PyPISimpleHTMLRenderer()]
327
+ if PYPI_SIMPLE_V1_JSON in accept:
328
+ renderers.insert(0, PyPISimpleJSONRenderer())
329
+ else:
330
+ renderers.append(PyPISimpleJSONRenderer())
331
+ return renderers
323
332
  else:
324
333
  return [JSONRenderer(), BrowsableAPIRenderer()]
325
334
 
@@ -169,8 +169,8 @@ def test_simple_json_detail_api(
169
169
  (PYPI_TEXT_HTML, PYPI_TEXT_HTML),
170
170
  (PYPI_SIMPLE_V1_HTML, PYPI_SIMPLE_V1_HTML),
171
171
  (PYPI_SIMPLE_V1_JSON, PYPI_SIMPLE_V1_JSON),
172
- # Follows defined ordering (html, pypi html, pypi json)
173
- (f"{PYPI_SIMPLE_V1_JSON}, {PYPI_SIMPLE_V1_HTML}", PYPI_SIMPLE_V1_HTML),
172
+ # Clients such as pip and uv advertise JSON first, with HTML as a fallback.
173
+ (f"{PYPI_SIMPLE_V1_JSON}, {PYPI_SIMPLE_V1_HTML}", PYPI_SIMPLE_V1_JSON),
174
174
  # Everything else should be html
175
175
  ("", PYPI_TEXT_HTML),
176
176
  ("application/json", PYPI_TEXT_HTML),
@@ -191,3 +191,5 @@ def test_simple_api_content_headers(
191
191
  response = requests.get(url, headers={"Accept": header})
192
192
  assert response.status_code == 200
193
193
  assert result in response.headers["Content-Type"]
194
+ if url == detail_url and result == PYPI_SIMPLE_V1_JSON:
195
+ assert all(file["upload-time"] for file in response.json()["files"])
@@ -91,14 +91,13 @@ def test_simple_cache_separate_accept_headers(synced_distro):
91
91
 
92
92
 
93
93
  @pytest.mark.parallel
94
- def test_simple_cache_format_json_does_not_poison_html(synced_distro):
94
+ def test_simple_cache_negotiated_media_types_are_separate(synced_distro):
95
95
  """
96
- A ?format=json response must not poison a later request with the same Accept.
96
+ JSON and HTML responses must not poison each other in the cache.
97
97
 
98
- Clients like uv/pip send an Accept that allows both JSON and HTML. DRF's
99
- ?format=json overrides negotiation to JSON, while the same Accept without
100
- that query param selects HTML. Caching must key on the negotiated type so
101
- the JSON entry is not served (and re-rendered) for the HTML request.
98
+ Clients like uv/pip send an Accept that allows both JSON and HTML. The
99
+ negotiated JSON response must be cached separately from an explicit HTML
100
+ response.
102
101
  """
103
102
  url = f"{urljoin(synced_distro.base_url, 'simple/')}aiohttp"
104
103
  # pip/uv-style Accept: JSON preferred, HTML still acceptable
@@ -112,13 +111,13 @@ def test_simple_cache_format_json_does_not_poison_html(synced_distro):
112
111
  assert r_json.headers["X-PULP-CACHE"] == "MISS"
113
112
  assert r_json.json()["name"] == "aiohttp"
114
113
 
115
- r_html = requests.get(url, headers=headers)
114
+ r_html = requests.get(url, headers={"Accept": PYPI_TEXT_HTML})
116
115
  assert r_html.status_code == 200
117
116
  assert PYPI_TEXT_HTML in r_html.headers["Content-Type"]
118
117
  assert r_html.headers["X-PULP-CACHE"] == "MISS"
119
118
  assert b"<a href=" in r_html.content
120
119
 
121
- r_html_hit = requests.get(url, headers=headers)
120
+ r_html_hit = requests.get(url, headers={"Accept": PYPI_TEXT_HTML})
122
121
  assert r_html_hit.status_code == 200
123
122
  assert r_html_hit.headers["X-PULP-CACHE"] == "HIT"
124
123
  assert PYPI_TEXT_HTML in r_html_hit.headers["Content-Type"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulp-python
3
- Version: 3.36.0
3
+ Version: 3.36.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.36.0"
10
+ version = "3.36.1"
11
11
  description = "pulp-python plugin for the Pulp Project"
12
12
  readme = "README.md"
13
13
  authors = [
@@ -79,7 +79,7 @@ ignore = [
79
79
  [tool.bumpversion]
80
80
  # This section is managed by the plugin template. Do not edit manually.
81
81
 
82
- current_version = "3.36.0"
82
+ current_version = "3.36.1"
83
83
  commit = false
84
84
  tag = false
85
85
  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