tigrbl_spec 0.4.2.dev3__tar.gz → 0.4.3__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.
- tigrbl_spec-0.4.3/NOTICE +7 -0
- {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/PKG-INFO +116 -26
- tigrbl_spec-0.4.3/README.md +155 -0
- {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/pyproject.toml +15 -2
- tigrbl_spec-0.4.3/tigrbl_spec/__init__.py +44 -0
- tigrbl_spec-0.4.3/tigrbl_spec/codegen.py +27 -0
- tigrbl_spec-0.4.3/tigrbl_spec/migrations/__init__.py +51 -0
- tigrbl_spec-0.4.3/tigrbl_spec/models/__init__.py +3 -0
- tigrbl_spec-0.4.3/tigrbl_spec/models/v0_3_20/__init__.py +45 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schema.py +202 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/AppSpec.json +146 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/BindingRegistrySpec.json +57 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/BindingSpec.json +51 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ColumnSpec.json +137 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/DataTypeSpec.json +72 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/EngineProviderSpec.json +54 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/EngineSpec.json +169 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/FieldSpec.json +70 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ForeignKeySpec.json +84 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HookSpec.json +122 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpJsonRpcBindingSpec.json +67 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpRestBindingSpec.json +67 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpStreamBindingSpec.json +67 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/IOSpec.json +174 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/OpSpec.json +282 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/RequestSpec.json +82 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ResponseSpec.json +166 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/RouterSpec.json +108 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SchemaRef.json +55 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SchemaSpec.json +77 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SessionSpec.json +363 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SseBindingSpec.json +67 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageSpec.json +201 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageTransformSpec.json +65 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageTypeRef.json +58 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableProfileSpec.json +134 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableRegistrySpec.json +47 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableSpec.json +158 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TemplateSpec.json +84 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/WebTransportBindingSpec.json +78 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/WsBindingSpec.json +67 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/bundle.json +3565 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/manifest.json +42 -0
- tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/shared.json +224 -0
- tigrbl_spec-0.4.2.dev3/README.md +0 -68
- tigrbl_spec-0.4.2.dev3/tigrbl_spec/__init__.py +0 -5
- {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/LICENSE +0 -0
tigrbl_spec-0.4.3/NOTICE
ADDED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl_spec
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
4
4
|
Summary: Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration.
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -204,6 +204,7 @@ License: Apache License
|
|
|
204
204
|
See the License for the specific language governing permissions and
|
|
205
205
|
limitations under the License.
|
|
206
206
|
License-File: LICENSE
|
|
207
|
+
License-File: NOTICE
|
|
207
208
|
Keywords: tigrbl,asgi,api,json-rpc,rest,sqlalchemy,pydantic,spec,specification,protocols,compatibility,openapi,openrpc,schema-first
|
|
208
209
|
Author: Jacob Stewart
|
|
209
210
|
Author-email: jacob@swarmauri.com
|
|
@@ -224,6 +225,8 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
224
225
|
Classifier: Topic :: Internet :: WWW/HTTP
|
|
225
226
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
226
227
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
228
|
+
Requires-Dist: jsonschema (>=4.0)
|
|
229
|
+
Requires-Dist: typing-extensions (>=4.0)
|
|
227
230
|
Project-URL: Discord, https://discord.gg/K4YTAPapjR
|
|
228
231
|
Project-URL: Homepage, https://github.com/tigrbl/tigrbl
|
|
229
232
|
Project-URL: Issues, https://github.com/tigrbl/tigrbl/issues
|
|
@@ -237,12 +240,45 @@ Description-Content-Type: text/markdown
|
|
|
237
240
|
<p><strong>Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration.</strong></p>
|
|
238
241
|
<a href="https://pypi.org/project/tigrbl_spec/"><img src="https://img.shields.io/pypi/v/tigrbl_spec?label=PyPI" alt="PyPI version for tigrbl_spec"/></a>
|
|
239
242
|
<a href="https://pypi.org/project/tigrbl_spec/"><img src="https://static.pepy.tech/badge/tigrbl_spec" alt="Downloads for tigrbl_spec"/></a>
|
|
243
|
+
<a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl_spec"/></a>
|
|
240
244
|
<a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl_spec/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl_spec/README.md.svg?label=hits" alt="Repository hits for tigrbl_spec README"/></a>
|
|
241
245
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-525252" alt="Apache 2.0 license"/></a>
|
|
242
|
-
<a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%
|
|
246
|
+
<a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-3776ab" alt="Python versions 3.10 | 3.11 | 3.12 | 3.13 | 3.14 for tigrbl_spec"/></a>
|
|
243
247
|
<a href="https://github.com/tigrbl/tigrbl/blob/master/docs/README.md"><img src="https://img.shields.io/badge/workspace-core-1f6feb" alt="Workspace group for tigrbl_spec"/></a>
|
|
244
248
|
</div>
|
|
245
249
|
|
|
250
|
+
## What is tigrbl_spec?
|
|
251
|
+
|
|
252
|
+
Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration.
|
|
253
|
+
|
|
254
|
+
## Why use tigrbl_spec?
|
|
255
|
+
|
|
256
|
+
Use it when you need this foundational Tigrbl layer directly as a small, focused dependency.
|
|
257
|
+
|
|
258
|
+
## When should I install tigrbl_spec?
|
|
259
|
+
|
|
260
|
+
Install it for extension packages, package-local tests, or internals that need this boundary without the whole facade.
|
|
261
|
+
|
|
262
|
+
## Who is tigrbl_spec for?
|
|
263
|
+
|
|
264
|
+
Framework maintainers, extension authors, and advanced users composing Tigrbl from split packages.
|
|
265
|
+
|
|
266
|
+
## Where does tigrbl_spec fit?
|
|
267
|
+
|
|
268
|
+
`tigrbl_spec` lives at `pkgs/core/tigrbl_spec` and serves a focused layer in the split Tigrbl framework.
|
|
269
|
+
|
|
270
|
+
## How does tigrbl_spec work?
|
|
271
|
+
|
|
272
|
+
It owns a narrow layer in the split workspace and is consumed by higher-level packages through explicit dependencies.
|
|
273
|
+
|
|
274
|
+
## Certification Status
|
|
275
|
+
|
|
276
|
+
- Package status: governed package in the `tigrbl/tigrbl` workspace.
|
|
277
|
+
- Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
|
|
278
|
+
- Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
|
|
279
|
+
- Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
|
|
280
|
+
- Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
|
|
281
|
+
|
|
246
282
|
## Install
|
|
247
283
|
|
|
248
284
|
```bash
|
|
@@ -253,50 +289,104 @@ uv add tigrbl_spec
|
|
|
253
289
|
pip install tigrbl_spec
|
|
254
290
|
```
|
|
255
291
|
|
|
292
|
+
## Surface Coverage
|
|
293
|
+
|
|
294
|
+
| Surface | Value |
|
|
295
|
+
|---|---|
|
|
296
|
+
| PyPI package | [`tigrbl_spec`](https://pypi.org/project/tigrbl_spec/) |
|
|
297
|
+
| Repository path | [`pkgs/core/tigrbl_spec`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_spec) |
|
|
298
|
+
| Python import root | `tigrbl_spec` |
|
|
299
|
+
| Console scripts | none declared |
|
|
300
|
+
| Entry points | none declared |
|
|
301
|
+
| Optional extras | none declared |
|
|
302
|
+
| Legal files | `LICENSE`, `NOTICE` |
|
|
303
|
+
| Supported Python | `3.10 | 3.11 | 3.12 | 3.13 | 3.14` |
|
|
304
|
+
|
|
256
305
|
## What It Owns
|
|
257
306
|
|
|
258
|
-
`tigrbl_spec` owns the
|
|
307
|
+
`tigrbl_spec` owns the `foundational framework package` boundary. It should be installed when you need this package's focused responsibility without assuming every other Tigrbl workspace package is present.
|
|
308
|
+
|
|
309
|
+
Implementation orientation:
|
|
310
|
+
- Module layout is intentionally small or namespace-oriented.
|
|
259
311
|
|
|
260
|
-
##
|
|
312
|
+
## Public API and Import Surface
|
|
261
313
|
|
|
262
|
-
|
|
314
|
+
- Import roots: `tigrbl_spec`.
|
|
315
|
+
- Public symbols: `__version__`.
|
|
316
|
+
- Workspace dependencies: none declared.
|
|
317
|
+
- External runtime dependencies: none declared.
|
|
263
318
|
|
|
264
|
-
##
|
|
319
|
+
## Usage Examples
|
|
265
320
|
|
|
266
|
-
|
|
321
|
+
### Verify the installed package
|
|
267
322
|
|
|
268
|
-
|
|
323
|
+
```bash
|
|
324
|
+
python -m pip show tigrbl_spec
|
|
325
|
+
python - <<'PY'
|
|
326
|
+
from importlib.metadata import version
|
|
327
|
+
print(version("tigrbl_spec"))
|
|
328
|
+
PY
|
|
329
|
+
```
|
|
269
330
|
|
|
270
|
-
|
|
271
|
-
- Package class: `core framework package`.
|
|
272
|
-
- Python requirement: `>=3.10,<3.15`.
|
|
331
|
+
### Import the package boundary
|
|
273
332
|
|
|
274
|
-
|
|
333
|
+
```python
|
|
334
|
+
import importlib
|
|
275
335
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
336
|
+
module = importlib.import_module("tigrbl_spec")
|
|
337
|
+
print(module.__name__)
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Import a public symbol
|
|
341
|
+
|
|
342
|
+
```python
|
|
343
|
+
from tigrbl_spec import __version__
|
|
344
|
+
|
|
345
|
+
print(__version__)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Use with the facade when building applications
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
uv add tigrbl tigrbl_spec
|
|
352
|
+
python - <<'PY'
|
|
353
|
+
import tigrbl
|
|
354
|
+
print(tigrbl.__name__)
|
|
355
|
+
PY
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## How To Choose This Package
|
|
359
|
+
|
|
360
|
+
Choose `tigrbl_spec` when the quick-answer table matches your use case. Choose [`tigrbl`](https://pypi.org/project/tigrbl/) instead when you want the full public facade. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) when you are building framework extensions or testing a specific internal boundary.
|
|
279
361
|
|
|
280
362
|
## Related Packages
|
|
281
363
|
|
|
282
364
|
- [`tigrbl`](https://pypi.org/project/tigrbl/)
|
|
365
|
+
- [`tigrbl-core`](https://pypi.org/project/tigrbl-core/)
|
|
366
|
+
- [`tigrbl-base`](https://pypi.org/project/tigrbl-base/)
|
|
367
|
+
- [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/)
|
|
368
|
+
|
|
369
|
+
## Documentation Links
|
|
370
|
+
|
|
371
|
+
- [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
|
|
372
|
+
- [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
|
|
373
|
+
- [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
|
|
374
|
+
- [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
|
|
375
|
+
- [Current state](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_STATE.md)
|
|
376
|
+
- [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json)
|
|
377
|
+
- [Release workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml)
|
|
283
378
|
|
|
284
|
-
##
|
|
379
|
+
## Support
|
|
285
380
|
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
289
|
-
- `docs/conformance/NEXT_STEPS.md`
|
|
290
|
-
- `docs/governance/DOC_POINTERS.md`
|
|
291
|
-
- `docs/developer/PACKAGE_CATALOG.md`
|
|
292
|
-
- `docs/developer/PACKAGE_LAYOUT.md`
|
|
381
|
+
- Community: [Discord](https://discord.gg/K4YTAPapjR).
|
|
382
|
+
- Issues: [GitHub Issues](https://github.com/tigrbl/tigrbl/issues).
|
|
383
|
+
- Repository: [pkgs/core/tigrbl_spec](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_spec).
|
|
293
384
|
|
|
294
385
|
## Package-local Boundary
|
|
295
386
|
|
|
296
|
-
This
|
|
297
|
-
Use this page for package installation and boundary orientation. Repository governance, conformance state, target status, and release evidence remain governed from `docs/` and `.ssot/`.
|
|
387
|
+
This README is the package-local distribution entry point for `tigrbl_spec`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
|
|
298
388
|
|
|
299
389
|
## License
|
|
300
390
|
|
|
301
|
-
Licensed under the Apache License, Version 2.0. See `LICENSE` and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
|
|
391
|
+
Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
|
|
302
392
|
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>tigrbl_spec</h1>
|
|
3
|
+
<img src="https://raw.githubusercontent.com/swarmauri/swarmauri-sdk/master/assets/tigrbl_full_logo.png" alt="Tigrbl logo" width="140"/>
|
|
4
|
+
<p><strong>Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration.</strong></p>
|
|
5
|
+
<a href="https://pypi.org/project/tigrbl_spec/"><img src="https://img.shields.io/pypi/v/tigrbl_spec?label=PyPI" alt="PyPI version for tigrbl_spec"/></a>
|
|
6
|
+
<a href="https://pypi.org/project/tigrbl_spec/"><img src="https://static.pepy.tech/badge/tigrbl_spec" alt="Downloads for tigrbl_spec"/></a>
|
|
7
|
+
<a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl_spec"/></a>
|
|
8
|
+
<a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl_spec/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl_spec/README.md.svg?label=hits" alt="Repository hits for tigrbl_spec README"/></a>
|
|
9
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-525252" alt="Apache 2.0 license"/></a>
|
|
10
|
+
<a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-3776ab" alt="Python versions 3.10 | 3.11 | 3.12 | 3.13 | 3.14 for tigrbl_spec"/></a>
|
|
11
|
+
<a href="https://github.com/tigrbl/tigrbl/blob/master/docs/README.md"><img src="https://img.shields.io/badge/workspace-core-1f6feb" alt="Workspace group for tigrbl_spec"/></a>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
## What is tigrbl_spec?
|
|
15
|
+
|
|
16
|
+
Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration.
|
|
17
|
+
|
|
18
|
+
## Why use tigrbl_spec?
|
|
19
|
+
|
|
20
|
+
Use it when you need this foundational Tigrbl layer directly as a small, focused dependency.
|
|
21
|
+
|
|
22
|
+
## When should I install tigrbl_spec?
|
|
23
|
+
|
|
24
|
+
Install it for extension packages, package-local tests, or internals that need this boundary without the whole facade.
|
|
25
|
+
|
|
26
|
+
## Who is tigrbl_spec for?
|
|
27
|
+
|
|
28
|
+
Framework maintainers, extension authors, and advanced users composing Tigrbl from split packages.
|
|
29
|
+
|
|
30
|
+
## Where does tigrbl_spec fit?
|
|
31
|
+
|
|
32
|
+
`tigrbl_spec` lives at `pkgs/core/tigrbl_spec` and serves a focused layer in the split Tigrbl framework.
|
|
33
|
+
|
|
34
|
+
## How does tigrbl_spec work?
|
|
35
|
+
|
|
36
|
+
It owns a narrow layer in the split workspace and is consumed by higher-level packages through explicit dependencies.
|
|
37
|
+
|
|
38
|
+
## Certification Status
|
|
39
|
+
|
|
40
|
+
- Package status: governed package in the `tigrbl/tigrbl` workspace.
|
|
41
|
+
- Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
|
|
42
|
+
- Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
|
|
43
|
+
- Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
|
|
44
|
+
- Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
|
|
45
|
+
|
|
46
|
+
## Install
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uv add tigrbl_spec
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install tigrbl_spec
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Surface Coverage
|
|
57
|
+
|
|
58
|
+
| Surface | Value |
|
|
59
|
+
|---|---|
|
|
60
|
+
| PyPI package | [`tigrbl_spec`](https://pypi.org/project/tigrbl_spec/) |
|
|
61
|
+
| Repository path | [`pkgs/core/tigrbl_spec`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_spec) |
|
|
62
|
+
| Python import root | `tigrbl_spec` |
|
|
63
|
+
| Console scripts | none declared |
|
|
64
|
+
| Entry points | none declared |
|
|
65
|
+
| Optional extras | none declared |
|
|
66
|
+
| Legal files | `LICENSE`, `NOTICE` |
|
|
67
|
+
| Supported Python | `3.10 | 3.11 | 3.12 | 3.13 | 3.14` |
|
|
68
|
+
|
|
69
|
+
## What It Owns
|
|
70
|
+
|
|
71
|
+
`tigrbl_spec` owns the `foundational framework package` boundary. It should be installed when you need this package's focused responsibility without assuming every other Tigrbl workspace package is present.
|
|
72
|
+
|
|
73
|
+
Implementation orientation:
|
|
74
|
+
- Module layout is intentionally small or namespace-oriented.
|
|
75
|
+
|
|
76
|
+
## Public API and Import Surface
|
|
77
|
+
|
|
78
|
+
- Import roots: `tigrbl_spec`.
|
|
79
|
+
- Public symbols: `__version__`.
|
|
80
|
+
- Workspace dependencies: none declared.
|
|
81
|
+
- External runtime dependencies: none declared.
|
|
82
|
+
|
|
83
|
+
## Usage Examples
|
|
84
|
+
|
|
85
|
+
### Verify the installed package
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python -m pip show tigrbl_spec
|
|
89
|
+
python - <<'PY'
|
|
90
|
+
from importlib.metadata import version
|
|
91
|
+
print(version("tigrbl_spec"))
|
|
92
|
+
PY
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Import the package boundary
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
import importlib
|
|
99
|
+
|
|
100
|
+
module = importlib.import_module("tigrbl_spec")
|
|
101
|
+
print(module.__name__)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Import a public symbol
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
from tigrbl_spec import __version__
|
|
108
|
+
|
|
109
|
+
print(__version__)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Use with the facade when building applications
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uv add tigrbl tigrbl_spec
|
|
116
|
+
python - <<'PY'
|
|
117
|
+
import tigrbl
|
|
118
|
+
print(tigrbl.__name__)
|
|
119
|
+
PY
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## How To Choose This Package
|
|
123
|
+
|
|
124
|
+
Choose `tigrbl_spec` when the quick-answer table matches your use case. Choose [`tigrbl`](https://pypi.org/project/tigrbl/) instead when you want the full public facade. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) when you are building framework extensions or testing a specific internal boundary.
|
|
125
|
+
|
|
126
|
+
## Related Packages
|
|
127
|
+
|
|
128
|
+
- [`tigrbl`](https://pypi.org/project/tigrbl/)
|
|
129
|
+
- [`tigrbl-core`](https://pypi.org/project/tigrbl-core/)
|
|
130
|
+
- [`tigrbl-base`](https://pypi.org/project/tigrbl-base/)
|
|
131
|
+
- [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/)
|
|
132
|
+
|
|
133
|
+
## Documentation Links
|
|
134
|
+
|
|
135
|
+
- [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
|
|
136
|
+
- [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
|
|
137
|
+
- [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
|
|
138
|
+
- [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
|
|
139
|
+
- [Current state](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_STATE.md)
|
|
140
|
+
- [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json)
|
|
141
|
+
- [Release workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml)
|
|
142
|
+
|
|
143
|
+
## Support
|
|
144
|
+
|
|
145
|
+
- Community: [Discord](https://discord.gg/K4YTAPapjR).
|
|
146
|
+
- Issues: [GitHub Issues](https://github.com/tigrbl/tigrbl/issues).
|
|
147
|
+
- Repository: [pkgs/core/tigrbl_spec](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_spec).
|
|
148
|
+
|
|
149
|
+
## Package-local Boundary
|
|
150
|
+
|
|
151
|
+
This README is the package-local distribution entry point for `tigrbl_spec`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl_spec"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.3"
|
|
4
4
|
description = "Shared Tigrbl interfaces, protocol definitions, compatibility targets, and specification artifacts for framework integration."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -41,7 +41,10 @@ classifiers = [
|
|
|
41
41
|
requires-python = ">=3.10,<3.15"
|
|
42
42
|
authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
|
|
43
43
|
|
|
44
|
-
dependencies = [
|
|
44
|
+
dependencies = [
|
|
45
|
+
"jsonschema>=4.0",
|
|
46
|
+
"typing-extensions>=4.0",
|
|
47
|
+
]
|
|
45
48
|
|
|
46
49
|
|
|
47
50
|
[project.urls]
|
|
@@ -55,6 +58,16 @@ Issues = "https://github.com/tigrbl/tigrbl/issues"
|
|
|
55
58
|
requires = ["poetry-core>=1.0.0"]
|
|
56
59
|
build-backend = "poetry.core.masonry.api"
|
|
57
60
|
|
|
61
|
+
[tool.poetry]
|
|
62
|
+
packages = [
|
|
63
|
+
{ include = "tigrbl_spec" },
|
|
64
|
+
]
|
|
65
|
+
include = [
|
|
66
|
+
"tigrbl_spec/schemas/**/*.json",
|
|
67
|
+
"tigrbl_spec/migrations/**/*.py",
|
|
68
|
+
"tigrbl_spec/models/**/*.py",
|
|
69
|
+
]
|
|
70
|
+
|
|
58
71
|
[dependency-groups]
|
|
59
72
|
dev = [
|
|
60
73
|
"pytest>=8.0",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Tigrbl specification schema catalog and bindings."""
|
|
2
|
+
|
|
3
|
+
from .schema import (
|
|
4
|
+
CURRENT_SCHEMA_VERSION,
|
|
5
|
+
SCHEMA_VERSION,
|
|
6
|
+
SpecSchemaError,
|
|
7
|
+
SpecValidationError,
|
|
8
|
+
UnknownSpecKindError,
|
|
9
|
+
UnsupportedSchemaVersionError,
|
|
10
|
+
identity_fields,
|
|
11
|
+
load_bundle,
|
|
12
|
+
load_manifest,
|
|
13
|
+
load_payload,
|
|
14
|
+
load_schema,
|
|
15
|
+
schema_path,
|
|
16
|
+
schema_versions,
|
|
17
|
+
spec_kinds,
|
|
18
|
+
spec_type,
|
|
19
|
+
validate_payload,
|
|
20
|
+
with_identity,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"__version__",
|
|
25
|
+
"CURRENT_SCHEMA_VERSION",
|
|
26
|
+
"SCHEMA_VERSION",
|
|
27
|
+
"SpecSchemaError",
|
|
28
|
+
"SpecValidationError",
|
|
29
|
+
"UnknownSpecKindError",
|
|
30
|
+
"UnsupportedSchemaVersionError",
|
|
31
|
+
"identity_fields",
|
|
32
|
+
"load_bundle",
|
|
33
|
+
"load_manifest",
|
|
34
|
+
"load_payload",
|
|
35
|
+
"load_schema",
|
|
36
|
+
"schema_path",
|
|
37
|
+
"schema_versions",
|
|
38
|
+
"spec_kinds",
|
|
39
|
+
"spec_type",
|
|
40
|
+
"validate_payload",
|
|
41
|
+
"with_identity",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
__version__ = "0.4.0.dev1"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from importlib import import_module
|
|
4
|
+
|
|
5
|
+
from tigrbl_spec.schema import CURRENT_SCHEMA_VERSION, spec_kinds
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CodegenFreshnessError(AssertionError):
|
|
9
|
+
"""Raised when checked-in generated models do not match packaged schemas."""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def generated_module_name(version: str = CURRENT_SCHEMA_VERSION) -> str:
|
|
13
|
+
normalized = version.replace(".", "_")
|
|
14
|
+
return f"tigrbl_spec.models.v{normalized}"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def check_generated_model_freshness(version: str = CURRENT_SCHEMA_VERSION) -> None:
|
|
18
|
+
module = import_module(generated_module_name(version))
|
|
19
|
+
expected = set(spec_kinds(version))
|
|
20
|
+
actual = {name for name in getattr(module, "__all__", ()) if name != "SpecDataclass"}
|
|
21
|
+
missing = sorted(expected - actual)
|
|
22
|
+
extra = sorted(actual - expected)
|
|
23
|
+
if missing or extra:
|
|
24
|
+
raise CodegenFreshnessError(
|
|
25
|
+
f"Generated tigrbl_spec dataclasses are stale for {version}: "
|
|
26
|
+
f"missing={missing}, extra={extra}"
|
|
27
|
+
)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from tigrbl_spec.schema import CURRENT_SCHEMA_VERSION, UnsupportedSchemaVersionError, schema_versions
|
|
7
|
+
|
|
8
|
+
SUPPORTED_SCHEMA_VERSIONS = schema_versions()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SchemaMigrationError(ValueError):
|
|
12
|
+
"""Raised when no valid schema catalog migration path exists."""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def migration_path(
|
|
16
|
+
from_version: str,
|
|
17
|
+
to_version: str = CURRENT_SCHEMA_VERSION,
|
|
18
|
+
) -> tuple[str, ...]:
|
|
19
|
+
if from_version not in SUPPORTED_SCHEMA_VERSIONS:
|
|
20
|
+
raise UnsupportedSchemaVersionError(f"Unsupported source schema version {from_version!r}")
|
|
21
|
+
if to_version not in SUPPORTED_SCHEMA_VERSIONS:
|
|
22
|
+
raise UnsupportedSchemaVersionError(f"Unsupported target schema version {to_version!r}")
|
|
23
|
+
if from_version == to_version:
|
|
24
|
+
return (from_version,)
|
|
25
|
+
versions = list(SUPPORTED_SCHEMA_VERSIONS)
|
|
26
|
+
start = versions.index(from_version)
|
|
27
|
+
end = versions.index(to_version)
|
|
28
|
+
if end < start:
|
|
29
|
+
raise SchemaMigrationError(
|
|
30
|
+
f"Downgrade migrations are not supported: {from_version!r} -> {to_version!r}"
|
|
31
|
+
)
|
|
32
|
+
path = tuple(versions[start : end + 1])
|
|
33
|
+
if len(path) < 2:
|
|
34
|
+
raise SchemaMigrationError(f"No migration path from {from_version!r} to {to_version!r}")
|
|
35
|
+
return path
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def migrate_payload(
|
|
39
|
+
spec_kind: str,
|
|
40
|
+
payload: dict[str, Any],
|
|
41
|
+
from_version: str,
|
|
42
|
+
to_version: str = CURRENT_SCHEMA_VERSION,
|
|
43
|
+
) -> dict[str, Any]:
|
|
44
|
+
path = migration_path(from_version, to_version)
|
|
45
|
+
migrated = copy.deepcopy(payload)
|
|
46
|
+
if len(path) == 1:
|
|
47
|
+
return migrated
|
|
48
|
+
raise SchemaMigrationError(
|
|
49
|
+
f"No adjacent migration implementation registered for {spec_kind!r}: "
|
|
50
|
+
f"{from_version!r} -> {to_version!r}"
|
|
51
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Any, ClassVar
|
|
5
|
+
from typing_extensions import Self
|
|
6
|
+
|
|
7
|
+
from tigrbl_spec.schema import CURRENT_SCHEMA_VERSION, identity_fields, spec_kinds, validate_payload
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(slots=True)
|
|
11
|
+
class SpecDataclass:
|
|
12
|
+
spec_kind: str
|
|
13
|
+
spec_schema_version: str
|
|
14
|
+
spec_type: str
|
|
15
|
+
data: dict[str, Any] = field(default_factory=dict)
|
|
16
|
+
|
|
17
|
+
KIND: ClassVar[str]
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def from_dict(cls, payload: dict[str, Any]) -> Self:
|
|
21
|
+
validated = validate_payload(cls.KIND, payload, CURRENT_SCHEMA_VERSION)
|
|
22
|
+
identity = identity_fields(cls.KIND, CURRENT_SCHEMA_VERSION)
|
|
23
|
+
data = {key: value for key, value in validated.items() if key not in identity}
|
|
24
|
+
return cls(data=data, **identity)
|
|
25
|
+
|
|
26
|
+
def to_dict(self) -> dict[str, Any]:
|
|
27
|
+
return {
|
|
28
|
+
"spec_kind": self.spec_kind,
|
|
29
|
+
"spec_schema_version": self.spec_schema_version,
|
|
30
|
+
"spec_type": self.spec_type,
|
|
31
|
+
**self.data,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _model_class(kind: str) -> type[SpecDataclass]:
|
|
36
|
+
return dataclass(slots=True)(
|
|
37
|
+
type(kind, (SpecDataclass,), {"KIND": kind, "__annotations__": {"KIND": ClassVar[str]}})
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
for _kind in spec_kinds(CURRENT_SCHEMA_VERSION):
|
|
42
|
+
globals()[_kind] = _model_class(_kind)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
__all__ = ["SpecDataclass", *spec_kinds(CURRENT_SCHEMA_VERSION)]
|