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.
Files changed (47) hide show
  1. tigrbl_spec-0.4.3/NOTICE +7 -0
  2. {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/PKG-INFO +116 -26
  3. tigrbl_spec-0.4.3/README.md +155 -0
  4. {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/pyproject.toml +15 -2
  5. tigrbl_spec-0.4.3/tigrbl_spec/__init__.py +44 -0
  6. tigrbl_spec-0.4.3/tigrbl_spec/codegen.py +27 -0
  7. tigrbl_spec-0.4.3/tigrbl_spec/migrations/__init__.py +51 -0
  8. tigrbl_spec-0.4.3/tigrbl_spec/models/__init__.py +3 -0
  9. tigrbl_spec-0.4.3/tigrbl_spec/models/v0_3_20/__init__.py +45 -0
  10. tigrbl_spec-0.4.3/tigrbl_spec/schema.py +202 -0
  11. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/AppSpec.json +146 -0
  12. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/BindingRegistrySpec.json +57 -0
  13. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/BindingSpec.json +51 -0
  14. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ColumnSpec.json +137 -0
  15. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/DataTypeSpec.json +72 -0
  16. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/EngineProviderSpec.json +54 -0
  17. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/EngineSpec.json +169 -0
  18. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/FieldSpec.json +70 -0
  19. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ForeignKeySpec.json +84 -0
  20. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HookSpec.json +122 -0
  21. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpJsonRpcBindingSpec.json +67 -0
  22. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpRestBindingSpec.json +67 -0
  23. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/HttpStreamBindingSpec.json +67 -0
  24. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/IOSpec.json +174 -0
  25. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/OpSpec.json +282 -0
  26. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/RequestSpec.json +82 -0
  27. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/ResponseSpec.json +166 -0
  28. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/RouterSpec.json +108 -0
  29. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SchemaRef.json +55 -0
  30. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SchemaSpec.json +77 -0
  31. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SessionSpec.json +363 -0
  32. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/SseBindingSpec.json +67 -0
  33. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageSpec.json +201 -0
  34. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageTransformSpec.json +65 -0
  35. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/StorageTypeRef.json +58 -0
  36. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableProfileSpec.json +134 -0
  37. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableRegistrySpec.json +47 -0
  38. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TableSpec.json +158 -0
  39. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/TemplateSpec.json +84 -0
  40. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/WebTransportBindingSpec.json +78 -0
  41. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/WsBindingSpec.json +67 -0
  42. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/bundle.json +3565 -0
  43. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/manifest.json +42 -0
  44. tigrbl_spec-0.4.3/tigrbl_spec/schemas/0.3.20/shared.json +224 -0
  45. tigrbl_spec-0.4.2.dev3/README.md +0 -68
  46. tigrbl_spec-0.4.2.dev3/tigrbl_spec/__init__.py +0 -5
  47. {tigrbl_spec-0.4.2.dev3 → tigrbl_spec-0.4.3}/LICENSE +0 -0
@@ -0,0 +1,7 @@
1
+ Tigrbl
2
+ Copyright 2026 Swarmauri
3
+
4
+ This product includes software developed by Swarmauri.
5
+
6
+ Tigrbl is licensed under the Apache License, Version 2.0.
7
+ See the LICENSE file distributed with this work for the full license text.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl_spec
3
- Version: 0.4.2.dev3
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%20to%203.15-3776ab" alt="Python requirement for tigrbl_spec"/></a>
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 spec boundary inside the split Python workspace.
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
- ## Use It When
312
+ ## Public API and Import Surface
261
313
 
262
- Use `tigrbl_spec` when you want this subsystem directly as a package boundary instead of consuming it only through the top-level `tigrbl` facade.
314
+ - Import roots: `tigrbl_spec`.
315
+ - Public symbols: `__version__`.
316
+ - Workspace dependencies: none declared.
317
+ - External runtime dependencies: none declared.
263
318
 
264
- ## Public Surface
319
+ ## Usage Examples
265
320
 
266
- - `tigrbl_spec` exposes `__version__`.
321
+ ### Verify the installed package
267
322
 
268
- ## Internal Layout
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
- - Workspace path: `pkgs/core/tigrbl_spec`.
271
- - Package class: `core framework package`.
272
- - Python requirement: `>=3.10,<3.15`.
331
+ ### Import the package boundary
273
332
 
274
- ## Dependency Surface
333
+ ```python
334
+ import importlib
275
335
 
276
- - Workspace package dependencies: none declared.
277
- - External runtime dependencies: none declared.
278
- - Optional extras: none declared.
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
- ## Canonical Repository Docs
379
+ ## Support
285
380
 
286
- - `docs/README.md`
287
- - `docs/conformance/CURRENT_TARGET.md`
288
- - `docs/conformance/CURRENT_STATE.md`
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 file is a package-local distribution entry point.
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.2.dev3"
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,3 @@
1
+ from __future__ import annotations
2
+
3
+ from tigrbl_spec.models.v0_3_20 import * # noqa: F403
@@ -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)]