tigrbl 0.3.13.dev1__tar.gz → 0.3.14.dev1__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 (312) hide show
  1. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/PKG-INFO +1 -1
  2. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/pyproject.toml +1 -1
  3. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/tigrbl_api.py +1 -0
  4. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/tigrbl_app.py +1 -0
  5. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rpc.py +68 -1
  6. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/lens.py +4 -2
  7. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/schema.py +3 -0
  8. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openrpc.py +3 -1
  9. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/__init__.py +4 -1
  10. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/helpers.py +5 -1
  11. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/LICENSE +0 -0
  12. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/README.md +0 -0
  13. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/README.md +0 -0
  14. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/__init__.py +0 -0
  15. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/__init__.py +0 -0
  16. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_api.py +0 -0
  17. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_route.py +0 -0
  18. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_router.py +0 -0
  19. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/_routing.py +0 -0
  20. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/api_spec.py +0 -0
  21. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/mro_collect.py +0 -0
  22. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/resolve.py +0 -0
  23. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/api/shortcuts.py +0 -0
  24. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/__init__.py +0 -0
  25. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_app.py +0 -0
  26. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_model_registry.py +0 -0
  27. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/_routing_runtime.py +0 -0
  28. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/app_spec.py +0 -0
  29. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/mro_collect.py +0 -0
  30. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/shortcuts.py +0 -0
  31. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/app/transport.py +0 -0
  32. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/__init__.py +0 -0
  33. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/__init__.py +0 -0
  34. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/common.py +0 -0
  35. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/include.py +0 -0
  36. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/resource_proxy.py +0 -0
  37. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/api/rpc.py +0 -0
  38. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/columns.py +0 -0
  39. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/__init__.py +0 -0
  40. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/builder.py +0 -0
  41. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/ctx.py +0 -0
  42. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/identifiers.py +0 -0
  43. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/namespaces.py +0 -0
  44. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/handlers/steps.py +0 -0
  45. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/hooks.py +0 -0
  46. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model.py +0 -0
  47. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model_helpers.py +0 -0
  48. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/model_registry.py +0 -0
  49. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/__init__.py +0 -0
  50. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/attach.py +0 -0
  51. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/collection.py +0 -0
  52. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/common.py +0 -0
  53. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/fastapi.py +0 -0
  54. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/helpers.py +0 -0
  55. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/io.py +0 -0
  56. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/io_headers.py +0 -0
  57. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/member.py +0 -0
  58. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/router.py +0 -0
  59. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/rest/routing.py +0 -0
  60. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/__init__.py +0 -0
  61. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/builder.py +0 -0
  62. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/defaults.py +0 -0
  63. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/bindings/schemas/utils.py +0 -0
  64. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/README.md +0 -0
  65. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/__init__.py +0 -0
  66. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/_column.py +0 -0
  67. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/column_spec.py +0 -0
  68. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/field_spec.py +0 -0
  69. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/__init__.py +0 -0
  70. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/core.py +0 -0
  71. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/jsonhints.py +0 -0
  72. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/planning.py +0 -0
  73. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/types.py +0 -0
  74. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/infer/utils.py +0 -0
  75. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/io_spec.py +0 -0
  76. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/mro_collect.py +0 -0
  77. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/shortcuts.py +0 -0
  78. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/column/storage_spec.py +0 -0
  79. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/__init__.py +0 -0
  80. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/constants.py +0 -0
  81. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/defaults.py +0 -0
  82. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/config/resolver.py +0 -0
  83. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/__init__.py +0 -0
  84. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/__init__.py +0 -0
  85. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/bulk.py +0 -0
  86. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/__init__.py +0 -0
  87. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/db.py +0 -0
  88. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/enum.py +0 -0
  89. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/filters.py +0 -0
  90. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/model.py +0 -0
  91. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/helpers/normalize.py +0 -0
  92. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/ops.py +0 -0
  93. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/crud/params.py +0 -0
  94. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/resolver.py +0 -0
  95. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/core/router_runtime.py +0 -0
  96. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/ddl/__init__.py +0 -0
  97. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/decorators.py +0 -0
  98. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/__init__.py +0 -0
  99. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/jinja.py +0 -0
  100. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/pydantic.py +0 -0
  101. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/deps/sqlalchemy.py +0 -0
  102. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/docs/verbosity.md +0 -0
  103. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/__init__.py +0 -0
  104. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/_engine.py +0 -0
  105. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/bind.py +0 -0
  106. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/builders.py +0 -0
  107. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/capabilities.py +0 -0
  108. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/collect.py +0 -0
  109. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/decorators.py +0 -0
  110. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/docs/PLUGINS.md +0 -0
  111. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/engine_spec.py +0 -0
  112. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/plugins.py +0 -0
  113. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/registry.py +0 -0
  114. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/resolver.py +0 -0
  115. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/engine/shortcuts.py +0 -0
  116. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/headers/__init__.py +0 -0
  117. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/headers/_header.py +0 -0
  118. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/__init__.py +0 -0
  119. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/_hook.py +0 -0
  120. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/decorators.py +0 -0
  121. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/exceptions.py +0 -0
  122. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/hook_spec.py +0 -0
  123. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/mro_collect.py +0 -0
  124. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/shortcuts.py +0 -0
  125. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/hook/types.py +0 -0
  126. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/__init__.py +0 -0
  127. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/base.py +0 -0
  128. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/compose.py +0 -0
  129. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/cors.py +0 -0
  130. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/decorators.py +0 -0
  131. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/middleware.py +0 -0
  132. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/middlewares/spec.py +0 -0
  133. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/__init__.py +0 -0
  134. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/_op.py +0 -0
  135. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/canonical.py +0 -0
  136. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/collect.py +0 -0
  137. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/decorators.py +0 -0
  138. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/model_registry.py +0 -0
  139. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/mro_collect.py +0 -0
  140. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/resolver.py +0 -0
  141. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/op/types.py +0 -0
  142. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/__init__.py +0 -0
  143. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/_RowBound.py +0 -0
  144. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/__init__.py +0 -0
  145. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/bootstrappable.py +0 -0
  146. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/bound.py +0 -0
  147. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/edges.py +0 -0
  148. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/fields.py +0 -0
  149. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/hierarchy.py +0 -0
  150. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/key_digest.py +0 -0
  151. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/lifecycle.py +0 -0
  152. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/locks.py +0 -0
  153. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/markers.py +0 -0
  154. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/operations.py +0 -0
  155. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/ownable.py +0 -0
  156. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/principals.py +0 -0
  157. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/tenant_bound.py +0 -0
  158. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/upsertable.py +0 -0
  159. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/mixins/utils.py +0 -0
  160. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/__init__.py +0 -0
  161. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/_base.py +0 -0
  162. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/audit.py +0 -0
  163. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/client.py +0 -0
  164. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/group.py +0 -0
  165. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/org.py +0 -0
  166. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/rbac.py +0 -0
  167. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/status.py +0 -0
  168. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/tenant.py +0 -0
  169. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/orm/tables/user.py +0 -0
  170. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/__init__.py +0 -0
  171. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/_request.py +0 -0
  172. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/requests/adapters.py +0 -0
  173. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/README.md +0 -0
  174. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/__init__.py +0 -0
  175. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/_response.py +0 -0
  176. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/_transport.py +0 -0
  177. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/bind.py +0 -0
  178. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/decorators.py +0 -0
  179. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/resolver.py +0 -0
  180. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/shortcuts.py +0 -0
  181. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/responses/types.py +0 -0
  182. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/rest/__init__.py +0 -0
  183. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/README.md +0 -0
  184. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/__init__.py +0 -0
  185. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/__init__.py +0 -0
  186. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/__init__.py +0 -0
  187. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/paired_post.py +0 -0
  188. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/paired_pre.py +0 -0
  189. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/emit/readtime_alias.py +0 -0
  190. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/out/__init__.py +0 -0
  191. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/out/masking.py +0 -0
  192. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/refresh/__init__.py +0 -0
  193. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/refresh/demand.py +0 -0
  194. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/__init__.py +0 -0
  195. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/assemble.py +0 -0
  196. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/resolve/paired_gen.py +0 -0
  197. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/__init__.py +0 -0
  198. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/headers_from_payload.py +0 -0
  199. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/negotiate.py +0 -0
  200. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/negotiation.py +0 -0
  201. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/render.py +0 -0
  202. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/renderer.py +0 -0
  203. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/template.py +0 -0
  204. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/response/templates.py +0 -0
  205. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/__init__.py +0 -0
  206. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/collect_in.py +0 -0
  207. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/schema/collect_out.py +0 -0
  208. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/storage/__init__.py +0 -0
  209. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/storage/to_stored.py +0 -0
  210. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/__init__.py +0 -0
  211. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/build_in.py +0 -0
  212. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/build_out.py +0 -0
  213. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/dump.py +0 -0
  214. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/atoms/wire/validate_in.py +0 -0
  215. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/context.py +0 -0
  216. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/events.py +0 -0
  217. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/__init__.py +0 -0
  218. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/guards.py +0 -0
  219. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/helpers.py +0 -0
  220. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/invoke.py +0 -0
  221. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/executor/types.py +0 -0
  222. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/kernel.py +0 -0
  223. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/labels.py +0 -0
  224. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/opview.py +0 -0
  225. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/ordering.py +0 -0
  226. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/__init__.py +0 -0
  227. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/converters.py +0 -0
  228. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/exceptions.py +0 -0
  229. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/mappings.py +0 -0
  230. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/status/utils.py +0 -0
  231. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/system.py +0 -0
  232. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/runtime/trace.py +0 -0
  233. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/__init__.py +0 -0
  234. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/_schema.py +0 -0
  235. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/__init__.py +0 -0
  236. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/build_schema.py +0 -0
  237. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/cache.py +0 -0
  238. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/compat.py +0 -0
  239. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/extras.py +0 -0
  240. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/helpers.py +0 -0
  241. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/list_params.py +0 -0
  242. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  243. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/collect.py +0 -0
  244. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/decorators.py +0 -0
  245. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/get_schema.py +0 -0
  246. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/schema_spec.py +0 -0
  247. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/shortcuts.py +0 -0
  248. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/types.py +0 -0
  249. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/schema/utils.py +0 -0
  250. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/__init__.py +0 -0
  251. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/dependencies.py +0 -0
  252. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/__init__.py +0 -0
  253. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/_base.py +0 -0
  254. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/api_key.py +0 -0
  255. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/http_bearer.py +0 -0
  256. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/mutual_tls.py +0 -0
  257. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/oauth2.py +0 -0
  258. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/security/schemes/openid_connect.py +0 -0
  259. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/README.md +0 -0
  260. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/__init__.py +0 -0
  261. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/abc.py +0 -0
  262. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/base.py +0 -0
  263. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/decorators.py +0 -0
  264. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/default.py +0 -0
  265. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/shortcuts.py +0 -0
  266. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/session/spec.py +0 -0
  267. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/shortcuts.py +0 -0
  268. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/specs.py +0 -0
  269. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/__init__.py +0 -0
  270. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/__init__.py +0 -0
  271. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/compat.py +0 -0
  272. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/healthz.py +0 -0
  273. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/hookz.py +0 -0
  274. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/kernelz.py +0 -0
  275. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/methodz.py +0 -0
  276. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/router.py +0 -0
  277. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/diagnostics/utils.py +0 -0
  278. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/__init__.py +0 -0
  279. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/__init__.py +0 -0
  280. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/helpers.py +0 -0
  281. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/metadata.py +0 -0
  282. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/openapi/mount.py +0 -0
  283. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/docs/swagger.py +0 -0
  284. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/favicon/__init__.py +0 -0
  285. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  286. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/system/uvicorn.py +0 -0
  287. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/__init__.py +0 -0
  288. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/_base.py +0 -0
  289. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/_table.py +0 -0
  290. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/mro_collect.py +0 -0
  291. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/shortcuts.py +0 -0
  292. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/table/table_spec.py +0 -0
  293. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/background.py +0 -0
  294. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/httpx.py +0 -0
  295. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  296. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/dispatcher.py +0 -0
  297. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/models.py +0 -0
  298. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/jsonrpc/openrpc.py +0 -0
  299. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/__init__.py +0 -0
  300. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/aggregator.py +0 -0
  301. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/transport/rest/decorators.py +0 -0
  302. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/__init__.py +0 -0
  303. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/allow_anon_provider.py +0 -0
  304. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/authn_abc.py +0 -0
  305. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/nested_path_provider.py +0 -0
  306. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op.py +0 -0
  307. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op_config_provider.py +0 -0
  308. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/op_verb_alias_provider.py +0 -0
  309. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/request_extras_provider.py +0 -0
  310. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/response_extras_provider.py +0 -0
  311. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/table_config_provider.py +0 -0
  312. {tigrbl-0.3.13.dev1 → tigrbl-0.3.14.dev1}/tigrbl/types/uuid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.3.13.dev1
