tigrbl 0.4.2.dev4__py3-none-any.whl → 0.4.3.dev4__py3-none-any.whl

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/__init__.py CHANGED
@@ -61,6 +61,18 @@ def _install_alias(alias: str, target: str) -> None:
61
61
  for alias, target in _ALIAS_MODULES.items():
62
62
  _install_alias(alias, target)
63
63
 
64
+ for alias, target in {
65
+ "runtime.events": "tigrbl_kernel.events",
66
+ "runtime.labels": "tigrbl_kernel.labels",
67
+ "runtime.status": "tigrbl_typing.status",
68
+ }.items():
69
+ _install_alias(alias, target)
70
+ parent_alias, attr_name = alias.rsplit(".", 1)
71
+ parent_module = sys.modules.get(f"{__name__}.{parent_alias}")
72
+ target_module = sys.modules.get(target) or _optional_import(target)
73
+ if parent_module is not None and target_module is not None:
74
+ setattr(parent_module, attr_name, target_module)
75
+
64
76
 
65
77
  _spec = import_module("tigrbl_core._spec")
66
78
  _base = import_module("tigrbl_base._base")
@@ -84,8 +96,11 @@ from tigrbl_concrete._concrete import ( # noqa: E402
84
96
  BackgroundTask,
85
97
  Binding,
86
98
  BindingRegistry,
99
+ BulkCrudTable,
87
100
  Column,
88
101
  CORSMiddleware,
102
+ CrudTable,
103
+ EventStreamTable,
89
104
  EventStreamResponse,
90
105
  FileResponse,
91
106
  ForeignKey,
@@ -93,23 +108,44 @@ from tigrbl_concrete._concrete import ( # noqa: E402
93
108
  HTMLResponse,
94
109
  HTTPBasic,
95
110
  HTTPBearer,
111
+ JsonRpcOlapTable,
112
+ JsonRpcOltpTable,
113
+ JsonRpcTable,
96
114
  JSONResponse,
97
115
  MutualTLS,
98
116
  OAuth2,
117
+ OlapTable,
118
+ OltpTable,
99
119
  OpenIdConnect,
100
120
  Op,
101
121
  PlainTextResponse,
122
+ RealtimeTable,
123
+ RestJsonRpcOlapTable,
124
+ RestJsonRpcOltpTable,
125
+ RestJsonRpcTable,
126
+ RestOlapTable,
127
+ RestOltpTable,
102
128
  RedirectResponse,
103
129
  Request,
104
130
  TransportResponse,
105
131
  UploadedFile,
106
132
  WebSocket,
133
+ WebSocketJsonRpcTable,
134
+ WebSocketTable,
135
+ WebTransportBidiTable,
136
+ WebTransportClientStreamTable,
137
+ WebTransportDatagramTable,
138
+ WebTransportServerStreamTable,
139
+ WebTransportTable,
107
140
  Response,
108
141
  Route,
109
142
  Router,
110
143
  Schema,
111
144
  StorageTransform,
112
145
  Middleware,
146
+ RestTable,
147
+ SseTable,
148
+ StreamTable,
113
149
  StreamingResponse,
114
150
  Table,
115
151
  TableRegistry,
@@ -117,7 +153,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
117
153
  TigrblRouter,
118
154
  )
119
155
  from tigrbl_concrete._concrete.dependencies import Depends # noqa: E402
120
- from tigrbl_runtime.runtime.status.exceptions import HTTPException # noqa: E402
156
+ from tigrbl_typing.status.exceptions import HTTPException # noqa: E402
121
157
  from tigrbl.engine import resolver # noqa: E402
122
158
  from tigrbl.system import mount_diagnostics # noqa: E402
123
159
  from tigrbl_core.config.constants import DEFAULT_HTTP_METHODS, HOOK_DECLS_ATTR # noqa: E402
@@ -143,16 +179,22 @@ from tigrbl.decorators import ( # noqa: E402
143
179
  websocket_ctx,
144
180
  webtransport_ctx,
145
181
  )
182
+ from tigrbl_concrete._decorators.middlewares import ( # noqa: E402
183
+ middleware as middleware,
184
+ middlewares as middlewares,
185
+ )
146
186
  from tigrbl.factories.op import op # noqa: E402
147
187
  from tigrbl.schema import _build_list_params, _build_schema, get_schema # noqa: E402
148
188
  from tigrbl.ddl import bootstrap_dbschema, ensure_schemas, register_sqlite_attach # noqa: E402
149
189
 
150
190
  from tigrbl_base._base import ( # noqa: E402
151
191
  AppBase,
192
+ CrudTableBase,
152
193
  EngineBase,
153
194
  EngineProviderBase,
154
195
  ForeignKeyBase,
155
196
  HookBase,
197
+ RealtimeTableBase,
156
198
  RouterBase,
157
199
  TableBase,
158
200
  TableRegistryBase,
@@ -196,21 +238,18 @@ from tigrbl_core._spec import ( # noqa: E402
196
238
  SchemaRef,
197
239
  SchemaSpec,
198
240
  SessionSpec,
199
- readonly,
200
- session_spec,
201
241
  StorageSpec,
202
242
  StorageTransformSpec,
203
243
  StorageTypeRef,
244
+ TableProfileSpec,
204
245
  TableRegistrySpec,
205
246
  TableSpec,
206
247
  TargetOp,
207
248
  TemplateSpec,
208
- tx_read_committed,
209
- tx_repeatable_read,
210
- tx_serializable,
211
249
  TxScope,
212
250
  WebSocketBindingSpec,
213
251
  WebTransportBindingSpec,
252
+ WellKnownResourceSpec,
214
253
  WsBindingSpec,
215
254
  canonical_binding_kind,
216
255
  normalize_binding_spec,
@@ -218,7 +257,7 @@ from tigrbl_core._spec import ( # noqa: E402
218
257
  validate_app_framing_for_binding,
219
258
  validate_binding_profile_exchange,
220
259
  )
221
- from tigrbl_runtime.runtime.executor import _invoke # noqa: E402
260
+ from tigrbl_runtime.executors.invoke import _invoke # noqa: E402
222
261
 
223
262
 
224
263
  def bind(*args, **kwargs):
@@ -332,6 +371,8 @@ __all__ = [
332
371
  "Depends",
333
372
  "HTTPException",
334
373
  "TableBase",
374
+ "CrudTableBase",
375
+ "RealtimeTableBase",
335
376
  "RouterBase",
336
377
  "Op",
337
378
  "op",
@@ -357,6 +398,7 @@ __all__ = [
357
398
  "PathKind",
358
399
  "PathSpec",
359
400
  "path_for_binding",
401
+ "WellKnownResourceSpec",
360
402
  "DocsPayloadKind",
361
403
  "DocsPayloadSpec",
362
404
  "DocsProjectionSelection",
@@ -428,6 +470,7 @@ __all__ = [
428
470
  "BindingRegistrySpec",
429
471
  "RouterSpec",
430
472
  "TableSpec",
473
+ "TableProfileSpec",
431
474
  "TableRegistrySpec",
432
475
  "ColumnSpec",
433
476
  "FieldSpec",
@@ -457,6 +500,30 @@ __all__ = [
457
500
  "AppBase",
458
501
  "App",
459
502
  "Table",
503
+ "CrudTable",
504
+ "RealtimeTable",
505
+ "RestTable",
506
+ "RestJsonRpcTable",
507
+ "JsonRpcTable",
508
+ "BulkCrudTable",
509
+ "RestOltpTable",
510
+ "JsonRpcOltpTable",
511
+ "RestJsonRpcOltpTable",
512
+ "OltpTable",
513
+ "RestOlapTable",
514
+ "JsonRpcOlapTable",
515
+ "RestJsonRpcOlapTable",
516
+ "OlapTable",
517
+ "StreamTable",
518
+ "SseTable",
519
+ "EventStreamTable",
520
+ "WebSocketTable",
521
+ "WebSocketJsonRpcTable",
522
+ "WebTransportTable",
523
+ "WebTransportBidiTable",
524
+ "WebTransportClientStreamTable",
525
+ "WebTransportServerStreamTable",
526
+ "WebTransportDatagramTable",
460
527
  "Column",
461
528
  "CORSMiddleware",
462
529
  "Route",
tigrbl/cli.py CHANGED
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import argparse
6
6
  import asyncio
7
+ import hashlib
7
8
  import importlib
8
9
  import importlib.util
9
10
  import inspect
@@ -193,7 +194,9 @@ def _resolve_target(args: argparse.Namespace) -> str | None:
193
194
 
194
195
 
195
196
  def _load_module_from_path(path: Path) -> Any:
196
- module_name = f"_tigrbl_cli_{path.stem}_{abs(hash(str(path.resolve())))}"
197
+ resolved = str(path.resolve())
198
+ digest = hashlib.sha256(resolved.encode("utf-8")).hexdigest()[:16]
199
+ module_name = f"_tigrbl_cli_{path.stem}_{digest}"
197
200
  spec = importlib.util.spec_from_file_location(module_name, path)
198
201
  if spec is None or spec.loader is None:
199
202
  raise CLIError(f"Could not load Python module from '{path}'")
@@ -208,7 +211,13 @@ def _load_target_object(target: str) -> Any:
208
211
  if not raw:
209
212
  raise CLIError("An app target is required. Use <module:attr> or <path.py:attr>.")
210
213
 
211
- source, attr = (raw.rsplit(":", 1) + ["app"])[:2] if ":" in raw else (raw, "app")
214
+ raw_path = Path(raw)
215
+ if raw.endswith(".py") or raw_path.exists():
216
+ source, attr = raw, "app"
217
+ elif ":" in raw:
218
+ source, attr = raw.rsplit(":", 1)
219
+ else:
220
+ source, attr = raw, "app"
212
221
  source_path = Path(source)
213
222
  if source.endswith(".py") or source_path.exists():
214
223
  if not source_path.exists():
tigrbl/hook/exceptions.py CHANGED
@@ -1,3 +1,3 @@
1
- """Compatibility shim for runtime-owned exceptions."""
1
+ """Compatibility shim for hook declaration exceptions."""
2
2
 
3
- from ..runtime.exceptions import * # noqa: F403, F401
3
+ from tigrbl_core._spec.exceptions import * # noqa: F403, F401
@@ -1,11 +1,13 @@
1
- """Hook type definitions exposed without importing runtime package internals."""
1
+ """Middleware declaration and composition helpers."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from tigrbl_atoms import HookPhase, HookPhases, HookPredicate, StepFn
5
+ from tigrbl_concrete._decorators.middlewares import (
6
+ MiddlewareConfig,
7
+ middleware,
8
+ middlewares,
9
+ )
6
10
 
7
- PHASE = HookPhase
8
- PHASES = tuple(h.value for h in HookPhases)
9
-
10
- __all__ = ["HookPhase", "HookPhases", "PHASE", "PHASES", "StepFn", "HookPredicate"]
11
+ from .compose import apply_middlewares
11
12
 
13
+ __all__ = ["MiddlewareConfig", "apply_middlewares", "middleware", "middlewares"]
@@ -0,0 +1 @@
1
+ from tigrbl_concrete.schema.jsonrpc import * # noqa: F401,F403
@@ -1,19 +1,27 @@
1
- from ...runtime.kernel import _default_kernel, build_phase_chains
2
- from .router import mount_diagnostics
3
- from .healthz import build_healthz_endpoint, build_healthz_html, mount_healthz_uix
4
- from .methodz import build_methodz_endpoint
5
- from .hookz import build_hookz_endpoint
1
+ from tigrbl_concrete.system.diagnostics import (
2
+ build_healthz_endpoint,
3
+ build_healthz_html,
4
+ build_hookz_endpoint,
5
+ build_methodz_endpoint,
6
+ mount_diagnostics,
7
+ mount_healthz_uix,
8
+ )
6
9
  from .kernelz import build_kernelz_endpoint
7
- from .methodz import build_methodz_endpoint as _build_methodz_endpoint
8
- from .hookz import build_hookz_endpoint as _build_hookz_endpoint
10
+ from tigrbl_concrete.system.diagnostics import (
11
+ build_hookz_endpoint as _build_hookz_endpoint,
12
+ )
9
13
  from .kernelz import build_kernelz_endpoint as _build_kernelz_endpoint
10
- from .utils import (
11
- table_iter as _table_iter,
12
- model_iter as _model_iter,
13
- opspecs as _opspecs,
14
+ from tigrbl_concrete.system.diagnostics import (
15
+ build_methodz_endpoint as _build_methodz_endpoint,
16
+ )
17
+ from tigrbl_concrete.system.diagnostics.utils import (
14
18
  label_callable as _label_callable,
15
19
  label_hook as _label_hook,
20
+ model_iter as _model_iter,
21
+ opspecs as _opspecs,
22
+ table_iter as _table_iter,
16
23
  )
24
+ from tigrbl_kernel import _default_kernel
17
25
 
18
26
  __all__ = [
19
27
  "mount_diagnostics",
@@ -31,6 +39,5 @@ __all__ = [
31
39
  "_opspecs",
32
40
  "_label_callable",
33
41
  "_label_hook",
34
- "build_phase_chains",
35
42
  "_default_kernel",
36
43
  ]
@@ -1,57 +1,15 @@
1
- """Diagnostic endpoint exposing kernel phase plans."""
2
-
3
1
  from __future__ import annotations
4
2
 
5
3
  from typing import Any
6
4
 
7
- from ...runtime.kernel import _default_kernel as K
5
+ from tigrbl_concrete.system.diagnostics.kernelz import (
6
+ build_kernelz_endpoint as _build_kernelz_endpoint,
7
+ )
8
+ from tigrbl_kernel import _default_kernel
8
9
 
9
10
 
10
11
  def build_kernelz_endpoint(router: Any):
11
- """Return an async handler that serves the Kernel's cached plan."""
12
-
13
- async def _kernelz():
14
- K.ensure_primed(router)
15
- payload = K.kernelz_payload(router)
16
- models = getattr(router, "models", {}) or {}
17
- if not models:
18
- return payload
19
-
20
- out = payload
21
- for model_name, model in models.items():
22
- specs = getattr(getattr(model, "opspecs", None), "all", ()) or ()
23
- if specs:
24
- continue
25
-
26
- model_map = payload.get(model_name)
27
- if not isinstance(model_map, dict):
28
- continue
29
-
30
- if out is payload:
31
- out = {
32
- name: {alias: list(seq) for alias, seq in ops.items()}
33
- for name, ops in payload.items()
34
- }
35
-
36
- enriched = out.get(model_name)
37
- if not isinstance(enriched, dict):
38
- continue
39
-
40
- for alias, seq in list(enriched.items()):
41
- extras: list[str] = []
42
- seen = set(seq)
43
- for label in seq:
44
- if not isinstance(label, str) or ":" not in label:
45
- continue
46
- raw = label.split(":", 1)[1]
47
- if raw not in seen:
48
- extras.append(raw)
49
- seen.add(raw)
50
- if extras:
51
- enriched[alias] = [*seq, *extras]
52
- return out
53
-
54
- return _kernelz
12
+ return _build_kernelz_endpoint(router, kernel=_default_kernel)
55
13
 
56
14
 
57
15
  __all__ = ["build_kernelz_endpoint"]
@@ -37,6 +37,8 @@ def build_methodz_endpoint(router: Any):
37
37
  methods.append(entry)
38
38
  per_model.setdefault(mname, []).append(entry)
39
39
  methods.sort(key=lambda x: (x["model"], x["alias"]))
40
+ for entries in per_model.values():
41
+ entries.sort(key=lambda x: x["alias"])
40
42
  cache = {"methods": methods, **per_model}
41
43
  return cache
42
44
 
@@ -1,63 +1,17 @@
1
- from __future__ import annotations
2
-
3
- import inspect
4
- import warnings
5
- from types import SimpleNamespace
6
- from typing import Any, Iterable
7
-
8
- from sqlalchemy import text
9
-
10
- from ...runtime.labels import (
11
- label_callable as _kernel_label_callable,
12
- label_hook as _kernel_label_hook,
1
+ from tigrbl_concrete.system.diagnostics.utils import (
2
+ label_callable,
3
+ label_hook,
4
+ maybe_execute,
5
+ model_iter,
6
+ opspecs,
7
+ table_iter,
13
8
  )
14
9
 
15
-
16
- def table_iter(router: Any) -> Iterable[type]:
17
- tables = getattr(router, "tables", None)
18
- if isinstance(tables, dict) and tables:
19
- return tables.values()
20
-
21
- return ()
22
-
23
-
24
- def model_iter(router: Any) -> Iterable[type]:
25
- warnings.warn(
26
- "model_iter is deprecated; use table_iter instead.",
27
- DeprecationWarning,
28
- stacklevel=2,
29
- )
30
- return table_iter(router)
31
-
32
-
33
- def opspecs(model: type):
34
- ops = getattr(getattr(model, "opspecs", SimpleNamespace()), "all", ()) or ()
35
- if ops:
36
- return ops
37
- try:
38
- from tigrbl_core._spec.op_spec import _mro_collect_decorated_ops
39
-
40
- return tuple(_mro_collect_decorated_ops(model))
41
- except Exception:
42
- return ()
43
-
44
-
45
- async def maybe_execute(db: Any, stmt: str):
46
- try:
47
- rv = db.execute(text(stmt)) # type: ignore[attr-defined]
48
- if inspect.isawaitable(rv):
49
- return await rv
50
- return rv
51
- except Exception:
52
- rv = db.execute(text("select 1")) # type: ignore[attr-defined]
53
- if inspect.isawaitable(rv):
54
- return await rv
55
- return rv
56
-
57
-
58
- def label_callable(fn: Any) -> str:
59
- return _kernel_label_callable(fn)
60
-
61
-
62
- def label_hook(fn: Any, phase: str) -> str:
63
- return _kernel_label_hook(fn, phase)
10
+ __all__ = [
11
+ "label_callable",
12
+ "label_hook",
13
+ "maybe_execute",
14
+ "model_iter",
15
+ "opspecs",
16
+ "table_iter",
17
+ ]
@@ -1 +1,7 @@
1
+ from tigrbl_concrete.transport._deprecation import (
2
+ JSONRPC_HELPERS_WARNING,
3
+ warn_deprecated_transport_module,
4
+ )
1
5
  from tigrbl_concrete.transport.jsonrpc.helpers import * # noqa: F401,F403
6
+
7
+ warn_deprecated_transport_module(JSONRPC_HELPERS_WARNING, __name__)
@@ -1 +1,7 @@
1
+ from tigrbl_concrete.transport._deprecation import (
2
+ JSONRPC_MODELS_WARNING,
3
+ warn_deprecated_transport_module,
4
+ )
1
5
  from tigrbl_concrete.transport.jsonrpc.models import * # noqa: F401,F403
6
+
7
+ warn_deprecated_transport_module(JSONRPC_MODELS_WARNING, __name__)
@@ -1 +1,7 @@
1
+ from tigrbl_concrete.transport._deprecation import (
2
+ REST_WARNING,
3
+ warn_deprecated_transport_module,
4
+ )
1
5
  from tigrbl_concrete.transport.rest.aggregator import * # noqa: F401,F403
6
+
7
+ warn_deprecated_transport_module(REST_WARNING, __name__)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.4.2.dev4
3
+ Version: 0.4.3.dev4
4
4
  Summary: Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -271,7 +271,7 @@ Description-Content-Type: text/markdown
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>
272
272
  <a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md.svg?label=hits" alt="Repository hits for tigrbl README"/></a>
273
273
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-525252" alt="Apache 2.0 license"/></a>
274
- <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"/></a>
274
+ <a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%2C%203.11%2C%203.12%2C%203.13%2C%203.14-3776ab" alt="Python versions 3.10 | 3.11 | 3.12 | 3.13 | 3.14 for tigrbl"/></a>
275
275
  <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"/></a>
276
276
  </div>
277
277
 
@@ -334,7 +334,7 @@ pip install "tigrbl[postgres,servers,templates,tests]"
334
334
  | Entry points | none declared |
335
335
  | Optional extras | `postgres`, `servers`, `templates`, `tests` |
336
336
  | Legal files | `LICENSE`, `NOTICE` |
337
- | Supported Python | `3.10 | 3.11 | 3.12 | 3.13 | 3.14` |
337
+ | Supported Python | `3.10, 3.11, 3.12, 3.13, 3.14` |
338
338
 
339
339
  ## What It Owns
340
340
 
@@ -343,6 +343,12 @@ pip install "tigrbl[postgres,servers,templates,tests]"
343
343
  Implementation orientation:
344
344
  - `tigrbl`: __main__, canonical_json, cli, config/, ddl/, decorators/, engine/, factories/, hook/, middlewares/, op/, orm/
345
345
 
346
+ Facade orientation:
347
+ - Authoring API: app/router factories, table helpers, column helpers, schema helpers, operation decorators, hook decorators, response decorators, and engine decorators.
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.
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
+
346
352
  ## Public API and Import Surface
347
353
 
348
354
  - Import roots: `tigrbl`.
@@ -393,6 +399,270 @@ tigrbl --help
393
399
  python -m tigrbl --help
394
400
  ```
395
401
 
402
+ ## Framework Catalog
403
+
404
+ Tigrbl is organized as a split framework behind this facade:
405
+
406
+ | Layer | Package | Responsibility |
407
+ |---|---|---|
408
+ | Facade | `tigrbl` | Public authoring imports, shortcuts, compatibility modules, CLI entry point, and application-facing docs. |
409
+ | Core specs | `tigrbl-core` | App, router, table, column, op, hook, schema, response, binding, engine, storage, path, docs, session, and middleware specs. |
410
+ | Base contracts | `tigrbl-base` | Abstract app/router/table/session/request/response/binding/security/middleware/storage interfaces and mapping helpers. |
411
+ | Concrete adapters | `tigrbl-concrete` | Concrete app/router/table/response/request/security/decorator/engine/system/transport implementations. |
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
+ | Kernel | `tigrbl-kernel` | Operation-view compilation, hook ordering, labels, packed plans, protocol chains, lifecycle rows, event keys, capability masks, and dispatch plans. |
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, and realtime/streaming workloads. |
416
+ | ORM | `tigrbl-orm` | SQLAlchemy-facing table and mixin helpers used by application models. |
417
+ | Engines | `tigrbl-engine-*` | Persistence, cache, queue, rate, bloom, dedupe, dataframe, warehouse, and database engine integrations. |
418
+
419
+ Use the facade for application code unless you are maintaining a framework layer, testing a boundary in isolation, or writing a package that intentionally plugs into one of the lower layers.
420
+
421
+ ## Authoring BCP
422
+
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
+
425
+ Do:
426
+
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.
436
+
437
+ Do not:
438
+
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 use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior.
442
+ - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers.
443
+ - 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.
444
+ - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior.
445
+ - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, stream, SSE, WebSocket, or WebTransport behavior.
446
+
447
+ Avoid:
448
+
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.
454
+
455
+ ## Default CRUD and Operation Semantics
456
+
457
+ The canonical default operation set is `create`, `read`, `update`, `replace`, `delete`, `list`, and `clear`. Tables can opt out, opt into a subset, or add explicit operation specs. Additional operation packs provide bulk, analytical, and realtime verbs such as `bulk_create`, `bulk_update`, `bulk_replace`, `bulk_merge`, `bulk_delete`, `count`, `exists`, `aggregate`, `group_by`, `tail`, `subscribe`, `publish`, `upload`, `download`, `append_chunk`, `checkpoint`, and transport-oriented handlers.
458
+
459
+ | Operation | REST shape | JSON-RPC shape | Arity | Semantics |
460
+ |---|---|---|---|---|
461
+ | `create` | `POST /{resource}` | `Model.create` | collection | Validate input, apply defaults/policies, persist one record, return the output schema. |
462
+ | `read` | `GET /{resource}/{id}` | `Model.read` | member | Fetch one record by identity and serialize through the output schema. |
463
+ | `update` | `PATCH /{resource}/{id}` | `Model.update` | member | Apply partial update semantics; omitted fields remain unchanged. |
464
+ | `replace` | `PUT /{resource}/{id}` | `Model.replace` | member | Apply replacement semantics; the submitted representation is the desired record shape. |
465
+ | `delete` | `DELETE /{resource}/{id}` | `Model.delete` | member | Remove or policy-delete one record and return the configured result envelope. |
466
+ | `list` | `GET /{resource}` | `Model.list` | collection | Resolve filters, pagination, ordering, visibility policy, and output collection shape. |
467
+ | `clear` | `DELETE /{resource}` | `Model.clear` | collection | Delete a collection according to policy and filter configuration. |
468
+ | `bulk_create` | `POST /{resource}` | `Model.bulk_create` | collection | Create many records from an array of row objects and return the created row outputs. |
469
+ | `bulk_update` | `PATCH /{resource}` | `Model.bulk_update` | collection | Patch many existing records by primary key and return the updated row outputs. |
470
+ | `bulk_replace` | `PUT /{resource}` | `Model.bulk_replace` | collection | Replace many existing records by primary key and return the replaced row outputs. |
471
+ | `bulk_merge` | `PATCH /{resource}` | `Model.bulk_merge` | collection | Upsert or merge many records by primary key and return the resulting row outputs. |
472
+ | `bulk_delete` | `DELETE /{resource}` | `Model.bulk_delete` | collection | Delete many records by primary key and return a deleted-count envelope. |
473
+ | `custom` | op-defined | op-defined | op-defined | Use explicit `op_ctx`/operation specs for domain-specific verbs while keeping schemas, hooks, and policies unified. |
474
+
475
+ Route conflicts are intentional. A collection `POST` cannot simultaneously mean scalar `create` and `bulk_create` on the same REST path, and a collection `DELETE` cannot simultaneously mean `clear` and `bulk_delete`. JSON-RPC methods remain independently addressable by method name, so RPC is the right surface when both scalar and bulk forms must be exposed without path ambiguity.
476
+
477
+ ## Bulk Operation Shape Reference
478
+
479
+ Bulk operations are collection-arity operations. REST binds them to the collection path, while JSON-RPC binds them to `Model.<bulk_op>`. The public wire shape is intentionally simple: row bulk operations take a JSON array of row objects, and `bulk_delete` takes a JSON array of primary-key values. Wrapper objects such as `{ "data": ... }`, `{ "payload": ... }`, `{ "body": ... }`, and `{ "item": ... }` are rejected unless those names are real schema fields for the operation.
480
+
481
+ | Operation | REST request | JSON-RPC params | Success response | Required shape rules |
482
+ |---|---|---|---|---|
483
+ | `bulk_create` | `POST /{resource}` with `[{...row}, {...row}]` | `[{...row}, {...row}]` | `[{...created_row}, {...created_row}]` | Each item is a create input row. Primary keys may be supplied or generated according to the table schema. Empty input creates nothing and returns `[]`. |
484
+ | `bulk_update` | `PATCH /{resource}` with `[{pk: value, ...patch}, ...]` | `[{pk: value, ...patch}, ...]` | `[{...updated_row}, ...]` | Each item must include the model primary-key field. Non-PK fields are patched; omitted mutable fields remain unchanged. Immutable columns for `update` are skipped. |
485
+ | `bulk_replace` | `PUT /{resource}` with `[{pk: value, ...replacement}, ...]` | `[{pk: value, ...replacement}, ...]` | `[{...replaced_row}, ...]` | Each item must include the model primary-key field. Replacement semantics apply per row: missing mutable attributes are cleared according to replace behavior, while immutable columns for `replace` are skipped. |
486
+ | `bulk_merge` | `PATCH /{resource}` with `[{pk: value, ...fields}, ...]` | `[{pk: value, ...fields}, ...]` | `[{...merged_or_created_row}, ...]` | Rows with an existing primary key are merged; rows with no key or a non-existing key are created/upserted. Existing-row merge follows the scalar `merge` semantics. |
487
+ | `bulk_delete` | `DELETE /{resource}` with `[pk1, pk2]` | `[pk1, pk2]` | `{ "deleted": N }` | Input is a sequence of primary-key values. The schema/docs layer may expose an `ids` wrapper for component naming, but REST and JSON-RPC call paths normalize a bare ID list. Empty input returns `{ "deleted": 0 }`. |
488
+
489
+ Example REST payloads:
490
+
491
+ ```json
492
+ [
493
+ { "id": "w-1", "name": "first" },
494
+ { "id": "w-2", "name": "second" }
495
+ ]
496
+ ```
497
+
498
+ ```json
499
+ ["w-1", "w-2"]
500
+ ```
501
+
502
+ Example JSON-RPC calls:
503
+
504
+ ```json
505
+ {
506
+ "jsonrpc": "2.0",
507
+ "method": "Widget.bulk_update",
508
+ "params": [
509
+ { "id": "w-1", "name": "renamed" },
510
+ { "id": "w-2", "name": "retitled" }
511
+ ],
512
+ "id": 1
513
+ }
514
+ ```
515
+
516
+ ```json
517
+ {
518
+ "jsonrpc": "2.0",
519
+ "method": "Widget.bulk_delete",
520
+ "params": ["w-1", "w-2"],
521
+ "id": 2
522
+ }
523
+ ```
524
+
525
+ Bulk operations are not part of the minimal canonical default set. They are enabled by operation specs, mixins such as `BulkCapable`, `Replaceable`, and `Mergeable`, or explicit table configuration. `bulk_replace` depends on replacement support, and `bulk_merge` depends on merge support. When a bulk REST route claims the same collection method as a scalar route, the bulk route suppresses the conflicting scalar REST route; the scalar JSON-RPC method can still be exposed by name.
526
+
527
+ ## REST, JSON-RPC, and Transport Projection
528
+
529
+ Tigrbl projects the same operation inventory across multiple protocol surfaces:
530
+
531
+ | Surface | Binding family | Framing | Primary use |
532
+ |---|---|---|---|
533
+ | REST over HTTP/HTTPS | request | JSON | Resource-oriented CRUD and conventional HTTP clients. |
534
+ | JSON-RPC over HTTP/HTTPS | request | JSON-RPC | Method-oriented clients, batch-capable RPC contracts, and OpenRPC generation. |
535
+ | HTTP stream | stream | stream or configured stream framing | Server-streaming outputs and progressive responses. |
536
+ | SSE | stream | SSE | Browser-friendly event streams. |
537
+ | WebSocket/WSS | message | text or JSON-RPC when negotiated | Bidirectional message workflows. |
538
+ | WebTransport | session, stream, or datagram | WebTransport outer framing plus lane-specific inner framing | Session, stream, and datagram transports with fail-closed lane validation. |
539
+
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.
541
+
542
+ ## Request Lifecycle and Hook Phases
543
+
544
+ Runtime-owned routing flows through stable phases. Hooks attach to phases, atoms provide framework work, and the kernel records the plan used for each model operation.
545
+
546
+ | Phase | Role |
547
+ |---|---|
548
+ | `INGRESS_BEGIN` | Start request or transport-unit handling and initialize context. |
549
+ | `INGRESS_PARSE` | Parse transport payloads, request metadata, path variables, query data, or message bodies. |
550
+ | `INGRESS_DISPATCH` | Resolve the target operation, binding, and protocol subevent. |
551
+ | `PRE_TX_BEGIN` | Run pre-transaction checks before a database transaction exists. |
552
+ | `START_TX` | Open or attach transaction/session state when the operation requires it. |
553
+ | `PRE_HANDLER` | Resolve dependencies, validate inputs, enforce policy, and prepare handler state. |
554
+ | `HANDLER` | Execute the operation handler or system handler. |
555
+ | `POST_HANDLER` | Normalize handler output and run in-transaction post-processing. |
556
+ | `PRE_COMMIT` | Run final in-transaction checks before commit. |
557
+ | `TX_COMMIT` | Flush/commit when Tigrbl owns the transaction; also exposed historically as `END_TX`. |
558
+ | `POST_COMMIT` | Run committed-side effects before response shaping. |
559
+ | `EGRESS_SHAPE` | Build response envelopes, apply masks, negotiate output shape, and prepare transport response data. |
560
+ | `EGRESS_FINALIZE` | Apply headers/status/renderers and finalize transport response. |
561
+ | `POST_RESPONSE` | Run after-response work that should not affect the returned payload. |
562
+ | `ON_*_ERROR` | Phase-specific error handling; falls back to `ON_ERROR` when no specific chain handles the failure. |
563
+ | `TX_ROLLBACK` | Roll back transaction-owned work and perform cleanup; also exposed historically as `ON_ROLLBACK`. |
564
+
565
+ Happy path:
566
+
567
+ ```text
568
+ INGRESS_BEGIN
569
+ INGRESS_PARSE
570
+ INGRESS_DISPATCH
571
+ PRE_TX_BEGIN
572
+ START_TX
573
+ PRE_HANDLER
574
+ HANDLER
575
+ POST_HANDLER
576
+ PRE_COMMIT
577
+ TX_COMMIT
578
+ POST_COMMIT
579
+ EGRESS_SHAPE
580
+ EGRESS_FINALIZE
581
+ POST_RESPONSE
582
+ ```
583
+
584
+ Use hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Keep core persistence and transport handling inside ops and atoms so REST, JSON-RPC, diagnostics, and schemas stay aligned.
585
+
586
+ ```python
587
+ from tigrbl import hook_ctx
588
+
589
+ @hook_ctx(ops="create", phase="PRE_HANDLER")
590
+ async def validate_name(ctx):
591
+ payload = ctx["request"].payload
592
+ if payload.get("name") == "reserved":
593
+ raise ValueError("reserved name")
594
+ ```
595
+
596
+ Hooks can also be registered imperatively on the model or composed by packages that build operation specs. Running apps can expose `/system/hookz` to inspect registered hook order and `/system/kernelz` to inspect the compiled phase plan.
597
+
598
+ ## Step Types and Kernel Labels
599
+
600
+ Execution plans are composed from labeled steps:
601
+
602
+ | Step type | Owner | Purpose |
603
+ |---|---|---|
604
+ | `secdep` | Application or security package | Authentication and authorization dependencies that run before ordinary dependencies. |
605
+ | `dep` | Application or extension package | General dependency resolution and request context hydration. |
606
+ | `hook:sys` | Tigrbl | Built-in system hooks for runtime behavior, transaction handling, schema work, and transport work. |
607
+ | `hook:wire` | Application or extension package | User hooks registered through decorators or specs. |
608
+ | `atom:<domain>:<subject>` | Tigrbl atoms/kernel | Small runtime units such as ingress parsing, dispatch, validation, handler invocation, response shaping, or transport emission. |
609
+
610
+ Kernel labels make execution order reviewable, for example `PRE_HANDLER:hook:wire:myapp.audit@PRE_HANDLER` or `EGRESS_SHAPE:atom:wire:dump`. Treat labels as diagnostics, not as a stable replacement for the public decorator/spec APIs.
611
+
612
+ ## Engine and Session Semantics
613
+
614
+ Engines are declared through specs, providers, decorators, or concrete engine instances. Resolution chooses the most specific binding:
615
+
616
+ ```text
617
+ operation > table/model > router > app > defaults
618
+ ```
619
+
620
+ Use engine specs and Tigrbl's engine decorators instead of creating ad-hoc SQLAlchemy engines inside handlers. This keeps transaction ownership, routing, diagnostics, engine plugins, and tests coherent.
621
+
622
+ ```python
623
+ from tigrbl.decorators.engine import engine_ctx
624
+ from tigrbl.engine.shortcuts import engine_spec
625
+
626
+ db = engine_spec(kind="sqlite", mode="memory")
627
+
628
+ @engine_ctx(db)
629
+ class Item:
630
+ __tablename__ = "items"
631
+ ```
632
+
633
+ Database sessions are guarded by lifecycle phase. Do not call `flush()` or `commit()` directly from application hooks or handlers unless you are implementing a framework-level atom with the correct guard contract. Let `START_TX`, `PRE_HANDLER`, `HANDLER`, `POST_HANDLER`, `PRE_COMMIT`, and `TX_COMMIT` own transaction progression.
634
+
635
+ ## Configuration and Schema Precedence
636
+
637
+ Tigrbl resolves configuration by layering broad defaults first and specific intent last:
638
+
639
+ ```text
640
+ per-request overrides > operation spec > column spec > table spec > router spec > app spec > framework defaults
641
+ ```
642
+
643
+ Use that same mental model for schema, response, path, engine, and operation behavior. Put shared policy at app/router scope, model-specific behavior at table scope, field behavior at column scope, and exceptional behavior in operation specs or request overrides.
644
+
645
+ Common table-level declarations include:
646
+
647
+ - `__tigrbl_request_extras__` and `__tigrbl_response_extras__` for operation-scoped virtual fields.
648
+ - `__tigrbl_register_hooks__` or hook decorators for lifecycle customization.
649
+ - `__tigrbl_nested_paths__` for hierarchical REST paths.
650
+ - `__tigrbl_allow_anon__` for anonymous operation access.
651
+ - `__tigrbl_owner_policy__` and `__tigrbl_tenant_policy__` for ownership and tenancy injection.
652
+ - `__tigrbl_verb_aliases__` and `__tigrbl_verb_alias_policy__` for operation naming and alias behavior.
653
+
654
+ ## Best Practices
655
+
656
+ - Use `tigrbl` facade imports in application code; import split packages directly only for framework extension work.
657
+ - Model domain actions as operations, not ad-hoc routes, so REST, JSON-RPC, schemas, hooks, OpenAPI, OpenRPC, and diagnostics stay in sync.
658
+ - Use `get_schema(...)` or schema helpers for request/response envelopes instead of hand-rolled Pydantic classes when the payload belongs to a Tigrbl operation.
659
+ - Keep `Table` first in model inheritance when using ORM table classes so table inspection and MRO-sensitive behavior stay deterministic.
660
+ - Bind engines declaratively at app, router, table, or operation scope; do not create engines inside request handlers.
661
+ - Let the lifecycle own transaction boundaries; avoid direct `flush()`, `commit()`, and SQLAlchemy session mutation from user hooks.
662
+ - Put authentication/authorization in security dependencies or `PRE_HANDLER` hooks, not in transport-specific route wrappers.
663
+ - Use `/system/hookz`, `/system/kernelz`, docs endpoints, OpenAPI, and OpenRPC outputs as operational inspection surfaces during debugging.
664
+ - Treat unsupported transport/framing combinations as unsupported, not broken. Preserve fail-closed behavior unless the underlying binding and runtime packages are intentionally extended.
665
+
396
666
  ## How To Choose This Package
397
667
 
398
668
  Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST and JSON-RPC projection, 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.
@@ -416,6 +686,8 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
416
686
  - [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
417
687
  - [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
418
688
  - [Current state](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_STATE.md)
689
+ - [Next steps](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/NEXT_STEPS.md)
690
+ - [Documentation pointers](https://github.com/tigrbl/tigrbl/blob/master/docs/governance/DOC_POINTERS.md)
419
691
  - [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json)
420
692
  - [Release workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml)
421
693
 
@@ -427,7 +699,7 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
427
699
 
428
700
  ## Package-local Boundary
429
701
 
430
- This README is the package-local distribution entry point for `tigrbl`. 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.
702
+ This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl`. 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.
431
703
 
432
704
  ## License
433
705
 
@@ -1,7 +1,7 @@
1
- tigrbl/__init__.py,sha256=O7LQ7QRG6bStodtJXeVKp0KR-dFg9IuTAB6N_0C8wlg,10908
1
+ tigrbl/__init__.py,sha256=YPfm-QVVRpNh6H2UYslMlFNeiB_S1Gd8Ut92u3qj0ZQ,12732
2
2
  tigrbl/__main__.py,sha256=un3tg4SmbC-Sts-Qy2pI200OZRhUONt5DAjijPunNas,78
3
3
  tigrbl/canonical_json.py,sha256=TgOOVnpTNarCj4VVm0mcnawgFD4ezZs86gF5Ea_UOt0,229
4
- tigrbl/cli.py,sha256=eDuct1vvTzpfO7XXhZcPgSXcgIOJ_ivtPISGFzvKMoM,32843
4
+ tigrbl/cli.py,sha256=xkg2ajezzq_I9MQtxTvHnv5s1tn9GMuO56DGWspkivA,33069
5
5
  tigrbl/config/__init__.py,sha256=MF8LNEX-S3IMsPYe2n1Y8KXZL1YFBer2nBk54JhBwyY,102
6
6
  tigrbl/config/constants.py,sha256=pA35CGX3GComUcFTveP8dqv73XGXJfwE5TKycZJubeg,123
7
7
  tigrbl/config/defaults.py,sha256=m8CMgrizY12CpLPfFBC_4Ja86xamJuKPdXROAm9xSQg,113
@@ -34,9 +34,9 @@ tigrbl/factories/responses.py,sha256=0XUnCLEbm0_Jc9j4JK8O85DecUrw1N-X9-f8S0zglfo
34
34
  tigrbl/factories/router.py,sha256=suXgxM2WJk13Je8oanmT5Ffi1Pplc4OVkMl3w0NFkOg,1355
35
35
  tigrbl/factories/schema.py,sha256=KKoZcacMtnGJjpLnGPdSurRs8ayRhA83fcLfWw3tAz0,952
36
36
  tigrbl/factories/table.py,sha256=rGk2reMpEyBZhKHXyqVkdd2PnvjQLcaxzZqcXQk3KxQ,1734
37
- tigrbl/hook/exceptions.py,sha256=XFTiArveiajtZYBYuhB5iOMxPOuvx1TwYyHvp8wqXgI,111
37
+ tigrbl/hook/exceptions.py,sha256=-pSRN8FC-FfjIOKHlIE_JkmlzxIzE1aVOvASr8J6uzA,122
38
38
  tigrbl/hook/types.py,sha256=5_7mwME1fMDuSSmKEGZgLxQegrvadvQ1RYiREFqL0mg,336
39
- tigrbl/middlewares/__init__.py,sha256=2azzU10Dp2kDMRYNbMAGq9eBTFxY29Wy0qH40Uu3eOA,340
39
+ tigrbl/middlewares/__init__.py,sha256=V97hoVwcZA_QUlIMKlti0opvRNABm_CUErwRdZfYkUk,324
40
40
  tigrbl/middlewares/compose.py,sha256=SXf4lOhY8DsWGBKgkDzpVqegzVRiqj32a6p7TRFXd5w,416
41
41
  tigrbl/op/__init__.py,sha256=2eMY51Bx2tjwXpacpIVaK_yP7Glk9sEpXsiIUrivhgQ,511
42
42
  tigrbl/op/canonical.py,sha256=bApdl9atBkUpqzSUJNDpFso9ShuJGown9Vs5bjzlvwA,115
@@ -53,6 +53,7 @@ tigrbl/schema/builder/extras.py,sha256=SS5YVKYhgG8Stfoans3mRTNltteKU_yaUzWi1SU-A
53
53
  tigrbl/schema/builder/helpers.py,sha256=OiEj0iZuPma8HgLV8qUYNnNaOKd4WIdFm4vcXkEANzo,127
54
54
  tigrbl/schema/builder/list_params.py,sha256=EmkhBvxNw-5WGIhlrWVVsPGyTowc46LgTu3V-BQKVWU,131
55
55
  tigrbl/schema/builder/strip_parent_fields.py,sha256=i-wz43Tz18FPFiez9Ym-uDrvEVkYZ3RWhnG6CtJ2UvQ,139
56
+ tigrbl/schema/jsonrpc.py,sha256=4ZYoFvImeRWyxFpUjcwUZrIGhnn3ZrFzaxLERMBzAK8,64
56
57
  tigrbl/schema/utils.py,sha256=BY1VM734AUlaFupIpGjvaJMwpK7gOJMPgiF2MNx_VTM,269
57
58
  tigrbl/security/__init__.py,sha256=0QVCDfEtYUTQN-Q5lp20EigwEyFyCygivsKlcFBgbz0,110
58
59
  tigrbl/security/dependencies.py,sha256=5_M-RKIkRzDKi0g65m9lUUbO6GT9Gm6T7Xa4uP5TVYQ,129
@@ -72,13 +73,13 @@ tigrbl/shortcuts/schema.py,sha256=J9IO6rZ8n8GGdmCcFCbykg8ueMELkWUUIwAHukjgm4Y,61
72
73
  tigrbl/shortcuts/table.py,sha256=6uROGTFNoQ05skg0YiABubUsZq-dr7RrFzA5Rfd9zJQ,60
73
74
  tigrbl/specs.py,sha256=hqNd1FOzymwBJO79D0e4JbvcNbFFPrJvIJYKixnVCA0,971
74
75
  tigrbl/system/__init__.py,sha256=53JG9pfmRtgg_exOOCmexAUSEmpLgOZYjkYPSiDckTg,106
75
- tigrbl/system/diagnostics/__init__.py,sha256=CE7Hn9DGoj_Xsxmy8t2NRjs3QhlwXY_uf9N1P8DvnoY,1147
76
+ tigrbl/system/diagnostics/__init__.py,sha256=ZXU_YJX_poe-45KPriuV-lm8gY_i_4n5VlAEzUbzHYw,1201
76
77
  tigrbl/system/diagnostics/healthz.py,sha256=GNNF9YAJBanRE7mtP7bCCP7FYax5hezp2YB4w6rd3uo,8761
77
78
  tigrbl/system/diagnostics/hookz.py,sha256=Acy2buWOkC-su-5Y5zPFc1Mw7cD2d1hPuQFC_4PAuUM,1807
78
- tigrbl/system/diagnostics/kernelz.py,sha256=SCTFj6y11A3W3IudQB03OdktdZwarSgPcK_9-7agHME,1719
79
- tigrbl/system/diagnostics/methodz.py,sha256=cQUyg5bhXKX7LdtanNvethcfJF1jp8LjudzMfPDuYm4,1634
79
+ tigrbl/system/diagnostics/kernelz.py,sha256=5M2N8xvVTlXpg2IE2UgNRvJQznAuRfhafYZIz0tPqGQ,365
80
+ tigrbl/system/diagnostics/methodz.py,sha256=68VgXvu6DO9BTJ_HeqdVh11NjtQefxrSi3KaIjKGQzg,1728
80
81
  tigrbl/system/diagnostics/router.py,sha256=HzrVdm8XZLDc3IWPRDMoCHtUIkYA4WWTcGTyYqJSEMg,106
81
- tigrbl/system/diagnostics/utils.py,sha256=bnOnnQSFIoxIp5ev8SgdWu0SdZogyl0oLQ_p5FaoxsE,1543
82
+ tigrbl/system/diagnostics/utils.py,sha256=mSWPhegRDccWY4l3b9aIFHIB2Xvma5U2h06-XKFouxU,284
82
83
  tigrbl/system/docs/__init__.py,sha256=BEosgnAkJyWGphoO_kbNx5NlwUhM_dtaCXHwYmfM0KQ,1510
83
84
  tigrbl/system/docs/lens.py,sha256=FEHSfVdNvNYT4gwf3uYQ4EpqDFc-SAkwP_rgtgZFNJA,3516
84
85
  tigrbl/system/docs/openapi/__init__.py,sha256=9aN4AuBuNoJsJ2Oz750NsJY2B_wg2KEQBOdJbwiTZGg,897
@@ -93,10 +94,10 @@ tigrbl/system/favicon/assets/favicon.svg,sha256=HsBFC1uF_Tb8dPqAId3CLEidRx0nQyrE
93
94
  tigrbl/system/uvicorn.py,sha256=ogvIqfv-1CxAPZ8BADucaNAy_ePsLA3IVIZxmhdfL3A,1526
94
95
  tigrbl/transport/__init__.py,sha256=h4-VBa7Ztft-z4nEYDiVRZm1NvPb3laRNUdcYEelmiI,59
95
96
  tigrbl/transport/jsonrpc/__init__.py,sha256=O6AuYTC0XlTWZc4j5aJFNKMqn3RfkHUh2bpg8kfj6s0,67
96
- tigrbl/transport/jsonrpc/helpers.py,sha256=BqtbdVQVTTwNhkOR15wfTv11jIhmx0mWFd9IhWMoRgI,75
97
- tigrbl/transport/jsonrpc/models.py,sha256=4Lsq2pbAf2zs0K9KrHu6UdIa3CsJfrCzeXsP3JwQk_w,74
97
+ tigrbl/transport/jsonrpc/helpers.py,sha256=RBrAKez0vEvTP4U4kMB7NTOYu5em8LqM5CBP1RY1hJQ,266
98
+ tigrbl/transport/jsonrpc/models.py,sha256=W3m3MGzzS6V6ifyg9TGqCSgfawaScBfQk07Otc8zJ4g,263
98
99
  tigrbl/transport/rest/__init__.py,sha256=VbK3ZEmI2U-74kkwFoLznC_pQGtci_jbuVJGhvJTqJ8,64
99
- tigrbl/transport/rest/aggregator.py,sha256=fd-2irmddowXzIe6ap71Nrx1UjFmPSmuC_VznacutIk,75
100
+ tigrbl/transport/rest/aggregator.py,sha256=IeUOt9mHUBpIGvbOUgcVpbz__Fr2i86b8ZFdoZyMUwA,244
100
101
  tigrbl/types/__init__.py,sha256=ABWqAC7Vmq5X1k6CjzYpGWIX6LDzq6BdWtmrJ85Etsw,595
101
102
  tigrbl/utils/__init__.py,sha256=qiT3_Dx7Fp7ddLERh1e95i47viL920sFnT7qbK5FhT0,57
102
103
  tigrbl/utils/schema.py,sha256=vjQd1kr0Q0Kx3L3nX9U1QZKfMDsTnpUhR4TOiTkNCS4,2510
@@ -104,9 +105,9 @@ tigrbl/vendor/__init__.py,sha256=RQZ9SR6hxUveFhVN2jyM2CaAV23fXa832sxB16CeWjQ,645
104
105
  tigrbl/vendor/jinja.py,sha256=sFr9Bq2luWDJPNMNFF7hCQcUyJOIzSwHwHrJ_k0yIh4,787
105
106
  tigrbl/vendor/pydantic.py,sha256=cLReo5Gd3V7TDJ9L3sMOFD93FWMd5QnZZoCaOJ6ip14,497
106
107
  tigrbl/vendor/sqlalchemy.py,sha256=mzc1kHispjk2n6Ll9xSPO7ZQ3Uq_BYECzS1o2Krifls,2456
107
- tigrbl-0.4.2.dev4.dist-info/METADATA,sha256=qe6HX5dvouGXKMVMPPlYBZicw9kGYqIYiecQUyz08RQ,24329
108
- tigrbl-0.4.2.dev4.dist-info/WHEEL,sha256=eY7nduwzv-ldUxpzbRlxwvC693Hg6PX8bWDjEHjZ_dk,88
109
- tigrbl-0.4.2.dev4.dist-info/entry_points.txt,sha256=pXiN_KfMec0vJe-se_ATzXS7bEPFcQ-pGgmqS1_6j3E,50
110
- tigrbl-0.4.2.dev4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
111
- tigrbl-0.4.2.dev4.dist-info/licenses/NOTICE,sha256=EvJMTshzsWz43LiK-DeN2ZuLtrP49cxvlrFlJ8F_buc,221
112
- tigrbl-0.4.2.dev4.dist-info/RECORD,,
108
+ tigrbl-0.4.3.dev4.dist-info/METADATA,sha256=aXPDqkd_4hezxcZC3Pr3dDshOtetMgNYcsuN-scUx7M,44910
109
+ tigrbl-0.4.3.dev4.dist-info/WHEEL,sha256=eY7nduwzv-ldUxpzbRlxwvC693Hg6PX8bWDjEHjZ_dk,88
110
+ tigrbl-0.4.3.dev4.dist-info/entry_points.txt,sha256=pXiN_KfMec0vJe-se_ATzXS7bEPFcQ-pGgmqS1_6j3E,50
111
+ tigrbl-0.4.3.dev4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
112
+ tigrbl-0.4.3.dev4.dist-info/licenses/NOTICE,sha256=EvJMTshzsWz43LiK-DeN2ZuLtrP49cxvlrFlJ8F_buc,221
113
+ tigrbl-0.4.3.dev4.dist-info/RECORD,,