tigrbl-concrete 0.4.4.dev8__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.4.dev8 → tigrbl_concrete-0.4.5.dev4}/PKG-INFO +9 -8
  2. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/README.md +8 -7
  3. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/pyproject.toml +1 -1
  4. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/tigrbl_app.py +2 -4
  5. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/op.py +121 -6
  6. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/LICENSE +0 -0
  7. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/NOTICE +0 -0
  8. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/__init__.py +0 -0
  9. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/__init__.py +0 -0
  10. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_alias.py +0 -0
  11. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_allow_anon.py +0 -0
  12. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_app.py +0 -0
  13. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_background.py +0 -0
  14. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_binding.py +0 -0
  15. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_body.py +0 -0
  16. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_column.py +0 -0
  17. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_cors_middleware.py +0 -0
  18. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_engine.py +0 -0
  19. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_event_stream_response.py +0 -0
  20. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_execution_backend.py +0 -0
  21. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_file_response.py +0 -0
  22. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_headers.py +0 -0
  23. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_hook.py +0 -0
  24. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_html_response.py +0 -0
  25. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_httpx.py +0 -0
  26. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_json_response.py +0 -0
  27. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_middleware.py +0 -0
  28. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_op.py +0 -0
  29. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_op_registry.py +0 -0
  30. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_plain_text_response.py +0 -0
  31. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_redirect_response.py +0 -0
  32. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_request.py +0 -0
  33. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_request_adapters.py +0 -0
  34. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_response.py +0 -0
  35. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_route.py +0 -0
  36. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_router.py +0 -0
  37. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_schema.py +0 -0
  38. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/__init__.py +0 -0
  39. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/api_key.py +0 -0
  40. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/http_basic.py +0 -0
  41. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/http_bearer.py +0 -0
  42. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/mutual_tls.py +0 -0
  43. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/oauth2.py +0 -0
  44. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_security/openid_connect.py +0 -0
  45. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_session.py +0 -0
  46. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_storage.py +0 -0
  47. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_streaming_response.py +0 -0
  48. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_table.py +0 -0
  49. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_table_registry.py +0 -0
  50. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_webhook.py +0 -0
  51. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/_websocket.py +0 -0
  52. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/dependencies.py +0 -0
  53. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/engine_resolver.py +0 -0
  54. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_concrete/tigrbl_router.py +0 -0
  55. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/__init__.py +0 -0
  56. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/allow_anon.py +0 -0
  57. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/engine.py +0 -0
  58. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/eventful.py +0 -0
  59. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/hook.py +0 -0
  60. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/middlewares.py +0 -0
  61. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/response.py +0 -0
  62. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/rest.py +0 -0
  63. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/schema.py +0 -0
  64. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/session.py +0 -0
  65. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_decorators/webhook.py +0 -0
  66. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/__init__.py +0 -0
  67. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/__init__.py +0 -0
  68. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/docs_lowering.py +0 -0
  69. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/engine_lowering.py +0 -0
  70. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/appspec/path_lowering.py +0 -0
  71. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/column_mro_collect.py +0 -0
  72. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/core_resolver.py +0 -0
  73. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/invoke.py +0 -0
  74. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/model.py +0 -0
  75. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/model_helpers.py +0 -0
  76. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/op_resolver.py +0 -0
  77. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/__init__.py +0 -0
  78. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/common.py +0 -0
  79. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/include.py +0 -0
  80. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/resource_proxy.py +0 -0
  81. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/router/rpc.py +0 -0
  82. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/_mapping/rpc.py +0 -0
  83. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/ddl/__init__.py +0 -0
  84. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/decorators.py +0 -0
  85. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/__init__.py +0 -0
  86. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/bind.py +0 -0
  87. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/builders.py +0 -0
  88. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/capabilities.py +0 -0
  89. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/collect.py +0 -0
  90. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/plugins.py +0 -0
  91. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/registry.py +0 -0
  92. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/engine/resolver.py +0 -0
  93. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/__init__.py +0 -0
  94. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/app.py +0 -0
  95. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/factories/webhook.py +0 -0
  96. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/resolve/__init__.py +0 -0
  97. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/resolve/handlers.py +0 -0
  98. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/schema/__init__.py +0 -0
  99. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/schema/jsonrpc.py +0 -0
  100. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/security/__init__.py +0 -0
  101. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/security/dependencies.py +0 -0
  102. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/__init__.py +0 -0
  103. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/app.py +0 -0
  104. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/rest.py +0 -0
  105. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/shortcuts/webhook.py +0 -0
  106. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/__init__.py +0 -0
  107. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/__init__.py +0 -0
  108. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/healthz.py +0 -0
  109. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/hookz.py +0 -0
  110. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/kernelz.py +0 -0
  111. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/methodz.py +0 -0
  112. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/router.py +0 -0
  113. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/diagnostics/utils.py +0 -0
  114. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/__init__.py +0 -0
  115. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/json_schema.py +0 -0
  116. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/lens.py +0 -0
  117. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/__init__.py +0 -0
  118. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/helpers.py +0 -0
  119. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/metadata.py +0 -0
  120. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/mount.py +0 -0
  121. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openapi/schema.py +0 -0
  122. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/openrpc.py +0 -0
  123. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/runtime_ops.py +0 -0
  124. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/surface.py +0 -0
  125. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/docs/swagger.py +0 -0
  126. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/favicon/__init__.py +0 -0
  127. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/favicon/assets/favicon.svg +0 -0
  128. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/static.py +0 -0
  129. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/uvicorn.py +0 -0
  130. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/system/well_known.py +0 -0
  131. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/__init__.py +0 -0
  132. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/_deprecation.py +0 -0
  133. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/__init__.py +0 -0
  134. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/helpers.py +0 -0
  135. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/jsonrpc/models.py +0 -0
  136. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/rest/__init__.py +0 -0
  137. {tigrbl_concrete-0.4.4.dev8 → tigrbl_concrete-0.4.5.dev4}/tigrbl_concrete/transport/rest/aggregator.py +0 -0
  138. {tigrbl_concrete-0.4.4.dev8 → 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.4.dev8
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
@@ -282,13 +282,6 @@ Framework maintainers, extension authors, and advanced users composing Tigrbl fr
282
282
 
283
283
  It owns a narrow layer in the split workspace and is consumed by higher-level packages through explicit dependencies.
284
284
 
285
- ## Certification Status
286
-
287
- - Package status: governed package in the `tigrbl/tigrbl` workspace.
288
- - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
289
- - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
290
- - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
291
- - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
292
285
 
293
286
  ## Install
294
287
 
@@ -495,6 +488,14 @@ Choose `tigrbl-concrete` when the quick-answer table matches your use case. Choo
495
488
 
496
489
  This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl-concrete`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
497
490
 
491
+ ## Certification Status
492
+
493
+ - Package status: governed package in the `tigrbl/tigrbl` workspace.
494
+ - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
495
+ - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
496
+ - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
497
+ - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
498
+
498
499
  ## License
499
500
 
500
501
  Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
@@ -35,13 +35,6 @@ Framework maintainers, extension authors, and advanced users composing Tigrbl fr
35
35
 
36
36
  It owns a narrow layer in the split workspace and is consumed by higher-level packages through explicit dependencies.
37
37
 
38
- ## Certification Status
39
-
40
- - Package status: governed package in the `tigrbl/tigrbl` workspace.
41
- - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
42
- - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
43
- - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
44
- - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
45
38
 
46
39
  ## Install
47
40
 
@@ -248,6 +241,14 @@ Choose `tigrbl-concrete` when the quick-answer table matches your use case. Choo
248
241
 
249
242
  This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl-concrete`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
250
243
 
244
+ ## Certification Status
245
+
246
+ - Package status: governed package in the `tigrbl/tigrbl` workspace.
247
+ - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
248
+ - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
249
+ - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
250
+ - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
251
+
251
252
  ## License
252
253
 
253
254
  Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl-concrete"
3
- version = "0.4.4.dev8"
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