|
5 | 5 | import json |
6 | 6 | import importlib.util |
7 | 7 | from copy import deepcopy |
8 | | - |
| 8 | +from packaging.version import Version, InvalidVersion |
9 | 9 |
|
10 | 10 | REMOVE_DEPS_AT_END = True |
11 | 11 | UPDATE_DOCKERFILE = True |
|
16 | 16 | def get_version(package): |
17 | 17 | url = "https://pypi.org/pypi/" + package + "/json" |
18 | 18 | r = requests.get(url) |
19 | | - res0 = r.text |
20 | | - dictio = r.json() |
21 | | - #json.dump(dictio, open("temp2.txt", "w"), indent=2) |
| 19 | + r.raise_for_status() |
| 20 | + data = r.json() |
| 21 | + |
| 22 | + # your debug dump |
| 23 | + #json.dump(data, open("temp2.txt", "w"), indent=2) |
| 24 | + |
| 25 | + # ---- license (same as before) ---- |
22 | 26 | license = "Unspecified" |
23 | | - for classi in dictio["info"]["classifiers"]: |
| 27 | + for classi in data["info"].get("classifiers", []): |
24 | 28 | if classi.startswith("License ::"): |
25 | 29 | license = classi.split(":: ")[-1] |
26 | | - version = dictio["info"]["version"] |
27 | | - #print(package, url, version, license) |
| 30 | + |
| 31 | + releases = data.get("releases", {}) |
| 32 | + |
| 33 | + versions = [] |
| 34 | + for s in releases.keys(): |
| 35 | + try: |
| 36 | + versions.append(Version(s)) |
| 37 | + except InvalidVersion: |
| 38 | + # skip weird/non-PEP 440 tags |
| 39 | + continue |
| 40 | + |
| 41 | + if not versions: |
| 42 | + # fallback: behave like before, use info["version"] |
| 43 | + version = data["info"]["version"] |
| 44 | + time.sleep(0.1) |
| 45 | + return package, url, version, license |
| 46 | + |
| 47 | + versions.sort(reverse=True) |
| 48 | + |
| 49 | + # latest stable (non-pre-release) |
| 50 | + stable_versions = [v for v in versions if not v.is_prerelease] |
| 51 | + latest_stable = stable_versions[0] if stable_versions else None |
| 52 | + |
| 53 | + # latest beta/RC (pre-release; you can restrict to 'b' and 'rc') |
| 54 | + prereleases = [v for v in versions if v.is_prerelease] |
| 55 | + |
| 56 | + # Only beta and rc; drop alphas if you don't want them |
| 57 | + beta_rc_versions = [ |
| 58 | + v for v in prereleases |
| 59 | + if v.pre is not None and v.pre[0] in ("b", "rc") |
| 60 | + ] |
| 61 | + latest_beta_rc = beta_rc_versions[0] if beta_rc_versions else None |
| 62 | + |
| 63 | + # ---- version choice logic with INCLUDE_BETAS ---- |
| 64 | + if not INCLUDE_BETAS: |
| 65 | + # always stable if possible |
| 66 | + if latest_stable is not None: |
| 67 | + chosen = latest_stable |
| 68 | + else: |
| 69 | + # no stable versions, fall back to newest overall |
| 70 | + chosen = versions[0] |
| 71 | + else: |
| 72 | + # prefer beta/rc only if it is *newer* than latest stable |
| 73 | + if latest_beta_rc is not None and latest_stable is not None: |
| 74 | + chosen = latest_beta_rc if latest_beta_rc > latest_stable else latest_stable |
| 75 | + elif latest_beta_rc is not None: |
| 76 | + # no stable, but we do have beta/rc |
| 77 | + chosen = latest_beta_rc |
| 78 | + elif latest_stable is not None: |
| 79 | + chosen = latest_stable |
| 80 | + else: |
| 81 | + # extremely weird case: only unparseable vs; fall back |
| 82 | + chosen = versions[0] |
| 83 | + |
| 84 | + version = str(chosen) |
| 85 | + |
28 | 86 | time.sleep(0.1) |
29 | 87 | return package, url, version, license |
30 | 88 |
|
|
0 commit comments