Skip to content

Commit 24f081f

Browse files
authored
Merge pull request #667 from leocardao/mr/cardao/e3-pypi-closure-manage-yanked
e3-pypi-closure: Add yanked management
2 parents 966eeed + 7cc70c6 commit 24f081f

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

src/e3/python/pypi.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ def url(self) -> str:
6666
"""Return the download url."""
6767
return self.data["url"]
6868

69+
@property
70+
def is_yanked(self) -> bool:
71+
"""Return whether the package is yanked."""
72+
return self.data.get("yanked", False)
73+
6974
@property
7075
def is_wheel(self) -> bool:
7176
"""Return whether the package is a wheel."""
@@ -191,6 +196,7 @@ def __init__(
191196
for version in self.data.get("releases", {}):
192197
try:
193198
v = packaging.version.parse(version)
199+
194200
if (not v.is_prerelease and not v.is_devrelease) or (
195201
v.is_prerelease and self.name in pypi.allowed_prerelease
196202
):
@@ -236,9 +242,15 @@ def latest_release(self) -> list[PackageFile]:
236242
for f in all_files
237243
if f.is_compatible_with_cpython3(self.pypi.python3_version)
238244
and f.is_compatible_with_platforms(self.pypi.platforms)
245+
and (not f.is_yanked or self.name in self.pypi.allowed_yanked)
239246
]
240247
if any((f.is_generic_wheel for f in all_files)):
241248
all_files = [f for f in all_files if f.is_wheel]
249+
250+
if not all_files:
251+
self.versions.remove(packaging.version.parse(self.latest_version))
252+
return self.latest_release
253+
242254
self.releases[self.latest_version] = all_files
243255

244256
return self.releases[self.latest_version]
@@ -365,6 +377,7 @@ def __init__(
365377
cache_file: str | None = None,
366378
pypi_url: str = "https://pypi.org/pypi",
367379
allowed_prerelease: list[str] | None = None,
380+
allowed_yanked: list[str] | None = None,
368381
) -> None:
369382
"""Initialize a PyPI session.
370383
@@ -375,6 +388,10 @@ def __init__(
375388
data is cached a maximum of 24h. The cache contains results of requests to
376389
PyPI.
377390
:param pypi_url: set Python package registry URL. Default is PyPI
391+
:param allowed_prerelease: list of package names authorized to be into
392+
pre-release.
393+
:param allowed_yanked: list of package names authorized to have yanked flags set
394+
to true (see: PEP_592).
378395
"""
379396
self.cache_file = cache_file
380397
self.cache_dir = cache_dir
@@ -385,6 +402,7 @@ def __init__(
385402
self.requirements: set[Requirement] = set()
386403
self.explicit_requirements: set[Requirement] = set()
387404
self.allowed_prerelease = allowed_prerelease or []
405+
self.allowed_yanked = allowed_yanked or []
388406

389407
self.platforms = platforms
390408
self.sys_platforms = set()

src/e3/python/pypiscript.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,29 +64,40 @@ def main() -> None:
6464
m.argument_parser.description = DESCRIPTION.strip()
6565
m.argument_parser.add_argument("config_file", help="configuration files")
6666
m.argument_parser.add_argument(
67-
"--python3-version", help="Python 3 version (default:10)", type=int, default=10
67+
"--python3-version",
68+
type=int,
69+
default=10,
70+
help="python 3 version (default: %(default)s)",
6871
)
6972
m.argument_parser.add_argument("target_dir", help="target directory")
7073
m.argument_parser.add_argument(
71-
"--cache-dir", help="cache directory (default ./cache)", default="./cache"
74+
"--cache-dir", help="cache directory (default: %(default)s)", default="./cache"
7275
)
7376
m.argument_parser.add_argument(
7477
"--skip-repo-updates",
7578
action="store_true",
76-
help="Don't update clones in the cache",
79+
help="don't update clones in the cache",
7780
)
7881
m.argument_parser.add_argument(
7982
"--local-clones",
80-
help="Use local clones. When set look for git clones in a directory",
83+
help="use local clones. When set look for git clones in a directory",
8184
default=None,
8285
)
8386
m.argument_parser.add_argument(
8487
"--allow-prerelease",
8588
dest="allowed_prerelease",
86-
metavar="REQUIREMENT",
89+
metavar="PACKAGE",
8790
nargs="*",
8891
default=None,
89-
help="Allow to use pre-release version for some requirements",
92+
help="allow to use pre-release version for some requirements",
93+
)
94+
m.argument_parser.add_argument(
95+
"--allow-yanked",
96+
dest="allowed_yanked",
97+
metavar="PACKAGE",
98+
nargs="*",
99+
default=None,
100+
help="allow to use yanked version for some requirements (See: PEP_592)",
90101
)
91102
m.parse_args()
92103
assert m.args is not None
@@ -162,6 +173,7 @@ def main() -> None:
162173
python3_version=m.args.python3_version,
163174
platforms=config["platforms"],
164175
allowed_prerelease=m.args.allowed_prerelease,
176+
allowed_yanked=m.args.allowed_yanked,
165177
) as pypi:
166178
for wheel in local_wheels:
167179
logging.info(f"Register wheel {wheel.path}")

0 commit comments

Comments
 (0)