tigrbl 0.4.5.dev4__tar.gz → 0.4.5.dev8__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 (126) hide show
  1. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/PKG-INFO +22 -13
  2. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/README.md +5 -5
  3. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/pyproject.toml +21 -8
  4. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/__init__.py +96 -7
  5. tigrbl-0.4.5.dev8/tigrbl/engine_session/__init__.py +28 -0
  6. tigrbl-0.4.5.dev8/tigrbl/engine_session/base.py +7 -0
  7. tigrbl-0.4.5.dev8/tigrbl/engine_session/spec.py +23 -0
  8. tigrbl-0.4.5.dev8/tigrbl/factories/__init__.py +85 -0
  9. tigrbl-0.4.5.dev8/tigrbl/factories/column.py +23 -0
  10. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/factories/engine.py +51 -2
  11. tigrbl-0.4.5.dev8/tigrbl/factories/op.py +3 -0
  12. tigrbl-0.4.5.dev8/tigrbl/factories/router.py +3 -0
  13. tigrbl-0.4.5.dev8/tigrbl/factories/table.py +17 -0
  14. tigrbl-0.4.5.dev8/tigrbl/session/__init__.py +29 -0
  15. tigrbl-0.4.5.dev8/tigrbl/session/base.py +20 -0
  16. tigrbl-0.4.5.dev8/tigrbl/session/spec.py +18 -0
  17. tigrbl-0.4.5.dev8/tigrbl/system/docs/openapi/helpers.py +33 -0
  18. tigrbl-0.4.5.dev8/tigrbl/system/docs/openapi/schema.py +5 -0
  19. tigrbl-0.4.5.dev8/tigrbl/system/docs/openrpc.py +5 -0
  20. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/utils/schema.py +10 -5
  21. tigrbl-0.4.5.dev4/tigrbl/factories/__init__.py +0 -31
  22. tigrbl-0.4.5.dev4/tigrbl/factories/column.py +0 -100
  23. tigrbl-0.4.5.dev4/tigrbl/factories/op.py +0 -14
  24. tigrbl-0.4.5.dev4/tigrbl/factories/router.py +0 -50
  25. tigrbl-0.4.5.dev4/tigrbl/factories/table.py +0 -57
  26. tigrbl-0.4.5.dev4/tigrbl/session/__init__.py +0 -8
  27. tigrbl-0.4.5.dev4/tigrbl/session/base.py +0 -7
  28. tigrbl-0.4.5.dev4/tigrbl/session/spec.py +0 -7
  29. tigrbl-0.4.5.dev4/tigrbl/system/docs/openapi/helpers.py +0 -223
  30. tigrbl-0.4.5.dev4/tigrbl/system/docs/openapi/schema.py +0 -233
  31. tigrbl-0.4.5.dev4/tigrbl/system/docs/openrpc.py +0 -340
  32. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/LICENSE +0 -0
  33. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/NOTICE +0 -0
  34. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/__main__.py +0 -0
  35. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/canonical_json.py +0 -0
  36. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/cli.py +0 -0
  37. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/config/__init__.py +0 -0
  38. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/config/constants.py +0 -0
  39. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/config/defaults.py +0 -0
  40. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/ddl/__init__.py +0 -0
  41. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/__init__.py +0 -0
  42. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/allow_anon.py +0 -0
  43. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/engine.py +0 -0
  44. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/hook.py +0 -0
  45. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/middlewares.py +0 -0
  46. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/op.py +0 -0
  47. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/response.py +0 -0
  48. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/rest.py +0 -0
  49. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/schema.py +0 -0
  50. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/decorators/session.py +0 -0
  51. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/__init__.py +0 -0
  52. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/bind.py +0 -0
  53. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/builders.py +0 -0
  54. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/capabilities.py +0 -0
  55. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/collect.py +0 -0
  56. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/plugins.py +0 -0
  57. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/registry.py +0 -0
  58. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/engine/resolver.py +0 -0
  59. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/factories/app.py +0 -0
  60. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/factories/hook.py +0 -0
  61. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/factories/responses.py +0 -0
  62. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/factories/schema.py +0 -0
  63. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/hook/exceptions.py +0 -0
  64. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/hook/types.py +0 -0
  65. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/middlewares/__init__.py +0 -0
  66. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/middlewares/compose.py +0 -0
  67. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/op/__init__.py +0 -0
  68. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/op/canonical.py +0 -0
  69. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/op/collect.py +0 -0
  70. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/op/types.py +0 -0
  71. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/orm/__init__.py +0 -0
  72. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/requests.py +0 -0
  73. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/rest/__init__.py +0 -0
  74. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/__init__.py +0 -0
  75. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/__init__.py +0 -0
  76. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/build_schema.py +0 -0
  77. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/cache.py +0 -0
  78. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/extras.py +0 -0
  79. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/helpers.py +0 -0
  80. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/list_params.py +0 -0
  81. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  82. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/jsonrpc.py +0 -0
  83. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/schema/utils.py +0 -0
  84. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/security/__init__.py +0 -0
  85. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/security/dependencies.py +0 -0
  86. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/__init__.py +0 -0
  87. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/app.py +0 -0
  88. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/column.py +0 -0
  89. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/engine.py +0 -0
  90. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/hook.py +0 -0
  91. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/op.py +0 -0
  92. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/responses.py +0 -0
  93. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/rest.py +0 -0
  94. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/router.py +0 -0
  95. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/schema.py +0 -0
  96. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/shortcuts/table.py +0 -0
  97. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/specs.py +0 -0
  98. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/__init__.py +0 -0
  99. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/__init__.py +0 -0
  100. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/healthz.py +0 -0
  101. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/hookz.py +0 -0
  102. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/kernelz.py +0 -0
  103. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/methodz.py +0 -0
  104. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/router.py +0 -0
  105. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/diagnostics/utils.py +0 -0
  106. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/__init__.py +0 -0
  107. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/lens.py +0 -0
  108. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/openapi/__init__.py +0 -0
  109. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/openapi/metadata.py +0 -0
  110. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/openapi/mount.py +0 -0
  111. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/docs/swagger.py +0 -0
  112. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/favicon/__init__.py +0 -0
  113. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  114. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/system/uvicorn.py +0 -0
  115. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/__init__.py +0 -0
  116. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  117. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/jsonrpc/helpers.py +0 -0
  118. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/jsonrpc/models.py +0 -0
  119. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/rest/__init__.py +0 -0
  120. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/transport/rest/aggregator.py +0 -0
  121. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/types/__init__.py +0 -0
  122. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/utils/__init__.py +0 -0
  123. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/vendor/__init__.py +0 -0
  124. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/vendor/jinja.py +0 -0
  125. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/vendor/pydantic.py +0 -0
  126. {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev8}/tigrbl/vendor/sqlalchemy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.4.5.dev4
