Skip to content

Commit 55061e6

Browse files
authored
Merge pull request #253 from numpy/simplify-stubtest-script
🔨 simplified stubtesting
2 parents 3e9fc75 + ec93384 commit 55061e6

File tree

5 files changed

+23
-239
lines changed

5 files changed

+23
-239
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,7 @@ jobs:
7676
enable-cache: true
7777
python-version: 3.13
7878

79-
- name: unstub numpy
80-
run: >
81-
uv run --no-editable
82-
tool/unstub.py
83-
8479
- name: stubtest
8580
run: >
86-
uv run --no-editable
87-
stubtest
88-
--mypy-config-file=pyproject.toml
89-
--allowlist=.mypyignore
90-
--allowlist=.mypyignore-todo
91-
--concise
92-
numpy
81+
uv run --no-project
82+
tool/stubtest.py --concise
File renamed without changes.
File renamed without changes.

tool/stubtest.py

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@
22
# requires-python = ">=3.10"
33
# dependencies = [
44
# "numtype[numpy]",
5-
#
6-
# # Keep in sync with pyproject.toml
7-
# "mypy[faster-cache]>=1.15.0",
8-
#
9-
# # numpy dev dependencies
10-
# "pytest>=8.3.4",
11-
# "hypothesis>=6.127.2",
12-
# "pyinstaller==6.12.0",
5+
# "mypy[faster-cache]>=1.15.0", # keep in sync with pyproject.toml
136
# ]
147
#
158
# [tool.uv]
@@ -21,8 +14,6 @@
2114

2215
"""Usage: `uv run tool/stubtest.py <OPTIONS>`."""
2316

24-
# ruff: noqa: ERA001, TRY003
25-
2617
import os
2718
import subprocess
2819
import sys
@@ -32,22 +23,12 @@
3223
VERBOSE = True
3324

3425
CWD = Path.cwd()
35-
BASE_DIR = Path(__file__).parent.parent
26+
TOOL_DIR = Path(__file__).parent
3627
SITE_DIR = Path(sysconfig.get_paths()["purelib"])
28+
ROOT_DIR = TOOL_DIR.parent
29+
ROOT_SITE_DIR = next((ROOT_DIR / ".venv" / "lib").glob("*/site-packages"))
3730

38-
39-
def __get_local_site_dir() -> Path:
40-
lib = BASE_DIR / ".venv" / "lib"
41-
if not lib.is_dir():
42-
raise NotADirectoryError(f"{lib} does not exist")
43-
44-
for out in lib.glob("*/site-packages"):
45-
return out
46-
47-
raise NotADirectoryError(f"Could not find {lib}/**/site-packages")
48-
49-
50-
SITE_DIR_LOCAL = __get_local_site_dir()
31+
ALLOWLISTS = ".mypyignore", ".mypyignore-todo"
5132

5233

5334
def __commit_pyi_genocide_for_mypy() -> None:
@@ -61,7 +42,7 @@ def __commit_pyi_genocide_for_mypy() -> None:
6142
"""
6243
package = SITE_DIR / "numpy"
6344
if not package.is_dir():
64-
raise NotADirectoryError(f"{package} does not exist")
45+
raise NotADirectoryError(f"{package} does not exist") # noqa: TRY003
6546

6647
py_typed = package / "py.typed"
6748
if py_typed.is_file():
@@ -76,19 +57,18 @@ def __commit_pyi_genocide_for_mypy() -> None:
7657

7758
def _stubtest_command() -> list[str]:
7859
cmd = ["stubtest"]
60+
args_extra = sys.argv[1:]
7961

80-
if "--mypy-config-file" not in sys.argv:
81-
config_path = BASE_DIR / "pyproject.toml"
82-
assert config_path.is_file(), config_path
83-
62+
if not any("--mypy-config-file" in arg for arg in args_extra):
63+
config_path = (ROOT_DIR / "pyproject.toml").relative_to(CWD)
8464
cmd.extend(("--mypy-config-file", str(config_path)))
8565

86-
if len(sys.argv) > 1:
87-
cmd.extend(sys.argv[1:])
88-
else:
89-
cmd.extend(["--allowlist", str(BASE_DIR / ".mypyignore")])
90-
cmd.extend(["--allowlist", str(BASE_DIR / ".mypyignore-todo")])
66+
if not any("--allowlist" in arg for arg in args_extra):
67+
for allowlist_name in ALLOWLISTS:
68+
allowlist_path = (TOOL_DIR / allowlist_name).relative_to(CWD)
69+
cmd.extend(["--allowlist", str(allowlist_path)])
9170

71+
cmd.extend(args_extra)
9272
cmd.append("numpy")
9373

9474
return cmd
@@ -103,20 +83,20 @@ def _rewrite_mypy_output(line: bytes, /) -> bytes:
10383
str
10484
"""
10585
line = line.replace(b"builtins.", b"")
106-
line = line.replace(b"typing.Sequence", b"")
86+
line = line.replace(b"numpy.", b"np.")
10787

