tigrbl 0.3.17.dev10__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.
Files changed (385) hide show
  1. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/PKG-INFO +7 -4
  2. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/README.md +2 -2
  3. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/pyproject.toml +12 -10
  4. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/__init__.py +4 -0
  5. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openrpc.py +2 -2
  6. tigrbl-0.3.17.dev10/tigrbl/_base/__init__.py +0 -24
  7. tigrbl-0.3.17.dev10/tigrbl/_base/_hook_base.py +0 -25
  8. tigrbl-0.3.17.dev10/tigrbl/_base/_middleware_base.py +0 -141
  9. tigrbl-0.3.17.dev10/tigrbl/_base/_op_base.py +0 -12
  10. tigrbl-0.3.17.dev10/tigrbl/_base/_request_base.py +0 -32
  11. tigrbl-0.3.17.dev10/tigrbl/_base/_response_base.py +0 -231
  12. tigrbl-0.3.17.dev10/tigrbl/_base/_schema_base.py +0 -14
  13. tigrbl-0.3.17.dev10/tigrbl/_base/_security_base.py +0 -69
  14. tigrbl-0.3.17.dev10/tigrbl/_base/_session_abc.py +0 -47
  15. tigrbl-0.3.17.dev10/tigrbl/_base/_session_base.py +0 -132
  16. tigrbl-0.3.17.dev10/tigrbl/_base/_storage.py +0 -13
  17. tigrbl-0.3.17.dev10/tigrbl/_base/_table_base.py +0 -443
  18. tigrbl-0.3.17.dev10/tigrbl/_base/_table_registry_base.py +0 -55
  19. tigrbl-0.3.17.dev10/tigrbl/_concrete/__init__.py +0 -44
  20. tigrbl-0.3.17.dev10/tigrbl/_concrete/_alias.py +0 -42
  21. tigrbl-0.3.17.dev10/tigrbl/_concrete/_app.py +0 -180
  22. tigrbl-0.3.17.dev10/tigrbl/_concrete/_background.py +0 -29
  23. tigrbl-0.3.17.dev10/tigrbl/_concrete/_body.py +0 -27
  24. tigrbl-0.3.17.dev10/tigrbl/_concrete/_column.py +0 -96
  25. tigrbl-0.3.17.dev10/tigrbl/_concrete/_cors_middleware.py +0 -103
  26. tigrbl-0.3.17.dev10/tigrbl/_concrete/_engine.py +0 -187
  27. tigrbl-0.3.17.dev10/tigrbl/_concrete/_file_response.py +0 -26
  28. tigrbl-0.3.17.dev10/tigrbl/_concrete/_headers.py +0 -142
  29. tigrbl-0.3.17.dev10/tigrbl/_concrete/_hook.py +0 -12
  30. tigrbl-0.3.17.dev10/tigrbl/_concrete/_html_response.py +0 -18
  31. tigrbl-0.3.17.dev10/tigrbl/_concrete/_httpx.py +0 -25
  32. tigrbl-0.3.17.dev10/tigrbl/_concrete/_json_response.py +0 -24
  33. tigrbl-0.3.17.dev10/tigrbl/_concrete/_middleware.py +0 -45
  34. tigrbl-0.3.17.dev10/tigrbl/_concrete/_op.py +0 -31
  35. tigrbl-0.3.17.dev10/tigrbl/_concrete/_op_registry.py +0 -301
  36. tigrbl-0.3.17.dev10/tigrbl/_concrete/_plain_text_response.py +0 -18
  37. tigrbl-0.3.17.dev10/tigrbl/_concrete/_redirect_response.py +0 -19
  38. tigrbl-0.3.17.dev10/tigrbl/_concrete/_request.py +0 -270
  39. tigrbl-0.3.17.dev10/tigrbl/_concrete/_request_adapters.py +0 -68
  40. tigrbl-0.3.17.dev10/tigrbl/_concrete/_response.py +0 -35
  41. tigrbl-0.3.17.dev10/tigrbl/_concrete/_route.py +0 -122
  42. tigrbl-0.3.17.dev10/tigrbl/_concrete/_router.py +0 -207
  43. tigrbl-0.3.17.dev10/tigrbl/_concrete/_routing.py +0 -139
  44. tigrbl-0.3.17.dev10/tigrbl/_concrete/_schema.py +0 -28
  45. tigrbl-0.3.17.dev10/tigrbl/_concrete/_security/api_key.py +0 -57
  46. tigrbl-0.3.17.dev10/tigrbl/_concrete/_security/http_bearer.py +0 -74
  47. tigrbl-0.3.17.dev10/tigrbl/_concrete/_security/mutual_tls.py +0 -27
  48. tigrbl-0.3.17.dev10/tigrbl/_concrete/_security/oauth2.py +0 -28
  49. tigrbl-0.3.17.dev10/tigrbl/_concrete/_security/openid_connect.py +0 -31
  50. tigrbl-0.3.17.dev10/tigrbl/_concrete/_session.py +0 -112
  51. tigrbl-0.3.17.dev10/tigrbl/_concrete/_storage.py +0 -13
  52. tigrbl-0.3.17.dev10/tigrbl/_concrete/_streaming_response.py +0 -35
  53. tigrbl-0.3.17.dev10/tigrbl/_concrete/_table.py +0 -103
  54. tigrbl-0.3.17.dev10/tigrbl/_concrete/_table_registry.py +0 -10
  55. tigrbl-0.3.17.dev10/tigrbl/_concrete/dependencies.py +0 -21
  56. tigrbl-0.3.17.dev10/tigrbl/_concrete/tigrbl_app.py +0 -893
  57. tigrbl-0.3.17.dev10/tigrbl/_concrete/tigrbl_router.py +0 -418
  58. tigrbl-0.3.17.dev10/tigrbl/_spec/__init__.py +0 -67
  59. tigrbl-0.3.17.dev10/tigrbl/_spec/alias_spec.py +0 -35
  60. tigrbl-0.3.17.dev10/tigrbl/_spec/app_spec.py +0 -137
  61. tigrbl-0.3.17.dev10/tigrbl/_spec/binding_spec.py +0 -78
  62. tigrbl-0.3.17.dev10/tigrbl/_spec/column_spec.py +0 -40
  63. tigrbl-0.3.17.dev10/tigrbl/_spec/engine_spec.py +0 -359
  64. tigrbl-0.3.17.dev10/tigrbl/_spec/field_spec.py +0 -32
  65. tigrbl-0.3.17.dev10/tigrbl/_spec/hook_spec.py +0 -24
  66. tigrbl-0.3.17.dev10/tigrbl/_spec/io_spec.py +0 -136
  67. tigrbl-0.3.17.dev10/tigrbl/_spec/middleware_spec.py +0 -28
  68. tigrbl-0.3.17.dev10/tigrbl/_spec/op_spec.py +0 -110
  69. tigrbl-0.3.17.dev10/tigrbl/_spec/request_spec.py +0 -19
  70. tigrbl-0.3.17.dev10/tigrbl/_spec/response_spec.py +0 -34
  71. tigrbl-0.3.17.dev10/tigrbl/_spec/response_types.py +0 -12
  72. tigrbl-0.3.17.dev10/tigrbl/_spec/router_spec.py +0 -25
  73. tigrbl-0.3.17.dev10/tigrbl/_spec/schema_spec.py +0 -20
  74. tigrbl-0.3.17.dev10/tigrbl/_spec/session_spec.py +0 -160
  75. tigrbl-0.3.17.dev10/tigrbl/_spec/shortcuts_spec.py +0 -8
  76. tigrbl-0.3.17.dev10/tigrbl/_spec/storage_spec.py +0 -72
  77. tigrbl-0.3.17.dev10/tigrbl/_spec/table_registry_spec.py +0 -14
  78. tigrbl-0.3.17.dev10/tigrbl/_spec/table_spec.py +0 -73
  79. tigrbl-0.3.17.dev10/tigrbl/core/__init__.py +0 -47
  80. tigrbl-0.3.17.dev10/tigrbl/core/crud/__init__.py +0 -43
  81. tigrbl-0.3.17.dev10/tigrbl/core/crud/bulk.py +0 -167
  82. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/__init__.py +0 -76
  83. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/db.py +0 -91
  84. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/enum.py +0 -85
  85. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/filters.py +0 -161
  86. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/model.py +0 -136
  87. tigrbl-0.3.17.dev10/tigrbl/core/crud/helpers/normalize.py +0 -98
  88. tigrbl-0.3.17.dev10/tigrbl/core/crud/ops.py +0 -298
  89. tigrbl-0.3.17.dev10/tigrbl/core/crud/params.py +0 -50
  90. tigrbl-0.3.17.dev10/tigrbl/mapping/__init__.py +0 -60
  91. tigrbl-0.3.17.dev10/tigrbl/mapping/app_mro_collect.py +0 -14
  92. tigrbl-0.3.17.dev10/tigrbl/mapping/apply.py +0 -98
  93. tigrbl-0.3.17.dev10/tigrbl/mapping/collect.py +0 -60
  94. tigrbl-0.3.17.dev10/tigrbl/mapping/collect_decorated_schemas.py +0 -78
  95. tigrbl-0.3.17.dev10/tigrbl/mapping/column_mro_collect.py +0 -124
  96. tigrbl-0.3.17.dev10/tigrbl/mapping/columns.py +0 -49
  97. tigrbl-0.3.17.dev10/tigrbl/mapping/config_resolver.py +0 -299
  98. tigrbl-0.3.17.dev10/tigrbl/mapping/context.py +0 -48
  99. tigrbl-0.3.17.dev10/tigrbl/mapping/core_resolver.py +0 -102
  100. tigrbl-0.3.17.dev10/tigrbl/mapping/diagnostics.py +0 -20
  101. tigrbl-0.3.17.dev10/tigrbl/mapping/engine_resolver.py +0 -379
  102. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/__init__.py +0 -10
  103. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/builder.py +0 -118
  104. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/ctx.py +0 -85
  105. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/identifiers.py +0 -227
  106. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/namespaces.py +0 -50
  107. tigrbl-0.3.17.dev10/tigrbl/mapping/handlers/steps.py +0 -276
  108. tigrbl-0.3.17.dev10/tigrbl/mapping/hook_mro_collect.py +0 -121
  109. tigrbl-0.3.17.dev10/tigrbl/mapping/hooks.py +0 -325
  110. tigrbl-0.3.17.dev10/tigrbl/mapping/mapping_resolver.py +0 -5
  111. tigrbl-0.3.17.dev10/tigrbl/mapping/model.py +0 -33
  112. tigrbl-0.3.17.dev10/tigrbl/mapping/model_helpers.py +0 -151
  113. tigrbl-0.3.17.dev10/tigrbl/mapping/model_registry.py +0 -85
  114. tigrbl-0.3.17.dev10/tigrbl/mapping/op_mro_collect.py +0 -136
  115. tigrbl-0.3.17.dev10/tigrbl/mapping/op_resolver.py +0 -216
  116. tigrbl-0.3.17.dev10/tigrbl/mapping/passes.py +0 -74
  117. tigrbl-0.3.17.dev10/tigrbl/mapping/plan.py +0 -54
  118. tigrbl-0.3.17.dev10/tigrbl/mapping/precedence.py +0 -45
  119. tigrbl-0.3.17.dev10/tigrbl/mapping/responses_resolver.py +0 -83
  120. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/__init__.py +0 -7
  121. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/attach.py +0 -25
  122. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/collection.py +0 -290
  123. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/common.py +0 -121
  124. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/helpers.py +0 -108
  125. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/io.py +0 -335
  126. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/io_headers.py +0 -49
  127. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/member.py +0 -200
  128. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/router.py +0 -319
  129. tigrbl-0.3.17.dev10/tigrbl/mapping/rest/routing.py +0 -135
  130. tigrbl-0.3.17.dev10/tigrbl/mapping/router/common.py +0 -100
  131. tigrbl-0.3.17.dev10/tigrbl/mapping/router/include.py +0 -466
  132. tigrbl-0.3.17.dev10/tigrbl/mapping/router/resource_proxy.py +0 -104
  133. tigrbl-0.3.17.dev10/tigrbl/mapping/router/rpc.py +0 -153
  134. tigrbl-0.3.17.dev10/tigrbl/mapping/router_mro_collect.py +0 -45
  135. tigrbl-0.3.17.dev10/tigrbl/mapping/rpc.py +0 -493
  136. tigrbl-0.3.17.dev10/tigrbl/mapping/runtime_routes.py +0 -293
  137. tigrbl-0.3.17.dev10/tigrbl/mapping/schemas/__init__.py +0 -10
  138. tigrbl-0.3.17.dev10/tigrbl/mapping/schemas/builder.py +0 -347
  139. tigrbl-0.3.17.dev10/tigrbl/mapping/schemas/defaults.py +0 -259
  140. tigrbl-0.3.17.dev10/tigrbl/mapping/schemas/utils.py +0 -192
  141. tigrbl-0.3.17.dev10/tigrbl/mapping/spec_normalization.py +0 -110
  142. tigrbl-0.3.17.dev10/tigrbl/mapping/table.py +0 -5
  143. tigrbl-0.3.17.dev10/tigrbl/mapping/table_mro_collect.py +0 -14
  144. tigrbl-0.3.17.dev10/tigrbl/mapping/traversal.py +0 -196
  145. tigrbl-0.3.17.dev10/tigrbl/orm/__init__.py +0 -1
  146. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/_RowBound.py +0 -83
  147. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/__init__.py +0 -95
  148. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/bootstrappable.py +0 -113
  149. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/bound.py +0 -47
  150. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/edges.py +0 -40
  151. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/fields.py +0 -165
  152. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/hierarchy.py +0 -54
  153. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/key_digest.py +0 -44
  154. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/lifecycle.py +0 -115
  155. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/locks.py +0 -51
  156. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/markers.py +0 -16
  157. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/operations.py +0 -57
  158. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/ownable.py +0 -337
  159. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/principals.py +0 -98
  160. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/tenant_bound.py +0 -301
  161. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/upsertable.py +0 -118
  162. tigrbl-0.3.17.dev10/tigrbl/orm/mixins/utils.py +0 -49
  163. tigrbl-0.3.17.dev10/tigrbl/orm/tables/__init__.py +0 -73
  164. tigrbl-0.3.17.dev10/tigrbl/orm/tables/_base.py +0 -7
  165. tigrbl-0.3.17.dev10/tigrbl/orm/tables/audit.py +0 -56
  166. tigrbl-0.3.17.dev10/tigrbl/orm/tables/client.py +0 -25
  167. tigrbl-0.3.17.dev10/tigrbl/orm/tables/group.py +0 -29
  168. tigrbl-0.3.17.dev10/tigrbl/orm/tables/org.py +0 -30
  169. tigrbl-0.3.17.dev10/tigrbl/orm/tables/rbac.py +0 -76
  170. tigrbl-0.3.17.dev10/tigrbl/orm/tables/status.py +0 -106
  171. tigrbl-0.3.17.dev10/tigrbl/orm/tables/tenant.py +0 -22
  172. tigrbl-0.3.17.dev10/tigrbl/orm/tables/user.py +0 -39
  173. tigrbl-0.3.17.dev10/tigrbl/runtime/README.md +0 -180
  174. tigrbl-0.3.17.dev10/tigrbl/runtime/__init__.py +0 -20
  175. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/__init__.py +0 -111
  176. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/dep/__init__.py +0 -15
  177. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/dep/extra.py +0 -104
  178. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/dep/security.py +0 -114
  179. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/__init__.py +0 -43
  180. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/asgi_send.py +0 -228
  181. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/envelope_apply.py +0 -101
  182. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/headers_apply.py +0 -58
  183. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/http_finalize.py +0 -43
  184. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/out_dump.py +0 -33
  185. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/result_normalize.py +0 -35
  186. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/egress/to_transport_response.py +0 -125
  187. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/emit/__init__.py +0 -42
  188. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/emit/paired_post.py +0 -158
  189. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/emit/paired_pre.py +0 -106
  190. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -120
  191. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/__init__.py +0 -58
  192. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/attach_compiled.py +0 -32
  193. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/body_peek.py +0 -29
  194. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/body_read.py +0 -66
  195. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/ctx_init.py +0 -27
  196. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/headers_parse.py +0 -67
  197. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/method_extract.py +0 -45
  198. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/metrics_start.py +0 -27
  199. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/path_extract.py +0 -46
  200. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/query_parse.py +0 -101
  201. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/raw_from_scope.py +0 -124
  202. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/request_body_apply.py +0 -26
  203. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/ingress/request_from_scope.py +0 -33
  204. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/out/__init__.py +0 -38
  205. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/out/masking.py +0 -135
  206. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/refresh/__init__.py +0 -38
  207. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/refresh/demand.py +0 -130
  208. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/resolve/__init__.py +0 -40
  209. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/resolve/assemble.py +0 -167
  210. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -152
  211. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/__init__.py +0 -19
  212. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -57
  213. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/negotiate.py +0 -30
  214. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/negotiation.py +0 -43
  215. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/render.py +0 -82
  216. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/renderer.py +0 -117
  217. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/template.py +0 -44
  218. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/response/templates.py +0 -88
  219. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/__init__.py +0 -42
  220. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/binding_match.py +0 -155
  221. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/binding_policy_apply.py +0 -82
  222. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/ctx_finalize.py +0 -142
  223. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/op_resolve.py +0 -67
  224. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/params_normalize.py +0 -22
  225. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/path_params_extract.py +0 -21
  226. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/payload_select.py +0 -196
  227. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/plan_select.py +0 -31
  228. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/protocol_detect.py +0 -51
  229. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/rpc_envelope_parse.py +0 -135
  230. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/route/rpc_method_match.py +0 -39
  231. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/schema/__init__.py +0 -40
  232. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/schema/collect_in.py +0 -21
  233. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/schema/collect_out.py +0 -21
  234. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/storage/__init__.py +0 -38
  235. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/storage/to_stored.py +0 -167
  236. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/sys/__init__.py +0 -26
  237. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/sys/commit_tx.py +0 -16
  238. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/sys/handler_persistence.py +0 -38
  239. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/sys/start_tx.py +0 -16
  240. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/wire/__init__.py +0 -45
  241. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/wire/build_in.py +0 -287
  242. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/wire/build_out.py +0 -99
  243. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/wire/dump.py +0 -270
  244. tigrbl-0.3.17.dev10/tigrbl/runtime/atoms/wire/validate_in.py +0 -259
  245. tigrbl-0.3.17.dev10/tigrbl/runtime/context.py +0 -206
  246. tigrbl-0.3.17.dev10/tigrbl/runtime/events.py +0 -435
  247. tigrbl-0.3.17.dev10/tigrbl/runtime/exceptions.py +0 -18
  248. tigrbl-0.3.17.dev10/tigrbl/runtime/executor/__init__.py +0 -6
  249. tigrbl-0.3.17.dev10/tigrbl/runtime/executor/guards.py +0 -132
  250. tigrbl-0.3.17.dev10/tigrbl/runtime/executor/helpers.py +0 -194
  251. tigrbl-0.3.17.dev10/tigrbl/runtime/executor/invoke.py +0 -242
  252. tigrbl-0.3.17.dev10/tigrbl/runtime/executor/types.py +0 -128
  253. tigrbl-0.3.17.dev10/tigrbl/runtime/gw/__init__.py +0 -4
  254. tigrbl-0.3.17.dev10/tigrbl/runtime/gw/invoke.py +0 -339
  255. tigrbl-0.3.17.dev10/tigrbl/runtime/gw/raw.py +0 -26
  256. tigrbl-0.3.17.dev10/tigrbl/runtime/hook_types.py +0 -60
  257. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/__init__.py +0 -49
  258. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/atoms.py +0 -234
  259. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/cache.py +0 -85
  260. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/core.py +0 -483
  261. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/models.py +0 -124
  262. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/opview_compiler.py +0 -99
  263. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel/payload.py +0 -64
  264. tigrbl-0.3.17.dev10/tigrbl/runtime/kernel.py +0 -667
  265. tigrbl-0.3.17.dev10/tigrbl/runtime/labels.py +0 -369
  266. tigrbl-0.3.17.dev10/tigrbl/runtime/opview.py +0 -89
  267. tigrbl-0.3.17.dev10/tigrbl/runtime/ordering.py +0 -331
  268. tigrbl-0.3.17.dev10/tigrbl/runtime/status/__init__.py +0 -63
  269. tigrbl-0.3.17.dev10/tigrbl/runtime/status/converters.py +0 -222
  270. tigrbl-0.3.17.dev10/tigrbl/runtime/status/exceptions.py +0 -149
  271. tigrbl-0.3.17.dev10/tigrbl/runtime/status/mappings.py +0 -94
  272. tigrbl-0.3.17.dev10/tigrbl/runtime/status/utils.py +0 -114
  273. tigrbl-0.3.17.dev10/tigrbl/runtime/system.py +0 -338
  274. tigrbl-0.3.17.dev10/tigrbl/runtime/trace.py +0 -330
  275. tigrbl-0.3.17.dev10/tigrbl/types/__init__.py +0 -187
  276. tigrbl-0.3.17.dev10/tigrbl/types/allow_anon_provider.py +0 -19
  277. tigrbl-0.3.17.dev10/tigrbl/types/authn_abc.py +0 -31
  278. tigrbl-0.3.17.dev10/tigrbl/types/nested_path_provider.py +0 -22
  279. tigrbl-0.3.17.dev10/tigrbl/types/op.py +0 -35
  280. tigrbl-0.3.17.dev10/tigrbl/types/op_config_provider.py +0 -17
  281. tigrbl-0.3.17.dev10/tigrbl/types/op_verb_alias_provider.py +0 -33
  282. tigrbl-0.3.17.dev10/tigrbl/types/request_extras_provider.py +0 -22
  283. tigrbl-0.3.17.dev10/tigrbl/types/response_extras_provider.py +0 -22
  284. tigrbl-0.3.17.dev10/tigrbl/types/table_config_provider.py +0 -13
  285. tigrbl-0.3.17.dev10/tigrbl/types/uuid.py +0 -55
  286. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/LICENSE +0 -0
  287. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/README.md +0 -0
  288. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/README.md +0 -0
  289. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/__init__.py +0 -0
  290. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/__init__.py +0 -0
  291. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/core.py +0 -0
  292. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/jsonhints.py +0 -0
  293. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/planning.py +0 -0
  294. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/types.py +0 -0
  295. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/column/infer/utils.py +0 -0
  296. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/config/__init__.py +0 -0
  297. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/config/constants.py +0 -0
  298. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/config/defaults.py +0 -0
  299. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/ddl/__init__.py +0 -0
  300. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/__init__.py +0 -0
  301. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/engine.py +0 -0
  302. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/hook.py +0 -0
  303. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/middlewares.py +0 -0
  304. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/op.py +0 -0
  305. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/response.py +0 -0
  306. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/rest.py +0 -0
  307. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/router.py +0 -0
  308. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/schema.py +0 -0
  309. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/decorators/session.py +0 -0
  310. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/docs/column_specs.md +0 -0
  311. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/docs/session.md +0 -0
  312. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/docs/verbosity.md +0 -0
  313. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/__init__.py +0 -0
  314. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/bind.py +0 -0
  315. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/builders.py +0 -0
  316. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/capabilities.py +0 -0
  317. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/collect.py +0 -0
  318. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/docs/PLUGINS.md +0 -0
  319. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/plugins.py +0 -0
  320. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/registry.py +0 -0
  321. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/engine/resolver.py +0 -0
  322. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/hook/exceptions.py +0 -0
  323. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/hook/types.py +0 -0
  324. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/middlewares/__init__.py +0 -0
  325. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/middlewares/compose.py +0 -0
  326. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/op/__init__.py +0 -0
  327. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/op/canonical.py +0 -0
  328. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/op/collect.py +0 -0
  329. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/op/types.py +0 -0
  330. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/requests.py +0 -0
  331. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/rest/__init__.py +0 -0
  332. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/__init__.py +0 -0
  333. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/__init__.py +0 -0
  334. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/build_schema.py +0 -0
  335. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/cache.py +0 -0
  336. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/extras.py +0 -0
  337. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/helpers.py +0 -0
  338. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/list_params.py +0 -0
  339. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  340. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/types.py +0 -0
  341. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/schema/utils.py +0 -0
  342. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/security/__init__.py +0 -0
  343. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/security/dependencies.py +0 -0
  344. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/__init__.py +0 -0
  345. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/app.py +0 -0
  346. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/column.py +0 -0
  347. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/engine.py +0 -0
  348. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/hook.py +0 -0
  349. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/op.py +0 -0
  350. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/responses.py +0 -0
  351. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/router.py +0 -0
  352. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/schema.py +0 -0
  353. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/shortcuts/table.py +0 -0
  354. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/specs.py +0 -0
  355. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/__init__.py +0 -0
  356. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/__init__.py +0 -0
  357. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/healthz.py +0 -0
  358. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/hookz.py +0 -0
  359. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/kernelz.py +0 -0
  360. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/methodz.py +0 -0
  361. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/router.py +0 -0
  362. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/diagnostics/utils.py +0 -0
  363. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/__init__.py +0 -0
  364. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/lens.py +0 -0
  365. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/__init__.py +0 -0
  366. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/helpers.py +0 -0
  367. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/metadata.py +0 -0
  368. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/mount.py +0 -0
  369. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/openapi/schema.py +0 -0
  370. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/docs/swagger.py +0 -0
  371. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/favicon/__init__.py +0 -0
  372. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  373. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/system/uvicorn.py +0 -0
  374. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/__init__.py +0 -0
  375. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  376. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/helpers.py +0 -0
  377. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/jsonrpc/models.py +0 -0
  378. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/rest/__init__.py +0 -0
  379. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/transport/rest/aggregator.py +0 -0
  380. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/utils/__init__.py +0 -0
  381. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/utils/schema.py +0 -0
  382. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/vendor/__init__.py +0 -0
  383. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/vendor/jinja.py +0 -0
  384. {tigrbl-0.3.17.dev10 → tigrbl-0.3.17.dev12}/tigrbl/vendor/pydantic.py +0 -0
  385. {tigrbl-0.3.17.dev10 → 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.dev10
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
@@ -228,7 +231,7 @@ Operation Handler
228
231
  v
229
232
  JSON-RPC Response
230
233
 
231
- ````
234
+ ```
232
235
 
233
236
  ## Hooks 🪝
234
237
 
@@ -245,7 +248,7 @@ class Item(Base):
245
248
  async def validate(cls, ctx):
246
249
  if ctx["request"].payload.get("name") == "bad":
247
250
  raise ValueError("invalid name")
248
- ````
251
+ ```
249
252
 
250
253
  The function runs during the `PRE_HANDLER` phase of `create`. The
251
254
  `ctx` mapping provides request and response objects, a database session,
@@ -195,7 +195,7 @@ Operation Handler
195
195
  v
196
196
  JSON-RPC Response
197
197
 
198
- ````
198
+ ```
199
199
 
200
200
  ## Hooks 🪝
201
201
 
@@ -212,7 +212,7 @@ class Item(Base):
212
212
  async def validate(cls, ctx):
213
213
  if ctx["request"].payload.get("name") == "bad":
214
214
  raise ValueError("invalid name")
215
- ````
215
+ ```
216
216
 
217
217
  The function runs during the `PRE_HANDLER` phase of `create`. The
218
218
  `ctx` mapping provides request and response objects, a database session,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.3.17.dev10"
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) ───────────────────────────────────────────────────
@@ -134,12 +134,12 @@ def _iter_ops(model: type) -> Sequence[OpSpec]:
134
134
 
135
135
  def _is_docs_only_op(op: OpSpec) -> bool:
136
136
  alias = str(getattr(op, "alias", "")).lower()
137
- if "openapi" in alias or "openrpc" in alias:
137
+ if any(token in alias for token in ("docs", "lens", "openapi", "openrpc")):
138
138
  return True
139
139
 
140
140
  for binding in tuple(getattr(op, "bindings", ()) or ()):
141
141
  path = str(getattr(binding, "path", "") or "").lower()
142
- if path in {"/openapi.json", "/openrpc.json"}:
142
+ if path in {"/docs", "/lens", "/openapi.json", "/openrpc.json"}:
143
143
  return True
144
144
 
145
145
  return False
@@ -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,12 +0,0 @@
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"]
@@ -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'.")