tigrbl 0.3.17.dev11__tar.gz → 0.3.17.dev12__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.17.dev11 → tigrbl-0.3.17.dev12}/PKG-INFO +5 -2
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/pyproject.toml +12 -10
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/__init__.py +4 -0
- tigrbl-0.3.17.dev11/tigrbl/_base/__init__.py +0 -24
- tigrbl-0.3.17.dev11/tigrbl/_base/_hook_base.py +0 -25
- tigrbl-0.3.17.dev11/tigrbl/_base/_middleware_base.py +0 -141
- tigrbl-0.3.17.dev11/tigrbl/_base/_op_base.py +0 -12
- tigrbl-0.3.17.dev11/tigrbl/_base/_request_base.py +0 -32
- tigrbl-0.3.17.dev11/tigrbl/_base/_response_base.py +0 -231
- tigrbl-0.3.17.dev11/tigrbl/_base/_schema_base.py +0 -14
- tigrbl-0.3.17.dev11/tigrbl/_base/_security_base.py +0 -69
- tigrbl-0.3.17.dev11/tigrbl/_base/_session_abc.py +0 -47
- tigrbl-0.3.17.dev11/tigrbl/_base/_session_base.py +0 -132
- tigrbl-0.3.17.dev11/tigrbl/_base/_storage.py +0 -13
- tigrbl-0.3.17.dev11/tigrbl/_base/_table_base.py +0 -443
- tigrbl-0.3.17.dev11/tigrbl/_base/_table_registry_base.py +0 -55
- tigrbl-0.3.17.dev11/tigrbl/_concrete/__init__.py +0 -44
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_alias.py +0 -42
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_app.py +0 -180
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_background.py +0 -29
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_body.py +0 -27
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_column.py +0 -96
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_cors_middleware.py +0 -103
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_engine.py +0 -187
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_file_response.py +0 -26
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_headers.py +0 -142
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_hook.py +0 -12
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_html_response.py +0 -18
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_httpx.py +0 -25
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_json_response.py +0 -24
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_middleware.py +0 -45
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_op.py +0 -31
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_op_registry.py +0 -301
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_plain_text_response.py +0 -18
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_redirect_response.py +0 -19
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_request.py +0 -270
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_request_adapters.py +0 -68
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_response.py +0 -35
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_route.py +0 -122
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_router.py +0 -207
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_routing.py +0 -139
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_schema.py +0 -28
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_security/api_key.py +0 -57
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_security/http_bearer.py +0 -74
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_security/mutual_tls.py +0 -27
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_security/oauth2.py +0 -28
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_security/openid_connect.py +0 -31
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_session.py +0 -112
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_storage.py +0 -13
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_streaming_response.py +0 -35
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_table.py +0 -103
- tigrbl-0.3.17.dev11/tigrbl/_concrete/_table_registry.py +0 -10
- tigrbl-0.3.17.dev11/tigrbl/_concrete/dependencies.py +0 -21
- tigrbl-0.3.17.dev11/tigrbl/_concrete/tigrbl_app.py +0 -895
- tigrbl-0.3.17.dev11/tigrbl/_concrete/tigrbl_router.py +0 -418
- tigrbl-0.3.17.dev11/tigrbl/_spec/__init__.py +0 -67
- tigrbl-0.3.17.dev11/tigrbl/_spec/alias_spec.py +0 -35
- tigrbl-0.3.17.dev11/tigrbl/_spec/app_spec.py +0 -137
- tigrbl-0.3.17.dev11/tigrbl/_spec/binding_spec.py +0 -78
- tigrbl-0.3.17.dev11/tigrbl/_spec/column_spec.py +0 -40
- tigrbl-0.3.17.dev11/tigrbl/_spec/engine_spec.py +0 -359
- tigrbl-0.3.17.dev11/tigrbl/_spec/field_spec.py +0 -32
- tigrbl-0.3.17.dev11/tigrbl/_spec/hook_spec.py +0 -24
- tigrbl-0.3.17.dev11/tigrbl/_spec/io_spec.py +0 -136
- tigrbl-0.3.17.dev11/tigrbl/_spec/middleware_spec.py +0 -28
- tigrbl-0.3.17.dev11/tigrbl/_spec/op_spec.py +0 -110
- tigrbl-0.3.17.dev11/tigrbl/_spec/request_spec.py +0 -19
- tigrbl-0.3.17.dev11/tigrbl/_spec/response_spec.py +0 -34
- tigrbl-0.3.17.dev11/tigrbl/_spec/response_types.py +0 -12
- tigrbl-0.3.17.dev11/tigrbl/_spec/router_spec.py +0 -25
- tigrbl-0.3.17.dev11/tigrbl/_spec/schema_spec.py +0 -20
- tigrbl-0.3.17.dev11/tigrbl/_spec/session_spec.py +0 -160
- tigrbl-0.3.17.dev11/tigrbl/_spec/shortcuts_spec.py +0 -8
- tigrbl-0.3.17.dev11/tigrbl/_spec/storage_spec.py +0 -72
- tigrbl-0.3.17.dev11/tigrbl/_spec/table_registry_spec.py +0 -14
- tigrbl-0.3.17.dev11/tigrbl/_spec/table_spec.py +0 -73
- tigrbl-0.3.17.dev11/tigrbl/core/__init__.py +0 -47
- tigrbl-0.3.17.dev11/tigrbl/core/crud/__init__.py +0 -43
- tigrbl-0.3.17.dev11/tigrbl/core/crud/bulk.py +0 -167
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/__init__.py +0 -76
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/db.py +0 -91
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/enum.py +0 -85
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/filters.py +0 -161
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/model.py +0 -136
- tigrbl-0.3.17.dev11/tigrbl/core/crud/helpers/normalize.py +0 -98
- tigrbl-0.3.17.dev11/tigrbl/core/crud/ops.py +0 -298
- tigrbl-0.3.17.dev11/tigrbl/core/crud/params.py +0 -50
- tigrbl-0.3.17.dev11/tigrbl/mapping/__init__.py +0 -60
- tigrbl-0.3.17.dev11/tigrbl/mapping/app_mro_collect.py +0 -14
- tigrbl-0.3.17.dev11/tigrbl/mapping/apply.py +0 -98
- tigrbl-0.3.17.dev11/tigrbl/mapping/collect.py +0 -60
- tigrbl-0.3.17.dev11/tigrbl/mapping/collect_decorated_schemas.py +0 -78
- tigrbl-0.3.17.dev11/tigrbl/mapping/column_mro_collect.py +0 -124
- tigrbl-0.3.17.dev11/tigrbl/mapping/columns.py +0 -49
- tigrbl-0.3.17.dev11/tigrbl/mapping/config_resolver.py +0 -299
- tigrbl-0.3.17.dev11/tigrbl/mapping/context.py +0 -48
- tigrbl-0.3.17.dev11/tigrbl/mapping/core_resolver.py +0 -102
- tigrbl-0.3.17.dev11/tigrbl/mapping/diagnostics.py +0 -20
- tigrbl-0.3.17.dev11/tigrbl/mapping/engine_resolver.py +0 -379
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/__init__.py +0 -10
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/builder.py +0 -118
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/ctx.py +0 -85
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/identifiers.py +0 -227
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/namespaces.py +0 -50
- tigrbl-0.3.17.dev11/tigrbl/mapping/handlers/steps.py +0 -276
- tigrbl-0.3.17.dev11/tigrbl/mapping/hook_mro_collect.py +0 -121
- tigrbl-0.3.17.dev11/tigrbl/mapping/hooks.py +0 -325
- tigrbl-0.3.17.dev11/tigrbl/mapping/mapping_resolver.py +0 -5
- tigrbl-0.3.17.dev11/tigrbl/mapping/model.py +0 -33
- tigrbl-0.3.17.dev11/tigrbl/mapping/model_helpers.py +0 -151
- tigrbl-0.3.17.dev11/tigrbl/mapping/model_registry.py +0 -85
- tigrbl-0.3.17.dev11/tigrbl/mapping/op_mro_collect.py +0 -136
- tigrbl-0.3.17.dev11/tigrbl/mapping/op_resolver.py +0 -216
- tigrbl-0.3.17.dev11/tigrbl/mapping/passes.py +0 -74
- tigrbl-0.3.17.dev11/tigrbl/mapping/plan.py +0 -54
- tigrbl-0.3.17.dev11/tigrbl/mapping/precedence.py +0 -45
- tigrbl-0.3.17.dev11/tigrbl/mapping/responses_resolver.py +0 -83
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/__init__.py +0 -7
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/attach.py +0 -25
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/collection.py +0 -290
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/common.py +0 -121
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/helpers.py +0 -108
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/io.py +0 -335
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/io_headers.py +0 -49
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/member.py +0 -200
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/router.py +0 -319
- tigrbl-0.3.17.dev11/tigrbl/mapping/rest/routing.py +0 -135
- tigrbl-0.3.17.dev11/tigrbl/mapping/router/common.py +0 -100
- tigrbl-0.3.17.dev11/tigrbl/mapping/router/include.py +0 -466
- tigrbl-0.3.17.dev11/tigrbl/mapping/router/resource_proxy.py +0 -104
- tigrbl-0.3.17.dev11/tigrbl/mapping/router/rpc.py +0 -153
- tigrbl-0.3.17.dev11/tigrbl/mapping/router_mro_collect.py +0 -45
- tigrbl-0.3.17.dev11/tigrbl/mapping/rpc.py +0 -493
- tigrbl-0.3.17.dev11/tigrbl/mapping/runtime_routes.py +0 -293
- tigrbl-0.3.17.dev11/tigrbl/mapping/schemas/__init__.py +0 -10
- tigrbl-0.3.17.dev11/tigrbl/mapping/schemas/builder.py +0 -347
- tigrbl-0.3.17.dev11/tigrbl/mapping/schemas/defaults.py +0 -259
- tigrbl-0.3.17.dev11/tigrbl/mapping/schemas/utils.py +0 -192
- tigrbl-0.3.17.dev11/tigrbl/mapping/spec_normalization.py +0 -110
- tigrbl-0.3.17.dev11/tigrbl/mapping/table.py +0 -5
- tigrbl-0.3.17.dev11/tigrbl/mapping/table_mro_collect.py +0 -14
- tigrbl-0.3.17.dev11/tigrbl/mapping/traversal.py +0 -196
- tigrbl-0.3.17.dev11/tigrbl/orm/__init__.py +0 -1
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/_RowBound.py +0 -83
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/__init__.py +0 -95
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/bootstrappable.py +0 -113
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/bound.py +0 -47
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/edges.py +0 -40
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/fields.py +0 -165
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/hierarchy.py +0 -54
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/key_digest.py +0 -44
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/lifecycle.py +0 -115
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/locks.py +0 -51
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/markers.py +0 -16
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/operations.py +0 -57
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/ownable.py +0 -337
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/principals.py +0 -98
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/tenant_bound.py +0 -301
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/upsertable.py +0 -118
- tigrbl-0.3.17.dev11/tigrbl/orm/mixins/utils.py +0 -49
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/__init__.py +0 -73
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/_base.py +0 -7
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/audit.py +0 -56
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/client.py +0 -25
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/group.py +0 -29
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/org.py +0 -30
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/rbac.py +0 -76
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/status.py +0 -106
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/tenant.py +0 -22
- tigrbl-0.3.17.dev11/tigrbl/orm/tables/user.py +0 -39
- tigrbl-0.3.17.dev11/tigrbl/runtime/README.md +0 -180
- tigrbl-0.3.17.dev11/tigrbl/runtime/__init__.py +0 -20
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/__init__.py +0 -111
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/dep/__init__.py +0 -15
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/dep/extra.py +0 -104
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/dep/security.py +0 -114
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/__init__.py +0 -43
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/asgi_send.py +0 -228
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/envelope_apply.py +0 -101
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/headers_apply.py +0 -58
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/http_finalize.py +0 -43
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/out_dump.py +0 -33
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/result_normalize.py +0 -35
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/egress/to_transport_response.py +0 -125
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/emit/__init__.py +0 -42
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/emit/paired_post.py +0 -158
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/emit/paired_pre.py +0 -106
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -120
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/__init__.py +0 -58
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/attach_compiled.py +0 -32
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/body_peek.py +0 -29
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/body_read.py +0 -66
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/ctx_init.py +0 -27
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/headers_parse.py +0 -67
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/method_extract.py +0 -45
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/metrics_start.py +0 -27
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/path_extract.py +0 -46
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/query_parse.py +0 -101
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/raw_from_scope.py +0 -124
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/request_body_apply.py +0 -26
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/ingress/request_from_scope.py +0 -33
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/out/__init__.py +0 -38
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/out/masking.py +0 -135
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/refresh/__init__.py +0 -38
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/refresh/demand.py +0 -130
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/resolve/__init__.py +0 -40
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/resolve/assemble.py +0 -167
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -152
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/__init__.py +0 -19
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -57
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/negotiate.py +0 -30
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/negotiation.py +0 -43
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/render.py +0 -82
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/renderer.py +0 -117
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/template.py +0 -44
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/response/templates.py +0 -88
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/__init__.py +0 -42
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/binding_match.py +0 -155
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/binding_policy_apply.py +0 -82
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/ctx_finalize.py +0 -142
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/op_resolve.py +0 -67
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/params_normalize.py +0 -22
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/path_params_extract.py +0 -21
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/payload_select.py +0 -222
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/plan_select.py +0 -31
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/protocol_detect.py +0 -51
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/rpc_envelope_parse.py +0 -135
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/route/rpc_method_match.py +0 -39
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/schema/__init__.py +0 -40
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/schema/collect_in.py +0 -21
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/schema/collect_out.py +0 -21
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/storage/__init__.py +0 -38
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/storage/to_stored.py +0 -167
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/sys/__init__.py +0 -26
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/sys/commit_tx.py +0 -16
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/sys/handler_persistence.py +0 -38
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/sys/start_tx.py +0 -16
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/wire/__init__.py +0 -45
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/wire/build_in.py +0 -287
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/wire/build_out.py +0 -99
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/wire/dump.py +0 -270
- tigrbl-0.3.17.dev11/tigrbl/runtime/atoms/wire/validate_in.py +0 -259
- tigrbl-0.3.17.dev11/tigrbl/runtime/context.py +0 -206
- tigrbl-0.3.17.dev11/tigrbl/runtime/events.py +0 -435
- tigrbl-0.3.17.dev11/tigrbl/runtime/exceptions.py +0 -18
- tigrbl-0.3.17.dev11/tigrbl/runtime/executor/__init__.py +0 -6
- tigrbl-0.3.17.dev11/tigrbl/runtime/executor/guards.py +0 -132
- tigrbl-0.3.17.dev11/tigrbl/runtime/executor/helpers.py +0 -194
- tigrbl-0.3.17.dev11/tigrbl/runtime/executor/invoke.py +0 -242
- tigrbl-0.3.17.dev11/tigrbl/runtime/executor/types.py +0 -128
- tigrbl-0.3.17.dev11/tigrbl/runtime/gw/__init__.py +0 -4
- tigrbl-0.3.17.dev11/tigrbl/runtime/gw/invoke.py +0 -345
- tigrbl-0.3.17.dev11/tigrbl/runtime/gw/raw.py +0 -26
- tigrbl-0.3.17.dev11/tigrbl/runtime/hook_types.py +0 -60
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/__init__.py +0 -49
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/atoms.py +0 -234
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/cache.py +0 -85
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/core.py +0 -483
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/models.py +0 -124
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/opview_compiler.py +0 -99
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel/payload.py +0 -64
- tigrbl-0.3.17.dev11/tigrbl/runtime/kernel.py +0 -667
- tigrbl-0.3.17.dev11/tigrbl/runtime/labels.py +0 -369
- tigrbl-0.3.17.dev11/tigrbl/runtime/opview.py +0 -89
- tigrbl-0.3.17.dev11/tigrbl/runtime/ordering.py +0 -331
- tigrbl-0.3.17.dev11/tigrbl/runtime/status/__init__.py +0 -63
- tigrbl-0.3.17.dev11/tigrbl/runtime/status/converters.py +0 -222
- tigrbl-0.3.17.dev11/tigrbl/runtime/status/exceptions.py +0 -149
- tigrbl-0.3.17.dev11/tigrbl/runtime/status/mappings.py +0 -94
- tigrbl-0.3.17.dev11/tigrbl/runtime/status/utils.py +0 -114
- tigrbl-0.3.17.dev11/tigrbl/runtime/system.py +0 -338
- tigrbl-0.3.17.dev11/tigrbl/runtime/trace.py +0 -330
- tigrbl-0.3.17.dev11/tigrbl/types/__init__.py +0 -187
- tigrbl-0.3.17.dev11/tigrbl/types/allow_anon_provider.py +0 -19
- tigrbl-0.3.17.dev11/tigrbl/types/authn_abc.py +0 -31
- tigrbl-0.3.17.dev11/tigrbl/types/nested_path_provider.py +0 -22
- tigrbl-0.3.17.dev11/tigrbl/types/op.py +0 -35
- tigrbl-0.3.17.dev11/tigrbl/types/op_config_provider.py +0 -17
- tigrbl-0.3.17.dev11/tigrbl/types/op_verb_alias_provider.py +0 -33
- tigrbl-0.3.17.dev11/tigrbl/types/request_extras_provider.py +0 -22
- tigrbl-0.3.17.dev11/tigrbl/types/response_extras_provider.py +0 -22
- tigrbl-0.3.17.dev11/tigrbl/types/table_config_provider.py +0 -13
- tigrbl-0.3.17.dev11/tigrbl/types/uuid.py +0 -55
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/LICENSE +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/README.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/README.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/README.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/core.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/jsonhints.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/planning.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/types.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/utils.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/engine.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/hook.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/middlewares.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/op.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/response.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/rest.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/router.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/schema.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/decorators/session.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/docs/column_specs.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/docs/session.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/docs/verbosity.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/docs/PLUGINS.md +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/hook/exceptions.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/middlewares/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/op/types.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/requests.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/types.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/security/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/security/dependencies.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/app.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/column.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/engine.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/hook.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/op.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/responses.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/router.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/schema.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/table.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/specs.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/lens.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/helpers.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/mount.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/schema.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openrpc.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/swagger.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/favicon/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/helpers.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/utils/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/utils/schema.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/vendor/__init__.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/vendor/jinja.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/vendor/pydantic.py +0 -0
- {tigrbl-0.3.17.dev11 → tigrbl-0.3.17.dev12}/tigrbl/vendor/sqlalchemy.py +0 -0
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl
|
|
3
|
-
Version: 0.3.17.
|
|
3
|
+
Version: 0.3.17.dev12
|
|
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,10 @@ 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-canon
|
|
30
|
+
Requires-Dist: tigrbl-concrete
|
|
31
|
+
Requires-Dist: tigrbl-orm
|
|
32
|
+
Requires-Dist: tigrbl-runtime
|
|
30
33
|
Requires-Dist: tigrbl-tests ; extra == "tests"
|
|
31
34
|
Requires-Dist: uvicorn
|
|
32
35
|
Description-Content-Type: text/markdown
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl"
|
|
3
|
-
version = "0.3.17.
|
|
3
|
+
version = "0.3.17.dev12"
|
|
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,19 @@ classifiers = [
|
|
|
18
18
|
]
|
|
19
19
|
authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
|
|
20
20
|
dependencies = [
|
|
21
|
+
"tigrbl-concrete",
|
|
22
|
+
"tigrbl-canon",
|
|
23
|
+
"tigrbl-runtime",
|
|
24
|
+
"tigrbl-orm",
|
|
21
25
|
"pydantic>=2.0.0",
|
|
22
26
|
"sqlalchemy>=2.0",
|
|
23
27
|
"aiosqlite>=0.19.0",
|
|
24
28
|
"httpx>=0.27.0",
|
|
25
29
|
"greenlet>=3.2.3",
|
|
26
|
-
"uvicorn",
|
|
27
|
-
]
|
|
28
|
-
keywords = [
|
|
29
|
-
'tigrbl',
|
|
30
|
-
'sdk',
|
|
31
|
-
'standards',
|
|
32
|
-
'asgi',
|
|
33
|
-
'rest',
|
|
34
|
-
'rpc',
|
|
30
|
+
"uvicorn",
|
|
35
31
|
]
|
|
36
32
|
|
|
33
|
+
|
|
37
34
|
[project.optional-dependencies]
|
|
38
35
|
postgres = [
|
|
39
36
|
"asyncpg>=0.30.0",
|
|
@@ -47,9 +44,14 @@ tests = [
|
|
|
47
44
|
]
|
|
48
45
|
|
|
49
46
|
[tool.uv.sources]
|
|
47
|
+
"tigrbl-concrete" = { workspace = true }
|
|
48
|
+
"tigrbl-canon" = { workspace = true }
|
|
49
|
+
"tigrbl-runtime" = { workspace = true }
|
|
50
|
+
"tigrbl-orm" = { workspace = true }
|
|
50
51
|
tigrbl-tests = { workspace = true }
|
|
51
52
|
tigrbl_client = { workspace = true }
|
|
52
53
|
|
|
54
|
+
|
|
53
55
|
[tool.pytest.ini_options]
|
|
54
56
|
norecursedirs = ["combined", "scripts"]
|
|
55
57
|
testpaths = ["../tigrbl_tests/tests"]
|
|
@@ -9,6 +9,10 @@ register RPC & REST, and (optionally) mount JSON-RPC and diagnostics.
|
|
|
9
9
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
|
+
from pkgutil import extend_path
|
|
13
|
+
|
|
14
|
+
__path__ = extend_path(__path__, __name__)
|
|
15
|
+
|
|
12
16
|
from ._concrete import Router
|
|
13
17
|
|
|
14
18
|
# ── OpSpec (source of truth) ───────────────────────────────────────────────────
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"""Base class implementations for tigrbl internals."""
|
|
2
|
-
|
|
3
|
-
from ._hook_base import HookBase
|
|
4
|
-
from ._storage import ForeignKeyBase
|
|
5
|
-
from ._op_base import OpBase
|
|
6
|
-
from ._request_base import RequestBase
|
|
7
|
-
from ._schema_base import SchemaBase
|
|
8
|
-
from ._session_abc import SessionABC
|
|
9
|
-
from ._session_base import TigrblSessionBase
|
|
10
|
-
from ._table_base import TableBase
|
|
11
|
-
from ._table_registry_base import TableRegistryBase
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
__all__ = [
|
|
15
|
-
"HookBase",
|
|
16
|
-
"ForeignKeyBase",
|
|
17
|
-
"OpBase",
|
|
18
|
-
"RequestBase",
|
|
19
|
-
"SchemaBase",
|
|
20
|
-
"SessionABC",
|
|
21
|
-
"TigrblSessionBase",
|
|
22
|
-
"TableBase",
|
|
23
|
-
"TableRegistryBase",
|
|
24
|
-
]
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"""Base runtime hook wrapper for Tigrbl v3."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from dataclasses import dataclass
|
|
6
|
-
from typing import Iterable, Optional, Union
|
|
7
|
-
|
|
8
|
-
from ..hook.types import HookPhase, StepFn
|
|
9
|
-
from .._spec.hook_spec import HookSpec
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@dataclass(frozen=True, slots=True)
|
|
13
|
-
class HookBase(HookSpec):
|
|
14
|
-
"""Base hook bound to a phase and one or more ops."""
|
|
15
|
-
|
|
16
|
-
phase: HookPhase
|
|
17
|
-
fn: StepFn
|
|
18
|
-
ops: Union[str, Iterable[str]] = "*"
|
|
19
|
-
order: int = 0
|
|
20
|
-
when: Optional[object] = None
|
|
21
|
-
name: Optional[str] = None
|
|
22
|
-
description: Optional[str] = None
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
__all__ = ["HookBase"]
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
"""Request/response middleware base with ``dispatch`` + ``call_next`` semantics."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any
|
|
6
|
-
from urllib.parse import urlencode
|
|
7
|
-
|
|
8
|
-
from tigrbl._concrete._request import Request
|
|
9
|
-
from tigrbl._concrete._request_adapters import request_from_asgi
|
|
10
|
-
from tigrbl._concrete._response import Response
|
|
11
|
-
from tigrbl.runtime.atoms.egress.asgi_send import finalize_transport_response
|
|
12
|
-
|
|
13
|
-
from .._spec.middleware_spec import MiddlewareSpec, ASGIReceive, ASGISend, Message
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class MiddlewareBase(MiddlewareSpec):
|
|
17
|
-
"""Base middleware for intercepting HTTP requests in ASGI mode."""
|
|
18
|
-
|
|
19
|
-
async def dispatch(
|
|
20
|
-
self,
|
|
21
|
-
request: Request,
|
|
22
|
-
call_next: Any,
|
|
23
|
-
) -> Response:
|
|
24
|
-
"""Process the request and optionally delegate to downstream middleware/app."""
|
|
25
|
-
|
|
26
|
-
return await call_next(request)
|
|
27
|
-
|
|
28
|
-
@staticmethod
|
|
29
|
-
def _scope_from_request(scope: dict[str, Any], request: Request) -> dict[str, Any]:
|
|
30
|
-
query_string = urlencode(
|
|
31
|
-
[
|
|
32
|
-
(name, value)
|
|
33
|
-
for name, values in request.query.items()
|
|
34
|
-
for value in values
|
|
35
|
-
],
|
|
36
|
-
doseq=True,
|
|
37
|
-
).encode("latin-1")
|
|
38
|
-
return {
|
|
39
|
-
**scope,
|
|
40
|
-
"method": request.method,
|
|
41
|
-
"path": request.path,
|
|
42
|
-
"query_string": query_string,
|
|
43
|
-
"headers": [
|
|
44
|
-
(key.encode("latin-1"), value.encode("latin-1"))
|
|
45
|
-
for key, value in request.headers.items()
|
|
46
|
-
],
|
|
47
|
-
"root_path": request.script_name,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async def asgi(
|
|
51
|
-
self,
|
|
52
|
-
scope: dict[str, Any],
|
|
53
|
-
receive: ASGIReceive,
|
|
54
|
-
send: ASGISend,
|
|
55
|
-
) -> None:
|
|
56
|
-
if scope.get("type") != "http":
|
|
57
|
-
await self.app(scope, receive, send)
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
request_body = b""
|
|
61
|
-
more_body = True
|
|
62
|
-
while more_body:
|
|
63
|
-
message = await receive()
|
|
64
|
-
request_body += message.get("body", b"")
|
|
65
|
-
more_body = message.get("more_body", False)
|
|
66
|
-
|
|
67
|
-
request = request_from_asgi(None, scope, request_body)
|
|
68
|
-
|
|
69
|
-
async def call_next(forward_request: Request | None = None) -> Response:
|
|
70
|
-
target_request = forward_request or request
|
|
71
|
-
target_scope = self._scope_from_request(scope, target_request)
|
|
72
|
-
|
|
73
|
-
messages: list[Message] = []
|
|
74
|
-
body_sent = False
|
|
75
|
-
|
|
76
|
-
async def receive_for_app() -> Message:
|
|
77
|
-
nonlocal body_sent
|
|
78
|
-
if body_sent:
|
|
79
|
-
return {"type": "http.request", "body": b"", "more_body": False}
|
|
80
|
-
body_sent = True
|
|
81
|
-
return {
|
|
82
|
-
"type": "http.request",
|
|
83
|
-
"body": target_request.body,
|
|
84
|
-
"more_body": False,
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async def send_from_app(message: Message) -> None:
|
|
88
|
-
messages.append(message)
|
|
89
|
-
|
|
90
|
-
await self.app(target_scope, receive_for_app, send_from_app)
|
|
91
|
-
|
|
92
|
-
start = next(
|
|
93
|
-
message
|
|
94
|
-
for message in messages
|
|
95
|
-
if message.get("type") == "http.response.start"
|
|
96
|
-
)
|
|
97
|
-
raw_headers = list(start.get("headers", []))
|
|
98
|
-
body = b"".join(
|
|
99
|
-
message.get("body", b"")
|
|
100
|
-
for message in messages
|
|
101
|
-
if message.get("type") == "http.response.body"
|
|
102
|
-
)
|
|
103
|
-
headers, finalized_body = finalize_transport_response(
|
|
104
|
-
target_scope,
|
|
105
|
-
int(start.get("status", 200)),
|
|
106
|
-
raw_headers,
|
|
107
|
-
body,
|
|
108
|
-
)
|
|
109
|
-
return Response(
|
|
110
|
-
status_code=int(start.get("status", 200)),
|
|
111
|
-
headers=[
|
|
112
|
-
(key.decode("latin-1"), value.decode("latin-1"))
|
|
113
|
-
for key, value in headers
|
|
114
|
-
],
|
|
115
|
-
body=finalized_body,
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
response = await self.dispatch(request, call_next)
|
|
119
|
-
headers, finalized_body = finalize_transport_response(
|
|
120
|
-
scope,
|
|
121
|
-
response.status_code,
|
|
122
|
-
response.raw_headers,
|
|
123
|
-
response.body,
|
|
124
|
-
)
|
|
125
|
-
await send(
|
|
126
|
-
{
|
|
127
|
-
"type": "http.response.start",
|
|
128
|
-
"status": response.status_code,
|
|
129
|
-
"headers": headers,
|
|
130
|
-
}
|
|
131
|
-
)
|
|
132
|
-
await send(
|
|
133
|
-
{
|
|
134
|
-
"type": "http.response.body",
|
|
135
|
-
"body": finalized_body,
|
|
136
|
-
"more_body": False,
|
|
137
|
-
}
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
__all__ = ["MiddlewareBase"]
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from .._spec.request_spec import RequestSpec
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class RequestBase(RequestSpec):
|
|
9
|
-
"""Base request model behavior shared by concrete request implementations."""
|
|
10
|
-
|
|
11
|
-
@classmethod
|
|
12
|
-
def from_scope(
|
|
13
|
-
cls,
|
|
14
|
-
scope: dict[str, Any],
|
|
15
|
-
receive: Any | None = None,
|
|
16
|
-
*,
|
|
17
|
-
app: Any | None = None,
|
|
18
|
-
state: Any | None = None,
|
|
19
|
-
) -> "RequestBase":
|
|
20
|
-
"""Construct a request from an ASGI scope.
|
|
21
|
-
|
|
22
|
-
Middleware/tests may resolve ``Request`` through base/spec surfaces during
|
|
23
|
-
import cycles. Delegate to the concrete request model to keep
|
|
24
|
-
``Request.from_scope(...)`` consistently available.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
from tigrbl._concrete._request import Request
|
|
28
|
-
|
|
29
|
-
return Request.from_scope(scope, receive, app=app, state=state)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
__all__ = ["RequestBase"]
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json as json_module
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
from http.cookies import SimpleCookie
|
|
6
|
-
from typing import Any, Mapping
|
|
7
|
-
|
|
8
|
-
from tigrbl._concrete._headers import HeaderCookies, Headers
|
|
9
|
-
|
|
10
|
-
from .._spec.response_spec import ResponseSpec, TemplateSpec
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class _JSONDualMethod:
|
|
14
|
-
def __get__(
|
|
15
|
-
self,
|
|
16
|
-
obj: "ResponseBase" | None,
|
|
17
|
-
owner: type["ResponseBase"],
|
|
18
|
-
):
|
|
19
|
-
if obj is None:
|
|
20
|
-
|
|
21
|
-
def _factory(
|
|
22
|
-
data: Any,
|
|
23
|
-
status_code: int = 200,
|
|
24
|
-
headers: Mapping[str, str] | None = None,
|
|
25
|
-
) -> "ResponseBase":
|
|
26
|
-
return owner.from_json(data, status_code=status_code, headers=headers)
|
|
27
|
-
|
|
28
|
-
return _factory
|
|
29
|
-
|
|
30
|
-
def _instance_json() -> Any:
|
|
31
|
-
return obj.json_body()
|
|
32
|
-
|
|
33
|
-
return _instance_json
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class ResponseBase(ResponseSpec):
|
|
37
|
-
"""Concrete HTTP response object that also implements ``ResponseSpec``."""
|
|
38
|
-
|
|
39
|
-
json = _JSONDualMethod()
|
|
40
|
-
|
|
41
|
-
def __init__(
|
|
42
|
-
self,
|
|
43
|
-
*,
|
|
44
|
-
status_code: int = 200,
|
|
45
|
-
headers: Mapping[str, str] | list[tuple[str, str]] | None = None,
|
|
46
|
-
body: bytes | None = None,
|
|
47
|
-
content: bytes | None = None,
|
|
48
|
-
media_type: str | None = None,
|
|
49
|
-
kind: str = "auto",
|
|
50
|
-
envelope: bool | None = None,
|
|
51
|
-
template: TemplateSpec | None = None,
|
|
52
|
-
filename: str | None = None,
|
|
53
|
-
download: bool | None = None,
|
|
54
|
-
etag: str | None = None,
|
|
55
|
-
cache_control: str | None = None,
|
|
56
|
-
redirect_to: str | None = None,
|
|
57
|
-
) -> None:
|
|
58
|
-
if body is not None and content is not None:
|
|
59
|
-
raise TypeError(
|
|
60
|
-
"ResponseBase: provide either 'body' or 'content', not both"
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
payload = (
|
|
64
|
-
body if body is not None else (content if content is not None else b"")
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
super().__init__(
|
|
68
|
-
kind=kind,
|
|
69
|
-
media_type=media_type,
|
|
70
|
-
status_code=status_code,
|
|
71
|
-
headers={
|
|
72
|
-
k: v
|
|
73
|
-
for k, v in (
|
|
74
|
-
headers.items() if hasattr(headers, "items") else (headers or [])
|
|
75
|
-
)
|
|
76
|
-
},
|
|
77
|
-
envelope=envelope,
|
|
78
|
-
template=template,
|
|
79
|
-
filename=filename,
|
|
80
|
-
download=download,
|
|
81
|
-
etag=etag,
|
|
82
|
-
cache_control=cache_control,
|
|
83
|
-
redirect_to=redirect_to,
|
|
84
|
-
)
|
|
85
|
-
self.status_code = status_code
|
|
86
|
-
self.headers = Headers(headers or {})
|
|
87
|
-
self.body = payload
|
|
88
|
-
self.media_type = media_type
|
|
89
|
-
self._headers = self.headers
|
|
90
|
-
|
|
91
|
-
@staticmethod
|
|
92
|
-
def _status_text(code: int) -> str:
|
|
93
|
-
return {
|
|
94
|
-
200: "OK",
|
|
95
|
-
201: "Created",
|
|
96
|
-
205: "Reset Content",
|
|
97
|
-
204: "No Content",
|
|
98
|
-
301: "Moved Permanently",
|
|
99
|
-
302: "Found",
|
|
100
|
-
307: "Temporary Redirect",
|
|
101
|
-
308: "Permanent Redirect",
|
|
102
|
-
400: "Bad Request",
|
|
103
|
-
401: "Unauthorized",
|
|
104
|
-
403: "Forbidden",
|
|
105
|
-
404: "Not Found",
|
|
106
|
-
405: "Method Not Allowed",
|
|
107
|
-
422: "Unprocessable Entity",
|
|
108
|
-
500: "Internal Server Error",
|
|
109
|
-
}.get(code, "OK")
|
|
110
|
-
|
|
111
|
-
def status_line(self) -> str:
|
|
112
|
-
return f"{self.status_code} {self._status_text(self.status_code)}"
|
|
113
|
-
|
|
114
|
-
@property
|
|
115
|
-
def raw_headers(self) -> list[tuple[bytes, bytes]]:
|
|
116
|
-
return [
|
|
117
|
-
(k.encode("latin-1"), v.encode("latin-1")) for k, v in self.headers.items()
|
|
118
|
-
]
|
|
119
|
-
|
|
120
|
-
@property
|
|
121
|
-
def headers_map(self) -> Headers:
|
|
122
|
-
return self.headers
|
|
123
|
-
|
|
124
|
-
@property
|
|
125
|
-
def body_text(self) -> str:
|
|
126
|
-
return self.body.decode("utf-8")
|
|
127
|
-
|
|
128
|
-
def json_body(self) -> Any:
|
|
129
|
-
if not self.body:
|
|
130
|
-
return None
|
|
131
|
-
return json_module.loads(self.body.decode("utf-8"))
|
|
132
|
-
|
|
133
|
-
@property
|
|
134
|
-
def cookies(self) -> HeaderCookies:
|
|
135
|
-
cookie = SimpleCookie()
|
|
136
|
-
for name, value in self.headers.items():
|
|
137
|
-
if name == "set-cookie":
|
|
138
|
-
cookie.load(value)
|
|
139
|
-
return HeaderCookies({name: morsel.value for name, morsel in cookie.items()})
|
|
140
|
-
|
|
141
|
-
def set_cookie(
|
|
142
|
-
self,
|
|
143
|
-
key: str,
|
|
144
|
-
value: str,
|
|
145
|
-
*,
|
|
146
|
-
path: str = "/",
|
|
147
|
-
domain: str | None = None,
|
|
148
|
-
secure: bool = False,
|
|
149
|
-
httponly: bool = False,
|
|
150
|
-
samesite: str | None = None,
|
|
151
|
-
max_age: int | None = None,
|
|
152
|
-
expires: str | None = None,
|
|
153
|
-
) -> None:
|
|
154
|
-
cookie = SimpleCookie()
|
|
155
|
-
cookie[key] = value
|
|
156
|
-
morsel = cookie[key]
|
|
157
|
-
morsel["path"] = path
|
|
158
|
-
if domain is not None:
|
|
159
|
-
morsel["domain"] = domain
|
|
160
|
-
if secure:
|
|
161
|
-
morsel["secure"] = True
|
|
162
|
-
if httponly:
|
|
163
|
-
morsel["httponly"] = True
|
|
164
|
-
if samesite is not None:
|
|
165
|
-
morsel["samesite"] = samesite
|
|
166
|
-
if max_age is not None:
|
|
167
|
-
morsel["max-age"] = str(max_age)
|
|
168
|
-
if expires is not None:
|
|
169
|
-
morsel["expires"] = expires
|
|
170
|
-
self.headers["set-cookie"] = cookie.output(header="").strip()
|
|
171
|
-
|
|
172
|
-
@classmethod
|
|
173
|
-
def from_json(
|
|
174
|
-
cls,
|
|
175
|
-
data: Any,
|
|
176
|
-
status_code: int = 200,
|
|
177
|
-
headers: Mapping[str, str] | None = None,
|
|
178
|
-
) -> "ResponseBase":
|
|
179
|
-
payload = json_module.dumps(
|
|
180
|
-
data, ensure_ascii=False, separators=(",", ":"), default=str
|
|
181
|
-
).encode("utf-8")
|
|
182
|
-
hdrs = [("content-type", "application/json; charset=utf-8")]
|
|
183
|
-
for k, v in (headers or {}).items():
|
|
184
|
-
hdrs.append((k.lower(), v))
|
|
185
|
-
return cls(
|
|
186
|
-
status_code=status_code,
|
|
187
|
-
headers=hdrs,
|
|
188
|
-
body=payload,
|
|
189
|
-
media_type="application/json",
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
@classmethod
|
|
193
|
-
def html(
|
|
194
|
-
cls,
|
|
195
|
-
html: str,
|
|
196
|
-
status_code: int = 200,
|
|
197
|
-
headers: Mapping[str, str] | None = None,
|
|
198
|
-
) -> "ResponseBase":
|
|
199
|
-
payload = html.encode("utf-8")
|
|
200
|
-
hdrs = [("content-type", "text/html; charset=utf-8")]
|
|
201
|
-
for k, v in (headers or {}).items():
|
|
202
|
-
hdrs.append((k.lower(), v))
|
|
203
|
-
return cls(
|
|
204
|
-
status_code=status_code,
|
|
205
|
-
headers=hdrs,
|
|
206
|
-
body=payload,
|
|
207
|
-
media_type="text/html",
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
@classmethod
|
|
211
|
-
def text(
|
|
212
|
-
cls,
|
|
213
|
-
text: str,
|
|
214
|
-
status_code: int = 200,
|
|
215
|
-
headers: Mapping[str, str] | None = None,
|
|
216
|
-
) -> "ResponseBase":
|
|
217
|
-
payload = text.encode("utf-8")
|
|
218
|
-
hdrs = [("content-type", "text/plain; charset=utf-8")]
|
|
219
|
-
for k, v in (headers or {}).items():
|
|
220
|
-
hdrs.append((k.lower(), v))
|
|
221
|
-
return cls(
|
|
222
|
-
status_code=status_code,
|
|
223
|
-
headers=hdrs,
|
|
224
|
-
body=payload,
|
|
225
|
-
media_type="text/plain",
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
@dataclass
|
|
230
|
-
class TemplateBase(TemplateSpec):
|
|
231
|
-
"""Concrete template configuration used at runtime."""
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class SchemaBase:
|
|
5
|
-
"""Shared schema helpers used by concrete schema wrappers."""
|
|
6
|
-
|
|
7
|
-
@classmethod
|
|
8
|
-
def collect(cls, model: type) -> dict[str, dict[str, type]]:
|
|
9
|
-
from ..mapping.collect_decorated_schemas import collect_decorated_schemas
|
|
10
|
-
|
|
11
|
-
return collect_decorated_schemas(model)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
__all__ = ["SchemaBase"]
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"""Core OpenAPI security scheme primitives."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Mapping, Sequence
|
|
6
|
-
|
|
7
|
-
_VALID_SECURITY_SCHEME_TYPES = {
|
|
8
|
-
"http",
|
|
9
|
-
"apiKey",
|
|
10
|
-
"oauth2",
|
|
11
|
-
"openIdConnect",
|
|
12
|
-
"mutualTLS",
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class OpenAPISecurityDependency:
|
|
17
|
-
"""Base security dependency with OpenAPI document metadata."""
|
|
18
|
-
|
|
19
|
-
def __init__(
|
|
20
|
-
self,
|
|
21
|
-
*,
|
|
22
|
-
scheme_name: str,
|
|
23
|
-
scheme: Mapping[str, Any],
|
|
24
|
-
scopes: Sequence[str] | None = None,
|
|
25
|
-
auto_error: bool = True,
|
|
26
|
-
) -> None:
|
|
27
|
-
self.scheme_name = scheme_name
|
|
28
|
-
self.auto_error = auto_error
|
|
29
|
-
self._scheme = dict(scheme)
|
|
30
|
-
self._scopes = list(scopes or [])
|
|
31
|
-
validate_openapi_security_scheme(self._scheme)
|
|
32
|
-
|
|
33
|
-
def openapi_security_scheme(self) -> dict[str, Any]:
|
|
34
|
-
return dict(self._scheme)
|
|
35
|
-
|
|
36
|
-
def openapi_security_requirement(self) -> dict[str, list[str]]:
|
|
37
|
-
return {self.scheme_name: list(self._scopes)}
|
|
38
|
-
|
|
39
|
-
def __call__(self, request: Any) -> Any | None:
|
|
40
|
-
return None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def validate_openapi_security_scheme(scheme: Mapping[str, Any]) -> None:
|
|
44
|
-
scheme_type = scheme.get("type")
|
|
45
|
-
if scheme_type not in _VALID_SECURITY_SCHEME_TYPES:
|
|
46
|
-
raise ValueError(
|
|
47
|
-
"OpenAPI security scheme 'type' must be one of: "
|
|
48
|
-
f"{sorted(_VALID_SECURITY_SCHEME_TYPES)}"
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
if "scheme" in scheme and scheme_type != "http":
|
|
52
|
-
raise ValueError("OpenAPI 'scheme' is only valid when type is 'http'.")
|
|
53
|
-
|
|
54
|
-
if scheme_type == "http" and not scheme.get("scheme"):
|
|
55
|
-
raise ValueError("OpenAPI type='http' requires a non-empty 'scheme'.")
|
|
56
|
-
|
|
57
|
-
if scheme_type == "apiKey":
|
|
58
|
-
if scheme.get("in") not in {"header", "query", "cookie"}:
|
|
59
|
-
raise ValueError(
|
|
60
|
-
"OpenAPI type='apiKey' requires 'in' to be header/query/cookie."
|
|
61
|
-
)
|
|
62
|
-
if not scheme.get("name"):
|
|
63
|
-
raise ValueError("OpenAPI type='apiKey' requires 'name'.")
|
|
64
|
-
|
|
65
|
-
if scheme_type == "oauth2" and not isinstance(scheme.get("flows"), Mapping):
|
|
66
|
-
raise ValueError("OpenAPI type='oauth2' requires a 'flows' object.")
|
|
67
|
-
|
|
68
|
-
if scheme_type == "openIdConnect" and not scheme.get("openIdConnectUrl"):
|
|
69
|
-
raise ValueError("OpenAPI type='openIdConnect' requires 'openIdConnectUrl'.")
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import Any, Callable
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class SessionABC(ABC):
|
|
8
|
-
"""Authoritative Tigrbl session interface."""
|
|
9
|
-
|
|
10
|
-
@abstractmethod
|
|
11
|
-
async def begin(self) -> None: ...
|
|
12
|
-
|
|
13
|
-
@abstractmethod
|
|
14
|
-
async def commit(self) -> None: ...
|
|
15
|
-
|
|
16
|
-
@abstractmethod
|
|
17
|
-
async def rollback(self) -> None: ...
|
|
18
|
-
|
|
19
|
-
@abstractmethod
|
|
20
|
-
def in_transaction(self) -> bool: ...
|
|
21
|
-
|
|
22
|
-
@abstractmethod
|
|
23
|
-
async def get(self, model: type, ident: Any) -> Any | None: ...
|
|
24
|
-
|
|
25
|
-
@abstractmethod
|
|
26
|
-
def add(self, obj: Any) -> None: ...
|
|
27
|
-
|
|
28
|
-
@abstractmethod
|
|
29
|
-
async def delete(self, obj: Any) -> None: ...
|
|
30
|
-
|
|
31
|
-
@abstractmethod
|
|
32
|
-
async def flush(self) -> None: ...
|
|
33
|
-
|
|
34
|
-
@abstractmethod
|
|
35
|
-
async def refresh(self, obj: Any) -> None: ...
|
|
36
|
-
|
|
37
|
-
@abstractmethod
|
|
38
|
-
async def execute(self, stmt: Any) -> Any: ...
|
|
39
|
-
|
|
40
|
-
@abstractmethod
|
|
41
|
-
async def close(self) -> None: ...
|
|
42
|
-
|
|
43
|
-
@abstractmethod
|
|
44
|
-
async def run_sync(self, fn: Callable[[Any], Any]) -> Any: ...
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
__all__ = ["SessionABC"]
|