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.
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.github/workflows/ci.yml +17 -8
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.github/workflows/release.yml +4 -3
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/CHANGELOG.md +30 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/PKG-INFO +10 -36
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/README.md +8 -34
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/pyproject.toml +3 -22
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/__init__.py +1 -1
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/uv.lock +82 -82
- sillo_wire-0.1.0.dev1/_sillo_wire_bootstrap.py +0 -104
- sillo_wire-0.1.0.dev1/sillo-stubs/py.typed +0 -1
- sillo_wire-0.1.0.dev1/sillo-stubs/wire.pyi +0 -48
- sillo_wire-0.1.0.dev1/sillo_wire.pth +0 -1
- sillo_wire-0.1.0.dev1/tests/test_alias.py +0 -115
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/.gitignore +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/LICENSE +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/backlog.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/consumer.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/envelope.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/errors.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/hub.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/peer.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/policy.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/py.typed +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/sillo_wire/testing.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_backlog.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_consumer.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_envelope.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_hub.py +0 -0
- {sillo_wire-0.1.0.dev1 → sillo_wire-1.0.0a2}/tests/test_peer.py +0 -0
- {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
|
|
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
|
-
#
|
|
39
|
-
#
|
|
40
|
-
- name: Check
|
|
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
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
81
|
-
#
|
|
82
|
-
#
|
|
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:
|
|
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.
|
|
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 `
|
|
41
|
+
Installs as `sillo-wire`, imports as `sillo_wire`.
|
|
42
42
|
|
|
43
43
|
```python
|
|
44
44
|
from sillo import SilloApp
|
|
45
|
-
from
|
|
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
|
|
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
|
|
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
|
|
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
|
-
`
|
|
168
|
+
`sillo_wire.testing` ships the piece unit tests are missing — a socket:
|
|
169
169
|
|
|
170
170
|
```python
|
|
171
|
-
from
|
|
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
|
|
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 `
|
|
9
|
+
Installs as `sillo-wire`, imports as `sillo_wire`.
|
|
10
10
|
|
|
11
11
|
```python
|
|
12
12
|
from sillo import SilloApp
|
|
13
|
-
from
|
|
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
|
|
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
|
|
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
|
|
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
|
-
`
|
|
136
|
+
`sillo_wire.testing` ships the piece unit tests are missing — a socket:
|
|
137
137
|
|
|
138
138
|
```python
|
|
139
|
-
from
|
|
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
|
|
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 = "
|
|
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.
|
|
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
|
-
|
|
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
|
|
|
@@ -31,66 +31,66 @@ wheels = [
|
|
|
31
31
|
|
|
32
32
|
[[package]]
|
|
33
33
|
name = "ast-serialize"
|
|
34
|
-
version = "0.
|
|
34
|
+
version = "0.11.1"
|
|
35
35
|
source = { registry = "https://pypi.org/simple" }
|
|
36
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/10/
|
|
66
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
67
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
69
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
70
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
71
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
72
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
73
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
74
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
75
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
76
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
77
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
78
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
79
|
-
{ url = "https://files.pythonhosted.org/packages/56/
|
|
80
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
81
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
82
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
83
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
84
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
85
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
86
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
87
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
88
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
89
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
90
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
91
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
92
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
93
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
725
|
+
version = "0.16.7"
|
|
726
726
|
source = { registry = "https://pypi.org/simple" }
|
|
727
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
730
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
731
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
732
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
733
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
734
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
735
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
736
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
737
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
738
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
739
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
740
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
741
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
742
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
743
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
744
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
745
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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/
|
|
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/
|
|
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 = "
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|