3
+ Version: 0.4.5.dev8
4
4
  Summary: Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -230,31 +230,40 @@ Classifier: Topic :: Software Development :: Code Generators
230
230
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
231
231
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
232
232
  Classifier: Typing :: Typed
233
+ Provides-Extra: gunicorn
234
+ Provides-Extra: hypercorn
233
235
  Provides-Extra: postgres
234
236
  Provides-Extra: servers
235
237
  Provides-Extra: templates
236
238
  Provides-Extra: tests
239
+ Provides-Extra: tigrcorn
240
+ Provides-Extra: uvicorn
237
241
  Requires-Dist: aiosqlite (>=0.19.0)
238
242
  Requires-Dist: asyncpg (>=0.30.0) ; extra == "postgres"
239
243
  Requires-Dist: greenlet (>=3.2.3)
244
+ Requires-Dist: gunicorn (>=21.2.0) ; extra == "gunicorn"
240
245
  Requires-Dist: gunicorn (>=21.2.0) ; extra == "servers"
241
246
  Requires-Dist: httpx (>=0.27.0)
247
+ Requires-Dist: hypercorn (>=0.16.0) ; extra == "hypercorn"
242
248
  Requires-Dist: hypercorn (>=0.16.0) ; extra == "servers"
243
249
  Requires-Dist: jinja2 (>=3.1.4) ; extra == "templates"
244
250
  Requires-Dist: psycopg2-binary (>=2.9.9) ; extra == "postgres"
245
251
  Requires-Dist: pydantic (>=2.0.0)
246
252
  Requires-Dist: sqlalchemy (>=2.0)
247
- Requires-Dist: tigrbl-atoms
248
- Requires-Dist: tigrbl-base
253
+ Requires-Dist: tigrbl-atoms (>=0.4.5.dev5)
254
+ Requires-Dist: tigrbl-base (>=0.4.5.dev6)
249
255
  Requires-Dist: tigrbl-canon
