sillo-wire 0.1.0.dev1__tar.gz → 1.0.0a2__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.
Files changed (30) hide show
  1. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.github/workflows/ci.yml +17 -8
  2. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.github/workflows/release.yml +4 -3
  3. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/CHANGELOG.md +30 -0
  4. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/PKG-INFO +10 -36
  5. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/README.md +8 -34
  6. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/pyproject.toml +3 -22
  7. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/__init__.py +1 -1
  8. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/uv.lock +82 -82
  9. sillo_wire-0.1.0.dev1/_sillo_wire_bootstrap.py +0 -104
  10. sillo_wire-0.1.0.dev1/sillo-stubs/py.typed +0 -1
  11. sillo_wire-0.1.0.dev1/sillo-stubs/wire.pyi +0 -48
  12. sillo_wire-0.1.0.dev1/sillo_wire.pth +0 -1
  13. sillo_wire-0.1.0.dev1/tests/test_alias.py +0 -115
  14. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.gitignore +0 -0
  15. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/LICENSE +0 -0
  16. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/backlog.py +0 -0
  17. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/consumer.py +0 -0
  18. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/envelope.py +0 -0
  19. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/errors.py +0 -0
  20. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/hub.py +0 -0
  21. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/peer.py +0 -0
  22. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/policy.py +0 -0
  23. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/py.typed +0 -0
  24. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/testing.py +0 -0
  25. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_backlog.py +0 -0
  26. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_consumer.py +0 -0
  27. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_envelope.py +0 -0
  28. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_hub.py +0 -0
  29. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_peer.py +0 -0
  30. {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_testing_helpers.py +0 -0
@@ -27,7 +27,7 @@ jobs:
27
27
  pip install pytest pytest-asyncio pytest-cov ruff mypy
28
28
 
29
29
  - name: Lint
30
- run: ruff check sillo_wire tests _sillo_wire_bootstrap.py
30
+ run: ruff check sillo_wire tests
31
31
 
32
32
  - name: Types
33
33
  run: mypy sillo_wire
@@ -35,19 +35,28 @@ jobs:
35
35
  - name: Install the package
36
36
  run: pip install -e .
37
37
 
38
- # The `.pth` only fires for a real install, so the alias is checked
39
- # against a built wheel rather than the editable checkout.
40
- - name: Check the sillo.wire alias against a real install
38
+ # Checked against a built wheel rather than the editable checkout: an
39
+ # editable install can import a package the wheel does not actually ship.
40
+ - name: Check a built wheel installs and imports
41
41
  run: |
42
42
  pip install build && python -m build --wheel -o /tmp/w .
43
43
  python -m venv /tmp/v && /tmp/v/bin/pip install -q sillo-framework /tmp/w/*.whl mypy
44
44
  /tmp/v/bin/python -c "
45
- import sillo, sillo.wire, sillo_wire, os
46
- assert sillo.wire is sillo_wire
45
+ import os, sillo, sillo_wire
46
+ from sillo_wire import Hub
47
+ # The package is top-level and adds nothing to the framework's own
48
+ # directory; it used to ship a .pth that aliased sillo.wire onto it.
47
49
  assert 'wire' not in os.listdir(os.path.dirname(sillo.__file__)), 'wrote into sillo/'
48
- print('alias ok, sillo/ untouched')
50
+ try:
51
+ import sillo.wire
52
+ except ImportError:
53
+ pass
54
+ else:
55
+ raise AssertionError('sillo.wire still resolves; the alias was removed')
56
+ print('sillo_wire imports, sillo/ untouched, no alias')
49
57
  "
50
- printf 'from sillo.wire import Hub\nh: Hub = Hub()\n' > /tmp/tc.py
58
+ # Types come from the package's own inline annotations now, not stubs.
59
+ printf 'from sillo_wire import Hub\nh: Hub = Hub()\n' > /tmp/tc.py
51
60
  /tmp/v/bin/python -m mypy /tmp/tc.py
52
61
 
53
62
  - name: Test
@@ -77,9 +77,10 @@ jobs:
77
77
  - name: Build the package
78
78
  run: uv build
79
79
 
80
- # The whole point of this package's layout: the wheel adds a top-level
81
- # `sillo_wire` plus the `.pth`/bootstrap at the site-packages root, and
82
- # it must never write into the framework's own `sillo/` directory.
80
+ # The wheel adds a top-level `sillo_wire` and nothing else; it must never
81
+ # write into the framework's own `sillo/` directory. Two distributions
82
+ # sharing one package directory goes wrong in both directions, which is
83
+ # why this is asserted rather than assumed.
83
84
  - name: The wheel must stay out of sillo/
84
85
  run: |
85
86
  python - <<'PY'
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## [1.0.0a1] - 2026-09-13
6
+
7
+ First alpha, released alongside `sillo-framework` 1.0.0a1. Install with
8
+ `pip install --pre sillo-wire==1.0.0a1`.
9
+
10
+ An alpha: this is what 1.0 is expected to look like, but the API is not frozen
11
+ yet and may still change before `1.0.0`.
12
+
13
+ ### Removed
14
+
15
+ - **The `sillo.wire` import alias.** `sillo_wire` is now the only import path:
16
+
17
+ ```python
18
+ from sillo_wire import Hub, Peer # was: from sillo.wire import ...
19
+ ```
20
+
21
+ The alias was a meta-path finder registered by a `.pth` at interpreter
22
+ startup, plus PEP 561 stubs under `sillo-stubs/` to serve type checkers,
23
+ which never run import hooks. It read as part of the framework, but it cost a
24
+ `.pth` executing on every interpreter start in every environment the package
25
+ was installed in, a second set of stubs to keep in step with the real
26
+ package, and a name that static analysis only resolved because a second set
27
+ of files said so. A plain top-level package needs none of that.
28
+
29
+ `_sillo_wire_bootstrap.py`, `sillo_wire.pth` and `sillo-stubs/` are gone, and
30
+ so are the `force-include` blocks that shipped them. Inline types in
31
+ `sillo_wire` are now the single source of truth for type checkers.
32
+
3
33
  ## 0.1.0.dev1
4
34
 
5
35
  Development pre-release for testing. Install with
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sillo-wire
3
- Version: 0.1.0.dev1
3
+ Version: 1.0.0a2
4
4
  Summary: Rooms, presence and fan-out for Sillo WebSockets — bounded queues, replayable backlog, no global state.
5
5
  Project-URL: Homepage, https://sillo.build
6
6
  Project-URL: Documentation, https://docs.sillo.build/packages/wire/
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Topic :: Internet :: WWW/HTTP
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.10
24
- Requires-Dist: sillo-framework>=0.3
24
+ Requires-Dist: sillo-framework>=1.0.0a1
25
25
  Provides-Extra: dev
26
26
  Requires-Dist: mypy>=1.11; extra == 'dev'
27
27
  Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
@@ -38,11 +38,11 @@ Rooms, presence and fan-out for [Sillo](https://sillo.build) WebSockets.
38
38
  pip install sillo-wire
39
39
  ```
40
40
 
41
- Installs as `sillo-wire`, imports as `sillo.wire`.
41
+ Installs as `sillo-wire`, imports as `sillo_wire`.
42
42
 
43
43
  ```python
44
44
  from sillo import SilloApp
45
- from sillo.wire import Hub, Peer
45
+ from sillo_wire import Hub, Peer
46
46
 
47
47
  app = SilloApp()
48
48
  hub = Hub()
@@ -98,7 +98,7 @@ await hub.replay(peer, "lobby", since=last_seq_the_client_saw)
98
98
  When a peer's queue fills, what happens is a choice, not a default:
99
99
 
100
100
  ```python
101
- from sillo.wire import Overflow, Peer
101
+ from sillo_wire import Overflow, Peer
102
102
 
103
103
  Peer(socket, overflow=Overflow.DROP_OLDEST) # keep current — prices, cursors
104
104
  Peer(socket, overflow=Overflow.DROP_NEWEST) # keep order — reconcile later
@@ -130,7 +130,7 @@ joins the rooms, pumps messages, and guarantees the peer is removed from every
130
130
  room when the connection ends — including when a hook raises.
131
131
 
132
132
  ```python
133
- from sillo.wire import Hub, RoomConsumer
133
+ from sillo_wire import Hub, RoomConsumer
134
134
 
135
135
  hub = Hub()
136
136
 
@@ -154,7 +154,7 @@ app.add_ws_route(path="/ws/{room}", handler=Chat.as_handler())
154
154
  Retention is per room and capped by payload bytes, evicting oldest first:
155
155
 
156
156
  ```python
157
- from sillo.wire import Hub, MemoryBacklog, NullBacklog
157
+ from sillo_wire import Hub, MemoryBacklog, NullBacklog
158
158
 
159
159
  Hub(backlog=MemoryBacklog(capacity_bytes=4 * 1024 * 1024))
160
160
  Hub(backlog=NullBacklog()) # keep nothing — typing indicators, telemetry
@@ -165,10 +165,10 @@ importing anything from here.
165
165
 
166
166
  ## Testing
167
167
 
168
- `sillo.wire.testing` ships the piece unit tests are missing — a socket:
168
+ `sillo_wire.testing` ships the piece unit tests are missing — a socket:
169
169
 
170
170
  ```python
171
- from sillo.wire import Hub, Peer
171
+ from sillo_wire import Hub, Peer
172
172
  from sillo_wire.testing import FakeSocket, drain
173
173
 
174
174
  async def test_a_broadcast_reaches_the_room():
@@ -197,32 +197,6 @@ to reproduce against a real server and the two most worth testing.
197
197
  | `Backlog` | `MemoryBacklog` `NullBacklog`, or your own |
198
198
  | `Overflow` | `DROP_OLDEST` `DROP_NEWEST` `CLOSE` |
199
199
 
200
- ## The two import paths
201
-
202
- `sillo.wire` and `sillo_wire` name the same objects. The code lives in the
203
- top-level `sillo_wire` package; `sillo.wire` is an alias, so it reads as part
204
- of the framework:
205
-
206
- ```python
207
- from sillo.wire import Hub # both of these
208
- from sillo_wire import Hub # bind the same class
209
- ```
210
-
211
- The alias is a meta-path finder registered by a `.pth` at interpreter startup —
212
- the only hook that runs before an `import sillo.wire` could fail. Type checkers
213
- never run import hooks, so they are served separately by the partial stubs in
214
- `sillo-stubs/` (PEP 561), which are additive: mypy resolves `sillo.wire` and
215
- still uses the framework's own inline types for the rest of `sillo`.
216
-
217
- Nothing is written into the framework's package directory. Shipping
218
- `sillo/wire/` in there would be simpler, and it is what this did first — but
219
- two distributions sharing one directory goes wrong in both directions.
220
- Installing the framework from a checkout moves where `sillo` resolves and
221
- orphans the copy in site-packages; removing or replacing the framework leaves
222
- that directory standing with no `__init__.py`, which is an override rather than
223
- an addition. Uninstalling either package here leaves the other exactly as it
224
- was.
225
-
226
200
  ## Working on it
227
201
 
228
202
  The alias works under an editable install too — the `.pth` is shipped by the
@@ -231,7 +205,7 @@ editable build target as well as the wheel.
231
205
  ```bash
232
206
  pip install -e ".[dev]"
233
207
  pytest --cov # 100% required, bootstrap included
234
- ruff check sillo_wire tests _sillo_wire_bootstrap.py
208
+ ruff check sillo_wire tests
235
209
  mypy sillo_wire
236
210
  ```
237
211
 
@@ -6,11 +6,11 @@ Rooms, presence and fan-out for [Sillo](https://sillo.build) WebSockets.
6
6
  pip install sillo-wire
7
7
  ```
8
8
 
9
- Installs as `sillo-wire`, imports as `sillo.wire`.
9
+ Installs as `sillo-wire`, imports as `sillo_wire`.
10
10
 
11
11
  ```python
12
12
  from sillo import SilloApp
13
- from sillo.wire import Hub, Peer
13
+ from sillo_wire import Hub, Peer
14
14
 
15
15
  app = SilloApp()
16
16
  hub = Hub()
@@ -66,7 +66,7 @@ await hub.replay(peer, "lobby", since=last_seq_the_client_saw)
66
66
  When a peer's queue fills, what happens is a choice, not a default:
67
67
 
68
68
  ```python
69
- from sillo.wire import Overflow, Peer
69
+ from sillo_wire import Overflow, Peer
70
70
 
71
71
  Peer(socket, overflow=Overflow.DROP_OLDEST) # keep current — prices, cursors
72
72
  Peer(socket, overflow=Overflow.DROP_NEWEST) # keep order — reconcile later
@@ -98,7 +98,7 @@ joins the rooms, pumps messages, and guarantees the peer is removed from every
98
98
  room when the connection ends — including when a hook raises.
99
99
 
100
100
  ```python
101
- from sillo.wire import Hub, RoomConsumer
101
+ from sillo_wire import Hub, RoomConsumer
102
102
 
103
103
  hub = Hub()
104
104
 
@@ -122,7 +122,7 @@ app.add_ws_route(path="/ws/{room}", handler=Chat.as_handler())
122
122
  Retention is per room and capped by payload bytes, evicting oldest first:
123
123
 
124
124
  ```python
125
- from sillo.wire import Hub, MemoryBacklog, NullBacklog
125
+ from sillo_wire import Hub, MemoryBacklog, NullBacklog
126
126
 
127
127
  Hub(backlog=MemoryBacklog(capacity_bytes=4 * 1024 * 1024))
128
128
  Hub(backlog=NullBacklog()) # keep nothing — typing indicators, telemetry
@@ -133,10 +133,10 @@ importing anything from here.
133
133
 
134
134
  ## Testing
135
135
 
136
- `sillo.wire.testing` ships the piece unit tests are missing — a socket:
136
+ `sillo_wire.testing` ships the piece unit tests are missing — a socket:
137
137
 
138
138
  ```python
139
- from sillo.wire import Hub, Peer
139
+ from sillo_wire import Hub, Peer
140
140
  from sillo_wire.testing import FakeSocket, drain
141
141
 
142
142
  async def test_a_broadcast_reaches_the_room():
@@ -165,32 +165,6 @@ to reproduce against a real server and the two most worth testing.
165
165
  | `Backlog` | `MemoryBacklog` `NullBacklog`, or your own |
166
166
  | `Overflow` | `DROP_OLDEST` `DROP_NEWEST` `CLOSE` |
167
167
 
168
- ## The two import paths
169
-
170
- `sillo.wire` and `sillo_wire` name the same objects. The code lives in the
171
- top-level `sillo_wire` package; `sillo.wire` is an alias, so it reads as part
172
- of the framework:
173
-
174
- ```python
175
- from sillo.wire import Hub # both of these
176
- from sillo_wire import Hub # bind the same class
177
- ```
178
-
179
- The alias is a meta-path finder registered by a `.pth` at interpreter startup —
180
- the only hook that runs before an `import sillo.wire` could fail. Type checkers
181
- never run import hooks, so they are served separately by the partial stubs in
182
- `sillo-stubs/` (PEP 561), which are additive: mypy resolves `sillo.wire` and
183
- still uses the framework's own inline types for the rest of `sillo`.
184
-
185
- Nothing is written into the framework's package directory. Shipping
186
- `sillo/wire/` in there would be simpler, and it is what this did first — but
187
- two distributions sharing one directory goes wrong in both directions.
188
- Installing the framework from a checkout moves where `sillo` resolves and
189
- orphans the copy in site-packages; removing or replacing the framework leaves
190
- that directory standing with no `__init__.py`, which is an override rather than
191
- an addition. Uninstalling either package here leaves the other exactly as it
192
- was.
193
-
194
168
  ## Working on it
195
169
 
196
170
  The alias works under an editable install too — the `.pth` is shipped by the
@@ -199,7 +173,7 @@ editable build target as well as the wheel.
199
173
  ```bash
200
174
  pip install -e ".[dev]"
201
175
  pytest --cov # 100% required, bootstrap included
202
- ruff check sillo_wire tests _sillo_wire_bootstrap.py
176
+ ruff check sillo_wire tests
203
177
  mypy sillo_wire
204
178
  ```
205
179
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sillo-wire"
7
- version = "0.1.0.dev1"
7
+ version = "1.0.0a2"
8
8
  description = "Rooms, presence and fan-out for Sillo WebSockets — bounded queues, replayable backlog, no global state."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -28,7 +28,7 @@ classifiers = [
28
28
  ]
29
29
  # Only the socket surface is used — WebSocketContext and the logger. No ORM,
30
30
  # no cache, no extras.
31
- dependencies = ["sillo-framework>=0.3"]
31
+ dependencies = ["sillo-framework>=1.0.0a1"]
32
32
 
33
33
  [project.urls]
34
34
  Homepage = "https://sillo.build"
@@ -39,21 +39,7 @@ Source = "https://github.com/sillohq/wire"
39
39
  dev = ["pytest>=8.0", "pytest-asyncio>=0.24", "pytest-cov>=5.0", "ruff>=0.6", "mypy>=1.11"]
40
40
 
41
41
  [tool.hatch.build.targets.wheel]
42
- # `sillo-stubs` serves type checkers, which never run the import hook below.
43
- packages = ["sillo_wire", "sillo-stubs"]
44
-
45
- # The bootstrap and its .pth land at the site-packages root. The .pth is what
46
- # runs at interpreter startup and registers the `sillo.wire` alias; see
47
- # _sillo_wire_bootstrap.py for why the package is not shipped into `sillo/`.
48
- [tool.hatch.build.targets.wheel.force-include]
49
- "_sillo_wire_bootstrap.py" = "_sillo_wire_bootstrap.py"
50
- "sillo_wire.pth" = "sillo_wire.pth"
51
-
52
- # The same two files for `pip install -e .`, so the `sillo.wire` alias works in
53
- # a development checkout and not only from a built wheel.
54
- [tool.hatch.build.targets.editable.force-include]
55
- "_sillo_wire_bootstrap.py" = "_sillo_wire_bootstrap.py"
56
- "sillo_wire.pth" = "sillo_wire.pth"
42
+ packages = ["sillo_wire"]
57
43
 
58
44
  [tool.pytest.ini_options]
59
45
  asyncio_mode = "auto"
@@ -61,11 +47,6 @@ asyncio_default_fixture_loop_scope = "function"
61
47
  testpaths = ["tests"]
62
48
 
63
49
  [tool.coverage.run]
64
- # `_sillo_wire_bootstrap` is deliberately not measured. Its `.pth` imports it
65
- # at interpreter startup, before coverage exists, so its `def` and `class`
66
- # statements never run under the tracer and it reads as 65% however thoroughly
67
- # it is tested. tests/test_alias.py covers it; the number would be an artefact
68
- # of import timing rather than of testing.
69
50
  source = ["sillo_wire"]
70
51
  branch = true
71
52
 
@@ -38,7 +38,7 @@ from sillo_wire.hub import Hub
38
38
  from sillo_wire.peer import Peer
39
39
  from sillo_wire.policy import Overflow
40
40
 
41
- __version__ = "0.1.0.dev1"
41
+ __version__ = "1.0.0a2"
42
42
 
43
43
  __all__ = [
44
44
  "Backlog",
@@ -31,66 +31,66 @@ wheels = [
31
31
 
32
32
  [[package]]
33
33
  name = "ast-serialize"
34
- version = "0.10.0"
34
+ version = "0.11.1"
35
35
  source = { registry = "https://pypi.org/simple" }
36
- sdist = { url = "https://files.pythonhosted.org/packages/59/6d/c6ab91f72f4862d63e446e10248d8f52e8b4c4b7579bb937ddf942a5961e/ast_serialize-0.10.0.tar.gz", hash = "sha256:f47a26cc7d2605fb645b6e7f6c21cf4fb8d7833d00ea8b48e26f057b14eccd01", size = 952608, upload-time = "2026-09-07T10:22:47.595Z" }
36
+ sdist = { url = "https://files.pythonhosted.org/packages/4e/a2/04a9383e7512c91c54b2f34b3ff86dc7d2610506f588c2bda36e952a68f7/ast_serialize-0.11.1.tar.gz", hash = "sha256:cc5db2983805f6be786488aac8c5998d5b71965488d1b18c44d435a2205a5cb4", size = 953785, upload-time = "2026-09-09T16:05:27.851Z" }
37
37
  wheels = [
38
- { url = "https://files.pythonhosted.org/packages/04/cd/0b7ede86065c89d56c533cd98b8997f3dd3f003bc01815c9c41860724d6c/ast_serialize-0.10.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:2759bc9e04b13f11b80a23a7aec8da16a27217e0f4bf61019f06ea533511d2ed", size = 894424, upload-time = "2026-09-07T10:21:17.374Z" },
39
- { url = "https://files.pythonhosted.org/packages/b9/62/012afc9f7177e181c7d23ef2b0b974c9a0a800321de5cf663bd372894d4e/ast_serialize-0.10.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:2eef5883e824ff7d303be13ca1dd1aaeb1975ac9f3da5ceecb3ae43c84a54773", size = 1229989, upload-time = "2026-09-07T10:21:19.536Z" },
40
- { url = "https://files.pythonhosted.org/packages/ea/76/67774bf7f22166f7609861d85d8350e465eab7f92461d4c4ab808de398e7/ast_serialize-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6ee514e465bd43dddc6b0b1d05b5baf64035b5f945ae558d4f1021b368f1c4c1", size = 1209345, upload-time = "2026-09-07T10:21:21.228Z" },
41
- { url = "https://files.pythonhosted.org/packages/d2/c7/238063d1b2797e43d3704c5a280faae003348a10bbb6d08b55a843c42fd4/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b910e8c67547efe5a5d5524de7ce80dc50a45debafaaf4b29000fc72b34a8902", size = 1274910, upload-time = "2026-09-07T10:21:23.425Z" },
42
- { url = "https://files.pythonhosted.org/packages/b2/48/1de96ee95d0069615ff7e1664a71b4e6b4ccf3f16b5e1a3ec1ab66f3788a/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0103ce489e91b0467cc2bf2fc7eaf80b7b61d5e48aed070a9c3d594e41dffaad", size = 1281284, upload-time = "2026-09-07T10:21:25.184Z" },
43
- { url = "https://files.pythonhosted.org/packages/fb/03/a33aa714487acd858eaa192099ab18c28a711d2f192606de1fc174d8b0e6/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cc1e7e5b6db230c980a2916350d07f9b7ad6f08fb1ab6932bd393aa0c6d9220", size = 1547608, upload-time = "2026-09-07T10:21:26.913Z" },
44
- { url = "https://files.pythonhosted.org/packages/88/11/9bf2e23bfa848033ba3faedab51a8f3104d90e58222ec32eb476b18cc97c/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:226535f407b70f22109c5faf777cb5c8e9189bf44f29b2fb4ba87093c2c01743", size = 1297685, upload-time = "2026-09-07T10:21:28.418Z" },
45
- { url = "https://files.pythonhosted.org/packages/4e/ba/6175b12119b1605b2a888318cfcbda260947c002ba7c6921b053606c6751/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8274eebef548a927c3691c7f7c2f4635dde700164ce942273a464cc914241ae9", size = 1295877, upload-time = "2026-09-07T10:21:30.414Z" },
46
- { url = "https://files.pythonhosted.org/packages/d7/81/80f5c2b313efa1397ef2dab6e76c321ec05c2c256d0ea5e91232835c86a7/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:6c944147c80cff8cfad185835bd4772c690019988331f05095d1d5f393eefe06", size = 1302152, upload-time = "2026-09-07T10:21:32.06Z" },
47
- { url = "https://files.pythonhosted.org/packages/fd/fb/e64b8081a5aaf1ebf189a9c4c3c1be771eb7e2a4e42009cb7a91d4647753/ast_serialize-0.10.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6760026ee6903cd63d89e77a0cb9ea4f150fe619ec541b8590bcaacf26dfbb81", size = 1349550, upload-time = "2026-09-07T10:21:33.614Z" },
48
- { url = "https://files.pythonhosted.org/packages/5d/17/9665016237be55439435b7eb809c65fbfcee6f0a94b67670c85d57674329/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f72062e17859d9cbf946fcd6b2d7b20d79a4fc5dc51e28198d86c6455cd1ed4", size = 1452798, upload-time = "2026-09-07T10:21:35.148Z" },
49
- { url = "https://files.pythonhosted.org/packages/07/77/66110e38d406d148986698a9e53ec0f5e3798b88b4483636469edefc492b/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0eb4562df6842d900b127c59c2896e8684e2a5eb69518cc79bfa24ec0b6bd808", size = 1555553, upload-time = "2026-09-07T10:21:36.722Z" },
50
- { url = "https://files.pythonhosted.org/packages/db/ba/a8ad46ae9510e7a9cddc21ebde3fa465ac4be863984c011a5886870a1d4d/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2afa657d7ce1a1e150dfa4794d1d303441bd17367d69941f9712c15e4d273b3c", size = 1550516, upload-time = "2026-09-07T10:21:38.215Z" },
51
- { url = "https://files.pythonhosted.org/packages/7f/dd/cb9d394e17eff38adc141983ba503ee12d3851c1a0f6c319e9228f5c5e81/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:7ff5abf0897f54d62bd32a2878bb154d648ceaf77f553ff39b264c1191b0d60f", size = 1679774, upload-time = "2026-09-07T10:21:39.766Z" },
52
- { url = "https://files.pythonhosted.org/packages/75/a2/ad4f80989c179ae73c6e44ed1bb215c39c220071e7ccb88d28e4651508f0/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:6f8b8a4c4e02d1bea4e2212727fa6ddf824d8c5926df03452ad491470ce37699", size = 1477137, upload-time = "2026-09-07T10:21:41.318Z" },
53
- { url = "https://files.pythonhosted.org/packages/e5/b5/4f193b9513161b109112fa5ba47fda0885cec6fa3f419317e15ea6583ff9/ast_serialize-0.10.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:84bac4b6f441824d91e0540362f12c0e0f8820294652521b4ce9d7e7faa56b5b", size = 1495387, upload-time = "2026-09-07T10:21:42.882Z" },
54
- { url = "https://files.pythonhosted.org/packages/c7/bf/adfe52b8be218ecc9a7e57fd217ede236e37421494f974791dc3939f1267/ast_serialize-0.10.0-cp314-cp314t-win32.whl", hash = "sha256:15bd638e70753e58b3d1f2859dfdeef268bc9ebfd349c5acf477bad01cb97cfc", size = 1114335, upload-time = "2026-09-07T10:21:44.635Z" },
55
- { url = "https://files.pythonhosted.org/packages/ec/ed/a7658ffbe64eb0a61fdc936dd33877d6233d4db6a757ae0c19b6e0bdf74e/ast_serialize-0.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4cb6d447b3510e47090b66560e17a466f3d61e42699c475482b505fd80ff8c83", size = 1150487, upload-time = "2026-09-07T10:21:46.401Z" },
56
- { url = "https://files.pythonhosted.org/packages/cc/0b/fdc76a035cd036d3ae5ad189247879bc3582742ba2267f4f79fbd16023a2/ast_serialize-0.10.0-cp314-cp314t-win_arm64.whl", hash = "sha256:efde0f316f226d4e7b211d62bc0cc17f6b4cd2d057622b889183a38956d0f9ce", size = 1121949, upload-time = "2026-09-07T10:21:48.1Z" },
57
- { url = "https://files.pythonhosted.org/packages/ac/bd/cf2deab2ceb79f4476a30479a2756bb64b63810b7f10bfbd3ce1503d4059/ast_serialize-0.10.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:cbcc3542259ae08153e634d50dc220723415fb24510856523052b5eeb10b4950", size = 1229414, upload-time = "2026-09-07T10:21:49.554Z" },
58
- { url = "https://files.pythonhosted.org/packages/ee/cb/ec8e84d3ab8073e8536823f7a3cba46e4992d9c8d904481e18509eeea3ff/ast_serialize-0.10.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:2251086be53a375d256faefaedffe5ccd99187be614788f8279b41dae1c5fdee", size = 1210297, upload-time = "2026-09-07T10:21:50.996Z" },
59
- { url = "https://files.pythonhosted.org/packages/6d/e7/6a1d216160da29566a6125c34e90092a5f9d1444e24e955741113abdf033/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1358ef5d98f9dc96468d171317d78d746f9ef8ca45577298512a737ba9d6514", size = 1276064, upload-time = "2026-09-07T10:21:52.452Z" },
60
- { url = "https://files.pythonhosted.org/packages/96/87/1f1052a0dd00dfe15c129a7073f7b1b5bb632b5507baff27190dd255e0a9/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59ef8acc0ba4315024e5000e5fa8ea656a02e375ebb5ce020f3582d308d6153d", size = 1280982, upload-time = "2026-09-07T10:21:53.992Z" },
61
- { url = "https://files.pythonhosted.org/packages/d3/8f/9f4578b668b60436249dfa1bc6612283d3cbb665bc6cb2c1e23934d708d8/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c9715c4379b33740c94819e55afe59e28d6d3f30f69b903b4fcb2ecb5335531", size = 1552458, upload-time = "2026-09-07T10:21:55.485Z" },
62
- { url = "https://files.pythonhosted.org/packages/e6/cc/395d96c55e5d91a87fcfa5f15c7d11834cd150d491ce4849b2290334b8e9/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26e6dc5d1f7aa642d9e94b98e4d3e1c81dc6b595f01619658f7e9268379826c0", size = 1298414, upload-time = "2026-09-07T10:21:57.01Z" },
63
- { url = "https://files.pythonhosted.org/packages/7a/8d/473c8fb551af1de55abcc36d591ac18d4175ba7fc15f41d62ad9b30d7385/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760dce78c6c4d4df30d3df9b80be1c521e0ee1d275ae54906e9a95b150692567", size = 1296613, upload-time = "2026-09-07T10:21:58.591Z" },
64
- { url = "https://files.pythonhosted.org/packages/6f/57/31044aa6fa739634ada7fff321db08a813157663b18629851820fca455a6/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:40a7f487e2f5523518270600e0b7f2c61beac3106da142d911c3386ed7abbcfa", size = 1304321, upload-time = "2026-09-07T10:22:00.12Z" },
65
- { url = "https://files.pythonhosted.org/packages/10/87/c5d7c0c627b991f46fc308a41c0e92b792322440f84e43739b11fb4a1a64/ast_serialize-0.10.0-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1c252b746da0ad1883b82502eeff859221eef1d66d3f95dcb2373760a34d440", size = 1350352, upload-time = "2026-09-07T10:22:01.605Z" },
66
- { url = "https://files.pythonhosted.org/packages/62/ec/d80abe681b7d96b4ea88cf69d559d55a41b1a36c907b579d774caff2527a/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:719c7a121cc3022d78b7f4f7a9fd159586e521531c0e495a245375d2c4695d4e", size = 1454522, upload-time = "2026-09-07T10:22:03.149Z" },
67
- { url = "https://files.pythonhosted.org/packages/8d/7a/d4cc3aa236b9fdce16a394bfd7c12072d9ac30e83f9319aaa14305cbaab9/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:d7621157ac99ae00957196e7094fe279e7547d8b505046a9d5509c4fc740e9fc", size = 1555150, upload-time = "2026-09-07T10:22:04.722Z" },
68
- { url = "https://files.pythonhosted.org/packages/d2/a6/710d1aef678650c75edcb4cdab79998ec63aae54710a438b9fd66c3a616e/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:82087a71fe39925ab0068ef2f25444a1c87d1e5f1901f32dcf82f6eddddeac6a", size = 1551843, upload-time = "2026-09-07T10:22:06.182Z" },
69
- { url = "https://files.pythonhosted.org/packages/e9/23/2a9c35721a82a506bae980dbdfeaa7b296bf79d818c731b3aaa0ee53c5a7/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:8aac958cf0c0b2595a0487c7b5d2ecac88fa5c0221b83b1420ac4bf472f84cb7", size = 1686064, upload-time = "2026-09-07T10:22:07.712Z" },
70
- { url = "https://files.pythonhosted.org/packages/24/36/f3fd4b6f2c1e4d5eca149e4bfdaa6d93fe77851b21562d14f22a452c71ee/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:a53a4d528171b8b709b4e7d89654532189bff53947f24ac4db9c465bb10e7cd2", size = 1478662, upload-time = "2026-09-07T10:22:09.218Z" },
71
- { url = "https://files.pythonhosted.org/packages/de/65/5135ac9c7e305bd3e6234ef0fbf50bbac2ac00a35076bc167936c6d6d166/ast_serialize-0.10.0-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:93ae740c6d6f5641573122a7dcffa4baa7ef9144109c54584baad5bf827ad388", size = 1495057, upload-time = "2026-09-07T10:22:10.742Z" },
72
- { url = "https://files.pythonhosted.org/packages/5a/dd/7dd0e80551dc66fc56197b5439d76fb6173ccf9975df6bf1399e2231069c/ast_serialize-0.10.0-cp315-abi3.abi3t-win32.whl", hash = "sha256:4d10d8fb4b82d5bae455ce9f606920d8dcd563b812b43dcd8d6f9b11089cfb23", size = 1114912, upload-time = "2026-09-07T10:22:12.675Z" },
73
- { url = "https://files.pythonhosted.org/packages/72/83/a84661b89065fe4986d183abdf0bce5f1a24bea26bbe74054345758357c1/ast_serialize-0.10.0-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:5917460c0f8322755872db1792788fcaa3835d1fb6a3f129c65ace700c7e4663", size = 1152503, upload-time = "2026-09-07T10:22:14.159Z" },
74
- { url = "https://files.pythonhosted.org/packages/f6/c0/95bc047bc830f3223d42111ca2980a4328cd09d597773f04f2c689c3330e/ast_serialize-0.10.0-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:8efb53cf1c439516a563664e014ba9b6b4fd86b4869c180954edce3954a51870", size = 1122527, upload-time = "2026-09-07T10:22:15.656Z" },
75
- { url = "https://files.pythonhosted.org/packages/21/56/f4c5811fc6e765a3c9b1b5dc64d58073e825b8a538773699ec02c2b98d0a/ast_serialize-0.10.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:7272522ca885c0091b4f4165b9403eb54a59e157a248592cc2539098c7ada50b", size = 894552, upload-time = "2026-09-07T10:22:17.27Z" },
76
- { url = "https://files.pythonhosted.org/packages/70/85/4606f3398e6776c74d44f8387855775c3cf31614b664cdb0e147df752933/ast_serialize-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:382cb721e2624dd1c2f4f7afd2a9b500930b057d2e24e1078cf6999c5fad1b31", size = 1236237, upload-time = "2026-09-07T10:22:18.767Z" },
77
- { url = "https://files.pythonhosted.org/packages/09/7b/520b33339f3d5ef9407fb17a00dac0849318158fa0c9853cfe8cc6b7a48d/ast_serialize-0.10.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:56a28b7567ba17f602a17d5603133a1292d307e957b3b5c3f66538e87548aed3", size = 1223110, upload-time = "2026-09-07T10:22:20.243Z" },
78
- { url = "https://files.pythonhosted.org/packages/a0/af/3c30941ed368ddb54e6ec0edfdd98dc7fdc679c6d4f478f8545c0b8f080a/ast_serialize-0.10.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8919e79a4525cdac63d51cd117c57f324936c902c7ecd0fd09d02aa88323b74d", size = 1285870, upload-time = "2026-09-07T10:22:22.019Z" },
79
- { url = "https://files.pythonhosted.org/packages/56/81/f0c0bf569388d319aab22c8a7f43747450e26c5ae6a6d9521766157f70f4/ast_serialize-0.10.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1109077d53b377d022d799bc4b171c32c3a711a716248a918d3e07875b5513cd", size = 1290793, upload-time = "2026-09-07T10:22:23.562Z" },
80
- { url = "https://files.pythonhosted.org/packages/c4/a1/515a76479ecfc77abe88d7c9954bc3a04f07b30fa33ec836eea80be07fd4/ast_serialize-0.10.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d17c50e1f6e8d950d79c66a18b863dee16cea3106f597203883131dd9c6ca4f", size = 1561250, upload-time = "2026-09-07T10:22:25.057Z" },
81
- { url = "https://files.pythonhosted.org/packages/4f/ba/702af61eb7a6803bf4cd30c09041ab4212e63d553ed9dc2793c95ab340b4/ast_serialize-0.10.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2c6cc5a62839869317523e0f74737db0d1759d72fb62cffe57a40e040d6a55", size = 1305696, upload-time = "2026-09-07T10:22:26.612Z" },
82
- { url = "https://files.pythonhosted.org/packages/31/ce/e6e0a311c16f84f13528f1cb32dec1ce68102711070c10c0c688a6c3cdf5/ast_serialize-0.10.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb1b20121a62da5937b0c11c8f31667be0102342bf55459bb44a10d8549f8f3f", size = 1302712, upload-time = "2026-09-07T10:22:28.088Z" },
83
- { url = "https://files.pythonhosted.org/packages/bd/a2/7fd715228a35fec1c587c8156eaabf37b6df98fea48c90eec8f1af362e20/ast_serialize-0.10.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:6e45f7d7a663c28ed44d52b4069e32335edb7a0653a908a43bef2801d8d7c344", size = 1313977, upload-time = "2026-09-07T10:22:29.642Z" },
84
- { url = "https://files.pythonhosted.org/packages/1b/ff/e1c6a0aefdc80695c2dda0c558d58f90f55cb7bb791545865cd7d4ec39d7/ast_serialize-0.10.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c75ed7d94660e3ed4fd3c35672ab16c248c0be51d6b845de3edebbb6cf4526c", size = 1360341, upload-time = "2026-09-07T10:22:31.289Z" },
85
- { url = "https://files.pythonhosted.org/packages/08/ef/ab341936f65b663e4909dd5d8772d7c13dd7a39616cf18fd6231197b8177/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:45cfbde7e43a56a386b47f13b415d1fa4421b0a5e07ae0c84a7d883ac9aca4b2", size = 1462406, upload-time = "2026-09-07T10:22:32.823Z" },
86
- { url = "https://files.pythonhosted.org/packages/74/08/1cef69ee4228cd82b9da6b5e29e7fcdd30a6b8b3d6332815781e09666b62/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b3a52baa4c457d17a5729aa9bd698da8e61731f1670b4fe33923da54daa480e3", size = 1566792, upload-time = "2026-09-07T10:22:34.381Z" },
87
- { url = "https://files.pythonhosted.org/packages/d2/01/a3d773d0fe1536485069953d54bece7d8a95aa688e64f5cd692f68949051/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c07cb3f354c234cfacf81da95194b085186d7f4c1f7ad06c7f04fb49e320ef6d", size = 1560873, upload-time = "2026-09-07T10:22:35.844Z" },
88
- { url = "https://files.pythonhosted.org/packages/e2/ba/7fdda55197f06b2a1613d2ed7e647035b40b26b7aff62ac78e6728128ce9/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:8c91b2bc42a12252be53966a1f1b14cc5c843dfca82bee3bce38f2e96b327aa6", size = 1693061, upload-time = "2026-09-07T10:22:37.355Z" },
89
- { url = "https://files.pythonhosted.org/packages/3a/29/630a7cafd2780651ed73d468518be9d08a6cc3e7c30fdc88c0b2b90c1c5a/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:cb698ad6625a55d5d618c9d887423fd04d65dc5ad0f3ae5a8cbd96c46cea2438", size = 1487731, upload-time = "2026-09-07T10:22:39.403Z" },
90
- { url = "https://files.pythonhosted.org/packages/a9/c3/84fc44b110ee10fb410d49f7f28686c4d23637161b6cb08775c1af8a4507/ast_serialize-0.10.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4496c0d20111a243525cb074a3e9a9313bbd7d3fb1d40ddee2ade9ef680b80c6", size = 1501731, upload-time = "2026-09-07T10:22:40.958Z" },
91
- { url = "https://files.pythonhosted.org/packages/59/9d/eedfd5a8cbeffd7172281e14d7a7e7640ed3997b3a09382c7756e39a2bbd/ast_serialize-0.10.0-cp39-abi3-win32.whl", hash = "sha256:ca5ff9030b426b245cf7897137872cdb6ebe43b2e4c5e04d5812ed24955a91ba", size = 1121201, upload-time = "2026-09-07T10:22:42.629Z" },
92
- { url = "https://files.pythonhosted.org/packages/a9/83/2db45120bd0ae66cfcd5e235d4dd29aec564e56440ebb17ec83428bb2685/ast_serialize-0.10.0-cp39-abi3-win_amd64.whl", hash = "sha256:f1a8508054137a1cc67a64915ba588e75f03f546a9b16424aaf0cc9854b0a2a2", size = 1158429, upload-time = "2026-09-07T10:22:44.546Z" },
93
- { url = "https://files.pythonhosted.org/packages/53/f4/3850ee0050b68f3bd31c06a70cb065f7b129123e5795ff8a0ef642db71da/ast_serialize-0.10.0-cp39-abi3-win_arm64.whl", hash = "sha256:354d12c7463266f2ca655af6f0333ee91ea98c875ffc5f47f10f03c7fe8a0667", size = 1130605, upload-time = "2026-09-07T10:22:46.082Z" },
38
+ { url = "https://files.pythonhosted.org/packages/e2/cb/3577c66278e4ea4ff6968aee04327447335ecfc58c76123f68cf7f76d75e/ast_serialize-0.11.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f7ca1557553fdab313999ad69156de154ff87152cae963698be2e765164bb6c0", size = 897021, upload-time = "2026-09-09T16:03:59.316Z" },
39
+ { url = "https://files.pythonhosted.org/packages/47/db/9b4eed53ab0bb63653f56ef71062fa91693c8c26b0b648c58d98365c990c/ast_serialize-0.11.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8b54e44763a851c336ca137c60a2434511f0d155e0b924ef374bfbc8d8db8927", size = 1235148, upload-time = "2026-09-09T16:04:01.201Z" },
40
+ { url = "https://files.pythonhosted.org/packages/fd/97/1ebe323015c3cf530f08e88df9929bfd9f5cf8165842bd4b37a7c958565c/ast_serialize-0.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:753afabcc4abf295f515ea33185cf997a1990b88a29d3a3336a9acf62ea85950", size = 1216082, upload-time = "2026-09-09T16:04:02.87Z" },
41
+ { url = "https://files.pythonhosted.org/packages/ac/72/0d3a368edc2d1e0e188c0d3f23821f4e20a6a2291b23d9df482a6b11277f/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98b8aba6bb682b9e8859c628382b4881c0600b28056d63c3168c227c449f3284", size = 1282848, upload-time = "2026-09-09T16:04:04.316Z" },
42
+ { url = "https://files.pythonhosted.org/packages/9c/fb/2a546a57d7caa708d739c1747bbdf45cc3aa9dac9407a11d9d67e8a0e255/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:651a7890558896c3e08089e51ab3b3a43710eab15b72ad861c400bc9a51923ba", size = 1285337, upload-time = "2026-09-09T16:04:05.899Z" },
43
+ { url = "https://files.pythonhosted.org/packages/bf/16/4ff4179584f8b8bec348787bf721cb7ce3d4c707c7878778065249b59b9a/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff8ddc1453bfe7934292409c7b8e9f68b0a6cff4e4c12535e4b4a66fd83aca0c", size = 1554906, upload-time = "2026-09-09T16:04:07.42Z" },
44
+ { url = "https://files.pythonhosted.org/packages/df/e8/e54a54676ca8965e1ae3cfe065dc26c75158e0b3a3ce35af283da106fbf9/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daec16b026c5741950a00c708acdf698c4f17babbe4829dd8232324822e9514f", size = 1301472, upload-time = "2026-09-09T16:04:08.782Z" },
45
+ { url = "https://files.pythonhosted.org/packages/e0/ab/618835a2479868a0d4ac807dd04cf2f89d24afe22c4171538d9779c2772e/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9961abcb93bf03652ab09c00862a2396abacd57551c769ad34490a2ae508a61d", size = 1301293, upload-time = "2026-09-09T16:04:10.17Z" },
46
+ { url = "https://files.pythonhosted.org/packages/61/cb/8acc29a1b279ccdfb30dcbdf099e1d8d34c4ee77be9be751c48061433129/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:8ca9e48edf246f09fd9bdb64fbd9cd8d18cd2a69ffc24d44891466e17595094f", size = 1307807, upload-time = "2026-09-09T16:04:11.989Z" },
47
+ { url = "https://files.pythonhosted.org/packages/da/74/bada875132f452cb5c1179e3156df43cee6df6cb51f773220688be3d4bb4/ast_serialize-0.11.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a57e0e025e9dcee48e466b3cf909178e298d238148664e796fc0f60ded5e52e", size = 1356265, upload-time = "2026-09-09T16:04:13.429Z" },
48
+ { url = "https://files.pythonhosted.org/packages/4f/ae/720a8042fc8c1d170f4cc7ed46295ef078f8198ed3476f58210a1e675e0c/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:110386eebccf200446d5f4dcc215f80866a5d3d3d054d3ced6ec1bf386cd3f02", size = 1459957, upload-time = "2026-09-09T16:04:14.878Z" },
49
+ { url = "https://files.pythonhosted.org/packages/7d/2c/ce2ff1ffd4d70376073393c154033728c8535c17211b7710fee7b0f04474/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ef3950747f3a588f692cf4d6f2937eedd1a2d5e199f863af29e8ec7da78a4f36", size = 1562369, upload-time = "2026-09-09T16:04:16.563Z" },
50
+ { url = "https://files.pythonhosted.org/packages/fd/3e/d7a5dd5f609bd0bac45617ce9425e4bd1e369b998c8678edfd70c985408c/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0bc94b81878a3f999fe4cdb606bf00ef7dff6b4f66d0e089b2cf7bfc00d59beb", size = 1556466, upload-time = "2026-09-09T16:04:18.396Z" },
51
+ { url = "https://files.pythonhosted.org/packages/99/cd/a45179802a8637f2be252163ec4e4948534fa8d88798dd391c9cc54e096e/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:341dfc9e6b4e47e5c37e1b7257a77d39f407cf49a371ee90225ab624c2fe8b36", size = 1687190, upload-time = "2026-09-09T16:04:19.965Z" },
52
+ { url = "https://files.pythonhosted.org/packages/01/eb/ef206d764ec0554368501b8b5268f5468819dc0588815acb0575465643df/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7b524cb1b08e15db0f116075c39ab51674b6d3c8103ec1a59c8ca464be83e28a", size = 1481188, upload-time = "2026-09-09T16:04:21.368Z" },
53
+ { url = "https://files.pythonhosted.org/packages/8b/37/9a724c523af7c8b97a659bf4dc28a8e60f97d0cf4d19be277db4067ca734/ast_serialize-0.11.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c2358b341aca08bd2e1005713bc480bc06eee9f345b67fcb826829aa7b8d0d3", size = 1500731, upload-time = "2026-09-09T16:04:22.905Z" },
54
+ { url = "https://files.pythonhosted.org/packages/48/10/890d5fcaf568088de7989e8cdb4ca525f485bd6cb25eea49d45f017500af/ast_serialize-0.11.1-cp314-cp314t-win32.whl", hash = "sha256:b9e61143a5904f46daa0cde74ba60d3b7c0e3e000752ee138e2bc68e126a5803", size = 1119009, upload-time = "2026-09-09T16:04:24.469Z" },
55
+ { url = "https://files.pythonhosted.org/packages/9d/61/2bd32bd16b5e2ee07badc8c32a73c545dc5a9f087ed19c07eee1243d5a1b/ast_serialize-0.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:31df8649761d5cb6eb0de2209bd4a167c7477c0516147c70c0b2f5bddc7839bb", size = 1155665, upload-time = "2026-09-09T16:04:26.638Z" },
56
+ { url = "https://files.pythonhosted.org/packages/5e/b6/84bb5e1dc418e660524b873c5bac9be2bf13d38676c96feef4cd4e7d03f3/ast_serialize-0.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2f8f33e416a4c7aad12ad757e895c676e953b4027b80b90718dccea83d45111a", size = 1131854, upload-time = "2026-09-09T16:04:28.099Z" },
57
+ { url = "https://files.pythonhosted.org/packages/8c/dd/16de2c0d23a6b298c735d4e4b56d86fa70476eef98e2c66ceaa65503b62f/ast_serialize-0.11.1-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:a015ede631eeb098a23de8ec0cfe11a1dd02159ab7a26bdc7c6bde2befbbc7b4", size = 1235495, upload-time = "2026-09-09T16:04:29.654Z" },
58
+ { url = "https://files.pythonhosted.org/packages/27/f7/302d2251e6298bbeabc8a1815c9147127031517b305001a02f34fd46b6b5/ast_serialize-0.11.1-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:57b7d52d1f5c92905cd648bda9efc83cac33097de1e5bb68de8feca9b5f7e87a", size = 1215642, upload-time = "2026-09-09T16:04:31.186Z" },
59
+ { url = "https://files.pythonhosted.org/packages/93/06/93b6527646613502f364cebfb23783fa6701cdbe90761ee26144f1fa20b9/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e47b9b028efbc0486263a49f782ad0ae3e879855fe5a2897b59feefb78e1c40c", size = 1283526, upload-time = "2026-09-09T16:04:32.597Z" },
60
+ { url = "https://files.pythonhosted.org/packages/2f/ac/ffb216262c9a582d039d846081b8c3017dc368cbed5a2520deca5cb7f8cb/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00adb748034c7b1938ec56925f9f6230ffcd9c56d47355fe32485df29b90b977", size = 1287526, upload-time = "2026-09-09T16:04:34.214Z" },
61
+ { url = "https://files.pythonhosted.org/packages/a2/06/19a4c4837c4d5e73b982938d6da3c9ae10513b61527575b3e1b8396f9298/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82359d00ea808c260c327e43955c0190bb7baef152a01ae0b5c74d05387b9552", size = 1558354, upload-time = "2026-09-09T16:04:35.669Z" },
62
+ { url = "https://files.pythonhosted.org/packages/e5/29/2373199907b2d97feed176115308dfb3dd0446566b047009828f266d2d66/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f35bb9ddeed4008c7d3e272dd1999885d712e1ce623b0a65ba8a8ed1d51c35cf", size = 1302731, upload-time = "2026-09-09T16:04:37.423Z" },
63
+ { url = "https://files.pythonhosted.org/packages/33/55/ab6805a1457dbe565c84f8d36e2aa4207ef22408adfd01d225823cd07484/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74093ed682ba58456f0d4450da7fb62b826fddd97824d44fc4a81ca6e0bf9e23", size = 1301594, upload-time = "2026-09-09T16:04:38.861Z" },
64
+ { url = "https://files.pythonhosted.org/packages/52/e2/4f54eab2201bb420d39bf61423abcb5d4daffd28e2270e1c5eee2bf3c0f1/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:4dd7218870c203eff4533cfc04a39f29077d6789b20f5b746e7648fe5762a548", size = 1309355, upload-time = "2026-09-09T16:04:40.543Z" },
65
+ { url = "https://files.pythonhosted.org/packages/10/07/755dd98664e2374080b72ccb5fea63d9f11b4bec2409a05b2a4ebc97618d/ast_serialize-0.11.1-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e8d20700766171a8a17f89cf53d7bd9712c509460d28a51f7f98340577b78aa", size = 1356645, upload-time = "2026-09-09T16:04:42.299Z" },
66
+ { url = "https://files.pythonhosted.org/packages/34/a0/fadbde3e108064236e2679728ce6d8247aefc81bac5fd82505b59cf69172/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:20b3371c0403099cd55d59f4bcedb6d3994d9db3fa41711c648760a89ef2a575", size = 1459696, upload-time = "2026-09-09T16:04:44.069Z" },
67
+ { url = "https://files.pythonhosted.org/packages/02/fd/b4f95249bd895368ea8290668e27d1f0a5c4ad888bd72a34c7beb2a500d6/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:cc1a78b913f8665dda145999b1b4805ad2ef442ecbe3b819512cf7f95e70498a", size = 1562517, upload-time = "2026-09-09T16:04:45.461Z" },
68
+ { url = "https://files.pythonhosted.org/packages/68/98/6afac594380410710d9d863b9ef41e9c6ca89bd901bda1464ee9e99180a8/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:38f7141881e783bccc362d201d7fd7437934216b669b9fef39febc2f63fd2d9b", size = 1556951, upload-time = "2026-09-09T16:04:47.12Z" },
69
+ { url = "https://files.pythonhosted.org/packages/ae/6f/5a81b5cbf1731f4722bc90adf4b4ace7dda69ca29837844147063aeafb22/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:13903a3f212ab9e5d05a6c3f2337288f4f8f4c18e6ab3817417ae7a3d46dee14", size = 1691039, upload-time = "2026-09-09T16:04:48.691Z" },
70
+ { url = "https://files.pythonhosted.org/packages/99/eb/d9b903206cbd6d5143838367d385fa88ec49eaae2cc12f284327c6e0af05/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:e5a9c53e64732118ae8235d0e57eb90e2333e90ff749a1a7dca6f8bfdfa5200e", size = 1483297, upload-time = "2026-09-09T16:04:50.136Z" },
71
+ { url = "https://files.pythonhosted.org/packages/ed/48/ee13b4079ec67e9b333a87e5bb8eee643ab1b49f7173b3fca71158c6cdf6/ast_serialize-0.11.1-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:aecb606f67f21fd1c0ffba1826470d2ee400e41b23881ad9a1b2157306865b1a", size = 1501686, upload-time = "2026-09-09T16:04:51.734Z" },
72
+ { url = "https://files.pythonhosted.org/packages/15/67/2175b79e1ee6b042e4bf8ed6871e60cafea7e9cf3fc69e87d7a9d520ae77/ast_serialize-0.11.1-cp315-abi3.abi3t-win32.whl", hash = "sha256:d1ef9c478d8c8ca83499704d13e5ac32c840ed7ca7884aaaf716166aca5a2806", size = 1119522, upload-time = "2026-09-09T16:04:53.248Z" },
73
+ { url = "https://files.pythonhosted.org/packages/f6/c3/8c96aa5f121e9bdda0346b2df3919185eb1ec9a2cce2d20e311b4575ca0b/ast_serialize-0.11.1-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:27eef0739e0110f5db1ff5dfa38b3dadfcb6f0c31975a2b412f9f2bd72139cea", size = 1157260, upload-time = "2026-09-09T16:04:54.944Z" },
74
+ { url = "https://files.pythonhosted.org/packages/10/bc/8aa663209e335eca73c9e1006197222b6b8dafa6665e513cdd975aa65496/ast_serialize-0.11.1-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:f9454960bbf185d33c669ccd5c9b76c96709a4542a95a65e27342c4d10dd8e20", size = 1132060, upload-time = "2026-09-09T16:04:56.501Z" },
75
+ { url = "https://files.pythonhosted.org/packages/aa/52/185edf155ff422744acfb2869a8adff84b7dc308027852feb97287b8688b/ast_serialize-0.11.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:2db9df3bca1431da25946ee8f2c50df01212e34e6029532bc90b92d05fa8d7a0", size = 897219, upload-time = "2026-09-09T16:04:58.217Z" },
76
+ { url = "https://files.pythonhosted.org/packages/7f/a7/e738887429de70350d9e25f84a95efbdd086b79579a811509dee8b02d7d5/ast_serialize-0.11.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7b9a6089f1337838492b217707e9a55d0b9b407fe9169a960fa12282abf2234c", size = 1240585, upload-time = "2026-09-09T16:04:59.616Z" },
77
+ { url = "https://files.pythonhosted.org/packages/a1/f9/46b64fa883f3c8b8cf51629978f16d8a2da3d5c5c02f64add40864907703/ast_serialize-0.11.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:68929da7fb1c7375f69641baac9519d5c41ee441cd09a591ea5dfc83107ffe6f", size = 1228038, upload-time = "2026-09-09T16:05:00.948Z" },
78
+ { url = "https://files.pythonhosted.org/packages/ad/89/fe75c8d0f104a4be11cd0e23acecf129484c9ba06c7130033752d63a78c5/ast_serialize-0.11.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8945557ed3015173dbf8d44184da9621add9162720acbc0ac4832b5a091b4e8a", size = 1292388, upload-time = "2026-09-09T16:05:02.498Z" },
79
+ { url = "https://files.pythonhosted.org/packages/cb/56/3f21c881900d8254a35195e1e962355b4d570ccd9cc193b0ba08abb81952/ast_serialize-0.11.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9cbed53bb8992b72e587dd47d0ca71703f5f715420f48ed57587c06c2fcd213", size = 1294413, upload-time = "2026-09-09T16:05:04.212Z" },
80
+ { url = "https://files.pythonhosted.org/packages/f3/b2/8d77be3dad1139158c59e370391f4990ea73f7f102983392272856bd3a63/ast_serialize-0.11.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65c836d1ab7af65e64a1dd73de82572566e838dd27529b1124eac0ac86f35e76", size = 1565921, upload-time = "2026-09-09T16:05:05.753Z" },
81
+ { url = "https://files.pythonhosted.org/packages/94/2e/0675b5796c897f957fbdac6af0ebeeaa9a63cee866c1c54f1e5136ef5bf6/ast_serialize-0.11.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ab6df9898600ff45149b86c12bb5aa3359cc71843ad99ad0c924d11392469ab", size = 1312160, upload-time = "2026-09-09T16:05:07.269Z" },
82
+ { url = "https://files.pythonhosted.org/packages/93/c2/1749fa4efae0dc98aad3c3d29f0178e2609208c3ba34700b4551082e40d5/ast_serialize-0.11.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eebd3dd25a81839ac7d25b5f3fb3527f6141b35eca29f63d2613fe6254307fd", size = 1312405, upload-time = "2026-09-09T16:05:08.753Z" },
83
+ { url = "https://files.pythonhosted.org/packages/00/14/2afc9f9d7db551f805b4d5e496946dc3dc2a703d27294ccc200b6ff07a7a/ast_serialize-0.11.1-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:311333c5f58f55fc04121be2c5adffa42a19e1038a43a2cef862fdf58c45bf4f", size = 1319458, upload-time = "2026-09-09T16:05:10.552Z" },
84
+ { url = "https://files.pythonhosted.org/packages/c7/4a/8b2866d9d6d5d0b037d7bf2b74db6e75a66695c503248632116f24009a8d/ast_serialize-0.11.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa8d0a9f6d02e7626cdf540555bc2f5313eabe803dcca04854fc628ddf4b1058", size = 1365055, upload-time = "2026-09-09T16:05:12.069Z" },
85
+ { url = "https://files.pythonhosted.org/packages/47/17/73119504574f9b46610ffb718501b254c8adb727d4e43c5babc3c62d4529/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e209a797fdf8680d58d2e969a9ddb25058ea682f6cff59dbabc98d8aef4e0db1", size = 1467771, upload-time = "2026-09-09T16:05:13.458Z" },
86
+ { url = "https://files.pythonhosted.org/packages/56/f5/776bfb7a856ba0bb9bd373b76a90230fb77b1a10c987810b621ed244d5ba/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b391becd31e9889da438d388aac0362e3dfd222affbe45d920580c351486c787", size = 1571459, upload-time = "2026-09-09T16:05:15.15Z" },
87
+ { url = "https://files.pythonhosted.org/packages/c7/43/86a655170ee36a8fdce65a922b7e34040bb319eb4ec251161032343c1fc3/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:021afb3482d27d1dace9c8999724a13083e96c7ece785e53e418bf5df3b50e0a", size = 1568959, upload-time = "2026-09-09T16:05:16.677Z" },
88
+ { url = "https://files.pythonhosted.org/packages/ed/b1/015a3a156dc9bd46e9c4e4f24a939eb0b87179b1c53c9495ac6f088f13b4/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:c1dc60251d93beff32d4147ecd4ccc518b0f022a900093f6f3021c2012416f0f", size = 1698173, upload-time = "2026-09-09T16:05:18.248Z" },
89
+ { url = "https://files.pythonhosted.org/packages/0e/ea/a988b70980aca3a8a3fb731901dc911fe73a456cebbc225b767bbe5490ff/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:b77d6a2267227d68d8221cfca177f8c6d9f68019f3250401d0355d2638db9fb9", size = 1493298, upload-time = "2026-09-09T16:05:19.806Z" },
90
+ { url = "https://files.pythonhosted.org/packages/de/15/e049b2701ddab9087d7f62448f4c2c1b1463e676baa471345cf3e4a31e1b/ast_serialize-0.11.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e68ac7d7fd1a5d42a3a6d726d7cc8a7e0c9987934f11c6a5162aa2cf68e81e24", size = 1510213, upload-time = "2026-09-09T16:05:21.402Z" },
91
+ { url = "https://files.pythonhosted.org/packages/46/a2/23d555eb842d1397dce54fac31851e6f151e03a0ae74db389d9b39718c33/ast_serialize-0.11.1-cp39-abi3-win32.whl", hash = "sha256:ed449d786b9032a7b85fcd6c2f7f54c4cd0e1e1ad254d396805ff922096bf08d", size = 1125239, upload-time = "2026-09-09T16:05:22.796Z" },
92
+ { url = "https://files.pythonhosted.org/packages/1f/4a/251f3fd1b8a5549edaedf8f3ba0b9fb5060e194d3c0ed208b593fccaeff1/ast_serialize-0.11.1-cp39-abi3-win_amd64.whl", hash = "sha256:6b43f5a9b9a8dd20ba3124914e63aa7d7427de761ac849081cda403c2112fda0", size = 1164260, upload-time = "2026-09-09T16:05:24.714Z" },
93
+ { url = "https://files.pythonhosted.org/packages/5e/b5/08e2f643feb9e4d72d42a484949ad51238b18262a01c7036196c201cc330/ast_serialize-0.11.1-cp39-abi3-win_arm64.whl", hash = "sha256:a579ea6f473aab3958a64734194b22fbaec108ec45d994c28d3bd721e1e1da32", size = 1137533, upload-time = "2026-09-09T16:05:26.095Z" },
94
94
  ]
95
95
 
96
96
  [[package]]
@@ -722,32 +722,32 @@ wheels = [
722
722
 
723
723
  [[package]]
724
724
  name = "ruff"
725
- version = "0.16.6"
725
+ version = "0.16.7"
726
726
  source = { registry = "https://pypi.org/simple" }
727
- sdist = { url = "https://files.pythonhosted.org/packages/a4/7c/6adb35d70e7c027e308274557901c7e00fb3407750faf3620c184ae058cb/ruff-0.16.6.tar.gz", hash = "sha256:dcf8a73d2ff77e99dde91244b4da16feba7f14e6beeb4015dee7c5a909e99050", size = 4921251, upload-time = "2026-09-03T16:57:29.037Z" }
727
+ sdist = { url = "https://files.pythonhosted.org/packages/82/bb/5a449b9162e49b139d72f61672bd3ac1d790221f796d3304e2241fff4c58/ruff-0.16.7.tar.gz", hash = "sha256:5f71d004ac1263b22fa39462ac5ae618a4b77d58981af2cc79bf79a29c12b1a6", size = 4924184, upload-time = "2026-09-10T18:04:06.336Z" }
728
728
  wheels = [
729
- { url = "https://files.pythonhosted.org/packages/a4/28/9cc1b79639e284ec103f43c88c644db4eb58cbd0ea1ca11f1193435369ac/ruff-0.16.6-py3-none-linux_armv6l.whl", hash = "sha256:61c368c26bf8e973e5ab14a2772de587bc068ea3f9a277f673380749b4898fb8", size = 10015638, upload-time = "2026-09-03T16:56:40.986Z" },
730
- { url = "https://files.pythonhosted.org/packages/71/11/627d342ef727ea7794edf74fe23d60a074b02c3acc2e9436684e782286ca/ruff-0.16.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ecf4f068e2e123e43a26e9db4e19524cc56563912404e83bbfca375757e45a32", size = 10220762, upload-time = "2026-09-03T16:56:44.681Z" },
731
- { url = "https://files.pythonhosted.org/packages/43/d9/b75668ce41e4c8d073d18d6d08672ba6906ce45d5c06ea4fdb2e84ce3853/ruff-0.16.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:99b62ea33baf130f50368798d841f0d95527b6d817bf31817b65dd058f1d314c", size = 9835082, upload-time = "2026-09-03T16:56:47.142Z" },
732
- { url = "https://files.pythonhosted.org/packages/99/97/123ab10b05cde889c107c20f5a9774955104b5552796a2a8584b089ae8eb/ruff-0.16.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fbf89013f2bb3f6835a6038ff658dc8a1b38c98dc8e724b964168ad4e881876", size = 9949304, upload-time = "2026-09-03T16:56:49.813Z" },
733
- { url = "https://files.pythonhosted.org/packages/3e/58/a4a2c59dd2e5b85929c912d9cac3056eb9ee8c7e75e9b9fe3e109174966b/ruff-0.16.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56a67065e22efa6bc4d498299d3bb06c0c90aace8fac2068b5a12f9dc4d8d51d", size = 9840612, upload-time = "2026-09-03T16:56:52.368Z" },
734
- { url = "https://files.pythonhosted.org/packages/61/6a/ff8c8626a786c4f49d48ced4a752dadbca65f5263005f9c2416578194694/ruff-0.16.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e25cc89174874b176a157e4428d66761c2c0c006654419bf384f967f361ff1b1", size = 10543465, upload-time = "2026-09-03T16:56:55.089Z" },
735
- { url = "https://files.pythonhosted.org/packages/ad/bb/c47535923365f337b82e28192e4e9eef2176511007cfd99a62fc22df5dad/ruff-0.16.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700580ed5303723cb3c11c2f1d2a8913ce77b7ea86646dddb887f5417a9ba70", size = 11267576, upload-time = "2026-09-03T16:56:57.791Z" },
736
- { url = "https://files.pythonhosted.org/packages/ba/50/e5119a5212b5cd63b51e1f4b25e7bd636a6668fc069a3160b108ad7e3c16/ruff-0.16.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15f1d0b6e165a6e56567befb6629f8209271311d990bae0f37e6d065035ef5f3", size = 10781993, upload-time = "2026-09-03T16:57:00.666Z" },
737
- { url = "https://files.pythonhosted.org/packages/8b/98/083d8b4ef3c51a0d19db84367791cbe9f44e4b53343d19dfa83556e1cd9a/ruff-0.16.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72c591a96986ee4268860e2b7235082129ca5e4cb9cbba653a4b57c11893757", size = 10317748, upload-time = "2026-09-03T16:57:03.428Z" },
738
- { url = "https://files.pythonhosted.org/packages/9a/29/68f7ff2c5ad95f19f00627ac2de95644e25fe47371ea60b2db1fd952315e/ruff-0.16.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:65a006baa18f33324325814c864daef03541d51564b98c517610ea756ab7003e", size = 10540096, upload-time = "2026-09-03T16:57:06.182Z" },
739
- { url = "https://files.pythonhosted.org/packages/c4/f9/79a8f6de85968641d68a7863aeec577551924ef066a990a48ff93167beab/ruff-0.16.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cd02a7bf1a21a8735228a3e8c95a9dc5cf86bd2a52194f4aaae2a5755b4de0f4", size = 10100494, upload-time = "2026-09-03T16:57:09.194Z" },
740
- { url = "https://files.pythonhosted.org/packages/d9/e8/b81a22d9b90c00b892ccf2fa2ac36fa95de4c13ab85aea3e73795cfe4651/ruff-0.16.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:31b36f1e5ad85e0737f09d2be4e512e2e283583c14015da3b9dc07359ac0fc88", size = 9843663, upload-time = "2026-09-03T16:57:12.168Z" },
741
- { url = "https://files.pythonhosted.org/packages/39/aa/54f516ec5e5a11c4afdceb1c454ebb054ffb96e4f4a1705580b4346abd35/ruff-0.16.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:61029b4ab4aa723fd3064fab96b1d814492596bf0c792679fffcbde1e1679953", size = 10282461, upload-time = "2026-09-03T16:57:15.077Z" },
742
- { url = "https://files.pythonhosted.org/packages/52/0b/38d0aa8aa32372b96dc44f97b22e576c4147808271aab7b2cb1e353d4445/ruff-0.16.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9ac8998457832c2061709d900856b7ad271dace0cb41f346588d540162bfa718", size = 10728808, upload-time = "2026-09-03T16:57:17.797Z" },
743
- { url = "https://files.pythonhosted.org/packages/5e/e5/9e274e24eeb027640ffc7442f21239f16d17f47acec15ae34f32e03a5c79/ruff-0.16.6-py3-none-win32.whl", hash = "sha256:0b87d9d16fcb63e8018423ca1d50b7260f15cb2da33e30db4baad4183a948c25", size = 10049212, upload-time = "2026-09-03T16:57:20.55Z" },
744
- { url = "https://files.pythonhosted.org/packages/22/31/72472449414223ed1a2da236b992adbb1a2ae59e34794574810f60ce068e/ruff-0.16.6-py3-none-win_amd64.whl", hash = "sha256:10d21c51c3495d8eaea7b703a16592117ea6eb1d649e36335aa965ff1173eb39", size = 10556402, upload-time = "2026-09-03T16:57:23.501Z" },
745
- { url = "https://files.pythonhosted.org/packages/fc/07/d781f8f8e1ac24bef9f3269cf62ffb1407ca24c3a8f12e5e22874f90528c/ruff-0.16.6-py3-none-win_arm64.whl", hash = "sha256:7a976c79b958f94e50a022a19f0f8c87387448020935ec14fc74331bd0a7f2c5", size = 10412850, upload-time = "2026-09-03T16:57:26.416Z" },
729
+ { url = "https://files.pythonhosted.org/packages/e3/b2/c80aeeb7f9e469c0d63a85d2f1ab6e1ebfbe10ea7a8d2438b7e09e3ff09e/ruff-0.16.7-py3-none-linux_armv6l.whl", hash = "sha256:727307773e7c7f9181d3ed3a2484186e56c1fa1874255911c74585eb2c7c19f9", size = 10048917, upload-time = "2026-09-10T18:03:30.28Z" },
730
+ { url = "https://files.pythonhosted.org/packages/7b/96/20bb7bcae008004df52afcb7ac83432d4a467f2c17b672fe46d26be231c5/ruff-0.16.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9d61c258deabf58f34c67bd4bb4d939c7f2e6b5f0e59c1cdd1cf771b11cde929", size = 10242929, upload-time = "2026-09-10T18:03:32.706Z" },
731
+ { url = "https://files.pythonhosted.org/packages/90/b2/f184b0d5abec02db69cfd7e49b688ae0237554528ca777136c613bf36bee/ruff-0.16.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7ab81118df8945e0193d0240712aa4496573595b75185c3636ed825592a0f728", size = 9847245, upload-time = "2026-09-10T18:03:34.509Z" },
732
+ { url = "https://files.pythonhosted.org/packages/eb/2d/db1633a641866ed801e34cc6b60ef236c5e16f9b2124ab1d49cc24a5fe4f/ruff-0.16.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c196c968874fc8019da8e7163de7a1a370f111e2309b4b7dfea0fce950198d0", size = 9961780, upload-time = "2026-09-10T18:03:36.618Z" },
733
+ { url = "https://files.pythonhosted.org/packages/4d/98/edea21e1a3e38dbbc3bf6bb068b863b3b06184cf8533a4c7dbbe208a89d5/ruff-0.16.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac8c3bd0a7e10ad31e6ce51e7a99f3cb772e69aecdd6b9ea7e99b362f62a62c0", size = 9866337, upload-time = "2026-09-10T18:03:38.805Z" },
734
+ { url = "https://files.pythonhosted.org/packages/0b/11/a15e60d4c87b214646f116ca9d204475bf993ee1047459bc9a360fd4d6d1/ruff-0.16.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398d3988edde000b5c75dc1b3f584708da9bc990de069c18909142580fec1af9", size = 10562512, upload-time = "2026-09-10T18:03:40.71Z" },
735
+ { url = "https://files.pythonhosted.org/packages/29/42/eaff4c9b6d0c7cdf56df313a17e89ae854f5bbc0b0c8f9cce19be0ab7a8f/ruff-0.16.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce05b62b770a8217c4646a9c4139fca00efe8fe5d71f87df2b243ff20d4584d1", size = 11302938, upload-time = "2026-09-10T18:03:42.607Z" },
736
+ { url = "https://files.pythonhosted.org/packages/5d/43/c75aa59a4ec181fe2ec06cab30e198c1c6d107229a9f008ae3a7c16cabd8/ruff-0.16.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af1b576fddb9d9ef2ececfb5fadcd6a624b25070ed85e3cfcfe449fc3ff6a7b9", size = 10840857, upload-time = "2026-09-10T18:03:44.604Z" },
737
+ { url = "https://files.pythonhosted.org/packages/21/33/81f3da371942ea031105ba679d8d6e28ec1660ccd690a45f42d381161356/ruff-0.16.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce7f8f22df67c93ed96c717f9128eadb797144ac2bad475cf536f31d6100c55", size = 10370001, upload-time = "2026-09-10T18:03:46.706Z" },
738
+ { url = "https://files.pythonhosted.org/packages/fa/0b/6345fb4dbf6dd0ed1cfe5d18391dc9c3f59cc81622a7b0a65b84b3e730ba/ruff-0.16.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:06d0e93d04f392996435ebd600c153f65b47d73fbec2415aa99c5ee5756b3a5f", size = 10548735, upload-time = "2026-09-10T18:03:48.658Z" },
739
+ { url = "https://files.pythonhosted.org/packages/3f/4d/c5576adf511f92a328e5569dda190ecdd430da51f1a649f3a4a2fd73e21e/ruff-0.16.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:142151a5e7b93c1b11111337142f89dd2fbfee92161225c99a97222f22e32656", size = 10108496, upload-time = "2026-09-10T18:03:50.563Z" },
740
+ { url = "https://files.pythonhosted.org/packages/ff/8c/667d83c16199a17a56adc6b0bd4c3beb5b767a2babcd16a56f76f9be7fd6/ruff-0.16.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e6651f97a342d8b35d54d8991544ca22169b86dc54111cb604666940c431b750", size = 9860136, upload-time = "2026-09-10T18:03:52.621Z" },
741
+ { url = "https://files.pythonhosted.org/packages/99/75/78d401106731999a1dd20cc5a6961e37e1eb9397a3b589f73f3a5ce146a3/ruff-0.16.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ef140c6eb935fa9a84c9c607dfb2cb1b85843c192e79265b0c54f35f557ea8e5", size = 10286290, upload-time = "2026-09-10T18:03:55.207Z" },
742
+ { url = "https://files.pythonhosted.org/packages/68/49/56f9c3a8b755df93a0ad318b2147bf4ef5dae9a7e5ec61c460109c67957f/ruff-0.16.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:53e39506a730fadeee0d998ed5946f30671f0db240c6c7c73bdabbe33604bb6f", size = 10745048, upload-time = "2026-09-10T18:03:57.299Z" },
743
+ { url = "https://files.pythonhosted.org/packages/5f/ea/7f9b938a63ece4bec677ad7f9f7fa02df3383db1949ed93a382441c09a87/ruff-0.16.7-py3-none-win32.whl", hash = "sha256:2ea3470fcebcbc5df2fb0c6f3b90333fa9084c534e0111c038fa4a6ab9f1c4b7", size = 10059082, upload-time = "2026-09-10T18:03:59.632Z" },
744
+ { url = "https://files.pythonhosted.org/packages/39/11/480a6973a927aa653e1cead6a6416008640e03a99d05b34c0434b8c6c366/ruff-0.16.7-py3-none-win_amd64.whl", hash = "sha256:7ac26aca826e9e21d0f1cb25b54ac660760a9fdd094d3e4df9848232be98cfc6", size = 10593368, upload-time = "2026-09-10T18:04:01.999Z" },
745
+ { url = "https://files.pythonhosted.org/packages/8b/4b/51327018d056f0dad2c2238f26d1fb0f53707a9d91b75dea6d1b3039f136/ruff-0.16.7-py3-none-win_arm64.whl", hash = "sha256:aab7f39e2c9df6c596216070f98eef1207b94f8516cca20c808826974971855b", size = 10412401, upload-time = "2026-09-10T18:04:04.098Z" },
746
746
  ]
747
747
 
748
748
  [[package]]
749
749
  name = "sillo-framework"
750
- version = "0.3.1"
750
+ version = "1.0.0a1"
751
751
  source = { registry = "https://pypi.org/simple" }
752
752
  dependencies = [
753
753
  { name = "anyio" },
@@ -756,14 +756,14 @@ dependencies = [
756
756
  { name = "typing-extensions", marker = "python_full_version < '3.13'" },
757
757
  { name = "uvicorn" },
758
758
  ]
759
- sdist = { url = "https://files.pythonhosted.org/packages/07/11/9ac0d9cee03a8861415a532736919efc37df0f74a39924489252a7fa883d/sillo_framework-0.3.1.tar.gz", hash = "sha256:13a381bacb2a5103239823447ab70356b4adf325383374ddfce8cc38bcd58884", size = 4211698, upload-time = "2026-08-27T11:44:04.363Z" }
759
+ sdist = { url = "https://files.pythonhosted.org/packages/5e/0a/96a50b20e7579258e1ae6c4891e80da10f87060b518c3fba1deda2867d32/sillo_framework-1.0.0a1.tar.gz", hash = "sha256:62916cbb2c9c3967fb77ec63aa3292b99aad345683d9768b1438f6bd55b4f183", size = 1050673, upload-time = "2026-09-12T22:21:17.748Z" }
760
760
  wheels = [
761
- { url = "https://files.pythonhosted.org/packages/ad/15/f314cbacf70cba8381143dc1409beee1e2731d558e5d649a3dcb9f50ea71/sillo_framework-0.3.1-py3-none-any.whl", hash = "sha256:cce15b962246d421ef163b04f8caef039ca80aac9060b282a3629df45195fe7f", size = 980922, upload-time = "2026-08-27T11:44:02.795Z" },
761
+ { url = "https://files.pythonhosted.org/packages/74/9f/e8c81d6737f288aa066d99e4df8e385168c61a58808e5f7c61c9b8dee280/sillo_framework-1.0.0a1-py3-none-any.whl", hash = "sha256:521c712fb5e2d9501e066499e694e6e41b8a40547ce52527bc37795fdc01c67f", size = 780717, upload-time = "2026-09-12T22:21:16.147Z" },
762
762
  ]
763
763
 
764
764
  [[package]]
765
765
  name = "sillo-wire"
766
- version = "0.1.0.dev1"
766
+ version = "1.0.0a2"
767
767
  source = { editable = "." }
768
768
  dependencies = [
769
769
  { name = "sillo-framework" },
@@ -785,7 +785,7 @@ requires-dist = [
785
785
  { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24" },
786
786
  { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0" },
787
787
  { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6" },
788
- { name = "sillo-framework", specifier = ">=0.3" },
788
+ { name = "sillo-framework", specifier = ">=1.0.0a1" },
789
789
  ]
790
790
  provides-extras = ["dev"]
791
791
 
@@ -1,104 +0,0 @@
1
- """Make ``sillo.wire`` resolve to this package, without touching the framework.
2
-
3
- The code lives in the top-level ``sillo_wire`` package. This module registers a
4
- meta-path finder that maps the name ``sillo.wire`` onto it, so both import
5
- paths reach the same objects:
6
-
7
- from sillo.wire import Hub # reads as part of the framework
8
- from sillo_wire import Hub # where the code actually is
9
-
10
- It is loaded by ``sillo_wire.pth`` at interpreter startup, which is the only
11
- hook that runs *before* an ``import sillo.wire`` could fail. Nothing is
12
- imported here — neither ``sillo`` nor ``sillo_wire`` — so the cost is one
13
- object appended to ``sys.meta_path``.
14
-
15
- Why not simply ship ``sillo/wire/`` into the framework's own package directory:
16
- two distributions writing into one directory goes wrong in both directions.
17
- Installing the framework from a checkout moves where ``sillo`` resolves and
18
- orphans whatever the other package left in ``site-packages``; and removing or
19
- replacing the framework leaves that directory standing with no ``__init__.py``
20
- in it, which is an override rather than an addition. Nothing here writes into
21
- ``sillo/`` at all.
22
-
23
- Static analysis does not run import hooks, so type checkers are served
24
- separately, by the partial stubs in ``sillo-stubs/`` (PEP 561).
25
- """
26
-
27
- from __future__ import annotations
28
-
29
- import sys
30
- from importlib.abc import Loader, MetaPathFinder
31
- from importlib.machinery import ModuleSpec
32
- from importlib.util import find_spec
33
-
34
- ALIAS = "sillo.wire"
35
- REAL = "sillo_wire"
36
-
37
-
38
- def _resolve(fullname: str) -> str | None:
39
- """The real module *fullname* stands for, or ``None`` if it is not ours."""
40
- if fullname == ALIAS:
41
- return REAL
42
- if fullname.startswith(ALIAS + "."):
43
- return REAL + fullname[len(ALIAS) :]
44
- return None
45
-
46
-
47
- class _AliasLoader(Loader):
48
- """Hands back the already-imported target, so both names are one object.
49
-
50
- Loading the source a second time under the other name would give two
51
- ``Hub`` classes and two sets of rooms — a broadcast would reach half of
52
- them, and ``isinstance`` would disagree with itself.
53
- """
54
-
55
- def __init__(self, target: str) -> None:
56
- self.target = target
57
-
58
- def create_module(self, spec: ModuleSpec):
59
- import importlib
60
-
61
- return importlib.import_module(self.target)
62
-
63
- def exec_module(self, module) -> None:
64
- """Already executed under its own name; nothing to run again."""
65
-
66
-
67
- class _AliasFinder(MetaPathFinder):
68
- """Answers for ``sillo.wire`` and anything beneath it."""
69
-
70
- def find_spec(self, fullname: str, path=None, target=None):
71
- real = _resolve(fullname)
72
- if real is None:
73
- return None
74
- try:
75
- if find_spec(real) is None:
76
- return None
77
- except (ImportError, ValueError):
78
- # The package is half-installed, or its parent is missing. Decline
79
- # rather than raise: another finder may do better, and the import
80
- # error a caller gets should be the ordinary one.
81
- return None
82
-
83
- import importlib
84
-
85
- module = importlib.import_module(real)
86
- spec = ModuleSpec(fullname, _AliasLoader(real))
87
- spec.submodule_search_locations = getattr(module, "__path__", None)
88
- return spec
89
-
90
-
91
- def install() -> bool:
92
- """Register the finder. Returns whether it was newly added.
93
-
94
- Idempotent, because a ``.pth`` is not the only thing that may import this
95
- module — a test does too, and a second finder would be dead weight on every
96
- import in the process.
97
- """
98
- if any(isinstance(finder, _AliasFinder) for finder in sys.meta_path):
99
- return False
100
- sys.meta_path.insert(0, _AliasFinder())
101
- return True
102
-
103
-
104
- install()
@@ -1 +0,0 @@
1
- partial
@@ -1,48 +0,0 @@
1
- """Type stubs for ``sillo.wire``.
2
-
3
- The runtime alias is installed by ``_sillo_wire_bootstrap`` via a ``.pth``, and
4
- a type checker never runs import hooks — so without this file
5
- ``from sillo.wire import Hub`` type-checks as a missing module even though it
6
- imports fine.
7
-
8
- ``py.typed`` next to this file contains the word ``partial`` (PEP 561), which
9
- is what keeps these stubs additive: a checker uses them for ``sillo.wire`` and
10
- falls back to the framework's own inline types for the rest of ``sillo``.
11
- Without it, this directory would claim to describe all of ``sillo`` and hide
12
- the types the framework ships.
13
-
14
- Nothing is declared here. Everything is re-exported from ``sillo_wire``, whose
15
- inline annotations are the single source of truth.
16
- """
17
-
18
- from sillo_wire import Backlog as Backlog
19
- from sillo_wire import DeliveryReport as DeliveryReport
20
- from sillo_wire import Encoding as Encoding
21
- from sillo_wire import Envelope as Envelope
22
- from sillo_wire import Hub as Hub
23
- from sillo_wire import MemoryBacklog as MemoryBacklog
24
- from sillo_wire import NullBacklog as NullBacklog
25
- from sillo_wire import Overflow as Overflow
26
- from sillo_wire import Peer as Peer
27
- from sillo_wire import PeerGone as PeerGone
28
- from sillo_wire import RoomConsumer as RoomConsumer
29
- from sillo_wire import RoomNotFound as RoomNotFound
30
- from sillo_wire import WireError as WireError
31
-
32
- __version__: str
33
-
34
- __all__ = [
35
- "Backlog",
36
- "DeliveryReport",
37
- "Encoding",
38
- "Envelope",
39
- "Hub",
40
- "MemoryBacklog",
41
- "NullBacklog",
42
- "Overflow",
43
- "Peer",
44
- "PeerGone",
45
- "RoomConsumer",
46
- "RoomNotFound",
47
- "WireError",
48
- ]
@@ -1 +0,0 @@
1
- import _sillo_wire_bootstrap
@@ -1,115 +0,0 @@
1
- """The `sillo.wire` alias, and the finder that provides it.
2
-
3
- The alias is what a `.pth` installs at interpreter startup. These tests drive
4
- the finder directly rather than relying on that, so they hold under an editable
5
- install too — where the `.pth` is present but the checkout is what is imported.
6
- """
7
-
8
- from __future__ import annotations
9
-
10
- import sys
11
-
12
- import pytest
13
-
14
- import _sillo_wire_bootstrap as bootstrap
15
- import sillo_wire
16
-
17
-
18
- @pytest.fixture
19
- def finder():
20
- """A finder registered for the duration of one test."""
21
- added = bootstrap.install()
22
- yield next(f for f in sys.meta_path if isinstance(f, bootstrap._AliasFinder))
23
- if added:
24
- sys.meta_path[:] = [
25
- f for f in sys.meta_path if not isinstance(f, bootstrap._AliasFinder)
26
- ]
27
-
28
-
29
- class TestNameResolution:
30
- def test_the_alias_itself(self):
31
- assert bootstrap._resolve("sillo.wire") == "sillo_wire"
32
-
33
- def test_anything_beneath_it(self):
34
- assert bootstrap._resolve("sillo.wire.hub") == "sillo_wire.hub"
35
- assert bootstrap._resolve("sillo.wire.a.b") == "sillo_wire.a.b"
36
-
37
- @pytest.mark.parametrize(
38
- "name",
39
- [
40
- "sillo", # the framework itself is not ours
41
- "sillo.responses", # nor any other part of it
42
- "sillo_wire", # the real name needs no help
43
- "sillowire", # a prefix match is not a package match
44
- "wire",
45
- ],
46
- )
47
- def test_names_that_are_not_ours(self, name):
48
- assert bootstrap._resolve(name) is None
49
-
50
-
51
- class TestTheFinder:
52
- def test_it_declines_names_it_does_not_own(self, finder):
53
- assert finder.find_spec("json") is None
54
- assert finder.find_spec("sillo.responses") is None
55
-
56
- def test_it_answers_for_the_alias(self, finder):
57
- spec = finder.find_spec("sillo.wire")
58
- assert spec is not None
59
- assert spec.name == "sillo.wire"
60
- # A package, so `sillo.wire.hub` can be found beneath it.
61
- assert spec.submodule_search_locations is not None
62
-
63
- def test_it_declines_when_the_target_is_absent(self, finder, monkeypatch):
64
- """Half an install should produce the ordinary import error, not one
65
- from in here."""
66
- monkeypatch.setattr(bootstrap, "REAL", "a_package_that_is_not_installed")
67
- assert finder.find_spec("sillo.wire") is None
68
-
69
- def test_it_declines_when_the_target_cannot_be_probed(self, finder, monkeypatch):
70
- def explode(name):
71
- raise ValueError("malformed spec")
72
-
73
- monkeypatch.setattr(bootstrap, "find_spec", explode)
74
- assert finder.find_spec("sillo.wire") is None
75
-
76
- def test_the_loader_returns_the_one_module(self, finder):
77
- """Not a second copy: two `Hub` classes would be two sets of rooms."""
78
- spec = finder.find_spec("sillo.wire")
79
- assert spec.loader.create_module(spec) is sillo_wire
80
-
81
- def test_exec_module_does_not_re_run_it(self, finder):
82
- spec = finder.find_spec("sillo.wire")
83
- assert spec.loader.exec_module(sillo_wire) is None
84
-
85
-
86
- class TestInstall:
87
- def test_it_registers_once(self):
88
- before = sum(isinstance(f, bootstrap._AliasFinder) for f in sys.meta_path)
89
- added = bootstrap.install()
90
- after = sum(isinstance(f, bootstrap._AliasFinder) for f in sys.meta_path)
91
- try:
92
- # Importing this module already installed one, so the second call
93
- # is a no-op — a duplicate would sit on every import in the process.
94
- assert after == max(before, 1)
95
- assert added is False or before == 0
96
- finally:
97
- if added:
98
- sys.meta_path[:] = [
99
- f
100
- for f in sys.meta_path
101
- if not isinstance(f, bootstrap._AliasFinder)
102
- ]
103
-
104
-
105
- class TestTheAliasEndToEnd:
106
- def test_it_imports_and_is_the_same_package(self, finder):
107
- import sillo.wire
108
-
109
- assert sillo.wire is sillo_wire
110
- assert sillo.wire.Hub is sillo_wire.Hub
111
-
112
- def test_submodules_resolve_through_it(self, finder):
113
- from sillo.wire.hub import Hub
114
-
115
- assert Hub is sillo_wire.Hub
File without changes
File without changes