tigrbl 0.3.3.dev2__tar.gz → 0.3.4.dev2__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.3.dev2 → tigrbl-0.3.4.dev2}/PKG-INFO +1 -1
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/pyproject.toml +1 -1
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/__init__.py +2 -2
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/fastapi.py +0 -4
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/executor/types.py +5 -11
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/__init__.py +2 -1
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/jsonrpc/__init__.py +5 -1
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/jsonrpc/dispatcher.py +14 -0
- tigrbl-0.3.4.dev2/tigrbl/transport/jsonrpc/openrpc.py +116 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/__init__.py +1 -2
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/authn_abc.py +2 -1
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/LICENSE +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/_api.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/api_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/api/tigrbl_api.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/_app.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/_model_registry.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/app_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/app/tigrbl_app.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/api/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/api/common.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/api/include.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/api/resource_proxy.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/api/rpc.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/columns.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/builder.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/ctx.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/identifiers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/namespaces.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/handlers/steps.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/hooks.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/model.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/model_helpers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/model_registry.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/attach.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/collection.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/common.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/fastapi.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/helpers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/io.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/io_headers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/member.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/router.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rest/routing.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/rpc.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/schemas/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/schemas/builder.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/schemas/defaults.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/bindings/schemas/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/_column.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/column_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/field_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/core.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/jsonhints.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/planning.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/types.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/infer/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/io_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/column/storage_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/config/resolver.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/bulk.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/db.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/enum.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/filters.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/model.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/helpers/normalize.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/core/crud/ops.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/favicon.svg +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/jinja.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/pydantic.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/sqlalchemy.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/deps/starlette.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/docs/verbosity.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/_engine.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/docs/PLUGINS.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/engine_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/engine/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/_hook.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/hook_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/_op.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/model_registry.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/resolver.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/op/types.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/_RowBound.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/bootstrappable.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/bound.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/edges.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/fields.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/hierarchy.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/key_digest.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/lifecycle.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/locks.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/markers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/operations.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/ownable.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/principals.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/tenant_bound.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/upsertable.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/mixins/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/_base.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/audit.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/client.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/group.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/org.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/rbac.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/status.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/tenant.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/orm/tables/user.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/bind.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/resolver.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/response/types.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/emit/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/emit/paired_post.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/emit/paired_pre.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/out/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/out/masking.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/refresh/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/refresh/demand.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/resolve/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/resolve/assemble.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/negotiate.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/negotiation.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/render.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/renderer.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/template.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/response/templates.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/schema/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/schema/collect_in.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/schema/collect_out.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/storage/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/storage/to_stored.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/wire/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/wire/build_in.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/wire/build_out.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/wire/dump.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/atoms/wire/validate_in.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/context.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/errors/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/errors/converters.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/errors/exceptions.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/errors/mappings.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/errors/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/events.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/executor/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/executor/guards.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/executor/helpers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/executor/invoke.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/kernel.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/labels.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/opview.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/ordering.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/system.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/runtime/trace.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/_schema.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/compat.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/get_schema.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/schema_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/types.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/README.md +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/abc.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/base.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/decorators.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/default.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/session/spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/specs.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/compat.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/_base.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/_table.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/mro_collect.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/shortcuts.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/table/table_spec.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/jsonrpc/helpers.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/allow_anon_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/nested_path_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/op.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/op_config_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/op_verb_alias_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/request_extras_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/response_extras_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/table_config_provider.py +0 -0
- {tigrbl-0.3.3.dev2 → tigrbl-0.3.4.dev2}/tigrbl/types/uuid.py +0 -0
|
@@ -16,5 +16,5 @@ from .pydantic import * # noqa: F403, F401
|
|
|
16
16
|
# Re-export all FastAPI dependencies
|
|
17
17
|
from .fastapi import * # noqa: F403, F401
|
|
18
18
|
|
|
19
|
-
#
|
|
20
|
-
|
|
19
|
+
# Re-export Starlette dependencies (Request/Response live here)
|
|
20
|
+
from .starlette import * # noqa: F403, F401
|
|
@@ -4,8 +4,6 @@ from fastapi import (
|
|
|
4
4
|
FastAPI,
|
|
5
5
|
Security,
|
|
6
6
|
Depends,
|
|
7
|
-
Request,
|
|
8
|
-
Response,
|
|
9
7
|
Path as FastAPIPath,
|
|
10
8
|
Body,
|
|
11
9
|
HTTPException,
|
|
@@ -36,8 +34,6 @@ __all__ = [
|
|
|
36
34
|
"FastAPI",
|
|
37
35
|
"Security",
|
|
38
36
|
"Depends",
|
|
39
|
-
"Request",
|
|
40
|
-
"Response",
|
|
41
37
|
"Path",
|
|
42
38
|
"Body",
|
|
43
39
|
"HTTPException",
|
|
@@ -8,23 +8,17 @@ from typing import (
|
|
|
8
8
|
Mapping,
|
|
9
9
|
MutableMapping,
|
|
10
10
|
Optional,
|
|
11
|
+
Protocol,
|
|
11
12
|
Sequence,
|
|
12
13
|
Union,
|
|
13
|
-
Protocol,
|
|
14
14
|
runtime_checkable,
|
|
15
15
|
)
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Request = Any # type: ignore
|
|
17
|
+
from ...deps.starlette import Request as StarletteRequest
|
|
18
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
19
|
+
from sqlalchemy.orm import Session
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
from sqlalchemy.orm import Session # type: ignore
|
|
24
|
-
from sqlalchemy.ext.asyncio import AsyncSession # type: ignore
|
|
25
|
-
except Exception: # pragma: no cover
|
|
26
|
-
Session = Any # type: ignore
|
|
27
|
-
AsyncSession = Any # type: ignore
|
|
21
|
+
Request = StarletteRequest if StarletteRequest is not None else Any # type: ignore
|
|
28
22
|
|
|
29
23
|
|
|
30
24
|
@runtime_checkable
|
|
@@ -27,7 +27,7 @@ from __future__ import annotations
|
|
|
27
27
|
from typing import Any, Callable, Optional, Sequence
|
|
28
28
|
|
|
29
29
|
# JSON-RPC transport
|
|
30
|
-
from .jsonrpc import build_jsonrpc_router
|
|
30
|
+
from .jsonrpc import build_jsonrpc_router, build_openrpc_spec
|
|
31
31
|
|
|
32
32
|
# REST transport (aggregator over per-model routers)
|
|
33
33
|
from .rest import build_rest_router, mount_rest
|
|
@@ -67,6 +67,7 @@ def mount_jsonrpc(
|
|
|
67
67
|
__all__ = [
|
|
68
68
|
# JSON-RPC
|
|
69
69
|
"build_jsonrpc_router",
|
|
70
|
+
"build_openrpc_spec",
|
|
70
71
|
"mount_jsonrpc",
|
|
71
72
|
# REST
|
|
72
73
|
"build_rest_router",
|
|
@@ -6,14 +6,18 @@ Public helper:
|
|
|
6
6
|
- build_jsonrpc_router(
|
|
7
7
|
api, *, get_db=None, tags=("rpc",)
|
|
8
8
|
) -> Router
|
|
9
|
+
- build_openrpc_spec(api) -> dict
|
|
9
10
|
|
|
10
11
|
Usage:
|
|
11
12
|
from tigrbl.transport.jsonrpc import build_jsonrpc_router
|
|
12
13
|
app.include_router(build_jsonrpc_router(api), prefix="/rpc")
|
|
14
|
+
# OpenRPC schema (JSON-RPC equivalent of OpenAPI)
|
|
15
|
+
build_openrpc_spec(api)
|
|
13
16
|
"""
|
|
14
17
|
|
|
15
18
|
from __future__ import annotations
|
|
16
19
|
|
|
17
20
|
from .dispatcher import build_jsonrpc_router
|
|
21
|
+
from .openrpc import build_openrpc_spec
|
|
18
22
|
|
|
19
|
-
__all__ = ["build_jsonrpc_router"]
|
|
23
|
+
__all__ = ["build_jsonrpc_router", "build_openrpc_spec"]
|
|
@@ -78,6 +78,7 @@ except Exception: # pragma: no cover
|
|
|
78
78
|
from ...runtime.errors import ERROR_MESSAGES, http_exc_to_rpc
|
|
79
79
|
from ...config.constants import TIGRBL_AUTH_CONTEXT_ATTR
|
|
80
80
|
from .models import RPCRequest, RPCResponse
|
|
81
|
+
from .openrpc import build_openrpc_spec
|
|
81
82
|
from .helpers import (
|
|
82
83
|
_authorize,
|
|
83
84
|
_err,
|
|
@@ -337,6 +338,19 @@ def build_jsonrpc_router(
|
|
|
337
338
|
# extra router deps already applied via Router(dependencies=...)
|
|
338
339
|
)
|
|
339
340
|
|
|
341
|
+
def _openrpc_endpoint():
|
|
342
|
+
return build_openrpc_spec(api)
|
|
343
|
+
|
|
344
|
+
router.add_api_route(
|
|
345
|
+
path="/openrpc.json",
|
|
346
|
+
endpoint=_openrpc_endpoint,
|
|
347
|
+
methods=["GET"],
|
|
348
|
+
name="openrpc_json",
|
|
349
|
+
tags=list(tags) if tags else None,
|
|
350
|
+
summary="OpenRPC",
|
|
351
|
+
description="OpenRPC 1.2.6 schema for JSON-RPC methods.",
|
|
352
|
+
)
|
|
353
|
+
|
|
340
354
|
# Compatibility: serve same endpoint without trailing slash
|
|
341
355
|
router.add_api_route(
|
|
342
356
|
path="/",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Iterable, List, Mapping, Sequence
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from ...op import OpSpec
|
|
8
|
+
|
|
9
|
+
JsonObject = Dict[str, Any]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _iter_models(api: Any) -> List[type]:
|
|
13
|
+
seen: set[type] = set()
|
|
14
|
+
models: List[type] = []
|
|
15
|
+
|
|
16
|
+
def _add_from(container: Any) -> None:
|
|
17
|
+
if isinstance(container, Mapping):
|
|
18
|
+
items: Iterable[Any] = container.values()
|
|
19
|
+
elif isinstance(container, Sequence):
|
|
20
|
+
items = container
|
|
21
|
+
else:
|
|
22
|
+
return
|
|
23
|
+
for model in items:
|
|
24
|
+
if isinstance(model, type) and model not in seen:
|
|
25
|
+
seen.add(model)
|
|
26
|
+
models.append(model)
|
|
27
|
+
|
|
28
|
+
_add_from(getattr(api, "models", None) or {})
|
|
29
|
+
for child in getattr(api, "apis", ()) or ():
|
|
30
|
+
_add_from(getattr(child, "models", None) or {})
|
|
31
|
+
|
|
32
|
+
return models
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _iter_ops(model: type) -> Sequence[OpSpec]:
|
|
36
|
+
ops = getattr(model, "ops", None)
|
|
37
|
+
if ops is not None:
|
|
38
|
+
all_ops = getattr(ops, "all", None)
|
|
39
|
+
if all_ops is not None:
|
|
40
|
+
return all_ops
|
|
41
|
+
opspecs = getattr(model, "opspecs", None)
|
|
42
|
+
if opspecs is not None:
|
|
43
|
+
all_ops = getattr(opspecs, "all", None)
|
|
44
|
+
if all_ops is not None:
|
|
45
|
+
return all_ops
|
|
46
|
+
return ()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _schema_with_defs(schema: type[BaseModel]) -> tuple[JsonObject, JsonObject]:
|
|
50
|
+
raw = schema.model_json_schema(ref_template="#/components/schemas/{model}")
|
|
51
|
+
defs = raw.pop("$defs", {})
|
|
52
|
+
return raw, defs
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _describe_method(model: type, spec: OpSpec) -> str | None:
|
|
56
|
+
rpc_ns = getattr(model, "rpc", None)
|
|
57
|
+
rpc_call = getattr(rpc_ns, spec.alias, None)
|
|
58
|
+
if rpc_call is None:
|
|
59
|
+
return None
|
|
60
|
+
doc = getattr(rpc_call, "__doc__", None)
|
|
61
|
+
if doc:
|
|
62
|
+
return doc.strip()
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def build_openrpc_spec(api: Any) -> JsonObject:
|
|
67
|
+
info_title = getattr(api, "title", None) or getattr(api, "name", None) or "API"
|
|
68
|
+
info_version = getattr(api, "version", None) or "0.1.0"
|
|
69
|
+
spec: JsonObject = {
|
|
70
|
+
"openrpc": "1.2.6",
|
|
71
|
+
"info": {"title": f"{info_title} JSON-RPC API", "version": info_version},
|
|
72
|
+
"methods": [],
|
|
73
|
+
"components": {"schemas": {}},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
components = spec["components"]["schemas"]
|
|
77
|
+
methods: List[JsonObject] = []
|
|
78
|
+
|
|
79
|
+
for model in _iter_models(api):
|
|
80
|
+
for op in _iter_ops(model):
|
|
81
|
+
if not getattr(op, "expose_rpc", True):
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
method: JsonObject = {"name": f"{model.__name__}.{op.alias}"}
|
|
85
|
+
description = _describe_method(model, op)
|
|
86
|
+
if description:
|
|
87
|
+
method["description"] = description
|
|
88
|
+
|
|
89
|
+
alias_ns = getattr(getattr(model, "schemas", None), op.alias, None)
|
|
90
|
+
in_schema = getattr(alias_ns, "in_", None)
|
|
91
|
+
out_schema = getattr(alias_ns, "out", None)
|
|
92
|
+
|
|
93
|
+
if in_schema is not None:
|
|
94
|
+
in_json, defs = _schema_with_defs(in_schema)
|
|
95
|
+
for key, value in defs.items():
|
|
96
|
+
components.setdefault(key, value)
|
|
97
|
+
method["params"] = [
|
|
98
|
+
{"name": "params", "schema": in_json, "required": True}
|
|
99
|
+
]
|
|
100
|
+
method["paramStructure"] = "by-name"
|
|
101
|
+
else:
|
|
102
|
+
method["params"] = []
|
|
103
|
+
|
|
104
|
+
if out_schema is not None:
|
|
105
|
+
out_json, defs = _schema_with_defs(out_schema)
|
|
106
|
+
for key, value in defs.items():
|
|
107
|
+
components.setdefault(key, value)
|
|
108
|
+
method["result"] = {"name": "result", "schema": out_json}
|
|
109
|
+
|
|
110
|
+
methods.append(method)
|
|
111
|
+
|
|
112
|
+
spec["methods"] = sorted(methods, key=lambda item: item["name"])
|
|
113
|
+
return spec
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
__all__ = ["build_openrpc_spec"]
|
|
@@ -57,13 +57,12 @@ from ..deps.fastapi import (
|
|
|
57
57
|
Router,
|
|
58
58
|
Security,
|
|
59
59
|
Depends,
|
|
60
|
-
Request,
|
|
61
|
-
Response,
|
|
62
60
|
Path,
|
|
63
61
|
Body,
|
|
64
62
|
HTTPException,
|
|
65
63
|
App,
|
|
66
64
|
)
|
|
65
|
+
from ..deps.starlette import Request, Response
|
|
67
66
|
|
|
68
67
|
# ── Local Package ─────────────────────────────────────────────────────────
|
|
69
68
|
from .op import _Op, _SchemaVerb
|
|
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
|