tigrbl 0.3.16.dev4__tar.gz → 0.3.17__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.3.16.dev4 → tigrbl-0.3.17}/PKG-INFO +50 -25
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/README.md +40 -23
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/pyproject.toml +24 -10
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/README.md +1 -1
- tigrbl-0.3.17/tigrbl/__init__.py +332 -0
- tigrbl-0.3.17/tigrbl/config/__init__.py +3 -0
- tigrbl-0.3.17/tigrbl/config/constants.py +3 -0
- tigrbl-0.3.17/tigrbl/config/defaults.py +3 -0
- tigrbl-0.3.17/tigrbl/ddl/__init__.py +3 -0
- tigrbl-0.3.17/tigrbl/decorators/__init__.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/allow_anon.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/engine.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/hook.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/middlewares.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/op.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/response.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/rest.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/router.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/schema.py +1 -0
- tigrbl-0.3.17/tigrbl/decorators/session.py +1 -0
- tigrbl-0.3.17/tigrbl/docs/session.md +11 -0
- tigrbl-0.3.17/tigrbl/engine/__init__.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/bind.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/builders.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/capabilities.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/collect.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/plugins.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/registry.py +1 -0
- tigrbl-0.3.17/tigrbl/engine/resolver.py +8 -0
- tigrbl-0.3.17/tigrbl/hook/exceptions.py +3 -0
- tigrbl-0.3.17/tigrbl/hook/types.py +10 -0
- tigrbl-0.3.17/tigrbl/op/__init__.py +22 -0
- tigrbl-0.3.17/tigrbl/op/canonical.py +3 -0
- tigrbl-0.3.17/tigrbl/op/collect.py +3 -0
- tigrbl-0.3.17/tigrbl/op/types.py +3 -0
- tigrbl-0.3.17/tigrbl/orm/__init__.py +32 -0
- tigrbl-0.3.17/tigrbl/requests.py +5 -0
- tigrbl-0.3.17/tigrbl/rest/__init__.py +15 -0
- tigrbl-0.3.17/tigrbl/schema/__init__.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/__init__.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/build_schema.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/cache.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/extras.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/helpers.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/list_params.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/builder/strip_parent_fields.py +3 -0
- tigrbl-0.3.17/tigrbl/schema/utils.py +9 -0
- tigrbl-0.3.17/tigrbl/security/__init__.py +3 -0
- tigrbl-0.3.17/tigrbl/security/dependencies.py +3 -0
- tigrbl-0.3.17/tigrbl/shortcuts/__init__.py +31 -0
- tigrbl-0.3.17/tigrbl/shortcuts/app.py +3 -0
- tigrbl-0.3.16.dev4/tigrbl/column/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/column.py +5 -5
- tigrbl-0.3.16.dev4/tigrbl/engine/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/engine.py +19 -17
- tigrbl-0.3.16.dev4/tigrbl/hook/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/hook.py +3 -3
- tigrbl-0.3.17/tigrbl/shortcuts/op.py +14 -0
- tigrbl-0.3.16.dev4/tigrbl/responses/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/responses.py +7 -9
- tigrbl-0.3.17/tigrbl/shortcuts/router.py +42 -0
- tigrbl-0.3.16.dev4/tigrbl/schema/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/schema.py +3 -3
- tigrbl-0.3.16.dev4/tigrbl/table/shortcuts.py → tigrbl-0.3.17/tigrbl/shortcuts/table.py +2 -2
- tigrbl-0.3.17/tigrbl/specs.py +38 -0
- tigrbl-0.3.17/tigrbl/system/__init__.py +3 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/diagnostics/__init__.py +2 -0
- tigrbl-0.3.17/tigrbl/system/diagnostics/healthz.py +69 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/diagnostics/hookz.py +7 -7
- tigrbl-0.3.17/tigrbl/system/diagnostics/kernelz.py +57 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/diagnostics/methodz.py +3 -3
- tigrbl-0.3.17/tigrbl/system/diagnostics/router.py +208 -0
- tigrbl-0.3.17/tigrbl/system/diagnostics/utils.py +63 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/lens.py +2 -2
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/openapi/helpers.py +29 -10
- tigrbl-0.3.17/tigrbl/system/docs/openapi/mount.py +85 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/openapi/schema.py +28 -12
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/openrpc.py +98 -35
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/swagger.py +15 -9
- tigrbl-0.3.17/tigrbl/system/favicon/__init__.py +138 -0
- tigrbl-0.3.17/tigrbl/transport/__init__.py +1 -0
- tigrbl-0.3.17/tigrbl/transport/jsonrpc/__init__.py +1 -0
- tigrbl-0.3.17/tigrbl/transport/jsonrpc/helpers.py +1 -0
- tigrbl-0.3.17/tigrbl/transport/jsonrpc/models.py +1 -0
- tigrbl-0.3.17/tigrbl/transport/rest/__init__.py +1 -0
- tigrbl-0.3.17/tigrbl/transport/rest/aggregator.py +1 -0
- tigrbl-0.3.17/tigrbl/types/__init__.py +35 -0
- tigrbl-0.3.17/tigrbl/utils/__init__.py +3 -0
- tigrbl-0.3.16.dev4/tigrbl/schema/get_schema.py → tigrbl-0.3.17/tigrbl/utils/schema.py +1 -1
- tigrbl-0.3.17/tigrbl/vendor/__init__.py +21 -0
- tigrbl-0.3.17/tigrbl/vendor/jinja.py +34 -0
- {tigrbl-0.3.16.dev4/tigrbl/deps → tigrbl-0.3.17/tigrbl/vendor}/sqlalchemy.py +2 -0
- tigrbl-0.3.16.dev4/tigrbl/__init__.py +0 -150
- tigrbl-0.3.16.dev4/tigrbl/api/__init__.py +0 -19
- tigrbl-0.3.16.dev4/tigrbl/api/_api.py +0 -150
- tigrbl-0.3.16.dev4/tigrbl/api/_route.py +0 -119
- tigrbl-0.3.16.dev4/tigrbl/api/_router.py +0 -490
- tigrbl-0.3.16.dev4/tigrbl/api/_routing.py +0 -143
- tigrbl-0.3.16.dev4/tigrbl/api/api_spec.py +0 -30
- tigrbl-0.3.16.dev4/tigrbl/api/mro_collect.py +0 -43
- tigrbl-0.3.16.dev4/tigrbl/api/resolve.py +0 -151
- tigrbl-0.3.16.dev4/tigrbl/api/shortcuts.py +0 -56
- tigrbl-0.3.16.dev4/tigrbl/api/tigrbl_api.py +0 -361
- tigrbl-0.3.16.dev4/tigrbl/app/_app.py +0 -119
- tigrbl-0.3.16.dev4/tigrbl/app/_model_registry.py +0 -41
- tigrbl-0.3.16.dev4/tigrbl/app/app_spec.py +0 -42
- tigrbl-0.3.16.dev4/tigrbl/app/mro_collect.py +0 -106
- tigrbl-0.3.16.dev4/tigrbl/app/shortcuts.py +0 -65
- tigrbl-0.3.16.dev4/tigrbl/app/tigrbl_app.py +0 -594
- tigrbl-0.3.16.dev4/tigrbl/app/transport.py +0 -154
- tigrbl-0.3.16.dev4/tigrbl/bindings/__init__.py +0 -73
- tigrbl-0.3.16.dev4/tigrbl/bindings/api/__init__.py +0 -11
- tigrbl-0.3.16.dev4/tigrbl/bindings/api/common.py +0 -108
- tigrbl-0.3.16.dev4/tigrbl/bindings/api/include.py +0 -273
- tigrbl-0.3.16.dev4/tigrbl/bindings/api/resource_proxy.py +0 -148
- tigrbl-0.3.16.dev4/tigrbl/bindings/api/rpc.py +0 -110
- tigrbl-0.3.16.dev4/tigrbl/bindings/columns.py +0 -49
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/__init__.py +0 -10
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/builder.py +0 -118
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/ctx.py +0 -73
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/identifiers.py +0 -227
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/namespaces.py +0 -50
- tigrbl-0.3.16.dev4/tigrbl/bindings/handlers/steps.py +0 -275
- tigrbl-0.3.16.dev4/tigrbl/bindings/hooks.py +0 -311
- tigrbl-0.3.16.dev4/tigrbl/bindings/model.py +0 -194
- tigrbl-0.3.16.dev4/tigrbl/bindings/model_helpers.py +0 -139
- tigrbl-0.3.16.dev4/tigrbl/bindings/model_registry.py +0 -77
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/__init__.py +0 -7
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/attach.py +0 -34
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/collection.py +0 -360
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/common.py +0 -134
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/fastapi.py +0 -52
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/helpers.py +0 -119
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/io.py +0 -320
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/io_headers.py +0 -49
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/member.py +0 -386
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/router.py +0 -342
- tigrbl-0.3.16.dev4/tigrbl/bindings/rest/routing.py +0 -160
- tigrbl-0.3.16.dev4/tigrbl/bindings/rpc.py +0 -445
- tigrbl-0.3.16.dev4/tigrbl/bindings/schemas/__init__.py +0 -10
- tigrbl-0.3.16.dev4/tigrbl/bindings/schemas/builder.py +0 -347
- tigrbl-0.3.16.dev4/tigrbl/bindings/schemas/defaults.py +0 -259
- tigrbl-0.3.16.dev4/tigrbl/bindings/schemas/utils.py +0 -192
- tigrbl-0.3.16.dev4/tigrbl/column/__init__.py +0 -75
- tigrbl-0.3.16.dev4/tigrbl/column/_column.py +0 -96
- tigrbl-0.3.16.dev4/tigrbl/column/column_spec.py +0 -40
- tigrbl-0.3.16.dev4/tigrbl/column/field_spec.py +0 -32
- tigrbl-0.3.16.dev4/tigrbl/column/infer/__init__.py +0 -25
- tigrbl-0.3.16.dev4/tigrbl/column/infer/core.py +0 -92
- tigrbl-0.3.16.dev4/tigrbl/column/infer/jsonhints.py +0 -44
- tigrbl-0.3.16.dev4/tigrbl/column/infer/planning.py +0 -133
- tigrbl-0.3.16.dev4/tigrbl/column/infer/types.py +0 -102
- tigrbl-0.3.16.dev4/tigrbl/column/infer/utils.py +0 -59
- tigrbl-0.3.16.dev4/tigrbl/column/io_spec.py +0 -136
- tigrbl-0.3.16.dev4/tigrbl/column/mro_collect.py +0 -59
- tigrbl-0.3.16.dev4/tigrbl/column/storage_spec.py +0 -78
- tigrbl-0.3.16.dev4/tigrbl/config/__init__.py +0 -19
- tigrbl-0.3.16.dev4/tigrbl/config/constants.py +0 -224
- tigrbl-0.3.16.dev4/tigrbl/config/defaults.py +0 -29
- tigrbl-0.3.16.dev4/tigrbl/config/resolver.py +0 -295
- tigrbl-0.3.16.dev4/tigrbl/core/__init__.py +0 -47
- tigrbl-0.3.16.dev4/tigrbl/core/crud/__init__.py +0 -36
- tigrbl-0.3.16.dev4/tigrbl/core/crud/bulk.py +0 -167
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/__init__.py +0 -76
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/db.py +0 -91
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/enum.py +0 -85
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/filters.py +0 -161
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/model.py +0 -131
- tigrbl-0.3.16.dev4/tigrbl/core/crud/helpers/normalize.py +0 -98
- tigrbl-0.3.16.dev4/tigrbl/core/crud/ops.py +0 -234
- tigrbl-0.3.16.dev4/tigrbl/core/crud/params.py +0 -50
- tigrbl-0.3.16.dev4/tigrbl/core/resolver.py +0 -81
- tigrbl-0.3.16.dev4/tigrbl/ddl/__init__.py +0 -385
- tigrbl-0.3.16.dev4/tigrbl/decorators.py +0 -17
- tigrbl-0.3.16.dev4/tigrbl/deps/__init__.py +0 -25
- tigrbl-0.3.16.dev4/tigrbl/deps/jinja.py +0 -27
- tigrbl-0.3.16.dev4/tigrbl/engine/__init__.py +0 -47
- tigrbl-0.3.16.dev4/tigrbl/engine/_engine.py +0 -144
- tigrbl-0.3.16.dev4/tigrbl/engine/bind.py +0 -33
- tigrbl-0.3.16.dev4/tigrbl/engine/builders.py +0 -244
- tigrbl-0.3.16.dev4/tigrbl/engine/capabilities.py +0 -29
- tigrbl-0.3.16.dev4/tigrbl/engine/collect.py +0 -111
- tigrbl-0.3.16.dev4/tigrbl/engine/decorators.py +0 -110
- tigrbl-0.3.16.dev4/tigrbl/engine/engine_spec.py +0 -358
- tigrbl-0.3.16.dev4/tigrbl/engine/plugins.py +0 -52
- tigrbl-0.3.16.dev4/tigrbl/engine/registry.py +0 -36
- tigrbl-0.3.16.dev4/tigrbl/engine/resolver.py +0 -356
- tigrbl-0.3.16.dev4/tigrbl/headers/__init__.py +0 -3
- tigrbl-0.3.16.dev4/tigrbl/headers/_header.py +0 -142
- tigrbl-0.3.16.dev4/tigrbl/hook/__init__.py +0 -23
- tigrbl-0.3.16.dev4/tigrbl/hook/_hook.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/hook/decorators.py +0 -35
- tigrbl-0.3.16.dev4/tigrbl/hook/exceptions.py +0 -18
- tigrbl-0.3.16.dev4/tigrbl/hook/hook_spec.py +0 -24
- tigrbl-0.3.16.dev4/tigrbl/hook/mro_collect.py +0 -98
- tigrbl-0.3.16.dev4/tigrbl/hook/types.py +0 -76
- tigrbl-0.3.16.dev4/tigrbl/middlewares/__init__.py +0 -37
- tigrbl-0.3.16.dev4/tigrbl/middlewares/base.py +0 -142
- tigrbl-0.3.16.dev4/tigrbl/middlewares/cors.py +0 -167
- tigrbl-0.3.16.dev4/tigrbl/middlewares/decorators.py +0 -32
- tigrbl-0.3.16.dev4/tigrbl/middlewares/middleware.py +0 -37
- tigrbl-0.3.16.dev4/tigrbl/middlewares/spec.py +0 -28
- tigrbl-0.3.16.dev4/tigrbl/op/__init__.py +0 -50
- tigrbl-0.3.16.dev4/tigrbl/op/_op.py +0 -31
- tigrbl-0.3.16.dev4/tigrbl/op/canonical.py +0 -31
- tigrbl-0.3.16.dev4/tigrbl/op/collect.py +0 -11
- tigrbl-0.3.16.dev4/tigrbl/op/decorators.py +0 -238
- tigrbl-0.3.16.dev4/tigrbl/op/model_registry.py +0 -301
- tigrbl-0.3.16.dev4/tigrbl/op/mro_collect.py +0 -99
- tigrbl-0.3.16.dev4/tigrbl/op/resolver.py +0 -216
- tigrbl-0.3.16.dev4/tigrbl/op/types.py +0 -136
- tigrbl-0.3.16.dev4/tigrbl/orm/__init__.py +0 -1
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/_RowBound.py +0 -83
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/__init__.py +0 -95
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/bootstrappable.py +0 -113
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/bound.py +0 -47
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/edges.py +0 -40
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/fields.py +0 -165
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/hierarchy.py +0 -54
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/key_digest.py +0 -44
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/lifecycle.py +0 -115
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/locks.py +0 -51
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/markers.py +0 -16
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/operations.py +0 -57
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/ownable.py +0 -337
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/principals.py +0 -98
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/tenant_bound.py +0 -301
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/upsertable.py +0 -118
- tigrbl-0.3.16.dev4/tigrbl/orm/mixins/utils.py +0 -49
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/__init__.py +0 -72
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/_base.py +0 -8
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/audit.py +0 -56
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/client.py +0 -25
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/group.py +0 -29
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/org.py +0 -30
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/rbac.py +0 -76
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/status.py +0 -106
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/tenant.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/orm/tables/user.py +0 -39
- tigrbl-0.3.16.dev4/tigrbl/requests/__init__.py +0 -5
- tigrbl-0.3.16.dev4/tigrbl/requests/_request.py +0 -251
- tigrbl-0.3.16.dev4/tigrbl/requests/adapters.py +0 -68
- tigrbl-0.3.16.dev4/tigrbl/responses/README.md +0 -34
- tigrbl-0.3.16.dev4/tigrbl/responses/__init__.py +0 -52
- tigrbl-0.3.16.dev4/tigrbl/responses/_response.py +0 -278
- tigrbl-0.3.16.dev4/tigrbl/responses/_transport.py +0 -32
- tigrbl-0.3.16.dev4/tigrbl/responses/bind.py +0 -12
- tigrbl-0.3.16.dev4/tigrbl/responses/decorators.py +0 -45
- tigrbl-0.3.16.dev4/tigrbl/responses/resolver.py +0 -83
- tigrbl-0.3.16.dev4/tigrbl/responses/types.py +0 -49
- tigrbl-0.3.16.dev4/tigrbl/rest/__init__.py +0 -27
- tigrbl-0.3.16.dev4/tigrbl/runtime/README.md +0 -129
- tigrbl-0.3.16.dev4/tigrbl/runtime/__init__.py +0 -20
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/__init__.py +0 -101
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/emit/__init__.py +0 -42
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/emit/paired_post.py +0 -158
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/emit/paired_pre.py +0 -106
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -120
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/out/__init__.py +0 -38
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/out/masking.py +0 -135
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/refresh/__init__.py +0 -38
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/refresh/demand.py +0 -130
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/resolve/__init__.py +0 -40
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/resolve/assemble.py +0 -167
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -147
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/__init__.py +0 -19
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -57
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/negotiate.py +0 -30
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/negotiation.py +0 -43
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/render.py +0 -36
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/renderer.py +0 -117
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/template.py +0 -44
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/response/templates.py +0 -88
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/schema/__init__.py +0 -40
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/schema/collect_in.py +0 -21
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/schema/collect_out.py +0 -21
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/storage/__init__.py +0 -38
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/storage/to_stored.py +0 -167
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/wire/__init__.py +0 -45
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/wire/build_in.py +0 -166
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/wire/build_out.py +0 -87
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/wire/dump.py +0 -206
- tigrbl-0.3.16.dev4/tigrbl/runtime/atoms/wire/validate_in.py +0 -228
- tigrbl-0.3.16.dev4/tigrbl/runtime/context.py +0 -206
- tigrbl-0.3.16.dev4/tigrbl/runtime/events.py +0 -209
- tigrbl-0.3.16.dev4/tigrbl/runtime/executor/__init__.py +0 -6
- tigrbl-0.3.16.dev4/tigrbl/runtime/executor/guards.py +0 -132
- tigrbl-0.3.16.dev4/tigrbl/runtime/executor/helpers.py +0 -88
- tigrbl-0.3.16.dev4/tigrbl/runtime/executor/invoke.py +0 -150
- tigrbl-0.3.16.dev4/tigrbl/runtime/executor/types.py +0 -76
- tigrbl-0.3.16.dev4/tigrbl/runtime/kernel.py +0 -644
- tigrbl-0.3.16.dev4/tigrbl/runtime/labels.py +0 -353
- tigrbl-0.3.16.dev4/tigrbl/runtime/opview.py +0 -89
- tigrbl-0.3.16.dev4/tigrbl/runtime/ordering.py +0 -256
- tigrbl-0.3.16.dev4/tigrbl/runtime/status/__init__.py +0 -63
- tigrbl-0.3.16.dev4/tigrbl/runtime/status/converters.py +0 -213
- tigrbl-0.3.16.dev4/tigrbl/runtime/status/exceptions.py +0 -149
- tigrbl-0.3.16.dev4/tigrbl/runtime/status/mappings.py +0 -94
- tigrbl-0.3.16.dev4/tigrbl/runtime/status/utils.py +0 -114
- tigrbl-0.3.16.dev4/tigrbl/runtime/system.py +0 -279
- tigrbl-0.3.16.dev4/tigrbl/runtime/trace.py +0 -330
- tigrbl-0.3.16.dev4/tigrbl/schema/__init__.py +0 -38
- tigrbl-0.3.16.dev4/tigrbl/schema/_schema.py +0 -27
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/__init__.py +0 -17
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/build_schema.py +0 -215
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/cache.py +0 -24
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/compat.py +0 -16
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/extras.py +0 -85
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/helpers.py +0 -51
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/list_params.py +0 -117
- tigrbl-0.3.16.dev4/tigrbl/schema/builder/strip_parent_fields.py +0 -70
- tigrbl-0.3.16.dev4/tigrbl/schema/collect.py +0 -78
- tigrbl-0.3.16.dev4/tigrbl/schema/decorators.py +0 -67
- tigrbl-0.3.16.dev4/tigrbl/schema/schema_spec.py +0 -20
- tigrbl-0.3.16.dev4/tigrbl/schema/types.py +0 -34
- tigrbl-0.3.16.dev4/tigrbl/schema/utils.py +0 -142
- tigrbl-0.3.16.dev4/tigrbl/security/__init__.py +0 -63
- tigrbl-0.3.16.dev4/tigrbl/security/dependencies.py +0 -21
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/__init__.py +0 -19
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/_base.py +0 -69
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/api_key.py +0 -57
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/http_bearer.py +0 -74
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/mutual_tls.py +0 -27
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/oauth2.py +0 -28
- tigrbl-0.3.16.dev4/tigrbl/security/schemes/openid_connect.py +0 -31
- tigrbl-0.3.16.dev4/tigrbl/session/README.md +0 -14
- tigrbl-0.3.16.dev4/tigrbl/session/__init__.py +0 -28
- tigrbl-0.3.16.dev4/tigrbl/session/abc.py +0 -76
- tigrbl-0.3.16.dev4/tigrbl/session/base.py +0 -151
- tigrbl-0.3.16.dev4/tigrbl/session/decorators.py +0 -43
- tigrbl-0.3.16.dev4/tigrbl/session/default.py +0 -118
- tigrbl-0.3.16.dev4/tigrbl/session/shortcuts.py +0 -50
- tigrbl-0.3.16.dev4/tigrbl/session/spec.py +0 -112
- tigrbl-0.3.16.dev4/tigrbl/shortcuts.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/specs.py +0 -44
- tigrbl-0.3.16.dev4/tigrbl/system/__init__.py +0 -98
- tigrbl-0.3.16.dev4/tigrbl/system/diagnostics/compat.py +0 -31
- tigrbl-0.3.16.dev4/tigrbl/system/diagnostics/healthz.py +0 -41
- tigrbl-0.3.16.dev4/tigrbl/system/diagnostics/kernelz.py +0 -20
- tigrbl-0.3.16.dev4/tigrbl/system/diagnostics/router.py +0 -73
- tigrbl-0.3.16.dev4/tigrbl/system/diagnostics/utils.py +0 -43
- tigrbl-0.3.16.dev4/tigrbl/system/docs/openapi/mount.py +0 -30
- tigrbl-0.3.16.dev4/tigrbl/system/favicon/__init__.py +0 -102
- tigrbl-0.3.16.dev4/tigrbl/table/__init__.py +0 -9
- tigrbl-0.3.16.dev4/tigrbl/table/_base.py +0 -439
- tigrbl-0.3.16.dev4/tigrbl/table/_table.py +0 -54
- tigrbl-0.3.16.dev4/tigrbl/table/mro_collect.py +0 -86
- tigrbl-0.3.16.dev4/tigrbl/table/table_spec.py +0 -28
- tigrbl-0.3.16.dev4/tigrbl/transport/__init__.py +0 -93
- tigrbl-0.3.16.dev4/tigrbl/transport/background.py +0 -29
- tigrbl-0.3.16.dev4/tigrbl/transport/httpx.py +0 -25
- tigrbl-0.3.16.dev4/tigrbl/transport/jsonrpc/__init__.py +0 -23
- tigrbl-0.3.16.dev4/tigrbl/transport/jsonrpc/dispatcher.py +0 -460
- tigrbl-0.3.16.dev4/tigrbl/transport/jsonrpc/helpers.py +0 -119
- tigrbl-0.3.16.dev4/tigrbl/transport/jsonrpc/models.py +0 -41
- tigrbl-0.3.16.dev4/tigrbl/transport/jsonrpc/openrpc.py +0 -3
- tigrbl-0.3.16.dev4/tigrbl/transport/rest/__init__.py +0 -34
- tigrbl-0.3.16.dev4/tigrbl/transport/rest/aggregator.py +0 -132
- tigrbl-0.3.16.dev4/tigrbl/transport/rest/decorators.py +0 -30
- tigrbl-0.3.16.dev4/tigrbl/types/__init__.py +0 -165
- tigrbl-0.3.16.dev4/tigrbl/types/allow_anon_provider.py +0 -19
- tigrbl-0.3.16.dev4/tigrbl/types/authn_abc.py +0 -31
- tigrbl-0.3.16.dev4/tigrbl/types/nested_path_provider.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/types/op.py +0 -35
- tigrbl-0.3.16.dev4/tigrbl/types/op_config_provider.py +0 -17
- tigrbl-0.3.16.dev4/tigrbl/types/op_verb_alias_provider.py +0 -33
- tigrbl-0.3.16.dev4/tigrbl/types/request_extras_provider.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/types/response_extras_provider.py +0 -22
- tigrbl-0.3.16.dev4/tigrbl/types/table_config_provider.py +0 -13
- tigrbl-0.3.16.dev4/tigrbl/types/uuid.py +0 -55
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/LICENSE +0 -0
- /tigrbl-0.3.16.dev4/tigrbl/column/README.md → /tigrbl-0.3.17/tigrbl/docs/column_specs.md +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/docs/verbosity.md +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/engine/docs/PLUGINS.md +0 -0
- {tigrbl-0.3.16.dev4/tigrbl/app → tigrbl-0.3.17/tigrbl/middlewares}/__init__.py +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.3.16.dev4 → tigrbl-0.3.17}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.3.16.dev4/tigrbl/deps → tigrbl-0.3.17/tigrbl/vendor}/pydantic.py +0 -0
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.17
|
|
4
4
|
Summary: A modern pure ASGI/WSGI Python framework for building schema-first REST and JSON-RPC APIs with SQLAlchemy models, typed validation, lifecycle hooks, and engine extension support.
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
|
-
Keywords: tigrbl,sdk,standards,asgi,rest,rpc
|
|
8
7
|
Author: Jacob Stewart
|
|
9
8
|
Author-email: jacob@swarmauri.com
|
|
10
9
|
Requires-Python: >=3.10,<3.13
|
|
@@ -27,6 +26,15 @@ Requires-Dist: jinja2 (>=3.1.4) ; extra == "templates"
|
|
|
27
26
|
Requires-Dist: psycopg2-binary (>=2.9.9) ; extra == "postgres"
|
|
28
27
|
Requires-Dist: pydantic (>=2.0.0)
|
|
29
28
|
Requires-Dist: sqlalchemy (>=2.0)
|
|
29
|
+
Requires-Dist: tigrbl-atoms
|
|
30
|
+
Requires-Dist: tigrbl-base
|
|
31
|
+
Requires-Dist: tigrbl-canon
|
|
32
|
+
Requires-Dist: tigrbl-concrete
|
|
33
|
+
Requires-Dist: tigrbl-core
|
|
34
|
+
Requires-Dist: tigrbl-kernel
|
|
35
|
+
Requires-Dist: tigrbl-ops-oltp
|
|
36
|
+
Requires-Dist: tigrbl-orm
|
|
37
|
+
Requires-Dist: tigrbl-runtime
|
|
30
38
|
Requires-Dist: tigrbl-tests ; extra == "tests"
|
|
31
39
|
Requires-Dist: uvicorn
|
|
32
40
|
Description-Content-Type: text/markdown
|
|
@@ -59,11 +67,28 @@ A high-leverage ASGI meta-framework that turns plain SQLAlchemy models into a fu
|
|
|
59
67
|
- 🧩 Pluggable engine and provider abstractions
|
|
60
68
|
- 🚀 Built as an ASGI-native framework with Pydantic-powered schema generation
|
|
61
69
|
|
|
70
|
+
## Split Package Module Locations 🗂️
|
|
71
|
+
|
|
72
|
+
These surfaces are now maintained in the split Tigrbl packages (with `tigrbl.*`
|
|
73
|
+
kept as compatibility imports):
|
|
74
|
+
|
|
75
|
+
- `tigrbl.ddl` → `tigrbl_concrete.ddl`
|
|
76
|
+
- `tigrbl.system` → `tigrbl_concrete.system`
|
|
77
|
+
- `tigrbl.op` → `tigrbl_core.op`
|
|
78
|
+
- `tigrbl.config` → `tigrbl_core.config`
|
|
79
|
+
- `tigrbl.schema` → `tigrbl_core.schema`
|
|
80
|
+
- `tigrbl.security` → `tigrbl_concrete.security`
|
|
81
|
+
|
|
82
|
+
## Runtime-owned Routing Contract
|
|
83
|
+
|
|
84
|
+
For the kernel-first flow that avoids pre-runtime REST/RPC dispatching, see
|
|
85
|
+
[`RUNTIME_OWNED_ROUTING.md`](./RUNTIME_OWNED_ROUTING.md).
|
|
86
|
+
|
|
62
87
|
## Terminology 📚
|
|
63
88
|
|
|
64
89
|
- **Tenant** 🏢 – a namespace used to group related resources.
|
|
65
90
|
- **Principal** 👤 – an owner of resources, such as an individual user or an organization.
|
|
66
|
-
- **Resource** 📦 – a logical collection of data or functionality exposed by the
|
|
91
|
+
- **Resource** 📦 – a logical collection of data or functionality exposed by the router.
|
|
67
92
|
- **Engine** ⚙️ – the database connection and transaction manager backing a resource.
|
|
68
93
|
- **Model / Table** 🧱 – the ORM or database representation of a resource's records.
|
|
69
94
|
- **Column** 📏 – a field on a model that maps to a table column.
|
|
@@ -223,7 +248,7 @@ Operation Handler
|
|
|
223
248
|
v
|
|
224
249
|
JSON-RPC Response
|
|
225
250
|
|
|
226
|
-
|
|
251
|
+
```
|
|
227
252
|
|
|
228
253
|
## Hooks 🪝
|
|
229
254
|
|
|
@@ -240,7 +265,7 @@ class Item(Base):
|
|
|
240
265
|
async def validate(cls, ctx):
|
|
241
266
|
if ctx["request"].payload.get("name") == "bad":
|
|
242
267
|
raise ValueError("invalid name")
|
|
243
|
-
|
|
268
|
+
```
|
|
244
269
|
|
|
245
270
|
The function runs during the `PRE_HANDLER` phase of `create`. The
|
|
246
271
|
`ctx` mapping provides request and response objects, a database session,
|
|
@@ -310,7 +335,7 @@ increasing order of precedence:
|
|
|
310
335
|
|
|
311
336
|
1. defaults
|
|
312
337
|
2. app config
|
|
313
|
-
3.
|
|
338
|
+
3. router config
|
|
314
339
|
4. table config
|
|
315
340
|
5. column config
|
|
316
341
|
6. operation spec
|
|
@@ -318,7 +343,7 @@ increasing order of precedence:
|
|
|
318
343
|
|
|
319
344
|
Later entries override earlier ones, so request overrides win over all other
|
|
320
345
|
sources. This can be summarized as
|
|
321
|
-
`overrides > opspec > colspecs > tabspec >
|
|
346
|
+
`overrides > opspec > colspecs > tabspec > routerspec > appspec > defaults`.
|
|
322
347
|
|
|
323
348
|
### Schema Config Precedence 🧬
|
|
324
349
|
|
|
@@ -327,7 +352,7 @@ Later layers override earlier ones, with the precedence order:
|
|
|
327
352
|
|
|
328
353
|
1. defaults (lowest)
|
|
329
354
|
2. app configuration
|
|
330
|
-
3.
|
|
355
|
+
3. router configuration
|
|
331
356
|
4. table configuration
|
|
332
357
|
5. column-level `cfg` values
|
|
333
358
|
6. op-specific `cfg`
|
|
@@ -367,7 +392,7 @@ This hierarchy ensures that the most specific settings always win. 🥇
|
|
|
367
392
|
When assembling values for persistence, defaults are resolved in this order:
|
|
368
393
|
|
|
369
394
|
1. Client-supplied value
|
|
370
|
-
2.
|
|
395
|
+
2. router `default_factory`
|
|
371
396
|
3. ORM default
|
|
372
397
|
4. Database `server_default`
|
|
373
398
|
5. HTTP 422 if the field is required and still missing
|
|
@@ -408,15 +433,15 @@ approved usage. These are not optional—adhering to them keeps the runtime
|
|
|
408
433
|
predictable, preserves hook lifecycle guarantees, and ensures schema
|
|
409
434
|
consistency across REST and RPC surfaces.
|
|
410
435
|
|
|
411
|
-
### 1) Never import SQLAlchemy directly or bypass Tigrbl
|
|
436
|
+
### 1) Never import SQLAlchemy directly or bypass Tigrbl routers
|
|
412
437
|
|
|
413
438
|
**Why:** Direct imports bypass Tigrbl's compatibility layer and make it
|
|
414
439
|
harder to evolve internal dependencies. Use the Tigrbl exports so your
|
|
415
|
-
code stays aligned with the framework’s versioned ASGI
|
|
440
|
+
code stays aligned with the framework’s versioned ASGI router.
|
|
416
441
|
|
|
417
442
|
✅ **Preferred:**
|
|
418
443
|
```python
|
|
419
|
-
from tigrbl import Base, TigrblApp,
|
|
444
|
+
from tigrbl import Base, TigrblApp, TigrblRouter
|
|
420
445
|
from tigrbl.types import Integer, String, Mapped
|
|
421
446
|
from tigrbl.types import Depends, HTTPException, Request
|
|
422
447
|
```
|
|
@@ -452,12 +477,12 @@ item_id = UUID(str(payload["id"]))
|
|
|
452
477
|
### 3) Use engine specs for persistence, not ad-hoc engines
|
|
453
478
|
|
|
454
479
|
**Why:** Engine specs make persistence declarative, testable, and
|
|
455
|
-
compatible with engine resolution across app,
|
|
480
|
+
compatible with engine resolution across app, router, table, and op scopes.
|
|
456
481
|
|
|
457
482
|
✅ **Preferred:**
|
|
458
483
|
```python
|
|
459
484
|
from tigrbl.engine.shortcuts import engine_spec
|
|
460
|
-
from tigrbl.engine
|
|
485
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
461
486
|
|
|
462
487
|
spec = engine_spec(kind="postgres", async_=True, host="db", name="app_db")
|
|
463
488
|
|
|
@@ -588,9 +613,9 @@ async def rotate_keys(payload, *, ctx):
|
|
|
588
613
|
|
|
589
614
|
🚫 **Avoid:**
|
|
590
615
|
```python
|
|
591
|
-
from some_framework import
|
|
616
|
+
from some_framework import routerRouter
|
|
592
617
|
|
|
593
|
-
router =
|
|
618
|
+
router = routerRouter()
|
|
594
619
|
|
|
595
620
|
@router.post("/keys/rotate")
|
|
596
621
|
async def rotate_keys(payload):
|
|
@@ -606,7 +631,7 @@ resolved deterministically by the runtime.
|
|
|
606
631
|
✅ **Preferred:**
|
|
607
632
|
```python
|
|
608
633
|
from tigrbl import hook_ctx, op_ctx, schema_ctx
|
|
609
|
-
from tigrbl.engine
|
|
634
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
610
635
|
|
|
611
636
|
@engine_ctx(kind="sqlite", mode="memory")
|
|
612
637
|
class Item(Table):
|
|
@@ -629,7 +654,7 @@ async def validate(ctx):
|
|
|
629
654
|
|
|
630
655
|
```python
|
|
631
656
|
from tigrbl.engine.shortcuts import engine_spec, prov
|
|
632
|
-
from tigrbl.
|
|
657
|
+
from tigrbl._concrete._engine import Engine, Provider
|
|
633
658
|
|
|
634
659
|
# Build an EngineSpec from a DSN string
|
|
635
660
|
spec = engine_spec("sqlite://:memory:")
|
|
@@ -656,7 +681,7 @@ provider_pg = Provider(spec_pg)
|
|
|
656
681
|
`engine_ctx` binds database configuration to different layers. It accepts a
|
|
657
682
|
DSN string, a mapping, an `EngineSpec`, a `Provider`, or an `Engine`. The
|
|
658
683
|
resolver chooses the most specific binding in the order
|
|
659
|
-
`op > table >
|
|
684
|
+
`op > table > router > app`.
|
|
660
685
|
|
|
661
686
|
#### Engine precedence 🥇
|
|
662
687
|
|
|
@@ -664,8 +689,8 @@ When engine contexts are declared at multiple scopes, Tigrbl resolves them
|
|
|
664
689
|
with strict precedence:
|
|
665
690
|
|
|
666
691
|
1. **Op level** – bindings attached directly to an operation take highest priority.
|
|
667
|
-
2. **Table/Model level** – definitions on a model or table override
|
|
668
|
-
3. **
|
|
692
|
+
2. **Table/Model level** – definitions on a model or table override router and app defaults.
|
|
693
|
+
3. **router level** – bindings on the router class apply when no model-specific context exists.
|
|
669
694
|
4. **App level** – the default engine supplied to the application is used last.
|
|
670
695
|
|
|
671
696
|
This ordering ensures that the most specific engine context always wins.
|
|
@@ -679,7 +704,7 @@ from tigrbl.engine.shortcuts import prov, engine
|
|
|
679
704
|
app = SimpleNamespace(db=prov(kind="sqlite", mode="memory"))
|
|
680
705
|
alt = SimpleNamespace(db=engine(kind="sqlite", mode="memory"))
|
|
681
706
|
|
|
682
|
-
class
|
|
707
|
+
class router:
|
|
683
708
|
db = {"kind": "sqlite", "memory": True}
|
|
684
709
|
|
|
685
710
|
class Item:
|
|
@@ -700,7 +725,7 @@ create.__tigrbl_engine_ctx__ = {
|
|
|
700
725
|
#### Decorative bindings 🎛️
|
|
701
726
|
|
|
702
727
|
```python
|
|
703
|
-
from tigrbl.engine
|
|
728
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
704
729
|
from tigrbl.engine.shortcuts import prov, engine
|
|
705
730
|
|
|
706
731
|
@engine_ctx(prov(kind="sqlite", mode="memory"))
|
|
@@ -708,7 +733,7 @@ class App:
|
|
|
708
733
|
pass
|
|
709
734
|
|
|
710
735
|
@engine_ctx(engine(kind="sqlite", mode="memory"))
|
|
711
|
-
class
|
|
736
|
+
class Decoratedrouter:
|
|
712
737
|
pass
|
|
713
738
|
|
|
714
739
|
@engine_ctx(kind="sqlite", mode="memory")
|
|
@@ -735,7 +760,7 @@ The bridge examples cover two integration styles:
|
|
|
735
760
|
* A Swarmauri `Factory` invocation during `PRE_HANDLER` via `hook_ctx`.
|
|
736
761
|
* Tigrbl default verbs (`create`, `get`, `list`, `update`, `delete`) plus a custom op.
|
|
737
762
|
* `engine_ctx` at model and operation scope.
|
|
738
|
-
* Generated
|
|
763
|
+
* Generated Openrouter and OpenRPC documents mounted from the same model bindings.
|
|
739
764
|
|
|
740
765
|
* **Smoother direct-model flow** (`swarmauri_tigrbl_bridge_smooth.py`)
|
|
741
766
|
* Uses hooks + default `create` persistence to normalize Swarmauri payloads.
|
|
@@ -26,11 +26,28 @@ A high-leverage ASGI meta-framework that turns plain SQLAlchemy models into a fu
|
|
|
26
26
|
- 🧩 Pluggable engine and provider abstractions
|
|
27
27
|
- 🚀 Built as an ASGI-native framework with Pydantic-powered schema generation
|
|
28
28
|
|
|
29
|
+
## Split Package Module Locations 🗂️
|
|
30
|
+
|
|
31
|
+
These surfaces are now maintained in the split Tigrbl packages (with `tigrbl.*`
|
|
32
|
+
kept as compatibility imports):
|
|
33
|
+
|
|
34
|
+
- `tigrbl.ddl` → `tigrbl_concrete.ddl`
|
|
35
|
+
- `tigrbl.system` → `tigrbl_concrete.system`
|
|
36
|
+
- `tigrbl.op` → `tigrbl_core.op`
|
|
37
|
+
- `tigrbl.config` → `tigrbl_core.config`
|
|
38
|
+
- `tigrbl.schema` → `tigrbl_core.schema`
|
|
39
|
+
- `tigrbl.security` → `tigrbl_concrete.security`
|
|
40
|
+
|
|
41
|
+
## Runtime-owned Routing Contract
|
|
42
|
+
|
|
43
|
+
For the kernel-first flow that avoids pre-runtime REST/RPC dispatching, see
|
|
44
|
+
[`RUNTIME_OWNED_ROUTING.md`](./RUNTIME_OWNED_ROUTING.md).
|
|
45
|
+
|
|
29
46
|
## Terminology 📚
|
|
30
47
|
|
|
31
48
|
- **Tenant** 🏢 – a namespace used to group related resources.
|
|
32
49
|
- **Principal** 👤 – an owner of resources, such as an individual user or an organization.
|
|
33
|
-
- **Resource** 📦 – a logical collection of data or functionality exposed by the
|
|
50
|
+
- **Resource** 📦 – a logical collection of data or functionality exposed by the router.
|
|
34
51
|
- **Engine** ⚙️ – the database connection and transaction manager backing a resource.
|
|
35
52
|
- **Model / Table** 🧱 – the ORM or database representation of a resource's records.
|
|
36
53
|
- **Column** 📏 – a field on a model that maps to a table column.
|
|
@@ -190,7 +207,7 @@ Operation Handler
|
|
|
190
207
|
v
|
|
191
208
|
JSON-RPC Response
|
|
192
209
|
|
|
193
|
-
|
|
210
|
+
```
|
|
194
211
|
|
|
195
212
|
## Hooks 🪝
|
|
196
213
|
|
|
@@ -207,7 +224,7 @@ class Item(Base):
|
|
|
207
224
|
async def validate(cls, ctx):
|
|
208
225
|
if ctx["request"].payload.get("name") == "bad":
|
|
209
226
|
raise ValueError("invalid name")
|
|
210
|
-
|
|
227
|
+
```
|
|
211
228
|
|
|
212
229
|
The function runs during the `PRE_HANDLER` phase of `create`. The
|
|
213
230
|
`ctx` mapping provides request and response objects, a database session,
|
|
@@ -277,7 +294,7 @@ increasing order of precedence:
|
|
|
277
294
|
|
|
278
295
|
1. defaults
|
|
279
296
|
2. app config
|
|
280
|
-
3.
|
|
297
|
+
3. router config
|
|
281
298
|
4. table config
|
|
282
299
|
5. column config
|
|
283
300
|
6. operation spec
|
|
@@ -285,7 +302,7 @@ increasing order of precedence:
|
|
|
285
302
|
|
|
286
303
|
Later entries override earlier ones, so request overrides win over all other
|
|
287
304
|
sources. This can be summarized as
|
|
288
|
-
`overrides > opspec > colspecs > tabspec >
|
|
305
|
+
`overrides > opspec > colspecs > tabspec > routerspec > appspec > defaults`.
|
|
289
306
|
|
|
290
307
|
### Schema Config Precedence 🧬
|
|
291
308
|
|
|
@@ -294,7 +311,7 @@ Later layers override earlier ones, with the precedence order:
|
|
|
294
311
|
|
|
295
312
|
1. defaults (lowest)
|
|
296
313
|
2. app configuration
|
|
297
|
-
3.
|
|
314
|
+
3. router configuration
|
|
298
315
|
4. table configuration
|
|
299
316
|
5. column-level `cfg` values
|
|
300
317
|
6. op-specific `cfg`
|
|
@@ -334,7 +351,7 @@ This hierarchy ensures that the most specific settings always win. 🥇
|
|
|
334
351
|
When assembling values for persistence, defaults are resolved in this order:
|
|
335
352
|
|
|
336
353
|
1. Client-supplied value
|
|
337
|
-
2.
|
|
354
|
+
2. router `default_factory`
|
|
338
355
|
3. ORM default
|
|
339
356
|
4. Database `server_default`
|
|
340
357
|
5. HTTP 422 if the field is required and still missing
|
|
@@ -375,15 +392,15 @@ approved usage. These are not optional—adhering to them keeps the runtime
|
|
|
375
392
|
predictable, preserves hook lifecycle guarantees, and ensures schema
|
|
376
393
|
consistency across REST and RPC surfaces.
|
|
377
394
|
|
|
378
|
-
### 1) Never import SQLAlchemy directly or bypass Tigrbl
|
|
395
|
+
### 1) Never import SQLAlchemy directly or bypass Tigrbl routers
|
|
379
396
|
|
|
380
397
|
**Why:** Direct imports bypass Tigrbl's compatibility layer and make it
|
|
381
398
|
harder to evolve internal dependencies. Use the Tigrbl exports so your
|
|
382
|
-
code stays aligned with the framework’s versioned ASGI
|
|
399
|
+
code stays aligned with the framework’s versioned ASGI router.
|
|
383
400
|
|
|
384
401
|
✅ **Preferred:**
|
|
385
402
|
```python
|
|
386
|
-
from tigrbl import Base, TigrblApp,
|
|
403
|
+
from tigrbl import Base, TigrblApp, TigrblRouter
|
|
387
404
|
from tigrbl.types import Integer, String, Mapped
|
|
388
405
|
from tigrbl.types import Depends, HTTPException, Request
|
|
389
406
|
```
|
|
@@ -419,12 +436,12 @@ item_id = UUID(str(payload["id"]))
|
|
|
419
436
|
### 3) Use engine specs for persistence, not ad-hoc engines
|
|
420
437
|
|
|
421
438
|
**Why:** Engine specs make persistence declarative, testable, and
|
|
422
|
-
compatible with engine resolution across app,
|
|
439
|
+
compatible with engine resolution across app, router, table, and op scopes.
|
|
423
440
|
|
|
424
441
|
✅ **Preferred:**
|
|
425
442
|
```python
|
|
426
443
|
from tigrbl.engine.shortcuts import engine_spec
|
|
427
|
-
from tigrbl.engine
|
|
444
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
428
445
|
|
|
429
446
|
spec = engine_spec(kind="postgres", async_=True, host="db", name="app_db")
|
|
430
447
|
|
|
@@ -555,9 +572,9 @@ async def rotate_keys(payload, *, ctx):
|
|
|
555
572
|
|
|
556
573
|
🚫 **Avoid:**
|
|
557
574
|
```python
|
|
558
|
-
from some_framework import
|
|
575
|
+
from some_framework import routerRouter
|
|
559
576
|
|
|
560
|
-
router =
|
|
577
|
+
router = routerRouter()
|
|
561
578
|
|
|
562
579
|
@router.post("/keys/rotate")
|
|
563
580
|
async def rotate_keys(payload):
|
|
@@ -573,7 +590,7 @@ resolved deterministically by the runtime.
|
|
|
573
590
|
✅ **Preferred:**
|
|
574
591
|
```python
|
|
575
592
|
from tigrbl import hook_ctx, op_ctx, schema_ctx
|
|
576
|
-
from tigrbl.engine
|
|
593
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
577
594
|
|
|
578
595
|
@engine_ctx(kind="sqlite", mode="memory")
|
|
579
596
|
class Item(Table):
|
|
@@ -596,7 +613,7 @@ async def validate(ctx):
|
|
|
596
613
|
|
|
597
614
|
```python
|
|
598
615
|
from tigrbl.engine.shortcuts import engine_spec, prov
|
|
599
|
-
from tigrbl.
|
|
616
|
+
from tigrbl._concrete._engine import Engine, Provider
|
|
600
617
|
|
|
601
618
|
# Build an EngineSpec from a DSN string
|
|
602
619
|
spec = engine_spec("sqlite://:memory:")
|
|
@@ -623,7 +640,7 @@ provider_pg = Provider(spec_pg)
|
|
|
623
640
|
`engine_ctx` binds database configuration to different layers. It accepts a
|
|
624
641
|
DSN string, a mapping, an `EngineSpec`, a `Provider`, or an `Engine`. The
|
|
625
642
|
resolver chooses the most specific binding in the order
|
|
626
|
-
`op > table >
|
|
643
|
+
`op > table > router > app`.
|
|
627
644
|
|
|
628
645
|
#### Engine precedence 🥇
|
|
629
646
|
|
|
@@ -631,8 +648,8 @@ When engine contexts are declared at multiple scopes, Tigrbl resolves them
|
|
|
631
648
|
with strict precedence:
|
|
632
649
|
|
|
633
650
|
1. **Op level** – bindings attached directly to an operation take highest priority.
|
|
634
|
-
2. **Table/Model level** – definitions on a model or table override
|
|
635
|
-
3. **
|
|
651
|
+
2. **Table/Model level** – definitions on a model or table override router and app defaults.
|
|
652
|
+
3. **router level** – bindings on the router class apply when no model-specific context exists.
|
|
636
653
|
4. **App level** – the default engine supplied to the application is used last.
|
|
637
654
|
|
|
638
655
|
This ordering ensures that the most specific engine context always wins.
|
|
@@ -646,7 +663,7 @@ from tigrbl.engine.shortcuts import prov, engine
|
|
|
646
663
|
app = SimpleNamespace(db=prov(kind="sqlite", mode="memory"))
|
|
647
664
|
alt = SimpleNamespace(db=engine(kind="sqlite", mode="memory"))
|
|
648
665
|
|
|
649
|
-
class
|
|
666
|
+
class router:
|
|
650
667
|
db = {"kind": "sqlite", "memory": True}
|
|
651
668
|
|
|
652
669
|
class Item:
|
|
@@ -667,7 +684,7 @@ create.__tigrbl_engine_ctx__ = {
|
|
|
667
684
|
#### Decorative bindings 🎛️
|
|
668
685
|
|
|
669
686
|
```python
|
|
670
|
-
from tigrbl.engine
|
|
687
|
+
from tigrbl.decorators.engine import engine_ctx
|
|
671
688
|
from tigrbl.engine.shortcuts import prov, engine
|
|
672
689
|
|
|
673
690
|
@engine_ctx(prov(kind="sqlite", mode="memory"))
|
|
@@ -675,7 +692,7 @@ class App:
|
|
|
675
692
|
pass
|
|
676
693
|
|
|
677
694
|
@engine_ctx(engine(kind="sqlite", mode="memory"))
|
|
678
|
-
class
|
|
695
|
+
class Decoratedrouter:
|
|
679
696
|
pass
|
|
680
697
|
|
|
681
698
|
@engine_ctx(kind="sqlite", mode="memory")
|
|
@@ -702,7 +719,7 @@ The bridge examples cover two integration styles:
|
|
|
702
719
|
* A Swarmauri `Factory` invocation during `PRE_HANDLER` via `hook_ctx`.
|
|
703
720
|
* Tigrbl default verbs (`create`, `get`, `list`, `update`, `delete`) plus a custom op.
|
|
704
721
|
* `engine_ctx` at model and operation scope.
|
|
705
|
-
* Generated
|
|
722
|
+
* Generated Openrouter and OpenRPC documents mounted from the same model bindings.
|
|
706
723
|
|
|
707
724
|
* **Smoother direct-model flow** (`swarmauri_tigrbl_bridge_smooth.py`)
|
|
708
725
|
* Uses hooks + default `create` persistence to normalize Swarmauri payloads.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.17"
|
|
4
4
|
description = "A modern pure ASGI/WSGI Python framework for building schema-first REST and JSON-RPC APIs with SQLAlchemy models, typed validation, lifecycle hooks, and engine extension support."
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
readme = "README.md"
|
|
@@ -18,22 +18,24 @@ classifiers = [
|
|
|
18
18
|
]
|
|
19
19
|
authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
|
|
20
20
|
dependencies = [
|
|
21
|
+
"tigrbl-core",
|
|
22
|
+
"tigrbl-base",
|
|
23
|
+
"tigrbl-concrete",
|
|
24
|
+
"tigrbl-canon",
|
|
25
|
+
"tigrbl-orm",
|
|
26
|
+
"tigrbl-runtime",
|
|
27
|
+
"tigrbl-atoms",
|
|
28
|
+
"tigrbl-kernel",
|
|
29
|
+
"tigrbl-ops-oltp",
|
|
21
30
|
"pydantic>=2.0.0",
|
|
22
31
|
"sqlalchemy>=2.0",
|
|
23
32
|
"aiosqlite>=0.19.0",
|
|
24
33
|
"httpx>=0.27.0",
|
|
25
34
|
"greenlet>=3.2.3",
|
|
26
|
-
"uvicorn",
|
|
27
|
-
]
|
|
28
|
-
keywords = [
|
|
29
|
-
'tigrbl',
|
|
30
|
-
'sdk',
|
|
31
|
-
'standards',
|
|
32
|
-
'asgi',
|
|
33
|
-
'rest',
|
|
34
|
-
'rpc',
|
|
35
|
+
"uvicorn",
|
|
35
36
|
]
|
|
36
37
|
|
|
38
|
+
|
|
37
39
|
[project.optional-dependencies]
|
|
38
40
|
postgres = [
|
|
39
41
|
"asyncpg>=0.30.0",
|
|
@@ -47,7 +49,18 @@ tests = [
|
|
|
47
49
|
]
|
|
48
50
|
|
|
49
51
|
[tool.uv.sources]
|
|
52
|
+
"tigrbl-core" = { workspace = true }
|
|
53
|
+
"tigrbl-base" = { workspace = true }
|
|
54
|
+
"tigrbl-concrete" = { workspace = true }
|
|
55
|
+
"tigrbl-canon" = { workspace = true }
|
|
56
|
+
"tigrbl-orm" = { workspace = true }
|
|
57
|
+
"tigrbl-runtime" = { workspace = true }
|
|
58
|
+
"tigrbl-atoms" = { workspace = true }
|
|
59
|
+
"tigrbl-kernel" = { workspace = true }
|
|
60
|
+
"tigrbl-ops-oltp" = { workspace = true }
|
|
50
61
|
tigrbl-tests = { workspace = true }
|
|
62
|
+
tigrbl_client = { workspace = true }
|
|
63
|
+
|
|
51
64
|
|
|
52
65
|
[tool.pytest.ini_options]
|
|
53
66
|
norecursedirs = ["combined", "scripts"]
|
|
@@ -81,6 +94,7 @@ packages = [
|
|
|
81
94
|
|
|
82
95
|
[dependency-groups]
|
|
83
96
|
dev = [
|
|
97
|
+
"tigrbl_client",
|
|
84
98
|
"pytest>=8.0",
|
|
85
99
|
"pytest-asyncio>=0.24.0",
|
|
86
100
|
"pytest-xdist>=3.6.1",
|
|
@@ -86,7 +86,7 @@ Some objects also expose optional helpers:
|
|
|
86
86
|
| Column | `column_spec.py` | `_column.py` | — | `shortcuts.py` | `collect.py` | — | — |
|
|
87
87
|
| Engine | `engine_spec.py` | `_engine.py` | `decorators.py` | `shortcuts.py` | `collect.py` | `resolver.py` | `builders.py` |
|
|
88
88
|
| Op | `types.py` | `_op.py` | `decorators.py` | — | `collect.py` | — | — |
|
|
89
|
-
| API | `
|
|
89
|
+
| API | `router_spec.py` | `_api.py` | — | `shortcuts.py` | — | — | — |
|
|
90
90
|
| App | `app_spec.py` | `_app.py` | — | `shortcuts.py` | — | — | — |
|
|
91
91
|
| Table | `table_spec.py` | `_table.py` | — | `shortcuts.py` | — | — | — |
|
|
92
92
|
|