250
- Requires-Dist: tigrbl-concrete
251
- Requires-Dist: tigrbl-core
252
- Requires-Dist: tigrbl-kernel
256
+ Requires-Dist: tigrbl-concrete (>=0.4.5.dev7)
257
+ Requires-Dist: tigrbl-core (>=0.4.5.dev6)
258
+ Requires-Dist: tigrbl-kernel (>=0.4.5.dev5)
253
259
  Requires-Dist: tigrbl-ops-oltp
254
260
  Requires-Dist: tigrbl-orm
255
- Requires-Dist: tigrbl-runtime
261
+ Requires-Dist: tigrbl-runtime (>=0.4.5.dev7)
256
262
  Requires-Dist: tigrbl-tests ; extra == "tests"
257
- Requires-Dist: uvicorn
263
+ Requires-Dist: tigrcorn ; extra == "servers"
264
+ Requires-Dist: tigrcorn ; extra == "tigrcorn"
265
+ Requires-Dist: uvicorn ; extra == "servers"
266
+ Requires-Dist: uvicorn ; extra == "uvicorn"
258
267
  Project-URL: Discord, https://discord.gg/K4YTAPapjR
259
268
  Project-URL: Homepage, https://github.com/tigrbl/tigrbl
260
269
  Project-URL: Issues, https://github.com/tigrbl/tigrbl/issues
@@ -269,7 +278,7 @@ Description-Content-Type: text/markdown
269
278
  <a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
270
279
  <a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
271
280
  <a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl"/></a>
272
- <a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md.svg?label=hits" alt="Repository hits for tigrbl README"/></a>
281
+ <a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/80_facade/tigrbl/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/80_facade/tigrbl/README.md.svg?label=hits" alt="Repository hits for tigrbl README"/></a>
273
282
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-525252" alt="Apache 2.0 license"/></a>
274
283
  <a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%2C%203.11%2C%203.12%2C%203.13%2C%203.14-3776ab" alt="Python versions 3.10 | 3.11 | 3.12 | 3.13 | 3.14 for tigrbl"/></a>
275
284
  <a href="https://github.com/tigrbl/tigrbl/blob/master/docs/README.md"><img src="https://img.shields.io/badge/workspace-core-1f6feb" alt="Workspace group for tigrbl"/></a>
@@ -293,7 +302,7 @@ Application developers, platform teams, and service owners building schema-first
293
302
 
294
303
  ## Where does tigrbl fit?
295
304
 
296
- `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
305
+ `tigrbl` lives at `pkgs/80_facade/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
297
306
 
298
307
  ## How does tigrbl work?
299
308
 
@@ -321,7 +330,7 @@ pip install "tigrbl[postgres,servers,templates,tests]"
321
330
  | Surface | Value |
322
331
  |---|---|
