tigrbl 0.4.3.dev4__tar.gz → 0.4.4.dev7__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-0.4.3.dev4 → tigrbl-0.4.4.dev7}/PKG-INFO +48 -34
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/README.md +45 -31
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/pyproject.toml +7 -2
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/__init__.py +19 -1
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/cli.py +3 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/LICENSE +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/NOTICE +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/__main__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/canonical_json.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/allow_anon.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/engine.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/hook.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/middlewares.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/op.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/response.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/rest.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/session.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/app.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/column.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/engine.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/hook.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/op.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/responses.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/router.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/table.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/hook/exceptions.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/middlewares/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/types.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/orm/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/requests.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/jsonrpc.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/security/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/security/dependencies.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/base.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/spec.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/app.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/column.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/engine.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/hook.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/op.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/responses.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/rest.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/router.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/table.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/specs.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/lens.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/helpers.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/mount.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openrpc.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/swagger.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/favicon/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/helpers.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/types/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/utils/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/utils/schema.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/__init__.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/jinja.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/pydantic.py +0 -0
- {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/sqlalchemy.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl
|
|
3
|
-
Version: 0.4.
|
|
4
|
-
Summary: Schema-first ASGI framework for REST
|
|
3
|
+
Version: 0.4.4.dev7
|
|
4
|
+
Summary: Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins.
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
7
7
|
http://www.apache.org/licenses/
|
|
@@ -205,7 +205,7 @@ License: Apache License
|
|
|
205
205
|
limitations under the License.
|
|
206
206
|
License-File: LICENSE
|
|
207
207
|
License-File: NOTICE
|
|
208
|
-
Keywords: tigrbl,asgi,api,api framework,asgi framework,dependency injection,fastapi alternative,json-rpc,framework,openapi,openrpc,pydantic,rest,schema-first,sqlalchemy,typed validation
|
|
208
|
+
Keywords: tigrbl,asgi,api,api framework,asgi framework,dependency injection,fastapi alternative,json-rpc,framework,openapi,openrpc,pydantic,rest,runtime plans,schema-first,sqlalchemy,sse,streaming,typed validation,websocket,webtransport
|
|
209
209
|
Author: Jacob Stewart
|
|
210
210
|
Author-email: jacob@swarmauri.com
|
|
211
211
|
Requires-Python: >=3.10,<3.15
|
|
@@ -265,7 +265,7 @@ Description-Content-Type: text/markdown
|
|
|
265
265
|
<div align="center">
|
|
266
266
|
<h1>tigrbl</h1>
|
|
267
267
|
<img src="https://raw.githubusercontent.com/swarmauri/swarmauri-sdk/master/assets/tigrbl_full_logo.png" alt="Tigrbl logo" width="140"/>
|
|
268
|
-
<p><strong>Schema-first ASGI framework for REST
|
|
268
|
+
<p><strong>Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.</strong></p>
|
|
269
269
|
<a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
|
|
270
270
|
<a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
|
|
271
271
|
<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"/></a>
|
|
@@ -277,7 +277,7 @@ Description-Content-Type: text/markdown
|
|
|
277
277
|
|
|
278
278
|
## What is tigrbl?
|
|
279
279
|
|
|
280
|
-
Schema-first ASGI framework for REST
|
|
280
|
+
Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.
|
|
281
281
|
|
|
282
282
|
## Why use tigrbl?
|
|
283
283
|
|
|
@@ -285,7 +285,7 @@ Use it when you want the public Tigrbl authoring surface in one install target i
|
|
|
285
285
|
|
|
286
286
|
## When should I install tigrbl?
|
|
287
287
|
|
|
288
|
-
Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, docs, schemas, engines, and CLI support from one facade.
|
|
288
|
+
Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, streaming, SSE, WebSocket, docs, schemas, engines, and CLI support from one facade.
|
|
289
289
|
|
|
290
290
|
## Who is tigrbl for?
|
|
291
291
|
|
|
@@ -293,7 +293,7 @@ Application developers, platform teams, and service owners building schema-first
|
|
|
293
293
|
|
|
294
294
|
## Where does tigrbl fit?
|
|
295
295
|
|
|
296
|
-
`tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST
|
|
296
|
+
`tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
|
|
297
297
|
|
|
298
298
|
## How does tigrbl work?
|
|
299
299
|
|
|
@@ -346,7 +346,7 @@ Implementation orientation:
|
|
|
346
346
|
Facade orientation:
|
|
347
347
|
- Authoring API: app/router factories, table helpers, column helpers, schema helpers, operation decorators, hook decorators, response decorators, and engine decorators.
|
|
348
348
|
- Compatibility imports: facade modules such as `tigrbl.op`, `tigrbl.config`, `tigrbl.schema`, `tigrbl.ddl`, `tigrbl.security`, and `tigrbl.system` forward into the split packages that now own the implementation.
|
|
349
|
-
- Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
|
|
349
|
+
- Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, HTTP streams, SSE responses, WebSocket channels, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
|
|
350
350
|
- Operational boundary: this package is the application-facing install target; lower-level packages own specs, atoms, kernel planning, runtime execution, base abstractions, concrete adapters, ORM helpers, and engine plugins.
|
|
351
351
|
|
|
352
352
|
## Public API and Import Surface
|
|
@@ -412,7 +412,7 @@ Tigrbl is organized as a split framework behind this facade:
|
|
|
412
412
|
| Atoms | `tigrbl-atoms` | Phase names, stage transitions, typed contexts, ingress/dispatch/wire/storage/handler/egress/error atoms, transaction atoms, batch atoms, and transport atoms. |
|
|
413
413
|
| Kernel | `tigrbl-kernel` | Operation-view compilation, hook ordering, labels, packed plans, protocol chains, lifecycle rows, event keys, capability masks, and dispatch plans. |
|
|
414
414
|
| Runtime | `tigrbl-runtime` | Runtime-owned routing, request execution, framing atoms, transport channels, and default kernel integration. |
|
|
415
|
-
| Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime` | Canonical operation definitions for CRUD, analytics,
|
|
415
|
+
| Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime`, `tigrbl-ops-webtransport` | Canonical operation definitions for CRUD, analytics, realtime/streaming, and WebTransport control-plane workloads. |
|
|
416
416
|
| ORM | `tigrbl-orm` | SQLAlchemy-facing table and mixin helpers used by application models. |
|
|
417
417
|
| Engines | `tigrbl-engine-*` | Persistence, cache, queue, rate, bloom, dedupe, dataframe, warehouse, and database engine integrations. |
|
|
418
418
|
|
|
@@ -422,35 +422,42 @@ Use the facade for application code unless you are maintaining a framework layer
|
|
|
422
422
|
|
|
423
423
|
The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
|
|
424
424
|
|
|
425
|
+
If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
|
|
426
|
+
WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
|
|
427
|
+
[`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
|
|
428
|
+
Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
|
|
429
|
+
authoring surfaces as the application contract.
|
|
430
|
+
|
|
425
431
|
Do:
|
|
426
432
|
|
|
427
|
-
- Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package.
|
|
428
|
-
- Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators.
|
|
429
|
-
- Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs.
|
|
430
|
-
- Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned.
|
|
431
|
-
- Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs.
|
|
432
|
-
- Do use `get_schema(...)` or schema helpers for operation request/response payloads.
|
|
433
|
-
- Do bind engines declaratively at app, router, table, or operation scope.
|
|
434
|
-
- Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work.
|
|
435
|
-
- Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state.
|
|
433
|
+
- Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
|
|
434
|
+
- Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
|
|
435
|
+
- Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
|
|
436
|
+
- Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
|
|
437
|
+
- Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
|
|
438
|
+
- Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
|
|
439
|
+
- Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
|
|
440
|
+
- Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
|
|
441
|
+
- Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
|
|
436
442
|
|
|
437
443
|
Do not:
|
|
438
444
|
|
|
439
|
-
- Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks.
|
|
440
|
-
- Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes.
|
|
441
|
-
- Do not
|
|
442
|
-
- Do not
|
|
443
|
-
- Do not
|
|
444
|
-
- Do not
|
|
445
|
-
- Do not
|
|
445
|
+
- Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
|
|
446
|
+
- Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
|
|
447
|
+
- Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
|
|
448
|
+
- Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
|
|
449
|
+
- Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
|
|
450
|
+
- Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
|
|
451
|
+
- Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
|
|
452
|
+
- Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
|
|
446
453
|
|
|
447
454
|
Avoid:
|
|
448
455
|
|
|
449
|
-
- Avoid treating ASGI, FastAPI, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks.
|
|
450
|
-
- Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source.
|
|
451
|
-
- Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
|
|
452
|
-
- Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once.
|
|
453
|
-
- Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface.
|
|
456
|
+
- Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
|
|
457
|
+
- Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
|
|
458
|
+
- Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
|
|
459
|
+
- Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
|
|
460
|
+
- Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
|
|
454
461
|
|
|
455
462
|
## Default CRUD and Operation Semantics
|
|
456
463
|
|
|
@@ -526,7 +533,7 @@ Bulk operations are not part of the minimal canonical default set. They are enab
|
|
|
526
533
|
|
|
527
534
|
## REST, JSON-RPC, and Transport Projection
|
|
528
535
|
|
|
529
|
-
Tigrbl projects the same operation inventory across multiple protocol surfaces
|
|
536
|
+
Tigrbl projects the same operation inventory across multiple protocol surfaces while keeping protocol, carrier, exchange, stream direction, and framing separate. The full public matrix is in [`docs/developer/TRANSPORTS_AND_FRAMING.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md).
|
|
530
537
|
|
|
531
538
|
| Surface | Binding family | Framing | Primary use |
|
|
532
539
|
|---|---|---|---|
|
|
@@ -535,9 +542,10 @@ Tigrbl projects the same operation inventory across multiple protocol surfaces:
|
|
|
535
542
|
| HTTP stream | stream | stream or configured stream framing | Server-streaming outputs and progressive responses. |
|
|
536
543
|
| SSE | stream | SSE | Browser-friendly event streams. |
|
|
537
544
|
| WebSocket/WSS | message | text or JSON-RPC when negotiated | Bidirectional message workflows. |
|
|
538
|
-
| WebTransport | session, stream, or datagram |
|
|
545
|
+
| WebTransport | session, stream, or datagram | no top-level app framing; lane-local framing only | Session, stream, and datagram transports with fail-closed lane validation. |
|
|
546
|
+
| h11 / h2 / h3 / QUIC carrier metadata | delegated server/runtime boundary | binding-dependent | Serving-stack protocol mechanics, runtime capability metadata, and deployment controls. |
|
|
539
547
|
|
|
540
|
-
The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed.
|
|
548
|
+
The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed. Tigrbl owns binding declarations, runtime planning, channel metadata, and frame codecs; the serving/runtime stack owns wire-level HTTP/1.1, HTTP/2, HTTP/3, QUIC, TLS termination, HPACK, QPACK, ALPN, and flow control.
|
|
541
549
|
|
|
542
550
|
## Request Lifecycle and Hook Phases
|
|
543
551
|
|
|
@@ -665,7 +673,7 @@ Common table-level declarations include:
|
|
|
665
673
|
|
|
666
674
|
## How To Choose This Package
|
|
667
675
|
|
|
668
|
-
Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST
|
|
676
|
+
Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs generation, engine integration, and CLI workflow. 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/) only when you are building framework extensions or testing a specific internal boundary.
|
|
669
677
|
|
|
670
678
|
## Related Packages
|
|
671
679
|
|
|
@@ -682,6 +690,12 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
|
|
|
682
690
|
## Documentation Links
|
|
683
691
|
|
|
684
692
|
- [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
|
|
693
|
+
- [Equivalence guide index](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md)
|
|
694
|
+
- [Application authoring equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_EQUIVALENCE.md)
|
|
695
|
+
- [Router and table equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ROUTER_TABLE_EQUIVALENCE.md)
|
|
696
|
+
- [Transport equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORT_EQUIVALENCE.md)
|
|
697
|
+
- [Engine and SQL equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ENGINE_SQL_EQUIVALENCE.md)
|
|
698
|
+
- [Transports and framing](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md)
|
|
685
699
|
- [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
|
|
686
700
|
- [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
|
|
687
701
|
- [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1>tigrbl</h1>
|
|
3
3
|
<img src="https://raw.githubusercontent.com/swarmauri/swarmauri-sdk/master/assets/tigrbl_full_logo.png" alt="Tigrbl logo" width="140"/>
|
|
4
|
-
<p><strong>Schema-first ASGI framework for REST
|
|
4
|
+
<p><strong>Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.</strong></p>
|
|
5
5
|
<a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
|
|
6
6
|
<a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
|
|
7
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"/></a>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## What is tigrbl?
|
|
15
15
|
|
|
16
|
-
Schema-first ASGI framework for REST
|
|
16
|
+
Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.
|
|
17
17
|
|
|
18
18
|
## Why use tigrbl?
|
|
19
19
|
|
|
@@ -21,7 +21,7 @@ Use it when you want the public Tigrbl authoring surface in one install target i
|
|
|
21
21
|
|
|
22
22
|
## When should I install tigrbl?
|
|
23
23
|
|
|
24
|
-
Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, docs, schemas, engines, and CLI support from one facade.
|
|
24
|
+
Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, streaming, SSE, WebSocket, docs, schemas, engines, and CLI support from one facade.
|
|
25
25
|
|
|
26
26
|
## Who is tigrbl for?
|
|
27
27
|
|
|
@@ -29,7 +29,7 @@ Application developers, platform teams, and service owners building schema-first
|
|
|
29
29
|
|
|
30
30
|
## Where does tigrbl fit?
|
|
31
31
|
|
|
32
|
-
`tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST
|
|
32
|
+
`tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
|
|
33
33
|
|
|
34
34
|
## How does tigrbl work?
|
|
35
35
|
|
|
@@ -82,7 +82,7 @@ Implementation orientation:
|
|
|
82
82
|
Facade orientation:
|
|
83
83
|
- Authoring API: app/router factories, table helpers, column helpers, schema helpers, operation decorators, hook decorators, response decorators, and engine decorators.
|
|
84
84
|
- Compatibility imports: facade modules such as `tigrbl.op`, `tigrbl.config`, `tigrbl.schema`, `tigrbl.ddl`, `tigrbl.security`, and `tigrbl.system` forward into the split packages that now own the implementation.
|
|
85
|
-
- Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
|
|
85
|
+
- Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, HTTP streams, SSE responses, WebSocket channels, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
|
|
86
86
|
- Operational boundary: this package is the application-facing install target; lower-level packages own specs, atoms, kernel planning, runtime execution, base abstractions, concrete adapters, ORM helpers, and engine plugins.
|
|
87
87
|
|
|
88
88
|
## Public API and Import Surface
|
|
@@ -148,7 +148,7 @@ Tigrbl is organized as a split framework behind this facade:
|
|
|
148
148
|
| Atoms | `tigrbl-atoms` | Phase names, stage transitions, typed contexts, ingress/dispatch/wire/storage/handler/egress/error atoms, transaction atoms, batch atoms, and transport atoms. |
|
|
149
149
|
| Kernel | `tigrbl-kernel` | Operation-view compilation, hook ordering, labels, packed plans, protocol chains, lifecycle rows, event keys, capability masks, and dispatch plans. |
|
|
150
150
|
| Runtime | `tigrbl-runtime` | Runtime-owned routing, request execution, framing atoms, transport channels, and default kernel integration. |
|
|
151
|
-
| Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime` | Canonical operation definitions for CRUD, analytics,
|
|
151
|
+
| Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime`, `tigrbl-ops-webtransport` | Canonical operation definitions for CRUD, analytics, realtime/streaming, and WebTransport control-plane workloads. |
|
|
152
152
|
| ORM | `tigrbl-orm` | SQLAlchemy-facing table and mixin helpers used by application models. |
|
|
153
153
|
| Engines | `tigrbl-engine-*` | Persistence, cache, queue, rate, bloom, dedupe, dataframe, warehouse, and database engine integrations. |
|
|
154
154
|
|
|
@@ -158,35 +158,42 @@ Use the facade for application code unless you are maintaining a framework layer
|
|
|
158
158
|
|
|
159
159
|
The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
|
|
160
160
|
|
|
161
|
+
If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
|
|
162
|
+
WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
|
|
163
|
+
[`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
|
|
164
|
+
Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
|
|
165
|
+
authoring surfaces as the application contract.
|
|
166
|
+
|
|
161
167
|
Do:
|
|
162
168
|
|
|
163
|
-
- Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package.
|
|
164
|
-
- Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators.
|
|
165
|
-
- Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs.
|
|
166
|
-
- Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned.
|
|
167
|
-
- Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs.
|
|
168
|
-
- Do use `get_schema(...)` or schema helpers for operation request/response payloads.
|
|
169
|
-
- Do bind engines declaratively at app, router, table, or operation scope.
|
|
170
|
-
- Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work.
|
|
171
|
-
- Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state.
|
|
169
|
+
- Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
|
|
170
|
+
- Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
|
|
171
|
+
- Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
|
|
172
|
+
- Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
|
|
173
|
+
- Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
|
|
174
|
+
- Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
|
|
175
|
+
- Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
|
|
176
|
+
- Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
|
|
177
|
+
- Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
|
|
172
178
|
|
|
173
179
|
Do not:
|
|
174
180
|
|
|
175
|
-
- Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks.
|
|
176
|
-
- Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes.
|
|
177
|
-
- Do not
|
|
178
|
-
- Do not
|
|
179
|
-
- Do not
|
|
180
|
-
- Do not
|
|
181
|
-
- Do not
|
|
181
|
+
- Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
|
|
182
|
+
- Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
|
|
183
|
+
- Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
|
|
184
|
+
- Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
|
|
185
|
+
- Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
|
|
186
|
+
- Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
|
|
187
|
+
- Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
|
|
188
|
+
- Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
|
|
182
189
|
|
|
183
190
|
Avoid:
|
|
184
191
|
|
|
185
|
-
- Avoid treating ASGI, FastAPI, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks.
|
|
186
|
-
- Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source.
|
|
187
|
-
- Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
|
|
188
|
-
- Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once.
|
|
189
|
-
- Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface.
|
|
192
|
+
- Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
|
|
193
|
+
- Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
|
|
194
|
+
- Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
|
|
195
|
+
- Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
|
|
196
|
+
- Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
|
|
190
197
|
|
|
191
198
|
## Default CRUD and Operation Semantics
|
|
192
199
|
|
|
@@ -262,7 +269,7 @@ Bulk operations are not part of the minimal canonical default set. They are enab
|
|
|
262
269
|
|
|
263
270
|
## REST, JSON-RPC, and Transport Projection
|
|
264
271
|
|
|
265
|
-
Tigrbl projects the same operation inventory across multiple protocol surfaces
|
|
272
|
+
Tigrbl projects the same operation inventory across multiple protocol surfaces while keeping protocol, carrier, exchange, stream direction, and framing separate. The full public matrix is in [`docs/developer/TRANSPORTS_AND_FRAMING.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md).
|
|
266
273
|
|
|
267
274
|
| Surface | Binding family | Framing | Primary use |
|
|
268
275
|
|---|---|---|---|
|
|
@@ -271,9 +278,10 @@ Tigrbl projects the same operation inventory across multiple protocol surfaces:
|
|
|
271
278
|
| HTTP stream | stream | stream or configured stream framing | Server-streaming outputs and progressive responses. |
|
|
272
279
|
| SSE | stream | SSE | Browser-friendly event streams. |
|
|
273
280
|
| WebSocket/WSS | message | text or JSON-RPC when negotiated | Bidirectional message workflows. |
|
|
274
|
-
| WebTransport | session, stream, or datagram |
|
|
281
|
+
| WebTransport | session, stream, or datagram | no top-level app framing; lane-local framing only | Session, stream, and datagram transports with fail-closed lane validation. |
|
|
282
|
+
| h11 / h2 / h3 / QUIC carrier metadata | delegated server/runtime boundary | binding-dependent | Serving-stack protocol mechanics, runtime capability metadata, and deployment controls. |
|
|
275
283
|
|
|
276
|
-
The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed.
|
|
284
|
+
The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed. Tigrbl owns binding declarations, runtime planning, channel metadata, and frame codecs; the serving/runtime stack owns wire-level HTTP/1.1, HTTP/2, HTTP/3, QUIC, TLS termination, HPACK, QPACK, ALPN, and flow control.
|
|
277
285
|
|
|
278
286
|
## Request Lifecycle and Hook Phases
|
|
279
287
|
|
|
@@ -401,7 +409,7 @@ Common table-level declarations include:
|
|
|
401
409
|
|
|
402
410
|
## How To Choose This Package
|
|
403
411
|
|
|
404
|
-
Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST
|
|
412
|
+
Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs generation, engine integration, and CLI workflow. 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/) only when you are building framework extensions or testing a specific internal boundary.
|
|
405
413
|
|
|
406
414
|
## Related Packages
|
|
407
415
|
|
|
@@ -418,6 +426,12 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
|
|
|
418
426
|
## Documentation Links
|
|
419
427
|
|
|
420
428
|
- [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
|
|
429
|
+
- [Equivalence guide index](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md)
|
|
430
|
+
- [Application authoring equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_EQUIVALENCE.md)
|
|
431
|
+
- [Router and table equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ROUTER_TABLE_EQUIVALENCE.md)
|
|
432
|
+
- [Transport equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORT_EQUIVALENCE.md)
|
|
433
|
+
- [Engine and SQL equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ENGINE_SQL_EQUIVALENCE.md)
|
|
434
|
+
- [Transports and framing](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md)
|
|
421
435
|
- [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
|
|
422
436
|
- [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
|
|
423
437
|
- [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl"
|
|
3
|
-
version = "0.4.
|
|
4
|
-
description = "Schema-first ASGI framework for REST
|
|
3
|
+
version = "0.4.4.dev7"
|
|
4
|
+
description = "Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
7
7
|
keywords = [
|
|
@@ -18,9 +18,14 @@ keywords = [
|
|
|
18
18
|
"openrpc",
|
|
19
19
|
"pydantic",
|
|
20
20
|
"rest",
|
|
21
|
+
"runtime plans",
|
|
21
22
|
"schema-first",
|
|
22
23
|
"sqlalchemy",
|
|
24
|
+
"sse",
|
|
25
|
+
"streaming",
|
|
23
26
|
"typed validation",
|
|
27
|
+
"websocket",
|
|
28
|
+
"webtransport",
|
|
24
29
|
]
|
|
25
30
|
classifiers = [
|
|
26
31
|
"Development Status :: 3 - Alpha",
|
|
@@ -108,6 +108,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
|
|
|
108
108
|
HTMLResponse,
|
|
109
109
|
HTTPBasic,
|
|
110
110
|
HTTPBearer,
|
|
111
|
+
JsonRpcBulkCrudTable,
|
|
111
112
|
JsonRpcOlapTable,
|
|
112
113
|
JsonRpcOltpTable,
|
|
113
114
|
JsonRpcTable,
|
|
@@ -120,6 +121,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
|
|
|
120
121
|
Op,
|
|
121
122
|
PlainTextResponse,
|
|
122
123
|
RealtimeTable,
|
|
124
|
+
RestBulkCrudTable,
|
|
123
125
|
RestJsonRpcOlapTable,
|
|
124
126
|
RestJsonRpcOltpTable,
|
|
125
127
|
RestJsonRpcTable,
|
|
@@ -219,9 +221,12 @@ from tigrbl_core._spec import ( # noqa: E402
|
|
|
219
221
|
FieldSpec,
|
|
220
222
|
Framing,
|
|
221
223
|
ForeignKeySpec,
|
|
224
|
+
HeadersSpec,
|
|
222
225
|
HookPhase,
|
|
223
226
|
HttpJsonRpcBindingSpec,
|
|
227
|
+
HttpJsonRpcProtocolBindingSpec,
|
|
224
228
|
HttpRestBindingSpec,
|
|
229
|
+
HttpRestProtocolBindingSpec,
|
|
225
230
|
HttpStreamBindingSpec,
|
|
226
231
|
IOSpec,
|
|
227
232
|
OpSpec,
|
|
@@ -249,6 +254,10 @@ from tigrbl_core._spec import ( # noqa: E402
|
|
|
249
254
|
TxScope,
|
|
250
255
|
WebSocketBindingSpec,
|
|
251
256
|
WebTransportBindingSpec,
|
|
257
|
+
WebSocketProtocolBindingSpec,
|
|
258
|
+
WebTransportDatagramSpec,
|
|
259
|
+
WebTransportProtocolBindingSpec,
|
|
260
|
+
WebTransportStreamSpec,
|
|
252
261
|
WellKnownResourceSpec,
|
|
253
262
|
WsBindingSpec,
|
|
254
263
|
canonical_binding_kind,
|
|
@@ -257,7 +266,7 @@ from tigrbl_core._spec import ( # noqa: E402
|
|
|
257
266
|
validate_app_framing_for_binding,
|
|
258
267
|
validate_binding_profile_exchange,
|
|
259
268
|
)
|
|
260
|
-
from tigrbl_runtime.executors.
|
|
269
|
+
from tigrbl_runtime.executors.phase_runner import _invoke # noqa: E402
|
|
261
270
|
|
|
262
271
|
|
|
263
272
|
def bind(*args, **kwargs):
|
|
@@ -394,7 +403,9 @@ __all__ = [
|
|
|
394
403
|
"Framing",
|
|
395
404
|
"HTTPBindingSpec",
|
|
396
405
|
"HttpJsonRpcBindingSpec",
|
|
406
|
+
"HttpJsonRpcProtocolBindingSpec",
|
|
397
407
|
"HttpRestBindingSpec",
|
|
408
|
+
"HttpRestProtocolBindingSpec",
|
|
398
409
|
"PathKind",
|
|
399
410
|
"PathSpec",
|
|
400
411
|
"path_for_binding",
|
|
@@ -431,6 +442,10 @@ __all__ = [
|
|
|
431
442
|
"SseBindingSpec",
|
|
432
443
|
"WebSocketBindingSpec",
|
|
433
444
|
"WebTransportBindingSpec",
|
|
445
|
+
"WebSocketProtocolBindingSpec",
|
|
446
|
+
"WebTransportDatagramSpec",
|
|
447
|
+
"WebTransportProtocolBindingSpec",
|
|
448
|
+
"WebTransportStreamSpec",
|
|
434
449
|
"WsBindingSpec",
|
|
435
450
|
"canonical_binding_kind",
|
|
436
451
|
"normalize_binding_spec",
|
|
@@ -481,6 +496,7 @@ __all__ = [
|
|
|
481
496
|
"StorageTransformSpec",
|
|
482
497
|
"StorageTypeRef",
|
|
483
498
|
"ForeignKeySpec",
|
|
499
|
+
"HeadersSpec",
|
|
484
500
|
"RequestSpec",
|
|
485
501
|
"SchemaSpec",
|
|
486
502
|
"SessionSpec",
|
|
@@ -506,6 +522,8 @@ __all__ = [
|
|
|
506
522
|
"RestJsonRpcTable",
|
|
507
523
|
"JsonRpcTable",
|
|
508
524
|
"BulkCrudTable",
|
|
525
|
+
"RestBulkCrudTable",
|
|
526
|
+
"JsonRpcBulkCrudTable",
|
|
509
527
|
"RestOltpTable",
|
|
510
528
|
"JsonRpcOltpTable",
|
|
511
529
|
"RestJsonRpcOltpTable",
|
|
@@ -21,6 +21,7 @@ from . import TigrblApp, TigrblRouter
|
|
|
21
21
|
from .engine import known_engine_kinds, load_engine_plugins
|
|
22
22
|
from .system import mount_lens, mount_openapi, mount_openrpc, mount_swagger
|
|
23
23
|
from tigrbl_core._spec.engine_spec import EngineSpec
|
|
24
|
+
from tigrbl_core._spec.serde import SerdeMixin
|
|
24
25
|
|
|
25
26
|
SUPPORTED_SERVERS = ("tigrcorn", "uvicorn", "hypercorn", "gunicorn")
|
|
26
27
|
DEFAULT_HOST = "127.0.0.1"
|
|
@@ -415,6 +416,8 @@ def _json_default(value: Any) -> Any:
|
|
|
415
416
|
return [str(item) for item in value]
|
|
416
417
|
if isinstance(value, Path):
|
|
417
418
|
return str(value)
|
|
419
|
+
if isinstance(value, SerdeMixin):
|
|
420
|
+
return value.to_dict()
|
|
418
421
|
raise TypeError(f"Object of type {value.__class__.__name__} is not JSON serializable")
|
|
419
422
|
|
|
420
423
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|