tigrbl 0.3.13.dev1__tar.gz → 0.3.14.dev1__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.13.dev1 → tigrbl-0.3.14.dev1}/PKG-INFO +1 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/pyproject.toml +1 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/tigrbl_api.py +1 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/tigrbl_app.py +1 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rpc.py +68 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/lens.py +4 -2
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/schema.py +3 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openrpc.py +3 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/__init__.py +4 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/helpers.py +5 -1
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/LICENSE +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_api.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_route.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_router.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_routing.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/api_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/resolve.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_app.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_model_registry.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_routing_runtime.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/app_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/transport.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/common.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/include.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/resource_proxy.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/rpc.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/columns.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/builder.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/ctx.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/identifiers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/namespaces.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/steps.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/hooks.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model_helpers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model_registry.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/attach.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/collection.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/common.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/fastapi.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/helpers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/io.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/io_headers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/member.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/router.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/routing.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/builder.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/defaults.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/_column.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/column_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/field_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/core.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/jsonhints.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/planning.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/io_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/storage_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/resolver.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/bulk.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/db.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/enum.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/filters.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/model.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/normalize.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/ops.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/params.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/resolver.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/router_runtime.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/jinja.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/pydantic.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/sqlalchemy.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/docs/verbosity.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/_engine.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/docs/PLUGINS.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/engine_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/headers/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/headers/_header.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/_hook.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/exceptions.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/hook_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/base.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/cors.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/middleware.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/_op.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/model_registry.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/resolver.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/_RowBound.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/bootstrappable.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/bound.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/edges.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/fields.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/hierarchy.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/key_digest.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/lifecycle.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/locks.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/markers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/operations.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/ownable.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/principals.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/tenant_bound.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/upsertable.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/_base.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/audit.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/client.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/group.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/org.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/rbac.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/status.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/tenant.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/user.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/_request.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/adapters.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/_response.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/_transport.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/bind.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/resolver.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/paired_post.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/paired_pre.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/out/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/out/masking.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/refresh/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/refresh/demand.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/assemble.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/negotiate.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/negotiation.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/render.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/renderer.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/template.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/templates.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/collect_in.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/collect_out.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/storage/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/storage/to_stored.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/build_in.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/build_out.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/dump.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/validate_in.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/context.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/events.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/guards.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/helpers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/invoke.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/kernel.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/labels.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/opview.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/ordering.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/converters.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/exceptions.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/mappings.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/system.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/trace.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/_schema.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/compat.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/get_schema.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/schema_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/types.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/dependencies.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/_base.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/api_key.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/http_bearer.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/mutual_tls.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/oauth2.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/openid_connect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/README.md +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/abc.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/base.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/default.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/specs.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/compat.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/helpers.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/mount.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/swagger.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/favicon/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/_base.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/_table.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/mro_collect.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/shortcuts.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/table_spec.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/background.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/httpx.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/dispatcher.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/openrpc.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/decorators.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/__init__.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/allow_anon_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/authn_abc.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/nested_path_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op_config_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op_verb_alias_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/request_extras_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/response_extras_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/table_config_provider.py +0 -0
- {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/uuid.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.14.dev1
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.14.dev1"
|
|
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"
|
|
@@ -213,6 +213,7 @@ class TigrblApi(_Api):
|
|
|
213
213
|
def mount_jsonrpc(self, *, prefix: str | None = None) -> Any:
|
|
214
214
|
"""Mount a JSON-RPC router onto this TigrblApi instance."""
|
|
215
215
|
px = prefix if prefix is not None else self.jsonrpc_prefix
|
|
216
|
+
self.jsonrpc_prefix = px
|
|
216
217
|
prov = _resolver.resolve_provider(api=self)
|
|
217
218
|
get_db = prov.get_db if prov else None
|
|
218
219
|
router = _mount_jsonrpc(
|
|
@@ -428,6 +428,7 @@ class TigrblApp(_App):
|
|
|
428
428
|
def mount_jsonrpc(self, *, prefix: str | None = None) -> Any:
|
|
429
429
|
"""Mount JSON-RPC router onto this app."""
|
|
430
430
|
px = prefix if prefix is not None else self.jsonrpc_prefix
|
|
431
|
+
self.jsonrpc_prefix = px
|
|
431
432
|
prov = _resolver.resolve_provider(api=self)
|
|
432
433
|
get_db = prov.get_db if prov else None
|
|
433
434
|
router = _mount_jsonrpc(
|
|
@@ -20,6 +20,7 @@ from pydantic import BaseModel
|
|
|
20
20
|
from ..op import OpSpec
|
|
21
21
|
from ..op.types import PHASES
|
|
22
22
|
from ..runtime import executor as _executor # expects _invoke(request, db, phases, ctx)
|
|
23
|
+
from ..runtime.status import HTTPException
|
|
23
24
|
|
|
24
25
|
# Prefer Kernel phase-chains if available (atoms + system steps + hooks)
|
|
25
26
|
try:
|
|
@@ -33,6 +34,65 @@ logger.debug("Loaded module v3/bindings/rpc")
|
|
|
33
34
|
_Key = Tuple[str, str] # (alias, target)
|
|
34
35
|
|
|
35
36
|
|
|
37
|
+
_WRAPPER_KEYS = frozenset({"data", "payload", "body", "item"})
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _schema_field_names(schema: Any) -> set[str]:
|
|
41
|
+
"""Return top-level field names declared by a Pydantic schema class."""
|
|
42
|
+
if not schema or not inspect.isclass(schema) or not issubclass(schema, BaseModel):
|
|
43
|
+
return set()
|
|
44
|
+
|
|
45
|
+
fields = getattr(schema, "model_fields", None)
|
|
46
|
+
if not isinstance(fields, Mapping):
|
|
47
|
+
return set()
|
|
48
|
+
|
|
49
|
+
names: set[str] = set(fields.keys())
|
|
50
|
+
for field_name, field_info in fields.items():
|
|
51
|
+
alias = getattr(field_info, "alias", None)
|
|
52
|
+
if isinstance(alias, str) and alias:
|
|
53
|
+
names.add(alias)
|
|
54
|
+
validation_alias = getattr(field_info, "validation_alias", None)
|
|
55
|
+
if isinstance(validation_alias, str) and validation_alias:
|
|
56
|
+
names.add(validation_alias)
|
|
57
|
+
return names
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _allowed_wrapper_keys(model: type, alias: str, target: str) -> set[str]:
|
|
61
|
+
"""Wrapper-like names that are valid operation fields for this RPC method."""
|
|
62
|
+
schemas_root = getattr(model, "schemas", None)
|
|
63
|
+
alias_ns = getattr(schemas_root, alias, None) if schemas_root else None
|
|
64
|
+
if not alias_ns:
|
|
65
|
+
return set()
|
|
66
|
+
|
|
67
|
+
allowed = _schema_field_names(getattr(alias_ns, "in_", None))
|
|
68
|
+
if target.startswith("bulk_") and target != "bulk_delete":
|
|
69
|
+
allowed |= _schema_field_names(getattr(alias_ns, "in_item", None))
|
|
70
|
+
return allowed & set(_WRAPPER_KEYS)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _reject_wrapper_keys(payload: Any, *, allowed_keys: set[str] | None = None) -> None:
|
|
74
|
+
allowed = allowed_keys or set()
|
|
75
|
+
|
|
76
|
+
if isinstance(payload, Mapping):
|
|
77
|
+
disallowed = sorted(
|
|
78
|
+
k for k in payload if k in _WRAPPER_KEYS and k not in allowed
|
|
79
|
+
)
|
|
80
|
+
if disallowed:
|
|
81
|
+
raise HTTPException(
|
|
82
|
+
status_code=422,
|
|
83
|
+
detail={
|
|
84
|
+
"reason": "Wrapper keys are not allowed; params must match the operation schema.",
|
|
85
|
+
"disallowed_keys": disallowed,
|
|
86
|
+
},
|
|
87
|
+
)
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
if isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
|
|
91
|
+
for item in payload:
|
|
92
|
+
if isinstance(item, Mapping):
|
|
93
|
+
_reject_wrapper_keys(item, allowed_keys=allowed)
|
|
94
|
+
|
|
95
|
+
|
|
36
96
|
# Mapping with attribute-style access
|
|
37
97
|
class AttrDict(dict):
|
|
38
98
|
def __getattr__(self, item: str) -> Any: # pragma: no cover - trivial
|
|
@@ -99,7 +159,12 @@ def _coerce_payload(payload: Any) -> Any:
|
|
|
99
159
|
if isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
|
|
100
160
|
out: list[Any] = []
|
|
101
161
|
for item in payload:
|
|
102
|
-
if isinstance(item,
|
|
162
|
+
if isinstance(item, BaseModel):
|
|
163
|
+
try:
|
|
164
|
+
out.append(item.model_dump(exclude_none=False))
|
|
165
|
+
except Exception:
|
|
166
|
+
out.append(dict(item.__dict__))
|
|
167
|
+
elif isinstance(item, Mapping):
|
|
103
168
|
out.append(dict(item))
|
|
104
169
|
else:
|
|
105
170
|
out.append(item)
|
|
@@ -263,8 +328,10 @@ def _build_rpc_callable(model: type, sp: OpSpec) -> Callable[..., Awaitable[Any]
|
|
|
263
328
|
schemas_root = getattr(model, "schemas", None)
|
|
264
329
|
alias_ns = getattr(schemas_root, alias, None)
|
|
265
330
|
item_in_model = getattr(alias_ns, "in_item", None)
|
|
331
|
+
allowed_wrapper_keys = _allowed_wrapper_keys(model, alias, target)
|
|
266
332
|
|
|
267
333
|
raw_payload = _coerce_payload(payload)
|
|
334
|
+
_reject_wrapper_keys(raw_payload, allowed_keys=allowed_wrapper_keys)
|
|
268
335
|
if target == "bulk_delete" and not isinstance(raw_payload, Mapping):
|
|
269
336
|
raw_payload = {"ids": raw_payload}
|
|
270
337
|
if (
|
|
@@ -7,6 +7,7 @@ from ...responses import Response
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
TIGRBL_LENS_VERSION = "latest"
|
|
10
|
+
TIGRBL_LENS_CSS_URL = f"https://esm.sh/@tigrbljs/tigrbl-lens@{TIGRBL_LENS_VERSION}/dist/tigrbl-lens.css?css"
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
def _with_leading_slash(path: str) -> str:
|
|
@@ -25,7 +26,7 @@ def build_lens_html(router: Any, request: Any, *, spec_path: str) -> str:
|
|
|
25
26
|
<title>{router.title} — Lens</title>
|
|
26
27
|
<link
|
|
27
28
|
rel="stylesheet"
|
|
28
|
-
href="
|
|
29
|
+
href="{TIGRBL_LENS_CSS_URL}"
|
|
29
30
|
/>
|
|
30
31
|
<style>
|
|
31
32
|
html, body, #root {{
|
|
@@ -79,7 +80,8 @@ def mount_lens(
|
|
|
79
80
|
) -> Any:
|
|
80
81
|
"""Mount a tigrbl-lens HTML endpoint onto ``router``."""
|
|
81
82
|
|
|
82
|
-
resolved_spec_path = spec_path or "/openrpc.json"
|
|
83
|
+
resolved_spec_path = spec_path or getattr(router, "openrpc_path", "/openrpc.json")
|
|
84
|
+
resolved_spec_path = _with_leading_slash(resolved_spec_path)
|
|
83
85
|
|
|
84
86
|
def _lens_handler(request: Any) -> Response:
|
|
85
87
|
return Response.html(
|
|
@@ -24,6 +24,9 @@ def openapi(router: Any) -> dict[str, Any]:
|
|
|
24
24
|
continue
|
|
25
25
|
|
|
26
26
|
canonical_path = route.path_template.rstrip("/") or "/"
|
|
27
|
+
if canonical_path == "/openrpc.json" or route.name == "openrpc_json":
|
|
28
|
+
continue
|
|
29
|
+
|
|
27
30
|
path_item = paths.setdefault(canonical_path, {})
|
|
28
31
|
for method in sorted(route.methods):
|
|
29
32
|
status_code = route.status_code or status.HTTP_200_OK
|
|
@@ -179,12 +179,14 @@ def mount_openrpc(
|
|
|
179
179
|
"""Mount an OpenRPC JSON endpoint onto ``router`` or ``api``."""
|
|
180
180
|
|
|
181
181
|
target_router = router if router is not None else api
|
|
182
|
+
normalized_path = _with_leading_slash(path)
|
|
183
|
+
setattr(api, "openrpc_path", normalized_path)
|
|
182
184
|
|
|
183
185
|
def _openrpc_endpoint(request: Any) -> Response:
|
|
184
186
|
return Response.json(build_openrpc_spec(api, request=request))
|
|
185
187
|
|
|
186
188
|
target_router.add_api_route(
|
|
187
|
-
|
|
189
|
+
normalized_path,
|
|
188
190
|
_openrpc_endpoint,
|
|
189
191
|
methods=["GET"],
|
|
190
192
|
name=name,
|
|
@@ -71,10 +71,13 @@ def mount_jsonrpc(
|
|
|
71
71
|
Optional tags applied to the mounted "/rpc" endpoint. Defaults to
|
|
72
72
|
``("rpc",)``.
|
|
73
73
|
"""
|
|
74
|
+
normalized_prefix = prefix if str(prefix).startswith("/") else f"/{prefix}"
|
|
75
|
+
setattr(api, "jsonrpc_prefix", normalized_prefix.rstrip("/") or "/")
|
|
76
|
+
|
|
74
77
|
router = build_jsonrpc_router(api, get_db=get_db, tags=tags)
|
|
75
78
|
include_router = getattr(app, "include_router", None)
|
|
76
79
|
if callable(include_router):
|
|
77
|
-
include_router(router, prefix=
|
|
80
|
+
include_router(router, prefix=normalized_prefix)
|
|
78
81
|
|
|
79
82
|
return router
|
|
80
83
|
|
|
@@ -35,7 +35,11 @@ def _normalize_params(params: Any) -> Any:
|
|
|
35
35
|
if params is None:
|
|
36
36
|
return {}
|
|
37
37
|
if isinstance(params, Mapping):
|
|
38
|
-
|
|
38
|
+
normalized = dict(params)
|
|
39
|
+
nested = normalized.get("params")
|
|
40
|
+
if set(normalized) == {"params"} and isinstance(nested, Mapping):
|
|
41
|
+
return dict(nested)
|
|
42
|
+
return normalized
|
|
39
43
|
if isinstance(params, Sequence) and not isinstance(params, (str, bytes)):
|
|
40
44
|
return list(params)
|
|
41
45
|
raise HTTPException(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|