tigrbl 0.4.5.dev4__tar.gz → 0.4.5.dev6__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.
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/PKG-INFO +16 -7
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/README.md +5 -5
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/pyproject.toml +15 -2
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/__init__.py +96 -7
- tigrbl-0.4.5.dev6/tigrbl/engine_session/__init__.py +28 -0
- tigrbl-0.4.5.dev6/tigrbl/engine_session/base.py +7 -0
- tigrbl-0.4.5.dev6/tigrbl/engine_session/spec.py +23 -0
- tigrbl-0.4.5.dev6/tigrbl/factories/__init__.py +85 -0
- tigrbl-0.4.5.dev6/tigrbl/factories/column.py +23 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/factories/engine.py +51 -2
- tigrbl-0.4.5.dev6/tigrbl/factories/op.py +3 -0
- tigrbl-0.4.5.dev6/tigrbl/factories/router.py +3 -0
- tigrbl-0.4.5.dev6/tigrbl/factories/table.py +17 -0
- tigrbl-0.4.5.dev6/tigrbl/session/__init__.py +29 -0
- tigrbl-0.4.5.dev6/tigrbl/session/base.py +20 -0
- tigrbl-0.4.5.dev6/tigrbl/session/spec.py +18 -0
- tigrbl-0.4.5.dev6/tigrbl/system/docs/openapi/helpers.py +33 -0
- tigrbl-0.4.5.dev6/tigrbl/system/docs/openapi/schema.py +5 -0
- tigrbl-0.4.5.dev6/tigrbl/system/docs/openrpc.py +5 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/utils/schema.py +10 -5
- tigrbl-0.4.5.dev4/tigrbl/factories/__init__.py +0 -31
- tigrbl-0.4.5.dev4/tigrbl/factories/column.py +0 -100
- tigrbl-0.4.5.dev4/tigrbl/factories/op.py +0 -14
- tigrbl-0.4.5.dev4/tigrbl/factories/router.py +0 -50
- tigrbl-0.4.5.dev4/tigrbl/factories/table.py +0 -57
- tigrbl-0.4.5.dev4/tigrbl/session/__init__.py +0 -8
- tigrbl-0.4.5.dev4/tigrbl/session/base.py +0 -7
- tigrbl-0.4.5.dev4/tigrbl/session/spec.py +0 -7
- tigrbl-0.4.5.dev4/tigrbl/system/docs/openapi/helpers.py +0 -223
- tigrbl-0.4.5.dev4/tigrbl/system/docs/openapi/schema.py +0 -233
- tigrbl-0.4.5.dev4/tigrbl/system/docs/openrpc.py +0 -340
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/LICENSE +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/NOTICE +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/__main__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/canonical_json.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/cli.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/allow_anon.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/engine.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/hook.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/middlewares.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/op.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/response.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/rest.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/schema.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/decorators/session.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/factories/app.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/factories/hook.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/factories/responses.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/factories/schema.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/hook/exceptions.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/middlewares/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/op/types.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/orm/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/requests.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/jsonrpc.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/security/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/security/dependencies.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/app.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/column.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/engine.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/hook.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/op.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/responses.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/rest.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/router.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/schema.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/shortcuts/table.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/specs.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/lens.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/openapi/mount.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/docs/swagger.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/favicon/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/jsonrpc/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/jsonrpc/helpers.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/types/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/utils/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/vendor/__init__.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/vendor/jinja.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/tigrbl/vendor/pydantic.py +0 -0
- {tigrbl-0.4.5.dev4 → tigrbl-0.4.5.dev6}/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.
|
|
3
|
+
Version: 0.4.5.dev6
|
|
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,15 +230,21 @@ 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"
|
|
@@ -254,7 +260,10 @@ Requires-Dist: tigrbl-ops-oltp
|
|
|
254
260
|
Requires-Dist: tigrbl-orm
|
|
255
261
|
Requires-Dist: tigrbl-runtime
|
|
256
262
|
Requires-Dist: tigrbl-tests ; extra == "tests"
|
|
257
|
-
Requires-Dist:
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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.
|
|
3
|
+
version = "0.4.5.dev6"
|
|
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" }
|
|
@@ -68,7 +68,6 @@ dependencies = [
|
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
503
|
-
"
|
|
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,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 '
|
|
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,17 @@
|
|
|
1
|
+
from tigrbl_concrete.factories.table import (
|
|
2
|
+
defineTableSpec,
|
|
3
|
+
deriveTable,
|
|
4
|
+
deriveTableSpec,
|
|
5
|
+
provideTableSpec,
|
|
6
|
+
)
|
|
7
|
+
from tigrbl_concrete.factories.activation import activateTableSpec, activateTableSpecs
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"activateTableSpec",
|
|
12
|
+
"activateTableSpecs",
|
|
13
|
+
"defineTableSpec",
|
|
14
|
+
"deriveTable",
|
|
15
|
+
"deriveTableSpec",
|
|
16
|
+
"provideTableSpec",
|
|
17
|
+
]
|