crosspoint 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .venv/
4
+ __pycache__/
5
+ *.egg-info/
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.5
2
+ Name: crosspoint
3
+ Version: 0.1.0
4
+ Summary: Crosspoint API client: the Polar SDK, pointed at Crosspoint
5
+ Project-URL: Documentation, https://app.crosspoint.finance/docs/africa/sdks
6
+ License-Expression: MIT
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: polar-sdk>=1.0.0a22
9
+ Description-Content-Type: text/markdown
10
+
11
+ # crosspoint
12
+
13
+ Python client for the [Crosspoint](https://crosspoint.finance) API.
14
+
15
+ Crosspoint's API is compatible with the Polar API, so this package is a thin layer over
16
+ the official `polar-sdk`: same methods and models, already pointed at
17
+ `https://api.crosspoint.finance`.
18
+
19
+ ```bash
20
+ pip install crosspoint
21
+ ```
22
+
23
+ ```python
24
+ from crosspoint import Crosspoint
25
+
26
+ # reads CROSSPOINT_ACCESS_TOKEN (an organization access token, cxp_oat_...)
27
+ crosspoint = Crosspoint()
28
+
29
+ for product in crosspoint.products.iter_list(limit=10):
30
+ print(product)
31
+ ```
32
+
33
+ Async: `from crosspoint import CrosspointAsync`. Pin an API version with
34
+ `from crosspoint.v2026_10 import Crosspoint`. Verify webhooks with
35
+ `crosspoint.webhooks.validate_event`.
36
+
37
+ Docs: https://app.crosspoint.finance/docs/africa/sdks
@@ -0,0 +1,27 @@
1
+ # crosspoint
2
+
3
+ Python client for the [Crosspoint](https://crosspoint.finance) API.
4
+
5
+ Crosspoint's API is compatible with the Polar API, so this package is a thin layer over
6
+ the official `polar-sdk`: same methods and models, already pointed at
7
+ `https://api.crosspoint.finance`.
8
+
9
+ ```bash
10
+ pip install crosspoint
11
+ ```
12
+
13
+ ```python
14
+ from crosspoint import Crosspoint
15
+
16
+ # reads CROSSPOINT_ACCESS_TOKEN (an organization access token, cxp_oat_...)
17
+ crosspoint = Crosspoint()
18
+
19
+ for product in crosspoint.products.iter_list(limit=10):
20
+ print(product)
21
+ ```
22
+
23
+ Async: `from crosspoint import CrosspointAsync`. Pin an API version with
24
+ `from crosspoint.v2026_10 import Crosspoint`. Verify webhooks with
25
+ `crosspoint.webhooks.validate_event`.
26
+
27
+ Docs: https://app.crosspoint.finance/docs/africa/sdks
@@ -0,0 +1,24 @@
1
+ [project]
2
+ name = "crosspoint"
3
+ version = "0.1.0"
4
+ description = "Crosspoint API client: the Polar SDK, pointed at Crosspoint"
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.11"
8
+ dependencies = ["polar-sdk>=1.0.0a22"]
9
+
10
+ [project.urls]
11
+ Documentation = "https://app.crosspoint.finance/docs/africa/sdks"
12
+
13
+ [build-system]
14
+ requires = ["hatchling"]
15
+ build-backend = "hatchling.build"
16
+
17
+ [tool.hatch.build.targets.wheel]
18
+ packages = ["src/crosspoint"]
19
+
20
+ [dependency-groups]
21
+ dev = ["pytest>=8"]
22
+
23
+ [tool.uv]
24
+ prerelease = "if-necessary"
@@ -0,0 +1,8 @@
1
+ """Crosspoint API client: the Polar SDK, pointed at Crosspoint.
2
+
3
+ The default API version is 2026-10; pin one with ``from crosspoint.v2026_10 import ...``.
4
+ """
5
+
6
+ from .v2026_10 import CROSSPOINT_API_URL, Crosspoint, CrosspointAsync, webhooks
7
+
8
+ __all__ = ["CROSSPOINT_API_URL", "Crosspoint", "CrosspointAsync", "webhooks"]
@@ -0,0 +1,16 @@
1
+ """Crosspoint's API is Polar's API: the Polar SDK works once it points at Crosspoint."""
2
+
3
+ import os
4
+
5
+ CROSSPOINT_API_URL = "https://api.crosspoint.finance"
6
+ ACCESS_TOKEN_ENV = "CROSSPOINT_ACCESS_TOKEN"
7
+
8
+
9
+ def resolve_access_token(access_token: str | None) -> str:
10
+ token = access_token or os.environ.get(ACCESS_TOKEN_ENV)
11
+ if not token:
12
+ raise ValueError(
13
+ f"Crosspoint: pass access_token or set {ACCESS_TOKEN_ENV} "
14
+ "(an organization access token, cxp_oat_...)."
15
+ )
16
+ return token
File without changes
@@ -0,0 +1,40 @@
1
+ """Crosspoint client for API version 2026_04."""
2
+
3
+ from typing import Any
4
+
5
+ from polar.v2026_04 import Polar, PolarAsync
6
+ from polar.v2026_04 import webhooks as webhooks
7
+
8
+ from ._options import CROSSPOINT_API_URL, resolve_access_token
9
+
10
+ __all__ = ["CROSSPOINT_API_URL", "Crosspoint", "CrosspointAsync", "webhooks"]
11
+
12
+
13
+ class Crosspoint(Polar):
14
+ """`Crosspoint()` reads CROSSPOINT_ACCESS_TOKEN; pass `base_url` only for local development."""
15
+
16
+ def __init__(
17
+ self,
18
+ access_token: str | None = None,
19
+ *,
20
+ base_url: str = CROSSPOINT_API_URL,
21
+ timeout: Any = 5.0,
22
+ ) -> None:
23
+ super().__init__(
24
+ resolve_access_token(access_token), base_url=base_url, timeout=timeout
25
+ )
26
+
27
+
28
+ class CrosspointAsync(PolarAsync):
29
+ """Async client: `async with CrosspointAsync() as crosspoint: ...`."""
30
+
31
+ def __init__(
32
+ self,
33
+ access_token: str | None = None,
34
+ *,
35
+ base_url: str = CROSSPOINT_API_URL,
36
+ timeout: Any = 5.0,
37
+ ) -> None:
38
+ super().__init__(
39
+ resolve_access_token(access_token), base_url=base_url, timeout=timeout
40
+ )
@@ -0,0 +1,40 @@
1
+ """Crosspoint client for API version 2026_10."""
2
+
3
+ from typing import Any
4
+
5
+ from polar.v2026_10 import Polar, PolarAsync
6
+ from polar.v2026_10 import webhooks as webhooks
7
+
8
+ from ._options import CROSSPOINT_API_URL, resolve_access_token
9
+
10
+ __all__ = ["CROSSPOINT_API_URL", "Crosspoint", "CrosspointAsync", "webhooks"]
11
+
12
+
13
+ class Crosspoint(Polar):
14
+ """`Crosspoint()` reads CROSSPOINT_ACCESS_TOKEN; pass `base_url` only for local development."""
15
+
16
+ def __init__(
17
+ self,
18
+ access_token: str | None = None,
19
+ *,
20
+ base_url: str = CROSSPOINT_API_URL,
21
+ timeout: Any = 5.0,
22
+ ) -> None:
23
+ super().__init__(
24
+ resolve_access_token(access_token), base_url=base_url, timeout=timeout
25
+ )
26
+
27
+
28
+ class CrosspointAsync(PolarAsync):
29
+ """Async client: `async with CrosspointAsync() as crosspoint: ...`."""
30
+
31
+ def __init__(
32
+ self,
33
+ access_token: str | None = None,
34
+ *,
35
+ base_url: str = CROSSPOINT_API_URL,
36
+ timeout: Any = 5.0,
37
+ ) -> None:
38
+ super().__init__(
39
+ resolve_access_token(access_token), base_url=base_url, timeout=timeout
40
+ )
@@ -0,0 +1,33 @@
1
+ import httpx
2
+ import pytest
3
+
4
+ from crosspoint import CROSSPOINT_API_URL, Crosspoint
5
+ from crosspoint.v2026_04 import Crosspoint as Crosspoint202604
6
+
7
+
8
+ def http(client: Crosspoint) -> httpx.Client:
9
+ return client._client._client # the SDK's httpx client
10
+
11
+
12
+ def test_talks_to_crosspoint_not_polar() -> None:
13
+ client = http(Crosspoint("cxp_oat_test"))
14
+
15
+ assert str(client.base_url).rstrip("/") == CROSSPOINT_API_URL
16
+ assert client.headers["authorization"] == "Bearer cxp_oat_test"
17
+
18
+
19
+ def test_local_development_url() -> None:
20
+ client = http(Crosspoint("cxp_oat_test", base_url="http://127.0.0.1:8001"))
21
+ assert str(client.base_url).rstrip("/") == "http://127.0.0.1:8001"
22
+
23
+
24
+ def test_reads_the_environment(monkeypatch: pytest.MonkeyPatch) -> None:
25
+ monkeypatch.setenv("CROSSPOINT_ACCESS_TOKEN", "cxp_oat_env")
26
+ Crosspoint()
27
+ Crosspoint202604()
28
+
29
+
30
+ def test_explains_a_missing_token(monkeypatch: pytest.MonkeyPatch) -> None:
31
+ monkeypatch.delenv("CROSSPOINT_ACCESS_TOKEN", raising=False)
32
+ with pytest.raises(ValueError, match="CROSSPOINT_ACCESS_TOKEN"):
33
+ Crosspoint()
@@ -0,0 +1,183 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.11"
4
+
5
+ [[package]]
6
+ name = "adaptix"
7
+ version = "3.0.0b12"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/5d/82/aa17eb2968cf7c78caf4915ca62397214f196dc1bef07e4d81bfb4c4abc5/adaptix-3.0.0b12.tar.gz", hash = "sha256:906053a39ff509f0aa4ca9faa07dffa205bd90fa41d9774cd849d3454565b0ea", size = 128634, upload-time = "2026-04-04T17:31:01.084Z" }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/11/66/abcca849b17e4a3adf5116e58c51471f37264a190cee2c67f1ba57782a7f/adaptix-3.0.0b12-py3-none-any.whl", hash = "sha256:8156f0549b96fcd193d13efca7bfbda39b3d6389085556d930e204c09f9ae6ed", size = 188651, upload-time = "2026-04-04T17:30:59.17Z" },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "anyio"
16
+ version = "4.15.1"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ dependencies = [
19
+ { name = "idna" },
20
+ { name = "typing-extensions", marker = "python_full_version < '3.15'" },
21
+ ]
22
+ sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" }
23
+ wheels = [
24
+ { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" },
25
+ ]
26
+
27
+ [[package]]
28
+ name = "certifi"
29
+ version = "2026.7.22"
30
+ source = { registry = "https://pypi.org/simple" }
31
+ sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" }
32
+ wheels = [
33
+ { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" },
34
+ ]
35
+
36
+ [[package]]
37
+ name = "colorama"
38
+ version = "0.4.6"
39
+ source = { registry = "https://pypi.org/simple" }
40
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
41
+ wheels = [
42
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
43
+ ]
44
+
45
+ [[package]]
46
+ name = "crosspoint"
47
+ version = "0.1.0"
48
+ source = { editable = "." }
49
+ dependencies = [
50
+ { name = "polar-sdk" },
51
+ ]
52
+
53
+ [package.dev-dependencies]
54
+ dev = [
55
+ { name = "pytest" },
56
+ ]
57
+
58
+ [package.metadata]
59
+ requires-dist = [{ name = "polar-sdk", specifier = ">=1.0.0a22" }]
60
+
61
+ [package.metadata.requires-dev]
62
+ dev = [{ name = "pytest", specifier = ">=8" }]
63
+
64
+ [[package]]
65
+ name = "h11"
66
+ version = "0.16.0"
67
+ source = { registry = "https://pypi.org/simple" }
68
+ sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
69
+ wheels = [
70
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
71
+ ]
72
+
73
+ [[package]]
74
+ name = "httpcore"
75
+ version = "1.0.9"
76
+ source = { registry = "https://pypi.org/simple" }
77
+ dependencies = [
78
+ { name = "certifi" },
79
+ { name = "h11" },
80
+ ]
81
+ sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
82
+ wheels = [
83
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
84
+ ]
85
+
86
+ [[package]]
87
+ name = "httpx"
88
+ version = "0.28.1"
89
+ source = { registry = "https://pypi.org/simple" }
90
+ dependencies = [
91
+ { name = "anyio" },
92
+ { name = "certifi" },
93
+ { name = "httpcore" },
94
+ { name = "idna" },
95
+ ]
96
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
97
+ wheels = [
98
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
99
+ ]
100
+
101
+ [[package]]
102
+ name = "idna"
103
+ version = "3.20"
104
+ source = { registry = "https://pypi.org/simple" }
105
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" }
106
+ wheels = [
107
+ { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" },
108
+ ]
109
+
110
+ [[package]]
111
+ name = "iniconfig"
112
+ version = "2.3.1"
113
+ source = { registry = "https://pypi.org/simple" }
114
+ sdist = { url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz", hash = "sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960", size = 21209, upload-time = "2026-10-06T22:48:38.076Z" }
115
+ wheels = [
116
+ { url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl", hash = "sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7", size = 7552, upload-time = "2026-10-06T22:48:36.959Z" },
117
+ ]
118
+
119
+ [[package]]
120
+ name = "packaging"
121
+ version = "26.3"
122
+ source = { registry = "https://pypi.org/simple" }
123
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
124
+ wheels = [
125
+ { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
126
+ ]
127
+
128
+ [[package]]
129
+ name = "pluggy"
130
+ version = "1.6.0"
131
+ source = { registry = "https://pypi.org/simple" }
132
+ sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
133
+ wheels = [
134
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
135
+ ]
136
+
137
+ [[package]]
138
+ name = "polar-sdk"
139
+ version = "1.0.2"
140
+ source = { registry = "https://pypi.org/simple" }
141
+ dependencies = [
142
+ { name = "adaptix" },
143
+ { name = "httpx" },
144
+ { name = "typing-extensions" },
145
+ ]
146
+ sdist = { url = "https://files.pythonhosted.org/packages/10/b4/6ff182038bd8d133c84061ed2d8c907f9f53f3ca3a25cf1726bee2dbec42/polar_sdk-1.0.2.tar.gz", hash = "sha256:9df91d57f7b9cb62162c1e64274e8b3cf556e4db711ac9c49b928f6bef9aeada", size = 327581, upload-time = "2026-10-02T07:00:30.008Z" }
147
+ wheels = [
148
+ { url = "https://files.pythonhosted.org/packages/92/e2/abec9d0e022b0cde10333fd937dba2b7057cacd3fe0a90b2c3340a02cc22/polar_sdk-1.0.2-py3-none-any.whl", hash = "sha256:170379262decb1c390e5e3c69b819cff1e3866045d08069bd49097e89760963a", size = 458808, upload-time = "2026-10-02T07:00:28.451Z" },
149
+ ]
150
+
151
+ [[package]]
152
+ name = "pygments"
153
+ version = "2.21.0"
154
+ source = { registry = "https://pypi.org/simple" }
155
+ sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" }
156
+ wheels = [
157
+ { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" },
158
+ ]
159
+
160
+ [[package]]
161
+ name = "pytest"
162
+ version = "9.1.1"
163
+ source = { registry = "https://pypi.org/simple" }
164
+ dependencies = [
165
+ { name = "colorama", marker = "sys_platform == 'win32'" },
166
+ { name = "iniconfig" },
167
+ { name = "packaging" },
168
+ { name = "pluggy" },
169
+ { name = "pygments" },
170
+ ]
171
+ sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
172
+ wheels = [
173
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
174
+ ]
175
+
176
+ [[package]]
177
+ name = "typing-extensions"
178
+ version = "4.16.0"
179
+ source = { registry = "https://pypi.org/simple" }
180
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
181
+ wheels = [
182
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
183
+ ]