10888
if len(line.strip()) <= len(str(SITE_DIR)):
10989
return line
11090

11191
for package_name in ("_numtype", "numpy-stubs", "numtype"):
11292
package_lib = str(SITE_DIR / package_name).encode()
113-
package_src = str((BASE_DIR / "src" / package_name).relative_to(CWD)).encode()
93+
package_src = str((ROOT_DIR / "src" / package_name).relative_to(CWD)).encode()
11494
if package_lib in line:
11595
line = line.replace(package_lib, package_src)
11696

11797
site_dir = str(SITE_DIR).encode()
11898
if site_dir in line:
119-
line = line.replace(site_dir, str(SITE_DIR_LOCAL.relative_to(CWD)).encode())
99+
line = line.replace(site_dir, str(ROOT_SITE_DIR.relative_to(CWD)).encode())
120100

121101
return line
122102

tool/stubtest.py.lock

Lines changed: 4 additions & 190 deletions
Original file line numberDiff line numberDiff line change
@@ -4,82 +4,8 @@ requires-python = ">=3.10"
44

55
[manifest]
66
requirements = [
7-
{ name = "hypothesis", specifier = ">=6.127.2" },
87
{ name = "mypy", extras = ["faster-cache"], specifier = ">=1.15.0" },
98
{ name = "numtype", extras = ["numpy"], directory = "../" },
10-
{ name = "pyinstaller", specifier = "==6.12.0" },
11-
{ name = "pytest", specifier = ">=8.3.4" },
12-
]
13-
14-
[[package]]
15-
name = "altgraph"
16-
version = "0.17.4"
17-
source = { registry = "https://pypi.org/simple" }
18-
sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418 }
19-
wheels = [
20-
{ url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212 },
21-
]
22-
23-
[[package]]
24-
name = "attrs"
25-
version = "25.1.0"
26-
source = { registry = "https://pypi.org/simple" }
27-
sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 }
28-
wheels = [
29-
{ url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 },
30-
]
31-
32-
[[package]]
33-
name = "colorama"
34-
version = "0.4.6"
35-
source = { registry = "https://pypi.org/simple" }
36-
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
37-
wheels = [
38-
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
39-
]
40-
41-
[[package]]
42-
name = "exceptiongroup"
43-
version = "1.2.2"
44-
source = { registry = "https://pypi.org/simple" }
45-
sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
46-
wheels = [
47-
{ url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
48-
]
49-
50-
[[package]]
51-
name = "hypothesis"
52-
version = "6.127.2"
53-
source = { registry = "https://pypi.org/simple" }
54-
dependencies = [
55-
{ name = "attrs" },
56-
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
57-
{ name = "sortedcontainers" },
58-
]
59-
sdist = { url = "https://files.pythonhosted.org/packages/03/52/cf2673c1b6aa8469e6ae0129940ed77187f1b393274b5acd8dee2a86fd5e/hypothesis-6.127.2.tar.gz", hash = "sha256:725343a65846c3627399398a6206adca3e1433786fdcfaa16ca0d114900849a5", size = 421265 }
60-
wheels = [
61-
{ url = "https://files.pythonhosted.org/packages/7b/a0/66c50f7c09807f6e2f7c6ce2ef152fa3875ac443db76c444fce298d42670/hypothesis-6.127.2-py3-none-any.whl", hash = "sha256:9b1b5e4e8adc82d01351d4e814ebdd38e2f3173f489de098b418c7a026f100c0", size = 484094 },
62-
]
63-
64-
[[package]]
65-
name = "iniconfig"
66-
version = "2.0.0"
67-
source = { registry = "https://pypi.org/simple" }
68-
sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
69-
wheels = [
70-
{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
71-
]
72-
73-
[[package]]
74-
name = "macholib"
75-
version = "1.16.3"
76-
source = { registry = "https://pypi.org/simple" }
77-
dependencies = [
78-
{ name = "altgraph" },
79-
]
80-
sdist = { url = "https://files.pythonhosted.org/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30", size = 59309 }
81-
wheels = [
82-
{ url = "https://files.pythonhosted.org/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c", size = 38094 },
839
]
8410

8511
[[package]]
@@ -212,13 +138,13 @@ provides-extras = ["numpy"]
212138

213139
[package.metadata.requires-dev]
214140
dev = [
215-
{ name = "basedpyright", specifier = ">=1.28.0" },
216-
{ name = "mypy", extras = ["faster-cache"], specifier = ">=1.15.0" },
217-
{ name = "numtype", extras = ["numpy"] },
141+
{ name = "basedpyright", specifier = ">=1.28.1" },
142+
{ name = "mypy", specifier = ">=1.15.0" },
218143
{ name = "pytest", specifier = ">=8.3.4" },
219-
{ name = "ruff", specifier = ">=0.9.8" },
144+
{ name = "ruff", specifier = ">=0.9.9" },
220145
]
221146
numpy = [{ name = "numtype", extras = ["numpy"] }]
147+
orjson = [{ name = "orjson", specifier = ">=3.10.15" }]
222148

223149
[[package]]
224150
name = "orjson"
@@ -280,118 +206,6 @@ wheels = [
280206
{ url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 },
281207
]
282208

283-
[[package]]
284-
name = "packaging"
285-
version = "24.2"
286-
source = { registry = "https://pypi.org/simple" }
287-
sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
288-
wheels = [
289-
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
290-
]
291-
292-
[[package]]
293-
name = "pefile"
294-
version = "2023.2.7"
295-
source = { registry = "https://pypi.org/simple" }
296-
sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 }
297-
wheels = [
298-
{ url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 },
299-
]
300-
301-
[[package]]
302-
name = "pluggy"
303-
version = "1.5.0"
304-
source = { registry = "https://pypi.org/simple" }
305-
sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
306-
wheels = [
307-
{ url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
308-
]
309-
310-
[[package]]
311-
name = "pyinstaller"
312-
version = "6.12.0"
313-
source = { registry = "https://pypi.org/simple" }
314-
dependencies = [
315-
{ name = "altgraph" },
316-
{ name = "macholib", marker = "sys_platform == 'darwin'" },
317-
{ name = "packaging" },
318-
{ name = "pefile", marker = "sys_platform == 'win32'" },
319-
{ name = "pyinstaller-hooks-contrib" },
320-
{ name = "pywin32-ctypes", marker = "sys_platform == 'win32'" },
321-
{ name = "setuptools" },
322-
]
323-
sdist = { url = "https://files.pythonhosted.org/packages/10/c0/001e86a13f9f6104613f198721c72d377fa1fc2a09550cfe1ac9a1d12406/pyinstaller-6.12.0.tar.gz", hash = "sha256:1834797be48ce1b26015af68bdeb3c61a6c7500136f04e0fc65e468115dec777", size = 4267132 }
324-
wheels = [
325-
{ url = "https://files.pythonhosted.org/packages/b2/73/b897a3fda99a14130111abdb978d63da14cbc9932497b5e5064c5fe28187/pyinstaller-6.12.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:68f1e4cecf88a6272063977fa2a2c69ad37cf568e5901769d7206d0314c74f47", size = 997954 },
326-
{ url = "https://files.pythonhosted.org/packages/4a/bc/0929ed6aca3c5ff3f20f8cfd4f2f7e90f18c9465440e0d151d56d8170851/pyinstaller-6.12.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fea76fc9b55ffa730fcf90beb897cce4399938460b0b6f40507fbebfc752c753", size = 714097 },
327-
{ url = "https://files.pythonhosted.org/packages/e1/9a/422d5eb04132e4a4735ca9099a53511324ff7d387b80231fe8dbd67bf322/pyinstaller-6.12.0-py3-none-manylinux2014_i686.whl", hash = "sha256:dac8a27988dbc33cdc34f2046803258bc3f6829de24de52745a5daa22bdba0f1", size = 724471 },
328-
{ url = "https://files.pythonhosted.org/packages/64/1c/5028ba2e09f5b57f6792e9d88e888725224f8f016a07666e48664f6a9fcf/pyinstaller-6.12.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:83c7f3bde9871b4a6aa71c66a96e8ba5c21668ce711ed97f510b9382d10aac6c", size = 722753 },
329-
{ url = "https://files.pythonhosted.org/packages/6f/d9/e7742caf4c4dc07d13e355ad2c14c7844c9bb2e66dea4f3386b4644bd106/pyinstaller-6.12.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:a69818815c6e0711c727edc30680cb1f81c691b59de35db81a2d9e0ae26a9ef1", size = 720906 },
330-
{ url = "https://files.pythonhosted.org/packages/80/2b/14404f2dc95d1ec94d08879c62a76d5f26a176fab99fb023c2c70d2ff500/pyinstaller-6.12.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a2abf5fde31a8b38b6df7939bcef8ac1d0c51e97e25317ce3555cd675259750f", size = 716959 },
331-
{ url = "https://files.pythonhosted.org/packages/11/a6/5c3a233cf19aa6d4caacf62f7ee1c728486cc20b73f5817be17485d7b7ff/pyinstaller-6.12.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:8e92e9873a616547bbabbb5a3a9843d5f2ab40c3d8b26810acdf0fe257bee4cf", size = 719414 },
332-
{ url = "https://files.pythonhosted.org/packages/24/57/069d35236806b281a3331ef00ff94e43f3b91e4b36350de8b40b4baf9fd3/pyinstaller-6.12.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:aefe502d55c9cf6aeaed7feba80b5f8491ce43f8f2b5fe2d9aadca3ee5a05bc4", size = 715903 },
333-
{ url = "https://files.pythonhosted.org/packages/4d/5f/857de8798836f9d16a620bd0a7c8899bba05b5fda7b3b4432762f148a86d/pyinstaller-6.12.0-py3-none-win32.whl", hash = "sha256:138856a5a503bb69c066377e0a22671b0db063e9cc14d5cf5c798a53561200d3", size = 1290980 },
334-
{ url = "https://files.pythonhosted.org/packages/99/6e/d7d76d4d15f6351f1f942256633b795eec3d6c691d985869df1bf319cd9d/pyinstaller-6.12.0-py3-none-win_amd64.whl", hash = "sha256:0e62d3906309248409f215b386f33afec845214e69cc0f296b93222b26a88f43", size = 1348786 },
335-
{ url = "https://files.pythonhosted.org/packages/47/c2/298ad6a3aa2cacb55cbc1f845068dc1e4a6c966082ffa0e19c69084cbc42/pyinstaller-6.12.0-py3-none-win_arm64.whl", hash = "sha256:0c271896a3a168f4f91827145702543db9c5427f4c7372a6df8c75925a3ac18a", size = 1289617 },
336-
]
337-
338-
[[package]]
339-
name = "pyinstaller-hooks-contrib"
340-
version = "2025.1"
341-
source = { registry = "https://pypi.org/simple" }
342-
dependencies = [
343-
{ name = "packaging" },
344-
{ name = "setuptools" },
345-
]
346-
sdist = { url = "https://files.pythonhosted.org/packages/2f/1b/dc256d42f4217db99b50d6d32dbbf841a41b9615506cde77d2345d94f4a5/pyinstaller_hooks_contrib-2025.1.tar.gz", hash = "sha256:130818f9e9a0a7f2261f1fd66054966a3a50c99d000981c5d1db11d3ad0c6ab2", size = 147043 }
347-
wheels = [
348-
{ url = "https://files.pythonhosted.org/packages/b7/48/833d67a585275e395f351e5787b4b7a8d462d87bca22a8c038f6ffdc2b3c/pyinstaller_hooks_contrib-2025.1-py3-none-any.whl", hash = "sha256:d3c799470cbc0bda60dcc8e6b4ab976777532b77621337f2037f558905e3a8e9", size = 346409 },
349-
]
350-
351-
[[package]]
352-
name = "pytest"
353-
version = "8.3.4"
354-
source = { registry = "https://pypi.org/simple" }
355-
dependencies = [
356-
{ name = "colorama", marker = "sys_platform == 'win32'" },
357-
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
358-
{ name = "iniconfig" },
359-
{ name = "packaging" },
360-
{ name = "pluggy" },
361-
{ name = "tomli", marker = "python_full_version < '3.11'" },
362-
]
363-
sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
364-
wheels = [
365-
{ url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
366-
]
367-
368-
[[package]]
369-
name = "pywin32-ctypes"
370-
version = "0.2.3"
371-
source = { registry = "https://pypi.org/simple" }
372-
sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 }
373-
wheels = [
374-
{ url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 },
375-
]
376-
377-
[[package]]
378-
name = "setuptools"
379-
version = "75.8.2"
380-
source = { registry = "https://pypi.org/simple" }
381-
sdist = { url = "https://files.pythonhosted.org/packages/d1/53/43d99d7687e8cdef5ab5f9ec5eaf2c0423c2b35133a2b7e7bc276fc32b21/setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2", size = 1344083 }
382-
wheels = [
383-
{ url = "https://files.pythonhosted.org/packages/a9/38/7d7362e031bd6dc121e5081d8cb6aa6f6fedf2b67bf889962134c6da4705/setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f", size = 1229385 },
384-
]
385-
386-
[[package]]
387-
name = "sortedcontainers"
388-
version = "2.4.0"
389-
source = { registry = "https://pypi.org/simple" }
390-
sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 }
391-
wheels = [
392-
{ url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 },
393-
]
394-
395209
[[package]]
396210
name = "tomli"
397211
version = "2.2.1"

0 commit comments

Comments
 (0)