|
12 | 12 |
|
13 | 13 | import argparse
|
14 | 14 | import os.path
|
| 15 | +import re |
15 | 16 | from typing import Optional
|
16 | 17 |
|
17 | 18 | import requests
|
|
28 | 29 | TIMEOUT = 3
|
29 | 30 |
|
30 | 31 |
|
| 32 | +def fetch_pypi_versions(distribution: str) -> list[str]: |
| 33 | + url = URL_TEMPLATE.format(PREFIX + distribution) |
| 34 | + retry_strategy = Retry( |
| 35 | + total=RETRIES, status_forcelist=RETRY_ON |
| 36 | + ) |
| 37 | + with requests.Session() as session: |
| 38 | + session.mount("https://", HTTPAdapter(max_retries=retry_strategy)) |
| 39 | + resp = session.get(url, timeout=TIMEOUT) |
| 40 | + if not resp.ok: |
| 41 | + if resp.status_code == 404: |
| 42 | + # Looks like this is first time this package is ever uploaded. |
| 43 | + return [] |
| 44 | + raise ValueError("Error while retrieving version") |
| 45 | + data = resp.json() |
| 46 | + return data["releases"].keys() |
| 47 | + |
| 48 | + |
31 | 49 | def read_base_version(typeshed_dir: str, distribution: str) -> str:
|
32 | 50 | """Read distribution version from metadata."""
|
33 | 51 | metadata_file = os.path.join(
|
34 | 52 | typeshed_dir, THIRD_PARTY_NAMESPACE, distribution, "METADATA.toml"
|
35 | 53 | )
|
36 | 54 | with open(metadata_file) as f:
|
37 | 55 | data = toml.loads(f.read())
|
38 |
| - return data["version"] |
| 56 | + version = data["version"] |
| 57 | + if version.endswith(".*"): |
| 58 | + version = version[:-2] |
| 59 | + assert re.match(r"\d+(\.\d+)*", version) |
| 60 | + return version |
39 | 61 |
|
40 | 62 |
|
41 | 63 | def strip_dep_version(dependency: str) -> str:
|
@@ -67,27 +89,13 @@ def main(typeshed_dir: str, distribution: str, version: Optional[str]) -> int:
|
67 | 89 |
|
68 | 90 | Supports basic reties and timeouts (as module constants).
|
69 | 91 | """
|
70 |
| - url = URL_TEMPLATE.format(PREFIX + distribution) |
71 |
| - retry_strategy = Retry( |
72 |
| - total=RETRIES, status_forcelist=RETRY_ON |
73 |
| - ) |
74 |
| - with requests.Session() as session: |
75 |
| - session.mount("https://", HTTPAdapter(max_retries=retry_strategy)) |
76 |
| - resp = session.get(url, timeout=TIMEOUT) |
77 |
| - if not resp.ok: |
78 |
| - if resp.status_code == 404: |
79 |
| - # Looks like this is first time this package is ever uploaded. |
80 |
| - return -1 |
81 |
| - raise ValueError("Error while retrieving version") |
82 |
| - data = resp.json() |
| 92 | + pypi_versions = fetch_pypi_versions() |
83 | 93 | if not version:
|
84 | 94 | # Use the METADATA.toml version, if not given one.
|
85 | 95 | version = read_base_version(typeshed_dir, distribution)
|
86 |
| - assert version.count(".") == 1 |
87 |
| - matching = [v for v in data["releases"].keys() if v.startswith(version)] |
| 96 | + matching = [v for v in pypi_versions if v.startswith(f"{version}.")] |
88 | 97 | if not matching:
|
89 | 98 | return -1
|
90 |
| - assert all(v.count(".") == 2 for v in matching) |
91 | 99 | increment = max(int(v.split(".")[-1]) for v in matching)
|
92 | 100 | return increment
|
93 | 101 |
|
|
0 commit comments