Skip to content

Commit ed76616

Browse files
committed
tmp
1 parent b8af421 commit ed76616

File tree

6 files changed

+56
-39
lines changed

6 files changed

+56
-39
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Generated by Django 4.2.25 on 2025-11-03 20:01
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("python", "0016_pythonpackagecontent_sha256_metadata_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="pythonpackagecontent",
15+
name="sha256_metadata",
16+
),
17+
migrations.RemoveField(
18+
model_name="pythonpackagecontent",
19+
name="yanked",
20+
),
21+
migrations.RemoveField(
22+
model_name="pythonpackagecontent",
23+
name="yanked_reason",
24+
),
25+
migrations.AddField(
26+
model_name="pythonpackagecontent",
27+
name="metadata_sha256",
28+
field=models.CharField(max_length=64, null=True),
29+
),
30+
]

pulp_python/app/models.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,8 @@ class PythonPackageContent(Content):
192192
packagetype = models.TextField(choices=PACKAGE_TYPES)
193193
python_version = models.TextField()
194194
sha256 = models.CharField(db_index=True, max_length=64)
195-
sha256_metadata = models.CharField(max_length=64)
196-
yanked = models.BooleanField(default=False)
197-
yanked_reason = models.TextField()
195+
metadata_sha256 = models.CharField(max_length=64, null=True)
196+
# yanked and yanked_reason are not implemented because they are mutable
198197

199198
# From pulpcore
200199
PROTECTED_FROM_RECLAIM = False

pulp_python/app/pypi/views.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,8 @@ def retrieve(self, request, path, package):
342342
"filename",
343343
"sha256",
344344
"name",
345-
"sha256_metadata",
345+
"metadata_sha256",
346346
"requires_python",
347-
"yanked",
348-
"yanked_reason",
349347
)
350348
.iterator()
351349
)
@@ -361,12 +359,10 @@ def retrieve(self, request, path, package):
361359
"filename": f,
362360
"url": urljoin(self.base_content_url, f"{path}/{f}"),
363361
"sha256": s,
364-
"sha256_metadata": sm,
362+
"metadata_sha256": ms,
365363
"requires_python": rp,
366-
"yanked": y,
367-
"yanked_reason": yr,
368364
}
369-
for f, s, _, sm, rp, y, yr in packages
365+
for f, s, _, ms, rp in packages
370366
)
371367
media_type = request.accepted_renderer.media_type
372368

@@ -377,7 +373,7 @@ def retrieve(self, request, path, package):
377373
else:
378374
detail_data = write_simple_detail(name, releases, streamed=True)
379375
kwargs = {"content_type": media_type}
380-
return StreamingHttpResponse(detail_data, kwargs)
376+
return StreamingHttpResponse(detail_data, **kwargs)
381377

