tigrbl 0.3.7.dev2__tar.gz → 0.3.7.dev3__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 (314) hide show
  1. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/PKG-INFO +1 -1
  2. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/pyproject.toml +1 -1
  3. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/__init__.py +2 -2
  4. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/_router.py +1 -1
  5. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/api_spec.py +1 -1
  6. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/app_spec.py +1 -1
  7. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/__init__.py +1 -1
  8. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/common.py +2 -2
  9. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/fastapi.py +4 -4
  10. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/helpers.py +1 -1
  11. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/io.py +1 -1
  12. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/routing.py +1 -1
  13. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/resolver.py +1 -1
  14. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/router_runtime.py +2 -2
  15. tigrbl-0.3.7.dev3/tigrbl/headers/__init__.py +3 -0
  16. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/headers/_header.py +25 -5
  17. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/types.py +1 -1
  18. tigrbl-0.3.7.dev3/tigrbl/requests/__init__.py +5 -0
  19. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/requests/_request.py +48 -4
  20. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/__init__.py +16 -18
  21. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/responses/_response.py +26 -4
  22. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/shortcuts.py +1 -1
  23. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/headers_from_payload.py +1 -1
  24. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/renderer.py +2 -2
  25. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/templates.py +1 -1
  26. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/executor/types.py +1 -1
  27. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/compat.py +1 -1
  28. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/lens.py +1 -1
  29. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openapi/mount.py +1 -1
  30. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openrpc.py +1 -1
  31. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/swagger.py +1 -1
  32. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/favicon/__init__.py +1 -1
  33. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/_base.py +1 -1
  34. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/table_spec.py +1 -1
  35. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/asgi_wsgi.py +48 -44
  36. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/jsonrpc/dispatcher.py +36 -10
  37. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/__init__.py +2 -2
  38. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/authn_abc.py +1 -1
  39. tigrbl-0.3.7.dev2/tigrbl/headers/__init__.py +0 -3
  40. tigrbl-0.3.7.dev2/tigrbl/requests/__init__.py +0 -3
  41. tigrbl-0.3.7.dev2/tigrbl/response/stdapi.py +0 -26
  42. tigrbl-0.3.7.dev2/tigrbl/responses/__init__.py +0 -19
  43. tigrbl-0.3.7.dev2/tigrbl/transport/request.py +0 -9
  44. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/LICENSE +0 -0
  45. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/README.md +0 -0
  46. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/README.md +0 -0
  47. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/__init__.py +0 -0
  48. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/_api.py +0 -0
  49. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/_route.py +0 -0
  50. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/_routing.py +0 -0
  51. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/mro_collect.py +0 -0
  52. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/resolve.py +0 -0
  53. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/shortcuts.py +0 -0
  54. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/api/tigrbl_api.py +0 -0
  55. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/__init__.py +0 -0
  56. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/_app.py +0 -0
  57. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/_model_registry.py +0 -0
  58. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/_routing_runtime.py +0 -0
  59. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/mro_collect.py +0 -0
  60. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/shortcuts.py +0 -0
  61. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/app/tigrbl_app.py +0 -0
  62. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/api/__init__.py +0 -0
  63. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/api/common.py +0 -0
  64. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/api/include.py +0 -0
  65. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/api/resource_proxy.py +0 -0
  66. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/api/rpc.py +0 -0
  67. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/columns.py +0 -0
  68. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/__init__.py +0 -0
  69. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/builder.py +0 -0
  70. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/ctx.py +0 -0
  71. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/identifiers.py +0 -0
  72. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/namespaces.py +0 -0
  73. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/handlers/steps.py +0 -0
  74. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/hooks.py +0 -0
  75. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/model.py +0 -0
  76. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/model_helpers.py +0 -0
  77. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/model_registry.py +0 -0
  78. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/__init__.py +0 -0
  79. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/attach.py +0 -0
  80. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/collection.py +0 -0
  81. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/io_headers.py +0 -0
  82. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/member.py +0 -0
  83. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rest/router.py +0 -0
  84. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/rpc.py +0 -0
  85. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/schemas/__init__.py +0 -0
  86. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/schemas/builder.py +0 -0
  87. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/schemas/defaults.py +0 -0
  88. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/bindings/schemas/utils.py +0 -0
  89. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/README.md +0 -0
  90. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/__init__.py +0 -0
  91. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/_column.py +0 -0
  92. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/column_spec.py +0 -0
  93. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/field_spec.py +0 -0
  94. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/__init__.py +0 -0
  95. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/core.py +0 -0
  96. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/jsonhints.py +0 -0
  97. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/planning.py +0 -0
  98. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/types.py +0 -0
  99. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/infer/utils.py +0 -0
  100. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/io_spec.py +0 -0
  101. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/mro_collect.py +0 -0
  102. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/shortcuts.py +0 -0
  103. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/column/storage_spec.py +0 -0
  104. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/config/__init__.py +0 -0
  105. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/config/constants.py +0 -0
  106. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/config/defaults.py +0 -0
  107. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/config/resolver.py +0 -0
  108. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/__init__.py +0 -0
  109. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/__init__.py +0 -0
  110. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/bulk.py +0 -0
  111. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/__init__.py +0 -0
  112. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/db.py +0 -0
  113. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/enum.py +0 -0
  114. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/filters.py +0 -0
  115. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/model.py +0 -0
  116. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/helpers/normalize.py +0 -0
  117. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/ops.py +0 -0
  118. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/core/crud/params.py +0 -0
  119. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/ddl/__init__.py +0 -0
  120. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/decorators.py +0 -0
  121. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/deps/__init__.py +0 -0
  122. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/deps/jinja.py +0 -0
  123. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/deps/pydantic.py +0 -0
  124. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/deps/sqlalchemy.py +0 -0
  125. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/docs/verbosity.md +0 -0
  126. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/__init__.py +0 -0
  127. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/_engine.py +0 -0
  128. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/bind.py +0 -0
  129. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/builders.py +0 -0
  130. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/capabilities.py +0 -0
  131. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/collect.py +0 -0
  132. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/decorators.py +0 -0
  133. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/docs/PLUGINS.md +0 -0
  134. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/engine_spec.py +0 -0
  135. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/plugins.py +0 -0
  136. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/registry.py +0 -0
  137. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/resolver.py +0 -0
  138. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/engine/shortcuts.py +0 -0
  139. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/__init__.py +0 -0
  140. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/_hook.py +0 -0
  141. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/decorators.py +0 -0
  142. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/exceptions.py +0 -0
  143. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/hook_spec.py +0 -0
  144. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/mro_collect.py +0 -0
  145. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/shortcuts.py +0 -0
  146. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/hook/types.py +0 -0
  147. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/__init__.py +0 -0
  148. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/compose.py +0 -0
  149. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/cors.py +0 -0
  150. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/decorators.py +0 -0
  151. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/middleware.py +0 -0
  152. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/middlewares/spec.py +0 -0
  153. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/__init__.py +0 -0
  154. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/_op.py +0 -0
  155. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/canonical.py +0 -0
  156. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/collect.py +0 -0
  157. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/decorators.py +0 -0
  158. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/model_registry.py +0 -0
  159. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/mro_collect.py +0 -0
  160. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/op/resolver.py +0 -0
  161. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/__init__.py +0 -0
  162. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/_RowBound.py +0 -0
  163. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/__init__.py +0 -0
  164. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/bootstrappable.py +0 -0
  165. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/bound.py +0 -0
  166. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/edges.py +0 -0
  167. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/fields.py +0 -0
  168. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/hierarchy.py +0 -0
  169. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/key_digest.py +0 -0
  170. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/lifecycle.py +0 -0
  171. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/locks.py +0 -0
  172. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/markers.py +0 -0
  173. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/operations.py +0 -0
  174. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/ownable.py +0 -0
  175. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/principals.py +0 -0
  176. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/tenant_bound.py +0 -0
  177. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/upsertable.py +0 -0
  178. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/mixins/utils.py +0 -0
  179. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/__init__.py +0 -0
  180. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/_base.py +0 -0
  181. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/audit.py +0 -0
  182. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/client.py +0 -0
  183. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/group.py +0 -0
  184. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/org.py +0 -0
  185. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/rbac.py +0 -0
  186. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/status.py +0 -0
  187. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/tenant.py +0 -0
  188. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/orm/tables/user.py +0 -0
  189. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/README.md +0 -0
  190. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/bind.py +0 -0
  191. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/decorators.py +0 -0
  192. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/resolver.py +0 -0
  193. {tigrbl-0.3.7.dev2/tigrbl/response → tigrbl-0.3.7.dev3/tigrbl/responses}/types.py +0 -0
  194. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/rest/__init__.py +0 -0
  195. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/README.md +0 -0
  196. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/__init__.py +0 -0
  197. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/__init__.py +0 -0
  198. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/emit/__init__.py +0 -0
  199. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/emit/paired_post.py +0 -0
  200. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/emit/paired_pre.py +0 -0
  201. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -0
  202. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/out/__init__.py +0 -0
  203. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/out/masking.py +0 -0
  204. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/refresh/__init__.py +0 -0
  205. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/refresh/demand.py +0 -0
  206. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/resolve/__init__.py +0 -0
  207. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/resolve/assemble.py +0 -0
  208. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -0
  209. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/__init__.py +0 -0
  210. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/negotiate.py +0 -0
  211. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/negotiation.py +0 -0
  212. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/render.py +0 -0
  213. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/response/template.py +0 -0
  214. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/schema/__init__.py +0 -0
  215. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/schema/collect_in.py +0 -0
  216. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/schema/collect_out.py +0 -0
  217. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/storage/__init__.py +0 -0
  218. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/storage/to_stored.py +0 -0
  219. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/wire/__init__.py +0 -0
  220. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/wire/build_in.py +0 -0
  221. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/wire/build_out.py +0 -0
  222. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/wire/dump.py +0 -0
  223. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/atoms/wire/validate_in.py +0 -0
  224. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/context.py +0 -0
  225. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/events.py +0 -0
  226. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/executor/__init__.py +0 -0
  227. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/executor/guards.py +0 -0
  228. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/executor/helpers.py +0 -0
  229. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/executor/invoke.py +0 -0
  230. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/kernel.py +0 -0
  231. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/labels.py +0 -0
  232. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/opview.py +0 -0
  233. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/ordering.py +0 -0
  234. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/status/__init__.py +0 -0
  235. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/status/converters.py +0 -0
  236. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/status/exceptions.py +0 -0
  237. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/status/mappings.py +0 -0
  238. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/status/utils.py +0 -0
  239. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/system.py +0 -0
  240. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/runtime/trace.py +0 -0
  241. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/__init__.py +0 -0
  242. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/_schema.py +0 -0
  243. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/__init__.py +0 -0
  244. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/build_schema.py +0 -0
  245. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/cache.py +0 -0
  246. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/compat.py +0 -0
  247. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/extras.py +0 -0
  248. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/helpers.py +0 -0
  249. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/list_params.py +0 -0
  250. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  251. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/collect.py +0 -0
  252. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/decorators.py +0 -0
  253. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/get_schema.py +0 -0
  254. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/schema_spec.py +0 -0
  255. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/shortcuts.py +0 -0
  256. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/types.py +0 -0
  257. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/schema/utils.py +0 -0
  258. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/__init__.py +0 -0
  259. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/dependencies.py +0 -0
  260. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/__init__.py +0 -0
  261. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/_base.py +0 -0
  262. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/api_key.py +0 -0
  263. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/http_bearer.py +0 -0
  264. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/mutual_tls.py +0 -0
  265. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/oauth2.py +0 -0
  266. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/security/schemes/openid_connect.py +0 -0
  267. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/README.md +0 -0
  268. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/__init__.py +0 -0
  269. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/abc.py +0 -0
  270. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/base.py +0 -0
  271. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/decorators.py +0 -0
  272. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/default.py +0 -0
  273. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/shortcuts.py +0 -0
  274. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/session/spec.py +0 -0
  275. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/shortcuts.py +0 -0
  276. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/specs.py +0 -0
  277. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/__init__.py +0 -0
  278. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/__init__.py +0 -0
  279. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/healthz.py +0 -0
  280. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/hookz.py +0 -0
  281. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/kernelz.py +0 -0
  282. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/methodz.py +0 -0
  283. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/router.py +0 -0
  284. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/diagnostics/utils.py +0 -0
  285. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/__init__.py +0 -0
  286. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openapi/__init__.py +0 -0
  287. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openapi/helpers.py +0 -0
  288. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openapi/metadata.py +0 -0
  289. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/docs/openapi/schema.py +0 -0
  290. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  291. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/system/uvicorn.py +0 -0
  292. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/__init__.py +0 -0
  293. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/_table.py +0 -0
  294. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/mro_collect.py +0 -0
  295. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/table/shortcuts.py +0 -0
  296. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/__init__.py +0 -0
  297. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/background.py +0 -0
  298. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/httpx.py +0 -0
  299. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  300. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/jsonrpc/helpers.py +0 -0
  301. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/jsonrpc/models.py +0 -0
  302. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/jsonrpc/openrpc.py +0 -0
  303. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/rest/__init__.py +0 -0
  304. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/rest/aggregator.py +0 -0
  305. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/transport/rest/decorators.py +0 -0
  306. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/allow_anon_provider.py +0 -0
  307. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/nested_path_provider.py +0 -0
  308. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/op.py +0 -0
  309. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/op_config_provider.py +0 -0
  310. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/op_verb_alias_provider.py +0 -0
  311. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/request_extras_provider.py +0 -0
  312. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/response_extras_provider.py +0 -0
  313. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/table_config_provider.py +0 -0
  314. {tigrbl-0.3.7.dev2 → tigrbl-0.3.7.dev3}/tigrbl/types/uuid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.3.7.dev2
