tigrbl-concrete 0.4.5.dev1__tar.gz → 0.4.5.dev4__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 (138) hide show
  1. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/PKG-INFO +1 -1
  2. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/pyproject.toml +1 -1
  3. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/tigrbl_app.py +2 -4
  4. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/op.py +121 -6
  5. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/LICENSE +0 -0
  6. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/NOTICE +0 -0
  7. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/README.md +0 -0
  8. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/__init__.py +0 -0
  9. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/__init__.py +0 -0
  10. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_alias.py +0 -0
  11. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_allow_anon.py +0 -0
  12. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_app.py +0 -0
  13. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_background.py +0 -0
  14. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_binding.py +0 -0
  15. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_body.py +0 -0
  16. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_column.py +0 -0
  17. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_cors_middleware.py +0 -0
  18. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_engine.py +0 -0
  19. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_event_stream_response.py +0 -0
  20. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_execution_backend.py +0 -0
  21. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_file_response.py +0 -0
  22. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_headers.py +0 -0
  23. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_hook.py +0 -0
  24. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_html_response.py +0 -0
  25. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_httpx.py +0 -0
  26. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_json_response.py +0 -0
  27. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_middleware.py +0 -0
  28. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_op.py +0 -0
  29. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_op_registry.py +0 -0
  30. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_plain_text_response.py +0 -0
  31. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_redirect_response.py +0 -0
  32. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_request.py +0 -0
  33. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_request_adapters.py +0 -0
  34. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_response.py +0 -0
  35. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_route.py +0 -0
  36. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_router.py +0 -0
  37. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_schema.py +0 -0
  38. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/__init__.py +0 -0
  39. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/api_key.py +0 -0
  40. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/http_basic.py +0 -0
  41. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/http_bearer.py +0 -0
  42. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/mutual_tls.py +0 -0
  43. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/oauth2.py +0 -0
  44. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/openid_connect.py +0 -0
  45. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_session.py +0 -0
  46. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_storage.py +0 -0
  47. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_streaming_response.py +0 -0
  48. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_table.py +0 -0
  49. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_table_registry.py +0 -0
  50. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_webhook.py +0 -0
  51. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_websocket.py +0 -0
  52. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/dependencies.py +0 -0
  53. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/engine_resolver.py +0 -0
  54. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/tigrbl_router.py +0 -0
  55. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/__init__.py +0 -0
  56. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/allow_anon.py +0 -0
  57. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/engine.py +0 -0
  58. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/eventful.py +0 -0
  59. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/hook.py +0 -0
  60. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/middlewares.py +0 -0
  61. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/response.py +0 -0
  62. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/rest.py +0 -0
  63. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/schema.py +0 -0
  64. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/session.py +0 -0
  65. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/webhook.py +0 -0
  66. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/__init__.py +0 -0
  67. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/__init__.py +0 -0
  68. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/docs_lowering.py +0 -0
  69. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/engine_lowering.py +0 -0
  70. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/path_lowering.py +0 -0
  71. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/column_mro_collect.py +0 -0
  72. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/core_resolver.py +0 -0
  73. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/invoke.py +0 -0
  74. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/model.py +0 -0
  75. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/model_helpers.py +0 -0
  76. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/op_resolver.py +0 -0
  77. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/__init__.py +0 -0
  78. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/common.py +0 -0
  79. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/include.py +0 -0
  80. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/resource_proxy.py +0 -0
  81. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/rpc.py +0 -0
  82. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/rpc.py +0 -0
  83. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/ddl/__init__.py +0 -0
  84. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/decorators.py +0 -0
  85. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/__init__.py +0 -0
  86. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/bind.py +0 -0
  87. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/builders.py +0 -0
  88. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/capabilities.py +0 -0
  89. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/collect.py +0 -0
  90. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/plugins.py +0 -0
  91. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/registry.py +0 -0
  92. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/resolver.py +0 -0
  93. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/__init__.py +0 -0
  94. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/app.py +0 -0
  95. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/webhook.py +0 -0
  96. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/resolve/__init__.py +0 -0
  97. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/resolve/handlers.py +0 -0
  98. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/schema/__init__.py +0 -0
  99. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/schema/jsonrpc.py +0 -0
  100. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/security/__init__.py +0 -0
  101. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/security/dependencies.py +0 -0
  102. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/__init__.py +0 -0
  103. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/app.py +0 -0
  104. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/rest.py +0 -0
  105. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/webhook.py +0 -0
  106. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/__init__.py +0 -0
  107. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/__init__.py +0 -0
  108. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/healthz.py +0 -0
  109. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/hookz.py +0 -0
  110. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/kernelz.py +0 -0
  111. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/methodz.py +0 -0
  112. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/router.py +0 -0
  113. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/utils.py +0 -0
  114. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/__init__.py +0 -0
  115. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/json_schema.py +0 -0
  116. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/lens.py +0 -0
  117. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/__init__.py +0 -0
  118. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/helpers.py +0 -0
  119. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/metadata.py +0 -0
  120. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/mount.py +0 -0
  121. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/schema.py +0 -0
  122. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openrpc.py +0 -0
  123. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/runtime_ops.py +0 -0
  124. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/surface.py +0 -0
  125. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/swagger.py +0 -0
  126. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/favicon/__init__.py +0 -0
  127. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/favicon/assets/favicon.svg +0 -0
  128. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/static.py +0 -0
  129. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/uvicorn.py +0 -0
  130. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/well_known.py +0 -0
  131. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/__init__.py +0 -0
  132. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/_deprecation.py +0 -0
  133. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/__init__.py +0 -0
  134. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/helpers.py +0 -0
  135. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/models.py +0 -0
  136. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/rest/__init__.py +0 -0
  137. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/rest/aggregator.py +0 -0
  138. {tigrbl_concrete-0.4.5.dev1 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/webhooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl-concrete
3
- Version: 0.4.5.dev1
3
+ Version: 0.4.5.dev4
4
4
  Summary: Concrete Tigrbl implementations for reusable framework behavior, sessions, routes, responses, and base abstraction adapters.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl-concrete"
3
- version = "0.4.5.dev1"
3
+ version = "0.4.5.dev4"
4
4
  description = "Concrete Tigrbl implementations for reusable framework behavior, sessions, routes, responses, and base abstraction adapters."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -20,7 +20,7 @@ from typing import (
20
20
 
21
21
  from ._app import App as _App
22
22
  from .tigrbl_router import TigrblRouter
23
- from tigrbl_core._spec.op_spec import OpSpec
23
+ from tigrbl_core._spec.op_spec import OpSpec, _get_decorated_op_spec
24
24
  from tigrbl_core._spec.engine_spec import EngineCfg
25
25
  from tigrbl_concrete._concrete import engine_resolver as _resolver
26
26
  from tigrbl_concrete.ddl import initialize as _ddl_initialize
@@ -320,9 +320,7 @@ class TigrblApp(_App):
320
320
 
321
321
  for attr in app_cls.__dict__.values():
322
322
  fn = getattr(attr, "__func__", attr)
323
- if getattr(fn, "__tigrbl_op_spec__", None) is not None:
324
- return True
325
- if getattr(fn, "__tigrbl_op_decl__", None) is not None:
323
+ if _get_decorated_op_spec(fn) is not None:
326
324
  return True
327
325
  return False
328
326
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from dataclasses import dataclass
5
+ from dataclasses import dataclass, replace
6
6
  from typing import Any, Callable, Iterable, Optional, Sequence, Union
7
7
 
8
8
  from tigrbl_core._spec.binding_spec import (
@@ -223,14 +223,18 @@ def op_ctx(
223
223
  f.__tigrbl_op_decl__ = spec
224
224
 
225
225
  if bind is not None:
226
- targets = (
227
- bind
228
- if isinstance(bind, Iterable) and not isinstance(bind, (str, bytes))
229
- else [bind]
230
- )
226
+ targets = _bind_targets(bind)
231
227
  for obj in targets:
232
228
  setattr(obj, f.__name__, cm)
233
229
  if isinstance(obj, type):
230
+ _register_bound_op(
231
+ obj,
232
+ spec,
233
+ f,
234
+ arity_was_explicit=arity is not None,
235
+ persist_was_explicit=persist is not None,
236
+ rest_was_explicit=rest is not None,
237
+ )
234
238
  _refresh_bound_ops(obj)
235
239
 
236
240
  return cm
@@ -275,6 +279,117 @@ def _normalize_bindings(
275
279
  return (value,)
276
280
 
277
281
 
282
+ def _bind_targets(bind: Any | Iterable[Any]) -> tuple[Any, ...]:
283
+ if isinstance(bind, Iterable) and not isinstance(bind, (str, bytes)):
284
+ return tuple(bind)
285
+ return (bind,)
286
+
287
+
288
+ def _register_bound_op(
289
+ model: type,
290
+ spec: OpSpec,
291
+ func: Callable[..., Any],
292
+ *,
293
+ arity_was_explicit: bool,
294
+ persist_was_explicit: bool,
295
+ rest_was_explicit: bool,
296
+ ) -> None:
297
+ registered = _registered_bound_spec(
298
+ model,
299
+ spec,
300
+ func,
301
+ )
302
+ ops = list(getattr(model, "__tigrbl_ops__", ()) or ())
303
+ key = (registered.alias, registered.target)
304
+ for index, existing in enumerate(ops):
305
+ existing_key = (
306
+ getattr(existing, "alias", None),
307
+ getattr(existing, "target", None),
308
+ )
309
+ if existing_key == key:
310
+ ops[index] = _merge_registered_bound_spec(
311
+ existing,
312
+ registered,
313
+ arity_was_explicit=arity_was_explicit,
314
+ persist_was_explicit=persist_was_explicit,
315
+ rest_was_explicit=rest_was_explicit,
316
+ )
317
+ break
318
+ else:
319
+ ops.append(registered)
320
+ model.__tigrbl_ops__ = tuple(ops)
321
+
322
+
323
+ def _registered_bound_spec(
324
+ model: type,
325
+ spec: OpSpec,
326
+ func: Callable[..., Any],
327
+ ) -> OpSpec:
328
+ try:
329
+ from tigrbl_core._spec.op_spec import _wrap_ctx_core
330
+
331
+ handler = _wrap_ctx_core(model, func)
332
+ except Exception:
333
+ handler = None
334
+ return replace(
335
+ spec,
336
+ table=model,
337
+ handler=handler,
338
+ core=handler,
339
+ core_raw=handler,
340
+ )
341
+
342
+
343
+ def _merge_registered_bound_spec(
344
+ existing: OpSpec,
345
+ registered: OpSpec,
346
+ *,
347
+ arity_was_explicit: bool,
348
+ persist_was_explicit: bool,
349
+ rest_was_explicit: bool,
350
+ ) -> OpSpec:
351
+ existing_bindings = tuple(getattr(existing, "bindings", ()) or ())
352
+ registered_bindings = tuple(getattr(registered, "bindings", ()) or ())
353
+ bindings = registered_bindings or existing_bindings
354
+ if existing_bindings and registered_bindings:
355
+ bindings = tuple(dict.fromkeys((*existing_bindings, *registered_bindings)))
356
+
357
+ return replace(
358
+ registered,
359
+ http_methods=registered.http_methods or existing.http_methods,
360
+ bindings=bindings,
361
+ path_suffix=registered.path_suffix
362
+ if registered.path_suffix is not None
363
+ else existing.path_suffix,
364
+ tags=registered.tags or existing.tags,
365
+ status_code=registered.status_code
366
+ if registered.status_code is not None
367
+ else existing.status_code,
368
+ request_model=registered.request_model or existing.request_model,
369
+ response_model=registered.response_model or existing.response_model,
370
+ response=registered.response or existing.response,
371
+ engine=registered.engine if registered.engine is not None else existing.engine,
372
+ engine_name=registered.engine_name
373
+ if registered.engine_name is not None
374
+ else existing.engine_name,
375
+ arity=registered.arity if arity_was_explicit else existing.arity,
376
+ persist=registered.persist if persist_was_explicit else existing.persist,
377
+ expose_routes=registered.expose_routes
378
+ if rest_was_explicit
379
+ else existing.expose_routes,
380
+ expose_rpc=registered.expose_rpc
381
+ if registered.expose_rpc is not None
382
+ else existing.expose_rpc,
383
+ expose_method=registered.expose_method
384
+ if registered.expose_method is not None
385
+ else existing.expose_method,
386
+ deps=registered.deps or existing.deps,
387
+ security_deps=registered.security_deps or existing.security_deps,
388
+ secdeps=registered.secdeps or existing.secdeps,
389
+ extra={**dict(getattr(existing, "extra", {}) or {}), **dict(registered.extra)},
390
+ )
391
+
392
+
278
393
  def _normalize_framing_arg(framing: Framing | FramingSpec | None) -> FramingSpec | None:
279
394
  return framing_spec_from_kind(framing)
280
395