3
+ Version: 0.3.14.dev1
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.13.dev1"
3
+ version = "0.3.14.dev1"
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"
@@ -213,6 +213,7 @@ class TigrblApi(_Api):
213
213
  def mount_jsonrpc(self, *, prefix: str | None = None) -> Any:
214
214
  """Mount a JSON-RPC router onto this TigrblApi instance."""
215
215
  px = prefix if prefix is not None else self.jsonrpc_prefix
216
+ self.jsonrpc_prefix = px
216
217
  prov = _resolver.resolve_provider(api=self)
217
218
  get_db = prov.get_db if prov else None
218
219
  router = _mount_jsonrpc(
@@ -428,6 +428,7 @@ class TigrblApp(_App):
428
428
  def mount_jsonrpc(self, *, prefix: str | None = None) -> Any:
429
429
  """Mount JSON-RPC router onto this app."""
430
430
  px = prefix if prefix is not None else self.jsonrpc_prefix
431
+ self.jsonrpc_prefix = px
431
432
  prov = _resolver.resolve_provider(api=self)
432
433
  get_db = prov.get_db if prov else None
433
434
  router = _mount_jsonrpc(
@@ -20,6 +20,7 @@ from pydantic import BaseModel
20
20
  from ..op import OpSpec
21
21
  from ..op.types import PHASES
22
22
  from ..runtime import executor as _executor # expects _invoke(request, db, phases, ctx)
23
+ from ..runtime.status import HTTPException
23
24
 
24
25
  # Prefer Kernel phase-chains if available (atoms + system steps + hooks)
25
26
  try:
@@ -33,6 +34,65 @@ logger.debug("Loaded module v3/bindings/rpc")
33
34
  _Key = Tuple[str, str] # (alias, target)
34
35
 
35
36
 
37
+ _WRAPPER_KEYS = frozenset({"data", "payload", "body", "item"})
38
+
39
+
40
+ def _schema_field_names(schema: Any) -> set[str]:
41
+ """Return top-level field names declared by a Pydantic schema class."""
42
+ if not schema or not inspect.isclass(schema) or not issubclass(schema, BaseModel):
43
+ return set()
44
+
45
+ fields = getattr(schema, "model_fields", None)
46
+ if not isinstance(fields, Mapping):
47
+ return set()
48
+
49
+ names: set[str] = set(fields.keys())
50
+ for field_name, field_info in fields.items():
51
+ alias = getattr(field_info, "alias", None)
52
+ if isinstance(alias, str) and alias:
53
+ names.add(alias)
54
+ validation_alias = getattr(field_info, "validation_alias", None)
55
+ if isinstance(validation_alias, str) and validation_alias:
56
+ names.add(validation_alias)
57
+ return names
58
+
59
+
60
+ def _allowed_wrapper_keys(model: type, alias: str, target: str) -> set[str]:
61
+ """Wrapper-like names that are valid operation fields for this RPC method."""
62
+ schemas_root = getattr(model, "schemas", None)
63
+ alias_ns = getattr(schemas_root, alias, None) if schemas_root else None
64
+ if not alias_ns:
65
+ return set()
66
+
67
+ allowed = _schema_field_names(getattr(alias_ns, "in_", None))
68
+ if target.startswith("bulk_") and target != "bulk_delete":
69
+ allowed |= _schema_field_names(getattr(alias_ns, "in_item", None))
70
+ return allowed & set(_WRAPPER_KEYS)
71
+
72
+
73
+ def _reject_wrapper_keys(payload: Any, *, allowed_keys: set[str] | None = None) -> None:
74
+ allowed = allowed_keys or set()
75
+
76
+ if isinstance(payload, Mapping):
77
+ disallowed = sorted(
78
+ k for k in payload if k in _WRAPPER_KEYS and k not in allowed
79
+ )
80
+ if disallowed:
81
+ raise HTTPException(
82
+ status_code=422,
83
+ detail={
84
+ "reason": "Wrapper keys are not allowed; params must match the operation schema.",
85
+ "disallowed_keys": disallowed,
86
+ },
87
+ )
88
+ return
89
+
90
+ if isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
91
+ for item in payload:
92
+ if isinstance(item, Mapping):
93
+ _reject_wrapper_keys(item, allowed_keys=allowed)
94
+
95
+
36
96
  # Mapping with attribute-style access
37
97
  class AttrDict(dict):
38
98
  def __getattr__(self, item: str) -> Any: # pragma: no cover - trivial
@@ -99,7 +159,12 @@ def _coerce_payload(payload: Any) -> Any:
99
159
  if isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
100
160
  out: list[Any] = []
101
161
  for item in payload:
102
- if isinstance(item, Mapping):
162
+ if isinstance(item, BaseModel):
163
+ try:
164
+ out.append(item.model_dump(exclude_none=False))
165
+ except Exception:
166
+ out.append(dict(item.__dict__))
167
+ elif isinstance(item, Mapping):
103
168
  out.append(dict(item))
104
169
  else:
105
170
  out.append(item)
@@ -263,8 +328,10 @@ def _build_rpc_callable(model: type, sp: OpSpec) -> Callable[..., Awaitable[Any]
263
328
  schemas_root = getattr(model, "schemas", None)
264
329
  alias_ns = getattr(schemas_root, alias, None)
265
330
  item_in_model = getattr(alias_ns, "in_item", None)
331
+ allowed_wrapper_keys = _allowed_wrapper_keys(model, alias, target)
266
332
 
267
333
  raw_payload = _coerce_payload(payload)
334
+ _reject_wrapper_keys(raw_payload, allowed_keys=allowed_wrapper_keys)
268
335
  if target == "bulk_delete" and not isinstance(raw_payload, Mapping):
269
336
  raw_payload = {"ids": raw_payload}
270
337
  if (
@@ -7,6 +7,7 @@ from ...responses import Response
7
7
 
8
8
 
9
9
  TIGRBL_LENS_VERSION = "latest"
10
+ TIGRBL_LENS_CSS_URL = f"https://esm.sh/@tigrbljs/tigrbl-lens@{TIGRBL_LENS_VERSION}/dist/tigrbl-lens.css?css"
10
11
 
11
12
 
12
13
  def _with_leading_slash(path: str) -> str:
@@ -25,7 +26,7 @@ def build_lens_html(router: Any, request: Any, *, spec_path: str) -> str:
25
26
  <title>{router.title} — Lens</title>
26
27
  <link
27
28
  rel="stylesheet"
28
- href="https://esm.sh/@tigrbljs/tigrbl-lens@{TIGRBL_LENS_VERSION}/dist/tigrbl-lens.css"
29
+ href="{TIGRBL_LENS_CSS_URL}"
29
30
  />
30
31
  <style>
31
32
  html, body, #root {{
@@ -79,7 +80,8 @@ def mount_lens(
79
80
  ) -> Any:
80
81
  """Mount a tigrbl-lens HTML endpoint onto ``router``."""
81
82
 
82
- resolved_spec_path = spec_path or "/openrpc.json"
83
+ resolved_spec_path = spec_path or getattr(router, "openrpc_path", "/openrpc.json")
84
+ resolved_spec_path = _with_leading_slash(resolved_spec_path)
83
85
 
84
86
  def _lens_handler(request: Any) -> Response:
85
87
  return Response.html(
@@ -24,6 +24,9 @@ def openapi(router: Any) -> dict[str, Any]:
24
24
  continue
25
25
 
26
26
  canonical_path = route.path_template.rstrip("/") or "/"
27
+ if canonical_path == "/openrpc.json" or route.name == "openrpc_json":
28
+ continue
29
+
27
30
  path_item = paths.setdefault(canonical_path, {})
28
31
  for method in sorted(route.methods):
29
32
  status_code = route.status_code or status.HTTP_200_OK
@@ -179,12 +179,14 @@ def mount_openrpc(
179
179
  """Mount an OpenRPC JSON endpoint onto ``router`` or ``api``."""
180
180
 
181
181
  target_router = router if router is not None else api
182
+ normalized_path = _with_leading_slash(path)
183
+ setattr(api, "openrpc_path", normalized_path)
182
184
 
183
185
  def _openrpc_endpoint(request: Any) -> Response:
184
186
  return Response.json(build_openrpc_spec(api, request=request))
185
187
 
186
188
  target_router.add_api_route(
187
- path,
189
+ normalized_path,
188
190
  _openrpc_endpoint,
189
191
  methods=["GET"],
190
192
  name=name,
@@ -71,10 +71,13 @@ def mount_jsonrpc(
71
71
  Optional tags applied to the mounted "/rpc" endpoint. Defaults to
72
72
  ``("rpc",)``.
73
73
  """
74
+ normalized_prefix = prefix if str(prefix).startswith("/") else f"/{prefix}"
75
+ setattr(api, "jsonrpc_prefix", normalized_prefix.rstrip("/") or "/")
76
+
74
77
  router = build_jsonrpc_router(api, get_db=get_db, tags=tags)
75
78
  include_router = getattr(app, "include_router", None)
76
79
  if callable(include_router):
77
- include_router(router, prefix=prefix)
80
+ include_router(router, prefix=normalized_prefix)
78
81
 
79
82
  return router
80
83
 
@@ -35,7 +35,11 @@ def _normalize_params(params: Any) -> Any:
35
35
  if params is None:
36
36
  return {}
37
37
  if isinstance(params, Mapping):
38
- return dict(params)
38
+ normalized = dict(params)
39
+ nested = normalized.get("params")
40
+ if set(normalized) == {"params"} and isinstance(nested, Mapping):
41
+ return dict(nested)
42
+ return normalized
39
43
  if isinstance(params, Sequence) and not isinstance(params, (str, bytes)):
40
44
  return list(params)
41
45
  raise HTTPException(
File without changes
File without changes