Skip to content

Commit 273ad14

Browse files
authored
Bump dependencies (#6312)
1 parent 3a81e83 commit 273ad14

File tree

10 files changed

+197
-101
lines changed

10 files changed

+197
-101
lines changed

.github/workflows/run_pip_compile.yaml

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,27 @@ jobs:
2020
- name: Set up Python 3.8.
2121
uses: actions/setup-python@v4
2222
with:
23-
python-version: '3.8'
23+
python-version: |
24+
3.11
25+
3.10
26+
3.9
27+
3.8
2428
25-
- name: Install dependencies
29+
- name: Install dependencies on Linux/macOS
30+
if: matrix.os != 'windows-latest'
31+
run: |
32+
python3.11 -m pip install -U pip pip-tools
33+
python3.10 -m pip install -U pip pip-tools
34+
python3.9 -m pip install -U pip pip-tools
35+
python3.8 -m pip install -U pip pip-tools
36+
37+
- name: Install dependencies on Windows
38+
if: matrix.os == 'windows-latest'
2639
run: |
27-
python -m pip install -U pip
28-
python -m pip install -U pip-tools
40+
py -3.11 -m pip install -U pip pip-tools
41+
py -3.10 -m pip install -U pip pip-tools
42+
py -3.9 -m pip install -U pip pip-tools
43+
py -3.8 -m pip install -U pip pip-tools
2944
3045
- name: Generate requirements files.
3146
id: compile_requirements
Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
import os
2+
import re
23
import shutil
34
import subprocess
45
import sys
56
from pathlib import Path
67

78

9+
EXCLUDE_STEM_RE = re.compile(r".*-3\.(?!8-)(\d+)-extra-(doc|style)")
810
GITHUB_OUTPUT = os.environ["GITHUB_OUTPUT"]
911
REQUIREMENTS_FOLDER = Path(__file__).parents[3].absolute() / "requirements"
1012
os.chdir(REQUIREMENTS_FOLDER)
1113

1214

13-
def pip_compile(name: str) -> None:
15+
def pip_compile(version: str, name: str) -> None:
16+
stem = f"{sys.platform}-{version}-{name}"
17+
if EXCLUDE_STEM_RE.fullmatch(stem):
18+
return
19+
20+
executable = ("py", f"-{version}") if sys.platform == "win32" else (f"python{version}",)
1421
subprocess.check_call(
1522
(
16-
sys.executable,
23+
*executable,
1724
"-m",
1825
"piptools",
1926
"compile",
@@ -22,15 +29,17 @@ def pip_compile(name: str) -> None:
2229
"--verbose",
2330
f"{name}.in",
2431
"--output-file",
25-
f"{sys.platform}-{name}.txt",
32+
f"{stem}.txt",
2633
)
2734
)
2835

2936

30-
pip_compile("base")
31-
shutil.copyfile(f"{sys.platform}-base.txt", "base.txt")
32-
for file in REQUIREMENTS_FOLDER.glob("extra-*.in"):
33-
pip_compile(file.stem)
37+
for minor in range(8, 11 + 1):
38+
version = f"3.{minor}"
39+
pip_compile(version, "base")
40+
shutil.copyfile(f"{sys.platform}-{version}-base.txt", "base.txt")
41+
for file in REQUIREMENTS_FOLDER.glob("extra-*.in"):
42+
pip_compile(version, file.stem)
3443

3544
with open(GITHUB_OUTPUT, "a", encoding="utf-8") as fp:
3645
fp.write(f"sys_platform={sys.platform}\n")

.github/workflows/scripts/merge_requirements.py

Lines changed: 93 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from __future__ import annotations
2+
13
import os
24
from pathlib import Path
3-
from typing import List, TextIO
5+
from typing import Dict, Iterable, List, TextIO, Tuple
46

57
from packaging.markers import Marker
68
from packaging.requirements import Requirement
@@ -15,6 +17,12 @@ def __init__(self, requirement_string: str) -> None:
1517
self.req = Requirement(requirement_string)
1618
self.comments = set()
1719

20+
def __hash__(self) -> int:
21+
return hash(self.req)
22+
23+
def __eq__(self, other: RequirementData) -> bool:
24+
return self.req == other.req
25+
1826
@property
1927
def name(self) -> str:
2028
return self.req.name
@@ -49,30 +57,47 @@ def get_requirements(fp: TextIO) -> List[RequirementData]:
4957
return requirements
5058

5159

60+
def iter_envs(envs: Iterable[str]) -> Iterable[Tuple[str, str]]:
61+
for env_name in envs:
62+
platform, python_version = env_name.split("-", maxsplit=1)
63+
yield (platform, python_version)
64+
65+
5266
names = ["base"]
5367
names.extend(file.stem for file in REQUIREMENTS_FOLDER.glob("extra-*.in"))
54-
base_requirements = []
68+
base_requirements: List[RequirementData] = []
5569

5670
for name in names:
57-
# {req_name: {sys_platform: RequirementData}
58-
input_data = {}
71+
# {req_data: {sys_platform: RequirementData}
72+
input_data: Dict[RequirementData, Dict[str, RequirementData]] = {}
73+
all_envs = set()
5974
all_platforms = set()
75+
all_python_versions = set()
6076
for file in REQUIREMENTS_FOLDER.glob(f"*-{name}.txt"):
61-
platform_name = file.stem.split("-", maxsplit=1)[0]
77+
platform_name, python_version, _ = file.stem.split("-", maxsplit=2)
78+
env_name = f"{platform_name}-{python_version}"
79+
all_envs.add(env_name)
6280
all_platforms.add(platform_name)
81+
all_python_versions.add(python_version)
6382
with file.open(encoding="utf-8") as fp:
6483
requirements = get_requirements(fp)
6584

6685
for req in requirements:
67-
platforms = input_data.setdefault(req.name, {})
68-
platforms[platform_name] = req
86+
envs = input_data.setdefault(req, {})
87+
envs[env_name] = req
6988

7089
output = base_requirements if name == "base" else []
71-
for req_name, platforms in input_data.items():
72-
req = next(iter(platforms.values()))
73-
for other_req in platforms.values():
74-
if req.req != other_req.req:
75-
raise RuntimeError(f"Incompatible requirements for {req_name}.")
90+
for req, envs in input_data.items():
91+
# {platform: [python_versions...]}
92+
python_versions_per_platform: Dict[str, List[str]] = {}
93+
# {python_version: [platforms...]}
94+
platforms_per_python_version: Dict[str, List[str]] = {}
95+
platforms = python_versions_per_platform.keys()
96+
python_versions = platforms_per_python_version.keys()
97+
for env_name, other_req in envs.items():
98+
platform_name, python_version = env_name.split("-", maxsplit=1)
99+
python_versions_per_platform.setdefault(platform_name, []).append(python_version)
100+
platforms_per_python_version.setdefault(python_version, []).append(platform_name)
76101

77102
req.comments.update(other_req.comments)
78103

@@ -84,30 +109,74 @@ def get_requirements(fp: TextIO) -> List[RequirementData]:
84109
old_req_marker = req.marker
85110
req.marker = base_req.marker = None
86111
if base_req.req != req.req:
87-
raise RuntimeError(f"Incompatible requirements for {req_name}.")
112+
raise RuntimeError(f"Incompatible requirements for {req.name}.")
88113

89114
base_req.marker = old_base_marker
90115
req.marker = old_req_marker
91116
if base_req.marker is None or base_req.marker == req.marker:
92117
continue
93118

94-
if len(platforms) == len(all_platforms):
119+
if len(envs) == len(all_envs):
95120
output.append(req)
96121
continue
97-
elif len(platforms) < len(all_platforms - platforms.keys()):
98-
platform_marker = " or ".join(
99-
f"sys_platform == '{platform}'" for platform in platforms
122+
123+
# At this point I'm wondering why I didn't just go for
124+
# a more generic boolean algebra simplification (sympy.simplify_logic())...
125+
if (
126+
len(set(map(frozenset, python_versions_per_platform.values()))) == 1
127+
or len(set(map(frozenset, platforms_per_python_version.values()))) == 1
128+
):
129+
# Either all platforms have the same Python version set
130+
# or all Python versions have the same platform set.
131+
# We can generate markers for platform (platform_marker) and Python
132+
# (python_version_marker) version sets separately and then simply require
133+
# that both markers are fulfilled at the same time (env_marker).
134+
135+
python_version_marker = (
136+
# Requirement present on less Python versions than not.
137+
" or ".join(
138+
f"python_version == '{python_version}'" for python_version in python_versions
139+
)
140+
if len(python_versions) < len(all_python_versions - python_versions)
141+
# Requirement present on more Python versions than not
142+
# This may generate an empty string when Python version is irrelevant.
143+
else " and ".join(
144+
f"python_version != '{python_version}'"
145+
for python_version in all_python_versions - python_versions
146+
)
100147
)
148+
149+
platform_marker = (
150+
# Requirement present on less platforms than not.
151+
" or ".join(f"sys_platform == '{platform}'" for platform in platforms)
152+
if len(platforms) < len(all_platforms - platforms)
153+
# Requirement present on more platforms than not
154+
# This may generate an empty string when platform is irrelevant.
155+
else " and ".join(
156+
f"sys_platform != '{platform}'" for platform in all_platforms - platforms
157+
)
158+
)
159+
160+
if python_version_marker and platform_marker:
161+
env_marker = f"({python_version_marker}) and ({platform_marker})"
162+
else:
163+
env_marker = python_version_marker or platform_marker
101164
else:
102-
platform_marker = " and ".join(
103-
f"sys_platform != '{platform}'" for platform in all_platforms - platforms.keys()
165+
# Fallback to generic case.
166+
env_marker = (
167+
# Requirement present on less envs than not.
168+
" or ".join(
169+
f"(sys_platform == '{platform}' and python_version == '{python_version}')"
170+
for platform, python_version in iter_envs(envs)
171+
)
172+
if len(envs) < len(all_envs - envs.keys())
173+
else " and ".join(
174+
f"(sys_platform != '{platform}' and python_version != '{python_version}')"
175+
for platform, python_version in iter_envs(all_envs - envs.keys())
176+
)
104177
)
105178

106-
new_marker = (
107-
f"({req.marker}) and ({platform_marker})"
108-
if req.marker is not None
109-
else platform_marker
110-
)
179+
new_marker = f"({req.marker}) and ({env_marker})" if req.marker is not None else env_marker
111180
req.marker = Marker(new_marker)
112181
if base_req is not None and base_req.marker == req.marker:
113182
continue

requirements/base.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
aiodns
21
aiohttp
32
aiohttp-json-rpc
43
apsw

requirements/base.txt

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
aiodns==3.0.0
2-
# via -r base.in
3-
aiohttp==3.8.5
1+
aiohttp==3.9.3
42
# via
53
# -r base.in
64
# aiohttp-json-rpc
@@ -10,20 +8,14 @@ aiohttp-json-rpc==0.13.3
108
# via -r base.in
119
aiosignal==1.3.1
1210
# via aiohttp
13-
apsw==3.43.1.0
11+
apsw==3.45.2.0
1412
# via -r base.in
15-
async-timeout==4.0.3
16-
# via aiohttp
17-
attrs==23.1.0
13+
attrs==23.2.0
1814
# via aiohttp
19-
babel==2.12.1
15+
babel==2.14.0
2016
# via -r base.in
2117
brotli==1.1.0
2218
# via -r base.in
23-
cffi==1.15.1
24-
# via pycares
25-
charset-normalizer==3.2.0
26-
# via aiohttp
2719
click==8.1.7
2820
# via -r base.in
2921
contextlib2==21.6.0
@@ -32,71 +24,69 @@ discord-py==2.3.2
3224
# via
3325
# -r base.in
3426
# red-lavalink
35-
frozenlist==1.4.0
27+
frozenlist==1.4.1
3628
# via
3729
# aiohttp
3830
# aiosignal
39-
idna==3.4
31+
idna==3.6
4032
# via yarl
41-
importlib-metadata==6.8.0
42-
# via markdown
43-
markdown==3.4.4
33+
markdown==3.6
4434
# via -r base.in
4535
markdown-it-py==3.0.0
4636
# via rich
4737
mdurl==0.1.2
4838
# via markdown-it-py
49-
multidict==6.0.4
39+
multidict==6.0.5
5040
# via
5141
# aiohttp
5242
# yarl
53-
orjson==3.9.7
43+
orjson==3.9.15
5444
# via -r base.in
55-
packaging==23.1
45+
packaging==24.0
5646
# via -r base.in
57-
platformdirs==3.10.0
47+
platformdirs==4.2.0
5848
# via -r base.in
59-
psutil==5.9.5
49+
psutil==5.9.8
6050
# via -r base.in
61-
pycares==4.3.0
62-
# via aiodns
63-
pycparser==2.21
64-
# via cffi
65-
pygments==2.16.1
51+
pygments==2.17.2
6652
# via rich
67-
python-dateutil==2.8.2
53+
python-dateutil==2.9.0.post0
6854
# via -r base.in
69-
pytz==2023.3.post1
70-
# via babel
7155
pyyaml==6.0.1
7256
# via -r base.in
73-
rapidfuzz==3.3.0
57+
rapidfuzz==3.6.2
7458
# via -r base.in
7559
red-commons==1.0.0
7660
# via
7761
# -r base.in
7862
# red-lavalink
7963
red-lavalink==0.11.0
8064
# via -r base.in
81-
rich==13.5.2
65+
rich==13.7.1
8266
# via -r base.in
8367
schema==0.7.5
8468
# via -r base.in
8569
six==1.16.0
8670
# via python-dateutil
87-
typing-extensions==4.7.1
71+
typing-extensions==4.10.0
8872
# via
8973
# -r base.in
9074
# rich
91-
yarl==1.9.2
75+
yarl==1.9.4
9276
# via
9377
# -r base.in
9478
# aiohttp
95-
zipp==3.16.2
96-
# via importlib-metadata
79+
async-timeout==4.0.3; python_version != "3.11"
80+
# via aiohttp
9781
colorama==0.4.6; sys_platform == "win32"
9882
# via click
99-
distro==1.8.0; sys_platform == "linux" and sys_platform == "linux"
83+
distro==1.9.0; sys_platform == "linux" and sys_platform == "linux"
10084
# via -r base.in
101-
uvloop==0.17.0; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32"
85+
importlib-metadata==7.1.0; python_version != "3.10" and python_version != "3.11"
86+
# via markdown
87+
pytz==2024.1; python_version == "3.8"
88+
# via babel
89+
uvloop==0.19.0; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32"
10290
# via -r base.in
91+
zipp==3.18.1; python_version != "3.10" and python_version != "3.11"
92+
# via importlib-metadata

0 commit comments

Comments
 (0)