tigrbl 0.3.16.dev5__tar.gz → 0.3.17.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.
Files changed (452) hide show
  1. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/PKG-INFO +11 -6
  2. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/README.md +10 -5
  3. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/pyproject.toml +3 -1
  4. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/README.md +1 -1
  5. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/__init__.py +94 -15
  6. tigrbl-0.3.17.dev2/tigrbl/_base/__init__.py +24 -0
  7. tigrbl-0.3.17.dev2/tigrbl/_base/_hook_base.py +25 -0
  8. tigrbl-0.3.16.dev5/tigrbl/middlewares/base.py → tigrbl-0.3.17.dev2/tigrbl/_base/_middleware_base.py +7 -8
  9. tigrbl-0.3.17.dev2/tigrbl/_base/_op_base.py +12 -0
  10. tigrbl-0.3.17.dev2/tigrbl/_base/_request_base.py +32 -0
  11. tigrbl-0.3.16.dev5/tigrbl/responses/_response.py → tigrbl-0.3.17.dev2/tigrbl/_base/_response_base.py +67 -114
  12. tigrbl-0.3.17.dev2/tigrbl/_base/_schema_base.py +14 -0
  13. tigrbl-0.3.17.dev2/tigrbl/_base/_session_abc.py +47 -0
  14. tigrbl-0.3.16.dev5/tigrbl/session/base.py → tigrbl-0.3.17.dev2/tigrbl/_base/_session_base.py +15 -34
  15. tigrbl-0.3.17.dev2/tigrbl/_base/_storage.py +13 -0
  16. tigrbl-0.3.16.dev5/tigrbl/table/_base.py → tigrbl-0.3.17.dev2/tigrbl/_base/_table_base.py +13 -9
  17. tigrbl-0.3.17.dev2/tigrbl/_base/_table_registry_base.py +55 -0
  18. tigrbl-0.3.17.dev2/tigrbl/_concrete/__init__.py +44 -0
  19. tigrbl-0.3.16.dev5/tigrbl/op/alias.py → tigrbl-0.3.17.dev2/tigrbl/_concrete/_alias.py +1 -1
  20. tigrbl-0.3.17.dev2/tigrbl/_concrete/_app.py +180 -0
  21. tigrbl-0.3.17.dev2/tigrbl/_concrete/_body.py +27 -0
  22. {tigrbl-0.3.16.dev5/tigrbl/column → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_column.py +4 -4
  23. tigrbl-0.3.16.dev5/tigrbl/middlewares/cors.py → tigrbl-0.3.17.dev2/tigrbl/_concrete/_cors_middleware.py +1 -65
  24. {tigrbl-0.3.16.dev5/tigrbl/engine → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_engine.py +44 -1
  25. tigrbl-0.3.17.dev2/tigrbl/_concrete/_file_response.py +26 -0
  26. tigrbl-0.3.17.dev2/tigrbl/_concrete/_hook.py +12 -0
  27. tigrbl-0.3.17.dev2/tigrbl/_concrete/_html_response.py +18 -0
  28. tigrbl-0.3.17.dev2/tigrbl/_concrete/_json_response.py +24 -0
  29. tigrbl-0.3.16.dev5/tigrbl/middlewares/middleware.py → tigrbl-0.3.17.dev2/tigrbl/_concrete/_middleware.py +12 -4
  30. {tigrbl-0.3.16.dev5/tigrbl/op → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_op.py +4 -4
  31. tigrbl-0.3.16.dev5/tigrbl/op/model_registry.py → tigrbl-0.3.17.dev2/tigrbl/_concrete/_op_registry.py +1 -1
  32. tigrbl-0.3.17.dev2/tigrbl/_concrete/_plain_text_response.py +18 -0
  33. tigrbl-0.3.17.dev2/tigrbl/_concrete/_redirect_response.py +19 -0
  34. {tigrbl-0.3.16.dev5/tigrbl/requests → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_request.py +22 -3
  35. tigrbl-0.3.17.dev2/tigrbl/_concrete/_response.py +35 -0
  36. {tigrbl-0.3.16.dev5/tigrbl/router → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_route.py +3 -0
  37. tigrbl-0.3.17.dev2/tigrbl/_concrete/_router.py +207 -0
  38. tigrbl-0.3.17.dev2/tigrbl/_concrete/_routing.py +139 -0
  39. {tigrbl-0.3.16.dev5/tigrbl/schema → tigrbl-0.3.17.dev2/tigrbl/_concrete}/_schema.py +3 -2
  40. {tigrbl-0.3.16.dev5/tigrbl/security/schemes → tigrbl-0.3.17.dev2/tigrbl/_concrete/_security}/api_key.py +1 -1
  41. {tigrbl-0.3.16.dev5/tigrbl/security/schemes → tigrbl-0.3.17.dev2/tigrbl/_concrete/_security}/http_bearer.py +1 -1
  42. {tigrbl-0.3.16.dev5/tigrbl/security/schemes → tigrbl-0.3.17.dev2/tigrbl/_concrete/_security}/mutual_tls.py +1 -1
  43. {tigrbl-0.3.16.dev5/tigrbl/security/schemes → tigrbl-0.3.17.dev2/tigrbl/_concrete/_security}/oauth2.py +1 -1
  44. {tigrbl-0.3.16.dev5/tigrbl/security/schemes → tigrbl-0.3.17.dev2/tigrbl/_concrete/_security}/openid_connect.py +1 -1
  45. tigrbl-0.3.16.dev5/tigrbl/session/default.py → tigrbl-0.3.17.dev2/tigrbl/_concrete/_session.py +6 -12
  46. tigrbl-0.3.17.dev2/tigrbl/_concrete/_storage.py +13 -0
  47. tigrbl-0.3.17.dev2/tigrbl/_concrete/_streaming_response.py +35 -0
  48. tigrbl-0.3.17.dev2/tigrbl/_concrete/_table.py +103 -0
  49. tigrbl-0.3.17.dev2/tigrbl/_concrete/_table_registry.py +10 -0
  50. {tigrbl-0.3.16.dev5/tigrbl/app → tigrbl-0.3.17.dev2/tigrbl/_concrete}/tigrbl_app.py +317 -118
  51. {tigrbl-0.3.16.dev5/tigrbl/router → tigrbl-0.3.17.dev2/tigrbl/_concrete}/tigrbl_router.py +162 -106
  52. tigrbl-0.3.17.dev2/tigrbl/_spec/__init__.py +67 -0
  53. {tigrbl-0.3.16.dev5/tigrbl/op → tigrbl-0.3.17.dev2/tigrbl/_spec}/alias_spec.py +1 -1
  54. tigrbl-0.3.17.dev2/tigrbl/_spec/app_spec.py +137 -0
  55. tigrbl-0.3.17.dev2/tigrbl/_spec/binding_spec.py +78 -0
  56. {tigrbl-0.3.16.dev5/tigrbl/column → tigrbl-0.3.17.dev2/tigrbl/_spec}/column_spec.py +3 -3
  57. {tigrbl-0.3.16.dev5/tigrbl/engine → tigrbl-0.3.17.dev2/tigrbl/_spec}/engine_spec.py +8 -7
  58. {tigrbl-0.3.16.dev5/tigrbl/hook → tigrbl-0.3.17.dev2/tigrbl/_spec}/hook_spec.py +1 -1
  59. {tigrbl-0.3.16.dev5/tigrbl/column → tigrbl-0.3.17.dev2/tigrbl/_spec}/io_spec.py +1 -1
  60. {tigrbl-0.3.16.dev5/tigrbl/op → tigrbl-0.3.17.dev2/tigrbl/_spec}/op_spec.py +23 -3
  61. tigrbl-0.3.17.dev2/tigrbl/_spec/request_spec.py +19 -0
  62. tigrbl-0.3.16.dev5/tigrbl/responses/types.py → tigrbl-0.3.17.dev2/tigrbl/_spec/response_spec.py +2 -17
  63. tigrbl-0.3.17.dev2/tigrbl/_spec/response_types.py +12 -0
  64. {tigrbl-0.3.16.dev5/tigrbl/router → tigrbl-0.3.17.dev2/tigrbl/_spec}/router_spec.py +7 -12
  65. {tigrbl-0.3.16.dev5/tigrbl/schema → tigrbl-0.3.17.dev2/tigrbl/_spec}/schema_spec.py +2 -2
  66. tigrbl-0.3.16.dev5/tigrbl/session/spec.py → tigrbl-0.3.17.dev2/tigrbl/_spec/session_spec.py +48 -0
  67. tigrbl-0.3.17.dev2/tigrbl/_spec/shortcuts_spec.py +8 -0
  68. {tigrbl-0.3.16.dev5/tigrbl/column → tigrbl-0.3.17.dev2/tigrbl/_spec}/storage_spec.py +0 -6
  69. tigrbl-0.3.17.dev2/tigrbl/_spec/table_registry_spec.py +14 -0
  70. tigrbl-0.3.17.dev2/tigrbl/_spec/table_spec.py +73 -0
  71. tigrbl-0.3.17.dev2/tigrbl/column/__init__.py +23 -0
  72. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/config/__init__.py +1 -1
  73. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/config/constants.py +1 -1
  74. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/model.py +7 -2
  75. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/ops.py +65 -1
  76. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/ddl/__init__.py +106 -80
  77. tigrbl-0.3.17.dev2/tigrbl/decorators/__init__.py +48 -0
  78. tigrbl-0.3.16.dev5/tigrbl/engine/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/engine.py +4 -4
  79. tigrbl-0.3.16.dev5/tigrbl/hook/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/hook.py +4 -4
  80. tigrbl-0.3.16.dev5/tigrbl/middlewares/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/middlewares.py +1 -1
  81. tigrbl-0.3.16.dev5/tigrbl/op/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/op.py +51 -20
  82. tigrbl-0.3.16.dev5/tigrbl/responses/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/response.py +1 -1
  83. tigrbl-0.3.17.dev2/tigrbl/decorators/rest.py +30 -0
  84. tigrbl-0.3.16.dev5/tigrbl/router/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/router.py +3 -3
  85. tigrbl-0.3.16.dev5/tigrbl/session/decorators.py → tigrbl-0.3.17.dev2/tigrbl/decorators/session.py +1 -1
  86. tigrbl-0.3.17.dev2/tigrbl/docs/column_specs.md +62 -0
  87. tigrbl-0.3.17.dev2/tigrbl/docs/session.md +11 -0
  88. tigrbl-0.3.17.dev2/tigrbl/engine/__init__.py +108 -0
  89. tigrbl-0.3.17.dev2/tigrbl/engine/bind.py +53 -0
  90. tigrbl-0.3.17.dev2/tigrbl/engine/collect.py +10 -0
  91. tigrbl-0.3.17.dev2/tigrbl/engine/resolver.py +8 -0
  92. tigrbl-0.3.17.dev2/tigrbl/hook/exceptions.py +3 -0
  93. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/hook/types.py +2 -18
  94. tigrbl-0.3.17.dev2/tigrbl/mapping/__init__.py +60 -0
  95. tigrbl-0.3.17.dev2/tigrbl/mapping/app_mro_collect.py +14 -0
  96. tigrbl-0.3.17.dev2/tigrbl/mapping/apply.py +98 -0
  97. tigrbl-0.3.17.dev2/tigrbl/mapping/collect.py +60 -0
  98. tigrbl-0.3.16.dev5/tigrbl/schema/collect.py → tigrbl-0.3.17.dev2/tigrbl/mapping/collect_decorated_schemas.py +2 -2
  99. tigrbl-0.3.17.dev2/tigrbl/mapping/column_mro_collect.py +124 -0
  100. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/columns.py +2 -2
  101. tigrbl-0.3.17.dev2/tigrbl/mapping/context.py +48 -0
  102. tigrbl-0.3.16.dev5/tigrbl/core/resolver.py → tigrbl-0.3.17.dev2/tigrbl/mapping/core_resolver.py +32 -11
  103. tigrbl-0.3.17.dev2/tigrbl/mapping/diagnostics.py +20 -0
  104. tigrbl-0.3.16.dev5/tigrbl/engine/resolver.py → tigrbl-0.3.17.dev2/tigrbl/mapping/engine_resolver.py +23 -2
  105. {tigrbl-0.3.16.dev5/tigrbl/bindings/schemas → tigrbl-0.3.17.dev2/tigrbl/mapping/handlers}/__init__.py +2 -2
  106. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/handlers/builder.py +4 -4
  107. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/handlers/ctx.py +14 -2
  108. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/handlers/identifiers.py +2 -2
  109. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/handlers/namespaces.py +2 -2
  110. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/handlers/steps.py +5 -6
  111. tigrbl-0.3.16.dev5/tigrbl/hook/mro_collect.py → tigrbl-0.3.17.dev2/tigrbl/mapping/hook_mro_collect.py +29 -6
  112. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/hooks.py +20 -6
  113. tigrbl-0.3.17.dev2/tigrbl/mapping/mapping_resolver.py +5 -0
  114. tigrbl-0.3.17.dev2/tigrbl/mapping/model.py +33 -0
  115. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/model_helpers.py +19 -7
  116. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/model_registry.py +4 -4
  117. tigrbl-0.3.17.dev2/tigrbl/mapping/op_mro_collect.py +136 -0
  118. tigrbl-0.3.16.dev5/tigrbl/op/resolver.py → tigrbl-0.3.17.dev2/tigrbl/mapping/op_resolver.py +4 -4
  119. tigrbl-0.3.17.dev2/tigrbl/mapping/passes.py +74 -0
  120. tigrbl-0.3.17.dev2/tigrbl/mapping/plan.py +54 -0
  121. tigrbl-0.3.17.dev2/tigrbl/mapping/precedence.py +45 -0
  122. tigrbl-0.3.16.dev5/tigrbl/responses/resolver.py → tigrbl-0.3.17.dev2/tigrbl/mapping/responses_resolver.py +1 -1
  123. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/__init__.py +1 -1
  124. tigrbl-0.3.17.dev2/tigrbl/mapping/rest/attach.py +25 -0
  125. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/collection.py +27 -82
  126. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/common.py +35 -48
  127. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/helpers.py +3 -14
  128. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/io.py +6 -4
  129. tigrbl-0.3.17.dev2/tigrbl/mapping/rest/member.py +200 -0
  130. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/router.py +6 -29
  131. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/routing.py +15 -40
  132. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/router/common.py +13 -21
  133. tigrbl-0.3.17.dev2/tigrbl/mapping/router/include.py +466 -0
  134. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/router/resource_proxy.py +37 -55
  135. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/router/rpc.py +53 -12
  136. tigrbl-0.3.16.dev5/tigrbl/router/mro_collect.py → tigrbl-0.3.17.dev2/tigrbl/mapping/router_mro_collect.py +3 -3
  137. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rpc.py +143 -33
  138. tigrbl-0.3.17.dev2/tigrbl/mapping/runtime_routes.py +293 -0
  139. {tigrbl-0.3.16.dev5/tigrbl/bindings/handlers → tigrbl-0.3.17.dev2/tigrbl/mapping/schemas}/__init__.py +2 -2
  140. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/schemas/builder.py +5 -5
  141. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/schemas/defaults.py +3 -3
  142. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/schemas/utils.py +2 -2
  143. tigrbl-0.3.17.dev2/tigrbl/mapping/spec_normalization.py +110 -0
  144. tigrbl-0.3.17.dev2/tigrbl/mapping/table.py +5 -0
  145. tigrbl-0.3.17.dev2/tigrbl/mapping/table_mro_collect.py +14 -0
  146. tigrbl-0.3.17.dev2/tigrbl/mapping/traversal.py +196 -0
  147. tigrbl-0.3.17.dev2/tigrbl/op/__init__.py +39 -0
  148. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/op/canonical.py +13 -11
  149. tigrbl-0.3.17.dev2/tigrbl/op/collect.py +20 -0
  150. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/op/types.py +4 -20
  151. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/bound.py +1 -1
  152. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/hierarchy.py +1 -1
  153. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/key_digest.py +2 -2
  154. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/lifecycle.py +1 -1
  155. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/locks.py +1 -1
  156. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/ownable.py +1 -1
  157. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/principals.py +1 -1
  158. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/tenant_bound.py +1 -1
  159. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/__init__.py +3 -2
  160. tigrbl-0.3.17.dev2/tigrbl/orm/tables/_base.py +7 -0
  161. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/audit.py +2 -2
  162. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/client.py +2 -2
  163. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/group.py +2 -2
  164. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/org.py +2 -2
  165. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/rbac.py +5 -5
  166. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/status.py +2 -2
  167. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/tenant.py +2 -2
  168. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/tables/user.py +2 -2
  169. tigrbl-0.3.17.dev2/tigrbl/requests.py +5 -0
  170. tigrbl-0.3.17.dev2/tigrbl/rest/__init__.py +15 -0
  171. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/README.md +52 -1
  172. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/__init__.py +8 -0
  173. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/dep/extra.py +104 -0
  174. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/dep/security.py +114 -0
  175. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/__init__.py +43 -0
  176. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/asgi_send.py +228 -0
  177. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/envelope_apply.py +101 -0
  178. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/headers_apply.py +58 -0
  179. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/http_finalize.py +43 -0
  180. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/out_dump.py +33 -0
  181. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/result_normalize.py +35 -0
  182. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/egress/to_transport_response.py +125 -0
  183. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/__init__.py +58 -0
  184. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/attach_compiled.py +32 -0
  185. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/body_peek.py +29 -0
  186. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/body_read.py +66 -0
  187. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/ctx_init.py +27 -0
  188. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/headers_parse.py +67 -0
  189. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/method_extract.py +45 -0
  190. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/metrics_start.py +27 -0
  191. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/path_extract.py +46 -0
  192. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/query_parse.py +101 -0
  193. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/raw_from_scope.py +124 -0
  194. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/request_body_apply.py +26 -0
  195. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/ingress/request_from_scope.py +33 -0
  196. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/resolve/paired_gen.py +5 -0
  197. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/headers_from_payload.py +2 -2
  198. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/negotiate.py +1 -1
  199. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/response/render.py +82 -0
  200. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/renderer.py +4 -4
  201. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/template.py +1 -1
  202. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/templates.py +2 -2
  203. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/__init__.py +42 -0
  204. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/binding_match.py +155 -0
  205. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/binding_policy_apply.py +82 -0
  206. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/ctx_finalize.py +142 -0
  207. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/op_resolve.py +67 -0
  208. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/params_normalize.py +22 -0
  209. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/path_params_extract.py +21 -0
  210. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/payload_select.py +196 -0
  211. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/plan_select.py +31 -0
  212. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/protocol_detect.py +51 -0
  213. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/rpc_envelope_parse.py +135 -0
  214. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/route/rpc_method_match.py +39 -0
  215. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/sys/__init__.py +26 -0
  216. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/sys/commit_tx.py +16 -0
  217. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/sys/handler_persistence.py +38 -0
  218. tigrbl-0.3.17.dev2/tigrbl/runtime/atoms/sys/start_tx.py +16 -0
  219. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/wire/build_in.py +123 -2
  220. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/wire/build_out.py +12 -0
  221. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/wire/dump.py +66 -2
  222. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/wire/validate_in.py +32 -1
  223. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/events.py +214 -30
  224. {tigrbl-0.3.16.dev5/tigrbl/hook → tigrbl-0.3.17.dev2/tigrbl/runtime}/exceptions.py +1 -1
  225. tigrbl-0.3.17.dev2/tigrbl/runtime/executor/helpers.py +194 -0
  226. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/executor/invoke.py +102 -10
  227. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/executor/types.py +54 -2
  228. tigrbl-0.3.17.dev2/tigrbl/runtime/gw/__init__.py +4 -0
  229. tigrbl-0.3.17.dev2/tigrbl/runtime/gw/invoke.py +339 -0
  230. tigrbl-0.3.17.dev2/tigrbl/runtime/gw/raw.py +26 -0
  231. tigrbl-0.3.17.dev2/tigrbl/runtime/hook_types.py +60 -0
  232. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/kernel/__init__.py +8 -3
  233. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/kernel/atoms.py +64 -19
  234. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/kernel/cache.py +1 -1
  235. tigrbl-0.3.17.dev2/tigrbl/runtime/kernel/core.py +483 -0
  236. tigrbl-0.3.17.dev2/tigrbl/runtime/kernel/models.py +124 -0
  237. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/kernel/opview_compiler.py +6 -0
  238. tigrbl-0.3.17.dev2/tigrbl/runtime/kernel/payload.py +64 -0
  239. tigrbl-0.3.17.dev2/tigrbl/runtime/kernel.py +667 -0
  240. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/labels.py +17 -1
  241. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/ordering.py +73 -0
  242. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/status/converters.py +9 -0
  243. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/status/utils.py +1 -1
  244. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/system.py +59 -0
  245. tigrbl-0.3.17.dev2/tigrbl/schema/__init__.py +27 -0
  246. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/build_schema.py +97 -4
  247. tigrbl-0.3.17.dev2/tigrbl/schema/builder/helpers.py +87 -0
  248. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/list_params.py +1 -1
  249. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/strip_parent_fields.py +1 -1
  250. tigrbl-0.3.17.dev2/tigrbl/security/__init__.py +5 -0
  251. tigrbl-0.3.17.dev2/tigrbl/security/dependencies.py +5 -0
  252. tigrbl-0.3.17.dev2/tigrbl/shortcuts/__init__.py +31 -0
  253. tigrbl-0.3.16.dev5/tigrbl/app/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/app.py +7 -7
  254. tigrbl-0.3.16.dev5/tigrbl/column/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/column.py +5 -5
  255. tigrbl-0.3.16.dev5/tigrbl/engine/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/engine.py +2 -2
  256. tigrbl-0.3.16.dev5/tigrbl/hook/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/hook.py +3 -3
  257. tigrbl-0.3.17.dev2/tigrbl/shortcuts/op.py +14 -0
  258. tigrbl-0.3.16.dev5/tigrbl/responses/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/responses.py +8 -10
  259. tigrbl-0.3.16.dev5/tigrbl/router/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/router.py +3 -17
  260. tigrbl-0.3.16.dev5/tigrbl/schema/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/schema.py +3 -3
  261. tigrbl-0.3.16.dev5/tigrbl/table/shortcuts.py → tigrbl-0.3.17.dev2/tigrbl/shortcuts/table.py +2 -2
  262. tigrbl-0.3.17.dev2/tigrbl/specs.py +30 -0
  263. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/diagnostics/__init__.py +2 -0
  264. tigrbl-0.3.17.dev2/tigrbl/system/diagnostics/healthz.py +63 -0
  265. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/diagnostics/hookz.py +2 -2
  266. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/diagnostics/kernelz.py +3 -3
  267. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/diagnostics/methodz.py +2 -2
  268. tigrbl-0.3.17.dev2/tigrbl/system/diagnostics/router.py +208 -0
  269. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/diagnostics/utils.py +27 -15
  270. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/lens.py +1 -1
  271. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/openapi/helpers.py +2 -2
  272. tigrbl-0.3.17.dev2/tigrbl/system/docs/openapi/mount.py +85 -0
  273. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/openapi/schema.py +20 -2
  274. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/openrpc.py +29 -3
  275. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/swagger.py +1 -1
  276. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/favicon/__init__.py +28 -18
  277. tigrbl-0.3.17.dev2/tigrbl/transport/__init__.py +3 -0
  278. tigrbl-0.3.17.dev2/tigrbl/transport/jsonrpc/__init__.py +0 -0
  279. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/transport/jsonrpc/helpers.py +1 -44
  280. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/transport/rest/aggregator.py +8 -8
  281. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/__init__.py +42 -25
  282. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/authn_abc.py +1 -1
  283. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/op_config_provider.py +1 -1
  284. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/uuid.py +1 -1
  285. tigrbl-0.3.17.dev2/tigrbl/utils/__init__.py +3 -0
  286. tigrbl-0.3.16.dev5/tigrbl/schema/get_schema.py → tigrbl-0.3.17.dev2/tigrbl/utils/schema.py +1 -1
  287. tigrbl-0.3.17.dev2/tigrbl/vendor/__init__.py +21 -0
  288. tigrbl-0.3.17.dev2/tigrbl/vendor/jinja.py +34 -0
  289. tigrbl-0.3.16.dev5/tigrbl/app/_app.py +0 -133
  290. tigrbl-0.3.16.dev5/tigrbl/app/_model_registry.py +0 -67
  291. tigrbl-0.3.16.dev5/tigrbl/app/app_spec.py +0 -44
  292. tigrbl-0.3.16.dev5/tigrbl/app/mro_collect.py +0 -106
  293. tigrbl-0.3.16.dev5/tigrbl/app/transport.py +0 -154
  294. tigrbl-0.3.16.dev5/tigrbl/bindings/__init__.py +0 -73
  295. tigrbl-0.3.16.dev5/tigrbl/bindings/model.py +0 -205
  296. tigrbl-0.3.16.dev5/tigrbl/bindings/rest/attach.py +0 -34
  297. tigrbl-0.3.16.dev5/tigrbl/bindings/rest/member.py +0 -337
  298. tigrbl-0.3.16.dev5/tigrbl/bindings/router/__init__.py +0 -15
  299. tigrbl-0.3.16.dev5/tigrbl/bindings/router/include.py +0 -277
  300. tigrbl-0.3.16.dev5/tigrbl/column/__init__.py +0 -75
  301. tigrbl-0.3.16.dev5/tigrbl/column/mro_collect.py +0 -59
  302. tigrbl-0.3.16.dev5/tigrbl/decorators.py +0 -17
  303. tigrbl-0.3.16.dev5/tigrbl/deps/__init__.py +0 -23
  304. tigrbl-0.3.16.dev5/tigrbl/deps/jinja.py +0 -27
  305. tigrbl-0.3.16.dev5/tigrbl/engine/__init__.py +0 -47
  306. tigrbl-0.3.16.dev5/tigrbl/engine/bind.py +0 -38
  307. tigrbl-0.3.16.dev5/tigrbl/engine/collect.py +0 -116
  308. tigrbl-0.3.16.dev5/tigrbl/headers/__init__.py +0 -3
  309. tigrbl-0.3.16.dev5/tigrbl/hook/__init__.py +0 -23
  310. tigrbl-0.3.16.dev5/tigrbl/hook/_hook.py +0 -22
  311. tigrbl-0.3.16.dev5/tigrbl/middlewares/__init__.py +0 -37
  312. tigrbl-0.3.16.dev5/tigrbl/op/__init__.py +0 -54
  313. tigrbl-0.3.16.dev5/tigrbl/op/collect.py +0 -11
  314. tigrbl-0.3.16.dev5/tigrbl/op/mro_collect.py +0 -97
  315. tigrbl-0.3.16.dev5/tigrbl/orm/tables/_base.py +0 -8
  316. tigrbl-0.3.16.dev5/tigrbl/requests/__init__.py +0 -5
  317. tigrbl-0.3.16.dev5/tigrbl/responses/README.md +0 -34
  318. tigrbl-0.3.16.dev5/tigrbl/responses/__init__.py +0 -52
  319. tigrbl-0.3.16.dev5/tigrbl/responses/_transport.py +0 -32
  320. tigrbl-0.3.16.dev5/tigrbl/responses/bind.py +0 -12
  321. tigrbl-0.3.16.dev5/tigrbl/rest/__init__.py +0 -27
  322. tigrbl-0.3.16.dev5/tigrbl/router/__init__.py +0 -23
  323. tigrbl-0.3.16.dev5/tigrbl/router/_router.py +0 -422
  324. tigrbl-0.3.16.dev5/tigrbl/router/_routing.py +0 -143
  325. tigrbl-0.3.16.dev5/tigrbl/router/resolve.py +0 -151
  326. tigrbl-0.3.16.dev5/tigrbl/runtime/atoms/dep/extra.py +0 -21
  327. tigrbl-0.3.16.dev5/tigrbl/runtime/atoms/dep/security.py +0 -21
  328. tigrbl-0.3.16.dev5/tigrbl/runtime/atoms/response/render.py +0 -36
  329. tigrbl-0.3.16.dev5/tigrbl/runtime/executor/helpers.py +0 -88
  330. tigrbl-0.3.16.dev5/tigrbl/runtime/kernel/core.py +0 -226
  331. tigrbl-0.3.16.dev5/tigrbl/runtime/kernel/models.py +0 -27
  332. tigrbl-0.3.16.dev5/tigrbl/runtime/kernel/payload.py +0 -74
  333. tigrbl-0.3.16.dev5/tigrbl/schema/__init__.py +0 -38
  334. tigrbl-0.3.16.dev5/tigrbl/schema/builder/compat.py +0 -16
  335. tigrbl-0.3.16.dev5/tigrbl/schema/builder/helpers.py +0 -51
  336. tigrbl-0.3.16.dev5/tigrbl/security/__init__.py +0 -63
  337. tigrbl-0.3.16.dev5/tigrbl/security/schemes/__init__.py +0 -19
  338. tigrbl-0.3.16.dev5/tigrbl/session/README.md +0 -14
  339. tigrbl-0.3.16.dev5/tigrbl/session/__init__.py +0 -28
  340. tigrbl-0.3.16.dev5/tigrbl/session/abc.py +0 -76
  341. tigrbl-0.3.16.dev5/tigrbl/session/shortcuts.py +0 -50
  342. tigrbl-0.3.16.dev5/tigrbl/shortcuts.py +0 -22
  343. tigrbl-0.3.16.dev5/tigrbl/specs.py +0 -44
  344. tigrbl-0.3.16.dev5/tigrbl/system/diagnostics/compat.py +0 -8
  345. tigrbl-0.3.16.dev5/tigrbl/system/diagnostics/healthz.py +0 -41
  346. tigrbl-0.3.16.dev5/tigrbl/system/diagnostics/router.py +0 -74
  347. tigrbl-0.3.16.dev5/tigrbl/system/docs/openapi/mount.py +0 -30
  348. tigrbl-0.3.16.dev5/tigrbl/table/__init__.py +0 -9
  349. tigrbl-0.3.16.dev5/tigrbl/table/_table.py +0 -54
  350. tigrbl-0.3.16.dev5/tigrbl/table/mro_collect.py +0 -86
  351. tigrbl-0.3.16.dev5/tigrbl/table/table_spec.py +0 -37
  352. tigrbl-0.3.16.dev5/tigrbl/transport/__init__.py +0 -93
  353. tigrbl-0.3.16.dev5/tigrbl/transport/dispatch.py +0 -175
  354. tigrbl-0.3.16.dev5/tigrbl/transport/jsonrpc/__init__.py +0 -20
  355. tigrbl-0.3.16.dev5/tigrbl/transport/jsonrpc/dispatcher.py +0 -466
  356. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/LICENSE +0 -0
  357. /tigrbl-0.3.16.dev5/tigrbl/security/schemes/_base.py → /tigrbl-0.3.17.dev2/tigrbl/_base/_security_base.py +0 -0
  358. /tigrbl-0.3.16.dev5/tigrbl/transport/background.py → /tigrbl-0.3.17.dev2/tigrbl/_concrete/_background.py +0 -0
  359. /tigrbl-0.3.16.dev5/tigrbl/headers/_header.py → /tigrbl-0.3.17.dev2/tigrbl/_concrete/_headers.py +0 -0
  360. /tigrbl-0.3.16.dev5/tigrbl/transport/httpx.py → /tigrbl-0.3.17.dev2/tigrbl/_concrete/_httpx.py +0 -0
  361. /tigrbl-0.3.16.dev5/tigrbl/requests/adapters.py → /tigrbl-0.3.17.dev2/tigrbl/_concrete/_request_adapters.py +0 -0
  362. {tigrbl-0.3.16.dev5/tigrbl/security → tigrbl-0.3.17.dev2/tigrbl/_concrete}/dependencies.py +0 -0
  363. {tigrbl-0.3.16.dev5/tigrbl/column → tigrbl-0.3.17.dev2/tigrbl/_spec}/field_spec.py +0 -0
  364. /tigrbl-0.3.16.dev5/tigrbl/middlewares/spec.py → /tigrbl-0.3.17.dev2/tigrbl/_spec/middleware_spec.py +0 -0
  365. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/README.md +0 -0
  366. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/__init__.py +0 -0
  367. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/core.py +0 -0
  368. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/jsonhints.py +0 -0
  369. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/planning.py +0 -0
  370. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/types.py +0 -0
  371. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/column/infer/utils.py +0 -0
  372. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/config/defaults.py +0 -0
  373. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/__init__.py +0 -0
  374. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/__init__.py +0 -0
  375. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/bulk.py +0 -0
  376. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/__init__.py +0 -0
  377. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/db.py +0 -0
  378. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/enum.py +0 -0
  379. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/filters.py +0 -0
  380. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/helpers/normalize.py +0 -0
  381. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/core/crud/params.py +0 -0
  382. /tigrbl-0.3.16.dev5/tigrbl/schema/decorators.py → /tigrbl-0.3.17.dev2/tigrbl/decorators/schema.py +0 -0
  383. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/docs/verbosity.md +0 -0
  384. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/engine/builders.py +0 -0
  385. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/engine/capabilities.py +0 -0
  386. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/engine/docs/PLUGINS.md +0 -0
  387. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/engine/plugins.py +0 -0
  388. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/engine/registry.py +0 -0
  389. /tigrbl-0.3.16.dev5/tigrbl/config/resolver.py → /tigrbl-0.3.17.dev2/tigrbl/mapping/config_resolver.py +0 -0
  390. {tigrbl-0.3.16.dev5/tigrbl/bindings → tigrbl-0.3.17.dev2/tigrbl/mapping}/rest/io_headers.py +0 -0
  391. {tigrbl-0.3.16.dev5/tigrbl/app → tigrbl-0.3.17.dev2/tigrbl/middlewares}/__init__.py +0 -0
  392. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/middlewares/compose.py +0 -0
  393. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/__init__.py +0 -0
  394. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/_RowBound.py +0 -0
  395. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/__init__.py +0 -0
  396. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/bootstrappable.py +0 -0
  397. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/edges.py +0 -0
  398. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/fields.py +0 -0
  399. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/markers.py +0 -0
  400. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/operations.py +0 -0
  401. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/upsertable.py +0 -0
  402. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/orm/mixins/utils.py +0 -0
  403. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/__init__.py +0 -0
  404. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/dep/__init__.py +0 -0
  405. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/emit/__init__.py +0 -0
  406. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/emit/paired_post.py +0 -0
  407. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/emit/paired_pre.py +0 -0
  408. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -0
  409. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/out/__init__.py +0 -0
  410. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/out/masking.py +0 -0
  411. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/refresh/__init__.py +0 -0
  412. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/refresh/demand.py +0 -0
  413. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/resolve/__init__.py +0 -0
  414. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/resolve/assemble.py +0 -0
  415. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/__init__.py +0 -0
  416. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/response/negotiation.py +0 -0
  417. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/schema/__init__.py +0 -0
  418. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/schema/collect_in.py +0 -0
  419. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/schema/collect_out.py +0 -0
  420. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/storage/__init__.py +0 -0
  421. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/storage/to_stored.py +0 -0
  422. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/atoms/wire/__init__.py +0 -0
  423. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/context.py +0 -0
  424. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/executor/__init__.py +0 -0
  425. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/executor/guards.py +0 -0
  426. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/opview.py +0 -0
  427. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/status/__init__.py +0 -0
  428. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/status/exceptions.py +0 -0
  429. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/status/mappings.py +0 -0
  430. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/runtime/trace.py +0 -0
  431. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/__init__.py +0 -0
  432. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/cache.py +0 -0
  433. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/builder/extras.py +0 -0
  434. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/types.py +0 -0
  435. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/schema/utils.py +0 -0
  436. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/__init__.py +0 -0
  437. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/__init__.py +0 -0
  438. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/openapi/__init__.py +0 -0
  439. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/docs/openapi/metadata.py +0 -0
  440. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  441. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/system/uvicorn.py +0 -0
  442. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/transport/jsonrpc/models.py +0 -0
  443. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/transport/rest/__init__.py +0 -0
  444. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/allow_anon_provider.py +0 -0
  445. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/nested_path_provider.py +0 -0
  446. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/op.py +0 -0
  447. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/op_verb_alias_provider.py +0 -0
  448. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/request_extras_provider.py +0 -0
  449. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/response_extras_provider.py +0 -0
  450. {tigrbl-0.3.16.dev5 → tigrbl-0.3.17.dev2}/tigrbl/types/table_config_provider.py +0 -0
  451. {tigrbl-0.3.16.dev5/tigrbl/deps → tigrbl-0.3.17.dev2/tigrbl/vendor}/pydantic.py +0 -0
  452. {tigrbl-0.3.16.dev5/tigrbl/deps → tigrbl-0.3.17.dev2/tigrbl/vendor}/sqlalchemy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.3.16.dev5
3
+ Version: 0.3.17.dev2
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
@@ -59,6 +59,11 @@ A high-leverage ASGI meta-framework that turns plain SQLAlchemy models into a fu
59
59
  - 🧩 Pluggable engine and provider abstractions
60
60
  - 🚀 Built as an ASGI-native framework with Pydantic-powered schema generation
61
61
 
62
+ ## Runtime-owned Routing Contract
63
+
64
+ For the kernel-first flow that avoids pre-runtime REST/RPC dispatching, see
65
+ [`RUNTIME_OWNED_ROUTING.md`](./RUNTIME_OWNED_ROUTING.md).
66
+
62
67
  ## Terminology 📚
63
68
 
64
69
  - **Tenant** 🏢 – a namespace used to group related resources.
@@ -457,7 +462,7 @@ compatible with engine resolution across app, router, table, and op scopes.
457
462
  ✅ **Preferred:**
458
463
  ```python
459
464
  from tigrbl.engine.shortcuts import engine_spec
460
- from tigrbl.engine.decorators import engine_ctx
465
+ from tigrbl.decorators.engine import engine_ctx
461
466
 
462
467
  spec = engine_spec(kind="postgres", async_=True, host="db", name="app_db")
463
468
 
@@ -606,7 +611,7 @@ resolved deterministically by the runtime.
606
611
  ✅ **Preferred:**
607
612
  ```python
608
613
  from tigrbl import hook_ctx, op_ctx, schema_ctx
609
- from tigrbl.engine.decorators import engine_ctx
614
+ from tigrbl.decorators.engine import engine_ctx
610
615
 
611
616
  @engine_ctx(kind="sqlite", mode="memory")
612
617
  class Item(Table):
@@ -629,7 +634,7 @@ async def validate(ctx):
629
634
 
630
635
  ```python
631
636
  from tigrbl.engine.shortcuts import engine_spec, prov
632
- from tigrbl.engine._engine import Engine, Provider
637
+ from tigrbl._concrete._engine import Engine, Provider
633
638
 
634
639
  # Build an EngineSpec from a DSN string
635
640
  spec = engine_spec("sqlite://:memory:")
@@ -656,7 +661,7 @@ provider_pg = Provider(spec_pg)
656
661
  `engine_ctx` binds database configuration to different layers. It accepts a
657
662
  DSN string, a mapping, an `EngineSpec`, a `Provider`, or an `Engine`. The
658
663
  resolver chooses the most specific binding in the order
659
- `op > table > api > app`.
664
+ `op > table > router > app`.
660
665
 
661
666
  #### Engine precedence 🥇
662
667
 
@@ -700,7 +705,7 @@ create.__tigrbl_engine_ctx__ = {
700
705
  #### Decorative bindings 🎛️
701
706
 
702
707
  ```python
703
- from tigrbl.engine.decorators import engine_ctx
708
+ from tigrbl.decorators.engine import engine_ctx
704
709
  from tigrbl.engine.shortcuts import prov, engine
705
710
 
706
711
  @engine_ctx(prov(kind="sqlite", mode="memory"))
@@ -26,6 +26,11 @@ A high-leverage ASGI meta-framework that turns plain SQLAlchemy models into a fu
26
26
  - 🧩 Pluggable engine and provider abstractions
27
27
  - 🚀 Built as an ASGI-native framework with Pydantic-powered schema generation
28
28
 
29
+ ## Runtime-owned Routing Contract
30
+
31
+ For the kernel-first flow that avoids pre-runtime REST/RPC dispatching, see
32
+ [`RUNTIME_OWNED_ROUTING.md`](./RUNTIME_OWNED_ROUTING.md).
33
+
29
34
  ## Terminology 📚
30
35
 
31
36
  - **Tenant** 🏢 – a namespace used to group related resources.
@@ -424,7 +429,7 @@ compatible with engine resolution across app, router, table, and op scopes.
424
429
  ✅ **Preferred:**
425
430
  ```python
426
431
  from tigrbl.engine.shortcuts import engine_spec
427
- from tigrbl.engine.decorators import engine_ctx
432
+ from tigrbl.decorators.engine import engine_ctx
428
433
 
429
434
  spec = engine_spec(kind="postgres", async_=True, host="db", name="app_db")
430
435
 
@@ -573,7 +578,7 @@ resolved deterministically by the runtime.
573
578
  ✅ **Preferred:**
574
579
  ```python
575
580
  from tigrbl import hook_ctx, op_ctx, schema_ctx
576
- from tigrbl.engine.decorators import engine_ctx
581
+ from tigrbl.decorators.engine import engine_ctx
577
582
 
578
583
  @engine_ctx(kind="sqlite", mode="memory")
579
584
  class Item(Table):
@@ -596,7 +601,7 @@ async def validate(ctx):
596
601
 
597
602
  ```python
598
603
  from tigrbl.engine.shortcuts import engine_spec, prov
599
- from tigrbl.engine._engine import Engine, Provider
604
+ from tigrbl._concrete._engine import Engine, Provider
600
605
 
601
606
  # Build an EngineSpec from a DSN string
602
607
  spec = engine_spec("sqlite://:memory:")
@@ -623,7 +628,7 @@ provider_pg = Provider(spec_pg)
623
628
  `engine_ctx` binds database configuration to different layers. It accepts a
624
629
  DSN string, a mapping, an `EngineSpec`, a `Provider`, or an `Engine`. The
625
630
  resolver chooses the most specific binding in the order
626
- `op > table > api > app`.
631
+ `op > table > router > app`.
627
632
 
628
633
  #### Engine precedence 🥇
629
634
 
@@ -667,7 +672,7 @@ create.__tigrbl_engine_ctx__ = {
667
672
  #### Decorative bindings 🎛️
668
673
 
669
674
  ```python
670
- from tigrbl.engine.decorators import engine_ctx
675
+ from tigrbl.decorators.engine import engine_ctx
671
676
  from tigrbl.engine.shortcuts import prov, engine
672
677
 
673
678
  @engine_ctx(prov(kind="sqlite", mode="memory"))
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.3.16.dev5"
3
+ version = "0.3.17.dev2"
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"
@@ -48,6 +48,7 @@ tests = [
48
48
 
49
49
  [tool.uv.sources]
50
50
  tigrbl-tests = { workspace = true }
51
+ tigrbl_client = { workspace = true }
51
52
 
52
53
  [tool.pytest.ini_options]
53
54
  norecursedirs = ["combined", "scripts"]
@@ -81,6 +82,7 @@ packages = [
81
82
 
82
83
  [dependency-groups]
83
84
  dev = [
85
+ "tigrbl_client",
84
86
  "pytest>=8.0",
85
87
  "pytest-asyncio>=0.24.0",
86
88
  "pytest-xdist>=3.6.1",
@@ -86,7 +86,7 @@ Some objects also expose optional helpers:
86
86
  | Column | `column_spec.py` | `_column.py` | — | `shortcuts.py` | `collect.py` | — | — |
87
87
  | Engine | `engine_spec.py` | `_engine.py` | `decorators.py` | `shortcuts.py` | `collect.py` | `resolver.py` | `builders.py` |
88
88
  | Op | `types.py` | `_op.py` | `decorators.py` | — | `collect.py` | — | — |
89
- | Router | `router_spec.py` | `_router.py` | — | `shortcuts.py` | — | — | — |
89
+ | API | `router_spec.py` | `_api.py` | — | `shortcuts.py` | — | — | — |
90
90
  | App | `app_spec.py` | `_app.py` | — | `shortcuts.py` | — | — | — |
91
91
  | Table | `table_spec.py` | `_table.py` | — | `shortcuts.py` | — | — | — |
92
92
 
@@ -9,6 +9,8 @@ register RPC & REST, and (optionally) mount JSON-RPC and diagnostics.
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
+ from ._concrete import Router
13
+
12
14
  # ── OpSpec (source of truth) ───────────────────────────────────────────────────
13
15
  from .op import (
14
16
  OpSpec,
@@ -26,14 +28,13 @@ from .schema.types import SchemaRef, SchemaArg
26
28
  # ── Ctx-only decorators (new surface; replaces legacy ops.decorators) ─────────
27
29
 
28
30
  from .op import alias_ctx, op_ctx, alias, op_alias
29
- from .hook import hook_ctx
30
- from .engine.decorators import engine_ctx
31
- from .schema.decorators import schema_ctx
32
- from .responses.decorators import response_ctx
33
- from .responses.types import ResponseSpec
31
+ from .decorators.hook import hook_ctx
32
+ from .decorators.engine import engine_ctx
33
+ from .decorators.schema import schema_ctx
34
+ from .decorators.response import response_ctx
34
35
 
35
36
  # ── Bindings (model + Router orchestration) ───────────────────────────────────────
36
- from .bindings import (
37
+ from .mapping import (
37
38
  bind,
38
39
  rebind,
39
40
  build_schemas,
@@ -53,7 +54,10 @@ from .runtime.executor import _invoke
53
54
  from .schema import _build_schema, _build_list_params, get_schema
54
55
 
55
56
  # ── Transport & Diagnostics (optional) ─────────────────────────────────────────
56
- from .transport.jsonrpc import build_jsonrpc_router
57
+ from ._concrete._request import Request
58
+ from .security import Depends
59
+ from ._concrete._json_response import JSONResponse
60
+ from ._concrete._response import Response
57
61
  from .system import mount_diagnostics
58
62
 
59
63
  # ── DB/bootstrap helpers (infra; optional) ─────────────────────────────────────
@@ -61,13 +65,50 @@ from .ddl import ensure_schemas, register_sqlite_attach, bootstrap_dbschema
61
65
 
62
66
  # ── Config constants (defaults used by REST) ───────────────────────────────────
63
67
  from .config.constants import DEFAULT_HTTP_METHODS
64
- from .app.tigrbl_app import TigrblApp
65
- from .router import Router, TigrblRouter, route_ctx
66
-
67
-
68
- from .table import Base
68
+ from ._concrete.tigrbl_app import TigrblApp
69
+ from ._concrete.tigrbl_router import TigrblRouter
70
+ from .decorators.router import route_ctx
71
+ from .orm.tables import TableBase
69
72
  from .op import Op
70
- from .security import APIKey, HTTPBearer, MutualTLS, OAuth2, OpenIdConnect
73
+ from .shortcuts.op import op
74
+ from .engine import resolver
75
+ from ._concrete._security.api_key import APIKey
76
+ from ._concrete._security.http_bearer import HTTPBearer
77
+ from ._concrete._security.mutual_tls import MutualTLS
78
+ from ._concrete._security.oauth2 import OAuth2
79
+ from ._concrete._security.openid_connect import OpenIdConnect
80
+ from .runtime.status.exceptions import HTTPException
81
+ from ._spec import (
82
+ AppSpec,
83
+ ColumnSpec,
84
+ EngineSpec,
85
+ FieldSpec,
86
+ ForeignKeySpec,
87
+ IOSpec,
88
+ RequestSpec,
89
+ ResponseSpec,
90
+ RouterSpec,
91
+ SchemaSpec,
92
+ SessionSpec,
93
+ StorageSpec,
94
+ StorageTransform,
95
+ TableRegistrySpec,
96
+ TableSpec,
97
+ TemplateSpec,
98
+ )
99
+ from ._base import ForeignKeyBase, HookBase, TableRegistryBase
100
+ from ._concrete import (
101
+ App,
102
+ Column,
103
+ ForeignKey,
104
+ Hook,
105
+ Route,
106
+ Schema,
107
+ Table,
108
+ TableRegistry,
109
+ )
110
+ from .decorators import HOOK_DECLS_ATTR, middleware, middlewares
111
+
71
112
 
72
113
  __all__: list[str] = []
73
114
 
@@ -75,8 +116,11 @@ __all__ += [
75
116
  "TigrblApp",
76
117
  "TigrblRouter",
77
118
  "Router",
78
- "Base",
119
+ "Depends",
120
+ "HTTPException",
121
+ "TableBase",
79
122
  "Op",
123
+ "op",
80
124
  "HTTPBearer",
81
125
  "APIKey",
82
126
  "OAuth2",
@@ -126,7 +170,6 @@ __all__ += [
126
170
  "_build_list_params",
127
171
  "get_schema",
128
172
  # Transport / Diagnostics
129
- "build_jsonrpc_router",
130
173
  "mount_diagnostics",
131
174
  # DB/infra
132
175
  "ensure_schemas",
@@ -134,4 +177,40 @@ __all__ += [
134
177
  "bootstrap_dbschema",
135
178
  # Config
136
179
  "DEFAULT_HTTP_METHODS",
180
+ "Request",
181
+ "Depends",
182
+ "Response",
183
+ "JSONResponse",
184
+ "resolver",
185
+ ]
186
+ __all__ += [
187
+ "AppSpec",
188
+ "RouterSpec",
189
+ "TableSpec",
190
+ "TableRegistrySpec",
191
+ "ColumnSpec",
192
+ "FieldSpec",
193
+ "IOSpec",
194
+ "StorageSpec",
195
+ "StorageTransform",
196
+ "ForeignKeySpec",
197
+ "RequestSpec",
198
+ "SchemaSpec",
199
+ "SessionSpec",
200
+ "EngineSpec",
201
+ "TemplateSpec",
202
+ "ForeignKeyBase",
203
+ "HookBase",
204
+ "TableRegistryBase",
205
+ "App",
206
+ "Table",
207
+ "Column",
208
+ "Route",
209
+ "Schema",
210
+ "Hook",
211
+ "ForeignKey",
212
+ "TableRegistry",
213
+ "HOOK_DECLS_ATTR",
214
+ "middleware",
215
+ "middlewares",
137
216
  ]
@@ -0,0 +1,24 @@
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
+ ]
@@ -0,0 +1,25 @@
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"]
@@ -5,16 +5,15 @@ from __future__ import annotations
5
5
  from typing import Any
6
6
  from urllib.parse import urlencode
7
7
 
8
- from tigrbl.requests import Request
9
- from tigrbl.requests.adapters import request_from_asgi
10
- from tigrbl.responses import Response
11
- from tigrbl.responses._transport import finalize_transport_response
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
12
 
13
- from .middleware import Middleware
14
- from .spec import ASGIReceive, ASGISend, Message
13
+ from .._spec.middleware_spec import MiddlewareSpec, ASGIReceive, ASGISend, Message
15
14
 
16
15
 
17
- class BaseHTTPMiddleware(Middleware):
16
+ class MiddlewareBase(MiddlewareSpec):
18
17
  """Base middleware for intercepting HTTP requests in ASGI mode."""
19
18
 
20
19
  async def dispatch(
@@ -139,4 +138,4 @@ class BaseHTTPMiddleware(Middleware):
139
138
  )
140
139
 
141
140
 
142
- __all__ = ["BaseHTTPMiddleware"]
141
+ __all__ = ["MiddlewareBase"]
@@ -0,0 +1,12 @@
1
+ """Base operation descriptor implementation for Tigrbl."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .._spec.op_spec import OpSpec
6
+
7
+
8
+ class OpBase(OpSpec):
9
+ """Base operation descriptor type."""
10
+
11
+
12
+ __all__ = ["OpBase"]
@@ -0,0 +1,32 @@
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,26 +1,28 @@
1
- """StdAPI response primitives."""
2
-
3
1
  from __future__ import annotations
4
2
 
5
3
  import json as json_module
6
- import mimetypes
7
- from dataclasses import dataclass, field
4
+ from dataclasses import dataclass
8
5
  from http.cookies import SimpleCookie
9
- from pathlib import Path
10
- from typing import Any, AsyncIterator, Iterable, Mapping
6
+ from typing import Any, Mapping
7
+
8
+ from tigrbl._concrete._headers import HeaderCookies, Headers
11
9
 
12
- from tigrbl.headers import HeaderCookies, Headers
10
+ from .._spec.response_spec import ResponseSpec, TemplateSpec
13
11
 
14
12
 
15
13
  class _JSONDualMethod:
16
- def __get__(self, obj: "Response" | None, owner: type["Response"]):
14
+ def __get__(
15
+ self,
16
+ obj: "ResponseBase" | None,
17
+ owner: type["ResponseBase"],
18
+ ):
17
19
  if obj is None:
18
20
 
19
21
  def _factory(
20
22
  data: Any,
21
23
  status_code: int = 200,
22
24
  headers: Mapping[str, str] | None = None,
23
- ) -> "Response":
25
+ ) -> "ResponseBase":
24
26
  return owner.from_json(data, status_code=status_code, headers=headers)
25
27
 
26
28
  return _factory
@@ -31,18 +33,59 @@ class _JSONDualMethod:
31
33
  return _instance_json
32
34
 
33
35
 
34
- @dataclass
35
- class Response:
36
- status_code: int = 200
37
- headers: Headers = field(default_factory=Headers)
38
- body: bytes = b""
39
- media_type: str | None = None
40
- _headers: Headers = field(init=False, repr=False)
36
+ class ResponseBase(ResponseSpec):
37
+ """Concrete HTTP response object that also implements ``ResponseSpec``."""
41
38
 
42
39
  json = _JSONDualMethod()
43
40
 
44
- def __post_init__(self) -> None:
45
- self.headers = Headers(self.headers)
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
46
89
  self._headers = self.headers
47
90
 
48
91
  @staticmethod
@@ -132,7 +175,7 @@ class Response:
132
175
  data: Any,
133
176
  status_code: int = 200,
134
177
  headers: Mapping[str, str] | None = None,
135
- ) -> "Response":
178
+ ) -> "ResponseBase":
136
179
  payload = json_module.dumps(
137
180
  data, ensure_ascii=False, separators=(",", ":"), default=str
138
181
  ).encode("utf-8")
@@ -152,7 +195,7 @@ class Response:
152
195
  html: str,
153
196
  status_code: int = 200,
154
197
  headers: Mapping[str, str] | None = None,
155
- ) -> "Response":
198
+ ) -> "ResponseBase":
156
199
  payload = html.encode("utf-8")
157
200
  hdrs = [("content-type", "text/html; charset=utf-8")]
158
201
  for k, v in (headers or {}).items():
@@ -170,7 +213,7 @@ class Response:
170
213
  text: str,
171
214
  status_code: int = 200,
172
215
  headers: Mapping[str, str] | None = None,
173
- ) -> "Response":
216
+ ) -> "ResponseBase":
174
217
  payload = text.encode("utf-8")
175
218
  hdrs = [("content-type", "text/plain; charset=utf-8")]
176
219
  for k, v in (headers or {}).items():
@@ -183,96 +226,6 @@ class Response:
183
226
  )
184
227
 
185
228
 
186
- class JSONResponse(Response):
187
- def __init__(self, content: Any, status_code: int = 200) -> None:
188
- payload = json_module.dumps(
189
- content, ensure_ascii=False, separators=(",", ":"), default=str
190
- ).encode("utf-8")
191
- super().__init__(
192
- status_code=status_code,
193
- headers=[("content-type", "application/json; charset=utf-8")],
194
- body=payload,
195
- media_type="application/json",
196
- )
197
-
198
-
199
- class HTMLResponse(Response):
200
- def __init__(self, content: str, status_code: int = 200) -> None:
201
- super().__init__(
202
- status_code=status_code,
203
- headers=[("content-type", "text/html; charset=utf-8")],
204
- body=content.encode("utf-8"),
205
- media_type="text/html",
206
- )
207
-
208
-
209
- class PlainTextResponse(Response):
210
- def __init__(self, content: str, status_code: int = 200) -> None:
211
- super().__init__(
212
- status_code=status_code,
213
- headers=[("content-type", "text/plain; charset=utf-8")],
214
- body=content.encode("utf-8"),
215
- media_type="text/plain",
216
- )
217
-
218
-
219
- class StreamingResponse(Response):
220
- def __init__(
221
- self,
222
- content: Iterable[bytes] | bytes,
223
- status_code: int = 200,
224
- media_type: str = "application/octet-stream",
225
- ) -> None:
226
- chunks = [content] if isinstance(content, bytes) else list(content)
227
- super().__init__(
228
- status_code=status_code,
229
- headers=[("content-type", media_type)],
230
- body=b"".join(chunks),
231
- media_type=media_type,
232
- )
233
- self._chunks = [bytes(chunk) for chunk in chunks]
234
-
235
- @property
236
- def body_iterator(self) -> AsyncIterator[bytes]:
237
- async def _iter() -> AsyncIterator[bytes]:
238
- for chunk in self._chunks:
239
- yield chunk
240
-
241
- return _iter()
242
-
243
-
244
- class FileResponse(Response):
245
- def __init__(self, path: str, media_type: str | None = None) -> None:
246
- payload = Path(path).read_bytes()
247
- content_type = (
248
- media_type or mimetypes.guess_type(path)[0] or "application/octet-stream"
249
- )
250
- super().__init__(
251
- status_code=200,
252
- headers=[("content-type", content_type)],
253
- body=payload,
254
- media_type=content_type,
255
- )
256
- self.path = str(path)
257
-
258
-
259
- class RedirectResponse(Response):
260
- def __init__(self, url: str, status_code: int = 307) -> None:
261
- super().__init__(
262
- status_code=status_code,
263
- headers=[("location", url)],
264
- body=b"",
265
- media_type=None,
266
- )
267
- self.url = url
268
-
269
-
270
- __all__ = [
271
- "Response",
272
- "JSONResponse",
273
- "HTMLResponse",
274
- "PlainTextResponse",
275
- "StreamingResponse",
276
- "FileResponse",
277
- "RedirectResponse",
278
- ]
229
+ @dataclass
230
+ class TemplateBase(TemplateSpec):
231
+ """Concrete template configuration used at runtime."""
@@ -0,0 +1,14 @@
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"]