323
332
  | PyPI package | [`tigrbl`](https://pypi.org/project/tigrbl/) |
324
- | Repository path | [`pkgs/core/tigrbl`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl) |
333
+ | Repository path | [`pkgs/80_facade/tigrbl`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/80_facade/tigrbl) |
325
334
  | Python import root | `tigrbl` |
326
335
  | Console scripts | `tigrbl` |
327
336
  | Entry points | none declared |
@@ -779,7 +788,7 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
779
788
 
780
789
  - Community: [Discord](https://discord.gg/K4YTAPapjR).
781
790
  - Issues: [GitHub Issues](https://github.com/tigrbl/tigrbl/issues).
782
- - Repository: [pkgs/core/tigrbl](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl).
791
+ - Repository: [pkgs/80_facade/tigrbl](https://github.com/tigrbl/tigrbl/tree/master/pkgs/80_facade/tigrbl).
783
792
 
784
793
  ## Package-local Boundary
785
794
 
@@ -790,7 +799,7 @@ This file is a package-local distribution entry point. This README is the packag
790
799
  - Package status: governed package in the `tigrbl/tigrbl` workspace.
791
800
  - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
792
801
  - 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.
793
- - 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`.
802
+ - Local certification guard: `pkgs/97_tests/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`.
794
803
  - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
795
804
 
796
805
  ## License
@@ -5,7 +5,7 @@
5
5
  <a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
6
6
  <a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
7
7
  <a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl"/></a>
8
- <a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/core/tigrbl/README.md.svg?label=hits" alt="Repository hits for tigrbl README"/></a>
8
+ <a href="https://github.com/tigrbl/tigrbl/blob/master/pkgs/80_facade/tigrbl/README.md"><img src="https://hits.sh/github.com/tigrbl/tigrbl/blob/master/pkgs/80_facade/tigrbl/README.md.svg?label=hits" alt="Repository hits for tigrbl README"/></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-525252" alt="Apache 2.0 license"/></a>
10
10
  <a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.10%2C%203.11%2C%203.12%2C%203.13%2C%203.14-3776ab" alt="Python versions 3.10 | 3.11 | 3.12 | 3.13 | 3.14 for tigrbl"/></a>
11
11
  <a href="https://github.com/tigrbl/tigrbl/blob/master/docs/README.md"><img src="https://img.shields.io/badge/workspace-core-1f6feb" alt="Workspace group for tigrbl"/></a>
@@ -29,7 +29,7 @@ Application developers, platform teams, and service owners building schema-first
29
29
 
30
30
  ## Where does tigrbl fit?
31
31
 
32
- `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
32
+ `tigrbl` lives at `pkgs/80_facade/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
33
33
 
34
34
  ## How does tigrbl work?
35
35
 
@@ -57,7 +57,7 @@ pip install "tigrbl[postgres,servers,templates,tests]"
57
57
  | Surface | Value |
58
58
  |---|---|
59
59
  | PyPI package | [`tigrbl`](https://pypi.org/project/tigrbl/) |
60
- | Repository path | [`pkgs/core/tigrbl`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl) |
60
+ | Repository path | [`pkgs/80_facade/tigrbl`](https://github.com/tigrbl/tigrbl/tree/master/pkgs/80_facade/tigrbl) |
61
61
  | Python import root | `tigrbl` |
62
62
  | Console scripts | `tigrbl` |
63
63
  | Entry points | none declared |
@@ -515,7 +515,7 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
515
515
 
516
516
  - Community: [Discord](https://discord.gg/K4YTAPapjR).
517
517
  - Issues: [GitHub Issues](https://github.com/tigrbl/tigrbl/issues).
518
- - Repository: [pkgs/core/tigrbl](https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl).
518
+ - Repository: [pkgs/80_facade/tigrbl](https://github.com/tigrbl/tigrbl/tree/master/pkgs/80_facade/tigrbl).
519
519
 
520
520
  ## Package-local Boundary
521
521
 
@@ -526,7 +526,7 @@ This file is a package-local distribution entry point. This README is the packag
526
526
  - Package status: governed package in the `tigrbl/tigrbl` workspace.
527
527
  - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
528
528
  - 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.
529
- - 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`.
529
+ - Local certification guard: `pkgs/97_tests/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`.
530
530
  - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
531
531
 
532
532
  ## License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.4.5.dev4"
3
+ version = "0.4.5.dev8"
4
4
  description = "Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -54,21 +54,20 @@ requires-python = ">=3.10,<3.15"
54
54
  authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
55
55
 
56
56
  dependencies = [
57
- "tigrbl-core",
58
- "tigrbl-base",
59
- "tigrbl-concrete",
57
+ "tigrbl-core>=0.4.5.dev6",
58
+ "tigrbl-base>=0.4.5.dev6",
59
+ "tigrbl-concrete>=0.4.5.dev7",
60
60
  "tigrbl-canon",
61
61
  "tigrbl-orm",
62
- "tigrbl-runtime",
63
- "tigrbl-atoms",
64
- "tigrbl-kernel",
62
+ "tigrbl-runtime>=0.4.5.dev7",
63
+ "tigrbl-atoms>=0.4.5.dev5",
64
+ "tigrbl-kernel>=0.4.5.dev5",
65
65
  "tigrbl-ops-oltp",
66
66
  "pydantic>=2.0.0",
67
67
  "sqlalchemy>=2.0",
68
68
  "aiosqlite>=0.19.0",
69
69
  "httpx>=0.27.0",
70
70
  "greenlet>=3.2.3",
71
- "uvicorn",
72
71
  ]
73
72
 
74
73
 
@@ -92,9 +91,23 @@ templates = [
92
91
  "jinja2>=3.1.4",
93
92
  ]
94
93
  servers = [
94
+ "uvicorn",
95
+ "tigrcorn",
95
96
  "hypercorn>=0.16.0",
96
97
  "gunicorn>=21.2.0",
97
98
  ]
99
+ uvicorn = [
100
+ "uvicorn",
101
+ ]
102
+ tigrcorn = [
103
+ "tigrcorn",
104
+ ]
105
+ hypercorn = [
106
+ "hypercorn>=0.16.0",
107
+ ]
108
+ gunicorn = [
109
+ "gunicorn>=21.2.0",
110
+ ]
98
111
  tests = [
99
112
  "tigrbl-tests",
100
113
  ]
@@ -100,6 +100,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
100
100
  Column,
101
101
  CORSMiddleware,
102
102
  CrudTable,
103
+ EngineSession,
103
104
  EventStreamTable,
104
105
  EventStreamResponse,
105
106
  FileResponse,
@@ -185,7 +186,39 @@ from tigrbl_concrete._decorators.middlewares import ( # noqa: E402
185
186
  middleware as middleware,
186
187
  middlewares as middlewares,
187
188
  )
188
- from tigrbl.factories.op import op # noqa: E402
189
+ from tigrbl.factories.op import makeOp, op # noqa: E402
190
+ from tigrbl.factories.table import ( # noqa: E402
191
+ activateTableSpec,
192
+ activateTableSpecs,
193
+ defineTableSpec,
194
+ deriveTableSpec,
195
+ provideTableSpec,
196
+ )
197
+ from tigrbl_concrete.records import ( # noqa: E402
198
+ clear_table_records,
199
+ clear_records,
200
+ create_table_record,
201
+ create_record,
202
+ database_from_context,
203
+ delete_table_record,
204
+ delete_record,
205
+ field,
206
+ field_value,
207
+ first_table_record,
208
+ first_record,
209
+ invoke_table_operation,
210
+ list_table_records,
211
+ list_records,
212
+ maybe_await,
213
+ normalize_items,
214
+ payload_from_context,
215
+ provideTableHandler,
216
+ read_table_record,
217
+ read_record,
218
+ record_identifier,
219
+ update_table_record,
220
+ update_record,
221
+ )
189
222
  from tigrbl.schema import _build_list_params, _build_schema, get_schema # noqa: E402
190
223
  from tigrbl.ddl import bootstrap_dbschema, ensure_schemas, register_sqlite_attach # noqa: E402
191
224
 
@@ -194,6 +227,7 @@ from tigrbl_base._base import ( # noqa: E402
194
227
  CrudTableBase,
195
228
  EngineBase,
196
229
  EngineProviderBase,
230
+ EngineSessionBase,
197
231
  ForeignKeyBase,
198
232
  HookBase,
199
233
  RealtimeTableBase,
@@ -229,6 +263,7 @@ from tigrbl_core._spec import ( # noqa: E402
229
263
  HttpRestProtocolBindingSpec,
230
264
  HttpStreamBindingSpec,
231
265
  IOSpec,
266
+ JsonRpcFramingSpec,
232
267
  OpSpec,
233
268
  PathKind,
234
269
  PathSpec,
@@ -242,7 +277,8 @@ from tigrbl_core._spec import ( # noqa: E402
242
277
  SchemaArg,
243
278
  SchemaRef,
244
279
  SchemaSpec,
245
- SessionSpec,
280
+ EngineSessionCfg,
281
+ EngineSessionSpec,
246
282
  StorageSpec,
247
283
  StorageTransformSpec,
248
284
  StorageTypeRef,
@@ -346,21 +382,41 @@ async def rpc_call(*args, **kwargs):
346
382
  )
347
383
 
348
384
 
349
- from tigrbl_core._spec.session_spec import ( # noqa: E402
385
+ from tigrbl_core._compat import warn_legacy_engine_session_name # noqa: E402
386
+ from tigrbl_core._spec.engine_session_spec import ( # noqa: E402
350
387
  readonly as _readonly_fn,
351
- session_spec as _session_spec_fn,
388
+ engine_session_spec as _engine_session_spec_fn,
352
389
  tx_read_committed as _tx_read_committed_fn,
353
390
  tx_repeatable_read as _tx_repeatable_read_fn,
354
391
  tx_serializable as _tx_serializable_fn,
355
392
  )
356
393
 
357
394
  readonly = _readonly_fn
358
- session_spec = _session_spec_fn
395
+ engine_session_spec = _engine_session_spec_fn
359
396
  tx_read_committed = _tx_read_committed_fn
360
397
  tx_repeatable_read = _tx_repeatable_read_fn
361
398
  tx_serializable = _tx_serializable_fn
362
399
 
363
400
 
401
+ def __getattr__(name: str):
402
+ if name == "SessionSpec":
403
+ warn_legacy_engine_session_name("tigrbl.SessionSpec", "EngineSessionSpec")
404
+ return EngineSessionSpec
405
+ if name == "SessionCfg":
406
+ warn_legacy_engine_session_name("tigrbl.SessionCfg", "EngineSessionCfg")
407
+ return EngineSessionCfg
408
+ if name == "session_spec":
409
+ warn_legacy_engine_session_name("tigrbl.session_spec", "engine_session_spec")
410
+ return engine_session_spec
411
+ if name == "TigrblSessionBase":
412
+ warn_legacy_engine_session_name("tigrbl.TigrblSessionBase", "EngineSessionBase")
413
+ return EngineSessionBase
414
+ if name == "DefaultSession":
415
+ warn_legacy_engine_session_name("tigrbl.DefaultSession", "EngineSession")
416
+ return EngineSession
417
+ raise AttributeError(name)
418
+
419
+
364
420
  __all__ = [
365
421
  "specs",
366
422
  "base",
@@ -383,8 +439,38 @@ __all__ = [
383
439
  "CrudTableBase",
384
440
  "RealtimeTableBase",
385
441
  "RouterBase",
442
+ "EngineSessionBase",
386
443
  "Op",
387
444
  "op",
445
+ "makeOp",
446
+ "defineTableSpec",
447
+ "deriveTableSpec",
448
+ "provideTableSpec",
449
+ "activateTableSpec",
450
+ "activateTableSpecs",
451
+ "clear_table_records",
452
+ "clear_records",
453
+ "create_table_record",
454
+ "create_record",
455
+ "database_from_context",
456
+ "delete_table_record",
457
+ "delete_record",
458
+ "field",
459
+ "field_value",
460
+ "first_table_record",
461
+ "first_record",
462
+ "invoke_table_operation",
463
+ "list_table_records",
464
+ "list_records",
465
+ "maybe_await",
466
+ "normalize_items",
467
+ "payload_from_context",
468
+ "provideTableHandler",
469
+ "read_table_record",
470
+ "read_record",
471
+ "record_identifier",
472
+ "update_table_record",
473
+ "update_record",
388
474
  "HTTPBasic",
389
475
  "HTTPBearer",
390
476
  "APIKey",
@@ -401,6 +487,7 @@ __all__ = [
401
487
  "HookPhase",
402
488
  "Exchange",
403
489
  "Framing",
490
+ "JsonRpcFramingSpec",
404
491
  "HTTPBindingSpec",
405
492
  "HttpJsonRpcBindingSpec",
406
493
  "HttpJsonRpcProtocolBindingSpec",
@@ -475,6 +562,7 @@ __all__ = [
475
562
  "Request",
476
563
  "UploadedFile",
477
564
  "WebSocket",
565
+ "EngineSession",
478
566
  "Response",
479
567
  "TransportResponse",
480
568
  "JSONResponse",
@@ -499,8 +587,9 @@ __all__ = [
499
587
  "HeadersSpec",
500
588
  "RequestSpec",
501
589
  "SchemaSpec",
502
- "SessionSpec",
503
- "session_spec",
590
+ "EngineSessionCfg",
591
+ "EngineSessionSpec",
592
+ "engine_session_spec",
504
593
  "tx_read_committed",
505
594
  "tx_repeatable_read",
506
595
  "tx_serializable",
@@ -0,0 +1,28 @@
1
+ """Canonical engine database session exports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from tigrbl_base._base import EngineSessionBase
6
+ from tigrbl_concrete._concrete import EngineSession, wrap_sessionmaker
7
+ from tigrbl_core._spec.engine_session_spec import (
8
+ EngineSessionCfg,
9
+ EngineSessionSpec,
10
+ engine_session_spec,
11
+ readonly,
12
+ tx_read_committed,
13
+ tx_repeatable_read,
14
+ tx_serializable,
15
+ )
16
+
17
+ __all__ = [
18
+ "EngineSession",
19
+ "EngineSessionBase",
20
+ "EngineSessionCfg",
21
+ "EngineSessionSpec",
22
+ "engine_session_spec",
23
+ "wrap_sessionmaker",
24
+ "readonly",
25
+ "tx_read_committed",
26
+ "tx_repeatable_read",
27
+ "tx_serializable",
28
+ ]
@@ -0,0 +1,7 @@
1
+ """Canonical engine session base export."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from tigrbl_base._base import EngineSessionBase
6
+
7
+ __all__ = ["EngineSessionBase"]
@@ -0,0 +1,23 @@
1
+ """Canonical engine session spec exports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from tigrbl_core._spec.engine_session_spec import (
6
+ EngineSessionCfg,
7
+ EngineSessionSpec,
8
+ engine_session_spec,
9
+ readonly,
10
+ tx_read_committed,
11
+ tx_repeatable_read,
12
+ tx_serializable,
13
+ )
14
+
15
+ __all__ = [
16
+ "EngineSessionCfg",
17
+ "EngineSessionSpec",
18
+ "engine_session_spec",
19
+ "readonly",
20
+ "tx_read_committed",
21
+ "tx_repeatable_read",
22
+ "tx_serializable",
23
+ ]
@@ -0,0 +1,85 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib import import_module
4
+
5
+ _MODULES = (
6
+ "app",
7
+ "column",
8
+ "engine",
9
+ "hook",
10
+ "op",
11
+ "responses",
12
+ "router",
13
+ "schema",
14
+ "table",
15
+ )
16
+
17
+ _EXPORT_MODULE = {
18
+ "Column": "column",
19
+ "ColumnSpec": "column",
20
+ "F": "column",
21
+ "IO": "column",
22
+ "S": "column",
23
+ "acol": "column",
24
+ "activateTableSpec": "table",
25
+ "activateTableSpecs": "table",
26
+ "as_event_stream": "responses",
27
+ "as_file": "responses",
28
+ "as_html": "responses",
29
+ "as_json": "responses",
30
+ "as_redirect": "responses",
31
+ "as_stream": "responses",
32
+ "as_text": "responses",
33
+ "defineAppSpec": "app",
34
+ "defineRouterSpec": "router",
35
+ "defineTableSpec": "table",
36
+ "deriveApp": "app",
37
+ "deriveRouter": "router",
38
+ "deriveTable": "table",
39
+ "deriveTableSpec": "table",
40
+ "engine": "engine",
41
+ "engine_spec": "engine",
42
+ "hook": "hook",
43
+ "hook_spec": "hook",
44
+ "makeColumn": "column",
45
+ "makeOp": "op",
46
+ "makeVirtualColumn": "column",
47
+ "mariadb": "engine",
48
+ "mariadb_cfg": "engine",
49
+ "mem": "engine",
50
+ "mysql": "engine",
51
+ "mysql_cfg": "engine",
52
+ "op": "op",
53
+ "pg": "engine",
54
+ "pg_cfg": "engine",
55
+ "pga": "engine",
56
+ "pgs": "engine",
57
+ "prov": "engine",
58
+ "provider_mariadb": "engine",
59
+ "provider_mysql": "engine",
60
+ "provider_postgres": "engine",
61
+ "provider_sqlite_file": "engine",
62
+ "provider_sqlite_memory": "engine",
63
+ "provideTableSpec": "table",
64
+ "schema": "schema",
65
+ "schema_spec": "schema",
66
+ "sqlite_cfg": "engine",
67
+ "sqlitef": "engine",
68
+ "vcol": "column",
69
+ }
70
+
71
+ __all__ = sorted((*_MODULES, *_EXPORT_MODULE))
72
+
73
+
74
+ def __getattr__(name: str):
75
+ module_name = name if name in _MODULES else _EXPORT_MODULE.get(name)
76
+ if module_name is None:
77
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
78
+ module = import_module(f"{__name__}.{module_name}")
79
+ value = module if name in _MODULES else getattr(module, name)
80
+ globals()[name] = value
81
+ return value
82
+
83
+
84
+ def __dir__() -> list[str]:
85
+ return sorted(set(__all__) | {key for key in globals() if not key.startswith("_")})
@@ -0,0 +1,23 @@
1
+ from tigrbl_concrete.factories.column import (
2
+ Column,
3
+ ColumnSpec,
4
+ F,
5
+ IO,
6
+ S,
7
+ acol,
8
+ makeColumn,
9
+ makeVirtualColumn,
10
+ vcol,
11
+ )
12
+
13
+ __all__ = [
14
+ "Column",
15
+ "ColumnSpec",
16
+ "F",
17
+ "IO",
18
+ "S",
19
+ "acol",
20
+ "makeColumn",
21
+ "makeVirtualColumn",
22
+ "vcol",
23
+ ]
@@ -28,7 +28,7 @@ def engine_spec(
28
28
  kind = kw.get("kind")
29
29
  if not kind:
30
30
  raise ValueError(
31
- "Provide spec=<DSN|mapping> or kind=('sqlite'|'postgres') with appropriate fields"
31
+ "Provide spec=<DSN|mapping> or kind=('sqlite'|'postgres'|'mysql') with appropriate fields"
32
32
  )
33
33
 
34
34
  async_kw = kw.get("async_")
@@ -69,8 +69,17 @@ def engine_spec(
69
69
  "pool_size": kw.get("pool_size", 10),
70
70
  "max": kw.get("max", 20),
71
71
  }
72
+ elif kind in ("mariadb", "mysql"):
73
+ async_ = bool(async_kw) if async_kw is not None else False
74
+ spec = {
75
+ "kind": kind, "async": async_,
76
+ "user": kw.get("user", "app"), "pwd": kw.get("pwd", "secret"),
77
+ "host": kw.get("host", "localhost"), "port": kw.get("port", 3306),
78
+ "db": kw.get("name", kw.get("db", "app_db")),
79
+ "pool_size": kw.get("pool_size", 10), "max": kw.get("max", 20),
80
+ }
72
81
  else:
73
- raise ValueError("kind must be 'sqlite' or 'postgres'")
82
+ raise ValueError("kind must be 'sqlite', 'postgres', or 'mysql'")
74
83
 
75
84
  return EngineSpec.from_any(spec)
76
85
 
@@ -142,6 +151,26 @@ def pg_cfg(
142
151
  }
143
152
 
144
153
 
154
+ def mysql_cfg(*, async_: bool = False, user: str = "app", pwd: str = "secret",
155
+ host: str = "localhost", port: int = 3306, name: str = "app_db",
156
+ pool_size: int = 10, max: int = 20) -> EngineCfg:
157
+ return {"kind": "mysql", "async": async_, "user": user, "pwd": pwd,
158
+ "host": host, "port": port, "db": name, "pool_size": pool_size, "max": max}
159
+
160
+
161
+ def mariadb_cfg(*, async_: bool = False, user: str = "app", pwd: str = "secret",
162
+ host: str = "localhost", port: int = 3306, name: str = "app_db",
163
+ pool_size: int = 10, max: int = 20) -> EngineCfg:
164
+ return {"kind": "mariadb", "async": async_, "user": user, "pwd": pwd,
165
+ "host": host, "port": port, "db": name, "pool_size": pool_size, "max": max}
166
+
167
+
168
+ def mariadb(**kw: Any) -> EngineCfg:
169
+ """Sync MariaDB EngineCfg (PyMySQL)."""
170
+ kw.setdefault("async_", False)
171
+ return mariadb_cfg(**kw)
172
+
173
+
145
174
  def mem(async_: bool = True) -> EngineCfg:
146
175
  """SQLite in-memory (StaticPool) EngineCfg mapping."""
147
176
  return {"kind": "sqlite", "async": async_, "mode": "memory"}
@@ -174,6 +203,12 @@ def pgs(**kw: Any) -> EngineCfg:
174
203
  return pg_cfg(**kw)
175
204
 
176
205
 
206
+ def mysql(**kw: Any) -> EngineCfg:
207
+ """Sync MySQL EngineCfg (PyMySQL)."""
208
+ kw.setdefault("async_", False)
209
+ return mysql_cfg(**kw)
210
+
211
+
177
212
  # ---------------------------------------------------------------------------
178
213
  # Provider one-liners
179
214
  # ---------------------------------------------------------------------------
@@ -213,6 +248,14 @@ def provider_postgres(
213
248
  )
214
249
 
215
250
 
251
+ def provider_mariadb(**kw: Any) -> Provider:
252
+ return provider_from_spec(engine_spec(mariadb_cfg(**kw)))
253
+
254
+
255
+ def provider_mysql(**kw: Any) -> Provider:
256
+ return provider_from_spec(engine_spec(mysql_cfg(**kw)))
257
+
258
+
216
259
  __all__ = [
217
260
  # EngineSpec / Provider / Engine helpers
218
261
  "engine_spec",
@@ -221,13 +264,19 @@ __all__ = [
221
264
  # convenience EngineCfg helpers
222
265
  "sqlite_cfg",
223
266
  "pg_cfg",
267
+ "mysql_cfg",
268
+ "mariadb_cfg",
224
269
  "mem",
225
270
  "sqlitef",
226
271
  "pg",
227
272
  "pga",
228
273
  "pgs",
274
+ "mysql",
275
+ "mariadb",
229
276
  # direct providers
230
277
  "provider_sqlite_memory",
231
278
  "provider_sqlite_file",
232
279
  "provider_postgres",
280
+ "provider_mysql",
281
+ "provider_mariadb",
233
282
  ]
@@ -0,0 +1,3 @@
1
+ from tigrbl_concrete.factories.op import makeOp, op
2
+
3
+ __all__ = ["makeOp", "op"]
@@ -0,0 +1,3 @@
1
+ from tigrbl_concrete.factories.router import defineRouterSpec, deriveRouter
2
+
3
+ __all__ = ["defineRouterSpec", "deriveRouter"]