3
+ Version: 0.3.7.dev3
4
4
  Summary: A modern pure ASGI/WSGI Python framework for building schema-first REST and JSON-RPC APIs with SQLAlchemy models, typed validation, lifecycle hooks, and engine extension support.
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.3.7.dev2"
3
+ version = "0.3.7.dev3"
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"
@@ -43,8 +43,8 @@ from .op import alias_ctx, op_ctx, alias, op_alias
43
43
  from .hook import hook_ctx
44
44
  from .engine.decorators import engine_ctx
45
45
  from .schema.decorators import schema_ctx
46
- from .response.decorators import response_ctx
47
- from .response.types import ResponseSpec
46
+ from .responses.decorators import response_ctx
47
+ from .responses.types import ResponseSpec
48
48
 
49
49
  # ── Bindings (model + API orchestration) ───────────────────────────────────────
50
50
  from .bindings import (
@@ -37,7 +37,7 @@ from tigrbl.transport.httpx import ensure_httpx_sync_transport
37
37
  from ._route import Route
38
38
  from ..system.docs.openapi import build_openapi, mount_openapi
39
39
  from ..system.docs.swagger import mount_swagger
40
- from ..requests._request import Request
40
+ from ..requests import Request
41
41
  from ..transport.rest.decorators import (
42
42
  delete as rest_delete,
43
43
  get as rest_get,
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass, field
4
4
  from typing import Any, Callable, Optional, Sequence
5
5
  from ..engine.engine_spec import EngineCfg
6
- from ..response.types import ResponseSpec
6
+ from ..responses.types import ResponseSpec
7
7
 
8
8
 
9
9
  @dataclass
@@ -4,7 +4,7 @@ from dataclasses import dataclass, field
4
4
  from typing import Any, Callable, Optional, Sequence
5
5
 
6
6
  from ..engine.engine_spec import EngineCfg
7
- from ..response.types import ResponseSpec
7
+ from ..responses.types import ResponseSpec
8
8
 
9
9
 
10
10
  @dataclass(eq=False)
@@ -46,7 +46,7 @@ from .hooks import normalize_and_attach as build_hooks
46
46
  from .handlers import build_and_attach as build_handlers
47
47
  from .rpc import register_and_attach as register_rpc
48
48
  from .rest import build_router_and_attach as build_rest
49
- from ..response.bind import bind as bind_response
49
+ from ..responses.bind import bind as bind_response
50
50
 
51
51
  # API facade integration
52
52
  from .api import include_model, include_models, rpc_call
@@ -13,11 +13,11 @@ from pydantic import BaseModel
13
13
 
14
14
  from ...api._api import APIRouter as Router
15
15
  from ...core.crud.params import Body, Path, Query
16
- from ...responses._response import Response
16
+ from ...responses import Response
17
17
  from ...runtime.status.exceptions import HTTPException
18
18
  from ...runtime.status.mappings import status as _status
19
19
  from ...security.dependencies import Depends, Security
20
- from ...requests._request import Request
20
+ from ...requests import Request
21
21
  from .helpers import (
22
22
  _Key,
23
23
  _coerce_parent_kw,
@@ -1,9 +1,9 @@
1
1
  """Deprecated compatibility module for REST ASGI-style primitives.
2
2
 
3
3
  Prefer importing directly from:
4
- - ``tigrbl.response`` for response classes
4
+ - ``tigrbl.responses`` for response classes
5
5
  - ``tigrbl.runtime.status`` for ``status`` and ``HTTPException``
6
- - ``tigrbl.api._api`` / ``tigrbl.requests._request`` / ``tigrbl.security.dependencies``
6
+ - ``tigrbl.api._api`` / ``tigrbl.requests`` / ``tigrbl.security.dependencies``
7
7
  """
8
8
 
9
9
  from __future__ import annotations
@@ -21,11 +21,11 @@ from ...response import (
21
21
  )
22
22
  from ...runtime.status import HTTPException, status
23
23
  from ...security.dependencies import Depends, Security
24
- from ...requests._request import Request
24
+ from ...requests import Request
25
25
 
26
26
  warnings.warn(
27
27
  "tigrbl.bindings.rest.asgi is deprecated; import from "
28
- "tigrbl.response, tigrbl.runtime.status, and concrete modules instead.",
28
+ "tigrbl.responses, tigrbl.runtime.status, and concrete modules instead.",
29
29
  DeprecationWarning,
30
30
  stacklevel=2,
31
31
  )
@@ -4,7 +4,7 @@ import logging
4
4
  from types import SimpleNamespace
5
5
  from typing import Any, Awaitable, Callable, Dict, Mapping, Sequence, Tuple
6
6
 
7
- from ...requests._request import Request
7
+ from ...requests import Request
8
8
  from ...op.types import PHASES
9
9
 
10
10
  try:
@@ -12,7 +12,7 @@ from pydantic import BaseModel, Field, create_model
12
12
  from ...core.crud.params import Query
13
13
  from ...runtime.status.exceptions import HTTPException
14
14
  from ...runtime.status.mappings import status as _status
15
- from ...requests._request import Request
15
+ from ...requests import Request
16
16
  from .helpers import _ensure_jsonable
17
17
  from ...op import OpSpec
18
18
 
@@ -9,7 +9,7 @@ from typing import Any, Dict, Optional, Sequence, Tuple
9
9
  from ...runtime.status.exceptions import HTTPException
10
10
  from ...runtime.status.mappings import status as _status
11
11
  from ...security.dependencies import Depends, Security
12
- from ...requests._request import Request
12
+ from ...requests import Request
13
13
  from ...op import OpSpec
14
14
  from ...security import HTTPBearer
15
15
  from ...op.types import CANON
@@ -7,7 +7,7 @@ from typing import Annotated, Any, Iterable, get_args, get_origin
7
7
  from ..core.crud.params import Param
8
8
  from ..runtime.status.exceptions import HTTPException
9
9
  from ..runtime.status.mappings import status
10
- from ..requests._request import Request
10
+ from ..requests import Request
11
11
 
12
12
 
13
13
  def split_annotated(annotation: Any) -> tuple[Any, tuple[Any, ...]]:
@@ -10,10 +10,10 @@ from ..api.resolve import (
10
10
  resolve_handler_kwargs,
11
11
  resolve_route_dependencies,
12
12
  )
13
- from ..responses._response import Response
13
+ from ..responses import Response
14
14
  from ..runtime.status.exceptions import HTTPException
15
15
  from ..runtime.status.mappings import status
16
- from ..requests._request import Request
16
+ from ..requests import Request
17
17
 
18
18
 
19
19
  def _is_http_response_like(obj: Any) -> bool:
@@ -0,0 +1,3 @@
1
+ from ._header import HeaderCookies, Headers
2
+
3
+ __all__ = ["Headers", "HeaderCookies"]
@@ -3,6 +3,17 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Iterable, Mapping, MutableMapping
6
+ from http.cookies import SimpleCookie
7
+
8
+
9
+ class HeaderCookies(dict[str, str]):
10
+ """Dot-addressable cookie mapping parsed from a Cookie header value."""
11
+
12
+ def __getattr__(self, name: str) -> str:
13
+ try:
14
+ return self[name]
15
+ except KeyError as exc: # pragma: no cover - defensive
16
+ raise AttributeError(name) from exc
6
17
 
7
18
 
8
19
  class Headers(MutableMapping[str, str]):
@@ -24,6 +35,12 @@ class Headers(MutableMapping[str, str]):
24
35
  def _attribute_key(name: str) -> str:
25
36
  return name.replace("_", "-").lower()
26
37
 
38
+ @staticmethod
39
+ def _parse_cookie_header(value: str) -> HeaderCookies:
40
+ parsed = SimpleCookie()
41
+ parsed.load(value)
42
+ return HeaderCookies({name: morsel.value for name, morsel in parsed.items()})
43
+
27
44
  def __getitem__(self, key: str) -> str:
28
45
  return self._data[key.lower()][1]
29
46
 
@@ -53,11 +70,14 @@ class Headers(MutableMapping[str, str]):
53
70
  return default
54
71
  return item[1]
55
72
 
56
- def __getattr__(self, name: str) -> str:
73
+ def __getattr__(self, name: str) -> str | HeaderCookies:
57
74
  key = self._attribute_key(name)
58
- if key in self._data:
59
- return self._data[key][1]
60
- raise AttributeError(name)
75
+ if key not in self._data:
76
+ raise AttributeError(name)
77
+ value = self._data[key][1]
78
+ if key == "cookie":
79
+ return self._parse_cookie_header(value)
80
+ return value
61
81
 
62
82
  def __setattr__(self, name: str, value: str) -> None:
63
83
  if name.startswith("_"):
@@ -66,4 +86,4 @@ class Headers(MutableMapping[str, str]):
66
86
  self[self._attribute_key(name)] = value
67
87
 
68
88
 
69
- __all__ = ["Headers"]
89
+ __all__ = ["Headers", "HeaderCookies"]
@@ -8,7 +8,7 @@ from typing import Any, Literal, Mapping, Optional, Tuple, cast
8
8
  from ..config.constants import CANON as CANONICAL_VERB_TUPLE
9
9
  from ..hook.types import PHASE, HookPhase, PHASES, Ctx, StepFn, HookPredicate
10
10
  from ..hook import HookSpec as OpHook
11
- from ..response.types import ResponseSpec
11
+ from ..responses.types import ResponseSpec
12
12
  from ..engine.engine_spec import EngineCfg
13
13
  from typing import TYPE_CHECKING
14
14
 
@@ -0,0 +1,5 @@
1
+ from tigrbl.headers import Headers
2
+
3
+ from ._request import AwaitableValue, Request, URL
4
+
5
+ __all__ = ["Headers", "Request", "AwaitableValue", "URL"]
@@ -2,13 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import base64
5
6
  import json as json_module
6
7
  from dataclasses import dataclass, field
7
8
  from http.cookies import SimpleCookie
8
9
  from types import SimpleNamespace
9
10
  from typing import Any
10
11
 
11
- from tigrbl.headers import Headers
12
+ from tigrbl.headers import HeaderCookies, Headers
12
13
 
13
14
 
14
15
  @dataclass(frozen=True)
@@ -64,6 +65,15 @@ class AwaitableValue:
64
65
  return len(self.value)
65
66
 
66
67
 
68
+ def _b64url_encode(data: bytes) -> str:
69
+ return base64.urlsafe_b64encode(data).decode("ascii").rstrip("=")
70
+
71
+
72
+ def _b64url_decode(data: str) -> bytes:
73
+ pad = "=" * (-len(data) % 4)
74
+ return base64.urlsafe_b64decode((data + pad).encode("ascii"))
75
+
76
+
67
77
  @dataclass
68
78
  class Request:
69
79
  method: str
@@ -111,11 +121,45 @@ class Request:
111
121
  return {name: vals[0] for name, vals in self.query.items() if vals}
112
122
 
113
123
  @property
114
- def cookies(self) -> dict[str, str]:
124
+ def cookies(self) -> HeaderCookies:
115
125
  raw = self.headers.get("cookie", "") or ""
116
126
  parsed = SimpleCookie()
117
127
  parsed.load(raw)
118
- return {name: morsel.value for name, morsel in parsed.items()}
128
+ return HeaderCookies({name: morsel.value for name, morsel in parsed.items()})
119
129
 
130
+ @property
131
+ def bearer_token(self) -> str | None:
132
+ authorization = self.headers.get("authorization", "") or ""
133
+ scheme, _, token = authorization.partition(" ")
134
+ if scheme.lower() == "bearer" and token:
135
+ return token
136
+ return None
137
+
138
+ @property
139
+ def session_token(self) -> str | None:
140
+ bearer = self.bearer_token
141
+ if bearer:
142
+ return bearer
143
+ return self.cookies.get("sid")
120
144
 
121
- __all__ = ["Request", "AwaitableValue", "URL"]
145
+ @property
146
+ def client(self) -> SimpleNamespace:
147
+ host = ""
148
+ try:
149
+ client = self.scope.get("client")
150
+ except AttributeError:
151
+ client = None
152
+ if isinstance(client, tuple) and client:
153
+ host = str(client[0])
154
+ return SimpleNamespace(ip=host, host=host)
155
+
156
+ @staticmethod
157
+ def b64url_encode(data: bytes) -> str:
158
+ return _b64url_encode(data)
159
+
160
+ @staticmethod
161
+ def b64url_decode(data: str) -> bytes:
162
+ return _b64url_decode(data)
163
+
164
+
165
+ __all__ = ["Request", "AwaitableValue", "URL", "_b64url_encode", "_b64url_decode"]
@@ -1,31 +1,29 @@
1
- from ..responses._response import (
2
- Response as StdApiResponse,
3
- JSONResponse,
1
+ from tigrbl.headers import Headers
2
+
3
+ from ._response import (
4
+ FileResponse,
4
5
  HTMLResponse,
6
+ JSONResponse,
5
7
  PlainTextResponse,
6
- StreamingResponse,
7
- FileResponse,
8
8
  RedirectResponse,
9
+ Response,
10
+ StreamingResponse,
9
11
  )
10
12
  from .decorators import (
11
- response_ctx,
12
- get_attached_response_spec,
13
13
  get_attached_response_alias,
14
+ get_attached_response_spec,
15
+ response_ctx,
14
16
  )
15
- from .types import (
16
- Response,
17
- ResponseKind,
18
- ResponseSpec,
19
- Template,
20
- TemplateSpec,
21
- )
22
- from .resolver import resolve_response_spec, infer_hints
23
- from .shortcuts import as_json, as_html, as_text, as_redirect, as_stream, as_file
17
+ from .resolver import infer_hints, resolve_response_spec
18
+ from .shortcuts import as_file, as_html, as_json, as_redirect, as_stream, as_text
19
+ from .types import Response as ResponseConfig
20
+ from .types import ResponseKind, ResponseSpec, Template, TemplateSpec
24
21
  from ..runtime.atoms.response.renderer import ResponseHints, render
25
22
  from ..runtime.atoms.response.templates import render_template
26
23
 
27
24
  __all__ = [
28
- "StdApiResponse",
25
+ "Headers",
26
+ "Response",
29
27
  "JSONResponse",
30
28
  "HTMLResponse",
31
29
  "PlainTextResponse",
@@ -38,7 +36,7 @@ __all__ = [
38
36
  "ResponseSpec",
39
37
  "ResponseKind",
40
38
  "TemplateSpec",
41
- "Response",
39
+ "ResponseConfig",
42
40
  "Template",
43
41
  "resolve_response_spec",
44
42
  "infer_hints",
@@ -9,7 +9,26 @@ from http.cookies import SimpleCookie
9
9
  from pathlib import Path
10
10
  from typing import Any, AsyncIterator, Iterable, Mapping
11
11
 
12
- from tigrbl.headers import Headers
12
+ from tigrbl.headers import HeaderCookies, Headers
13
+
14
+
15
+ class _JSONDualMethod:
16
+ def __get__(self, obj: "Response" | None, owner: type["Response"]):
17
+ if obj is None:
18
+
19
+ def _factory(
20
+ data: Any,
21
+ status_code: int = 200,
22
+ headers: Mapping[str, str] | None = None,
23
+ ) -> "Response":
24
+ return owner.from_json(data, status_code=status_code, headers=headers)
25
+
26
+ return _factory
27
+
28
+ def _instance_json() -> Any:
29
+ return obj.json_body()
30
+
31
+ return _instance_json
13
32
 
14
33
 
15
34
  @dataclass
@@ -20,6 +39,8 @@ class Response:
20
39
  media_type: str | None = None
21
40
  _headers: Headers = field(init=False, repr=False)
22
41
 
42
+ json = _JSONDualMethod()
43
+
23
44
  def __post_init__(self) -> None:
24
45
  self._headers = Headers(self.headers)
25
46
 
@@ -28,6 +49,7 @@ class Response:
28
49
  return {
29
50
  200: "OK",
30
51
  201: "Created",
52
+ 205: "Reset Content",
31
53
  204: "No Content",
32
54
  301: "Moved Permanently",
33
55
  302: "Found",
@@ -65,12 +87,12 @@ class Response:
65
87
  return json_module.loads(self.body.decode("utf-8"))
66
88
 
67
89
  @property
68
- def cookies(self) -> dict[str, str]:
90
+ def cookies(self) -> HeaderCookies:
69
91
  cookie = SimpleCookie()
70
92
  for name, value in self._headers.items():
71
93
  if name == "set-cookie":
72
94
  cookie.load(value)
73
- return {name: morsel.value for name, morsel in cookie.items()}
95
+ return HeaderCookies({name: morsel.value for name, morsel in cookie.items()})
74
96
 
75
97
  def set_cookie(self, key: str, value: str, *, path: str = "/") -> None:
76
98
  cookie = SimpleCookie()
@@ -80,7 +102,7 @@ class Response:
80
102
  self.headers = self._headers.as_list()
81
103
 
82
104
  @classmethod
83
- def json(
105
+ def from_json(
84
106
  cls,
85
107
  data: Any,
86
108
  status_code: int = 200,
@@ -8,7 +8,7 @@ from datetime import datetime, timezone
8
8
  from pathlib import Path
9
9
  from typing import Any, AsyncIterable, Iterable, Mapping, Optional, Union
10
10
 
11
- from .stdapi import (
11
+ from ._response import (
12
12
  FileResponse,
13
13
  HTMLResponse,
14
14
  JSONResponse,
@@ -13,7 +13,7 @@ def run(_, ctx) -> None:
13
13
  - Honors op-specific exposure via ``io.out_verbs``.
14
14
  Complexity: O(#fields in opview).
15
15
  """
16
- from tigrbl.response import ResponseHints
16
+ from tigrbl.responses import ResponseHints
17
17
 
18
18
  resp = getattr(ctx, "response", None)
19
19
  if resp is None:
@@ -4,10 +4,10 @@ from pathlib import Path
4
4
  from typing import Any, AsyncIterable, Iterable, Mapping, Optional, Union, cast
5
5
  import logging
6
6
 
7
- from ....responses._response import Response
7
+ from ....responses import Response
8
8
  from ....transport.background import BackgroundTask
9
9
 
10
- from ....response.shortcuts import (
10
+ from ....responses.shortcuts import (
11
11
  as_file,
12
12
  as_html,
13
13
  as_json,
@@ -3,7 +3,7 @@ from functools import lru_cache
3
3
  import logging
4
4
  from typing import Any, Dict, Iterable, Optional, Tuple
5
5
 
6
- from ....requests._request import Request
6
+ from ....requests import Request
7
7
  from ....deps.jinja import (
8
8
  Environment,
9
9
  FileSystemLoader,
@@ -14,7 +14,7 @@ from typing import (
14
14
  runtime_checkable,
15
15
  )
16
16
 
17
- from ...requests._request import Request
17
+ from ...requests import Request
18
18
  from sqlalchemy.ext.asyncio import AsyncSession
19
19
  from sqlalchemy.orm import Session
20
20
 
@@ -4,7 +4,7 @@ from typing import Any, Callable, Sequence
4
4
  from types import SimpleNamespace
5
5
 
6
6
  try:
7
- from ...responses._response import JSONResponse
7
+ from ...responses import JSONResponse
8
8
  from ...types import Depends, Request, Router
9
9
  except Exception: # pragma: no cover
10
10
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from typing import Any
4
4
  from urllib.parse import quote
5
5
 
6
- from ...responses._response import Response
6
+ from ...responses import Response
7
7
 
8
8
 
9
9
  TIGRBL_LENS_VERSION = "0.0.14"
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
- from ....responses._response import Response
5
+ from ....responses import Response
6
6
  from .schema import openapi
7
7
 
8
8
 
@@ -4,7 +4,7 @@ from typing import Any, Dict, Iterable, List, Mapping, Sequence
4
4
 
5
5
  from pydantic import BaseModel
6
6
 
7
- from ...responses._response import Response
7
+ from ...responses import Response
8
8
  from ...op import OpSpec
9
9
 
10
10
  JsonObject = Dict[str, Any]
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
- from ...responses._response import Response
5
+ from ...responses import Response
6
6
 
7
7
 
8
8
  def build_swagger_html(router: Any, request: Any) -> str:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
  from typing import Any
5
5
 
6
- from ...responses._response import FileResponse
6
+ from ...responses import FileResponse
7
7
 
8
8
  FAVICON_PATH = Path(__file__).with_name("assets") / "favicon.svg"
9
9
 
@@ -379,7 +379,7 @@ class Base(DeclarativeBase):
379
379
 
380
380
  # 2.6) Collect response specs declared via @response_ctx
381
381
  try:
382
- from tigrbl.response import (
382
+ from tigrbl.responses import (
383
383
  get_attached_response_spec,
384
384
  get_attached_response_alias,
385
385
  )
@@ -4,7 +4,7 @@ from dataclasses import dataclass, field
4
4
  from typing import Any, Callable, Optional, Sequence
5
5
 
6
6
  from ..engine.engine_spec import EngineCfg
7
- from ..response.types import ResponseSpec
7
+ from ..responses.types import ResponseSpec
8
8
 
9
9
 
10
10
  @dataclass