382378
@extend_schema(
383379
request=PackageUploadSerializer,

pulp_python/app/tasks/publish.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,13 @@ def write_simple_api(publication):
101101
relative_path = release["filename"]
102102
path = f"../../{relative_path}"
103103
checksum = release["sha256"]
104-
package_releases.append((relative_path, path, checksum))
104+
package_releases.append(
105+
{
106+
"filename": relative_path,
107+
"url": path,
108+
"sha256": checksum,
109+
}
110+
)
105111
# Write the final project's page
106112
write_project_page(
107113
name=canonicalize_name(current_name),
@@ -118,7 +124,6 @@ def write_project_page(name, simple_dir, package_releases, publication):
118124
metadata_relative_path = f"{project_dir}index.html"
119125

120126
with open(metadata_relative_path, "w") as simple_metadata:
121-
# todo?
122127
simple_metadata.write(write_simple_detail(name, package_releases))
123128

124129
project_metadata = models.PublishedMetadata.create_from_file(

pulp_python/app/utils.py

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,17 @@
1212
from pulpcore.plugin.models import Remote
1313

1414

15-
# todo: why upper case?
1615
PYPI_LAST_SERIAL = "X-PYPI-LAST-SERIAL"
1716
"""TODO This serial constant is temporary until Python repositories implements serials"""
1817
PYPI_SERIAL_CONSTANT = 1000000000
1918

20-
PYPI_API_VERSION = "1.0"
19+
SIMPLE_API_VERSION = "1.0"
2120

2221
simple_index_template = """<!DOCTYPE html>
2322
<html>
2423
<head>
2524
<title>Simple Index</title>
26-
<meta name="api-version" value="2" />
25+
<meta name="pypi:repository-version" content="{SIMPLE_API_VERSION}">
2726
</head>
2827
<body>
2928
{% for name, canonical_name in projects %}
@@ -131,6 +130,7 @@ def parse_project_metadata(project):
131130
# Release metadata
132131
"packagetype": project.get("packagetype") or "",
133132
"python_version": project.get("python_version") or "",
133+
"metadata_sha256": "", # TODO
134134
}
135135

136136

@@ -161,9 +161,9 @@ def parse_metadata(project, version, distribution):
161161
package["requires_python"] = distribution.get("requires_python") or package.get(
162162
"requires_python"
163163
) # noqa: E501
164-
package["yanked"] = distribution.get("yanked") or False
165-
package["yanked_reason"] = distribution.get("yanked_reason") or ""
166-
package["sha256_metadata"] = distribution.get("data-dist-info-metadata", {}).get("sha256") or ""
164+
package["metadata_sha256"] = distribution.get("data-dist-info-metadata", {}).get(
165+
"sha256"
166+
) or package.get("metadata_sha256")
167167

168168
return package
169169

@@ -209,10 +209,6 @@ def artifact_to_python_content_data(filename, artifact, domain=None):
209209
data["filename"] = filename
210210
data["pulp_domain"] = domain or artifact.pulp_domain
211211
data["_pulp_domain"] = data["pulp_domain"]
212-
# todo: how to get these / should they be here?
213-
# data["yanked"] = False
214-
# data["yanked_reason"] = ""
215-
# data["sha256_metadata"] = ""
216212
return data
217213

218214

@@ -335,7 +331,6 @@ def python_content_to_info(content):
335331
"platform": content.platform or "",
336332
"requires_dist": json_to_dict(content.requires_dist) or None,
337333
"classifiers": json_to_dict(content.classifiers) or None,
338-
# todo yanked
339334
"yanked": False, # These are no longer used on PyPI, but are still present
340335
"yanked_reason": None,
341336
# New core metadata (Version 2.1, 2.2, 2.4)
@@ -406,7 +401,6 @@ def find_artifact():
406401
"upload_time": str(content.pulp_created),
407402
"upload_time_iso_8601": str(content.pulp_created.isoformat()),
408403
"url": url,
409-
# todo yanked
410404
"yanked": False,
411405
"yanked_reason": None,
412406
}
@@ -429,7 +423,7 @@ def write_simple_detail(project_name, project_packages, streamed=False):
429423
def write_simple_index_json(project_names):
430424
"""Writes the simple index in JSON format."""
431425
return {
432-
"meta": {"api-version": PYPI_API_VERSION, "_last-serial": PYPI_SERIAL_CONSTANT},
426+
"meta": {"api-version": SIMPLE_API_VERSION, "_last-serial": PYPI_SERIAL_CONSTANT},
433427
"projects": [
434428
{"name": name, "_last-serial": PYPI_SERIAL_CONSTANT} for name in project_names
435429
],
@@ -439,7 +433,7 @@ def write_simple_index_json(project_names):
439433
def write_simple_detail_json(project_name, project_packages):
440434
"""Writes the simple detail page in JSON format."""
441435
return {
442-
"meta": {"api-version": PYPI_API_VERSION, "_last-serial": PYPI_SERIAL_CONSTANT},
436+
"meta": {"api-version": SIMPLE_API_VERSION, "_last-serial": PYPI_SERIAL_CONSTANT},
443437
"name": canonicalize_name(project_name),
444438
"files": [
445439
{
@@ -450,23 +444,17 @@ def write_simple_detail_json(project_name, project_packages):
450444
"requires_python": package["requires_python"] or None,
451445
# data-dist-info-metadata is deprecated alias for core-metadata
452446
"data-dist-info-metadata": (
453-
{"sha256": package["sha256_metadata"]} if package["sha256_metadata"] else False
447+
{"sha256": package["metadata_sha256"]} if package["metadata_sha256"] else False
454448
),
455-
"yanked": (
456-
package["yanked_reason"]
457-
if package["yanked"] and package["yanked_reason"]
458-
else package["yanked"]
459-
),
460-
# gpg-sig (not in warehouse)
461-
# todo (from new PEPs):
462-
# size (v1.1, PEP 700)
463-
# upload-time (v1.1, PEP 700)
449+
# yanked and yanked_reason are not implemented because they are mutable
450+
# TODO in the future:
451+
# size, upload-time (v1.1, PEP 700)
464452
# core-metadata (PEP 7.14)
465453
# provenance (v1.3, PEP 740)
466454
}
467455
for package in project_packages
468456
],
469-
# todo (from new PEPs):
457+
# TODO in the future:
470458
# versions (v1.1, PEP 700)
471459
# alternate-locations (v1.2, PEP 708)
472460
# project-status (v1.4, PEP 792 - pypi and docs differ)

pulp_python/tests/functional/api/test_pypi_simple_json_api.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ def test_simple_json_detail_api(
6262
"hashes",
6363
"data-dist-info-metadata",
6464
"requires_python",
65-
"yanked",
6665
]:
6766
assert i in file
6867

0 commit comments

Comments
 (0)