tigrbl 0.4.4.dev8__tar.gz → 0.4.5.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/PKG-INFO +123 -45
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/README.md +122 -44
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/pyproject.toml +1 -1
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/LICENSE +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/NOTICE +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/__main__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/canonical_json.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/cli.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/config/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/config/constants.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/config/defaults.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/ddl/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/allow_anon.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/engine.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/hook.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/middlewares.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/op.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/response.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/rest.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/decorators/session.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/bind.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/builders.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/capabilities.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/collect.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/plugins.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/registry.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/engine/resolver.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/app.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/column.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/engine.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/hook.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/op.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/responses.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/router.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/factories/table.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/hook/exceptions.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/hook/types.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/middlewares/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/middlewares/compose.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/op/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/op/canonical.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/op/collect.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/op/types.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/orm/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/requests.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/rest/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/build_schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/cache.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/extras.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/helpers.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/list_params.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/jsonrpc.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/schema/utils.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/security/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/security/dependencies.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/session/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/session/base.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/session/spec.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/app.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/column.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/engine.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/hook.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/op.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/responses.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/rest.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/router.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/table.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/specs.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/healthz.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/hookz.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/kernelz.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/methodz.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/router.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/utils.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/lens.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/helpers.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/metadata.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/mount.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openrpc.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/swagger.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/favicon/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/favicon/assets/favicon.svg +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/system/uvicorn.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/helpers.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/models.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/rest/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/transport/rest/aggregator.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/types/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/utils/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/utils/schema.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/vendor/__init__.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/vendor/jinja.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/vendor/pydantic.py +0 -0
- {tigrbl-0.4.4.dev8 → tigrbl-0.4.5.dev1}/tigrbl/vendor/sqlalchemy.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5.dev1
|
|
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
|
|
@@ -299,13 +299,6 @@ Application developers, platform teams, and service owners building schema-first
|
|
|
299
299
|
|
|
300
300
|
It re-exports stable author-facing classes and decorators while delegating resident behavior to core, base, runtime, kernel, atoms, ORM, and operation packages.
|
|
301
301
|
|
|
302
|
-
## Certification Status
|
|
303
|
-
|
|
304
|
-
- Package status: governed package in the `tigrbl/tigrbl` workspace.
|
|
305
|
-
- Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
|
|
306
|
-
- 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.
|
|
307
|
-
- 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`.
|
|
308
|
-
- Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
|
|
309
302
|
|
|
310
303
|
## Install
|
|
311
304
|
|
|
@@ -418,46 +411,123 @@ Tigrbl is organized as a split framework behind this facade:
|
|
|
418
411
|
|
|
419
412
|
Use the facade for application code unless you are maintaining a framework layer, testing a boundary in isolation, or writing a package that intentionally plugs into one of the lower layers.
|
|
420
413
|
|
|
421
|
-
## Authoring BCP
|
|
414
|
+
## Convenient Authoring Path and Best Current Practice (BCP)
|
|
422
415
|
|
|
423
|
-
|
|
416
|
+
Tigrbl is most convenient when application code describes behavior once and lets the framework project that behavior into routes, RPC methods, schemas, docs, lifecycle hooks, diagnostics, tests, and transport-aware runtime plans. The best current practice is to use tables, default canonical operations, operation specs, custom handlers, and lifecycle hooks together instead of spreading one behavior across lower-level framework surfaces. The detailed policy is in [`docs/developer/AUTHORING_BCP.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_BCP.md).
|
|
424
417
|
|
|
425
|
-
|
|
426
|
-
|
|
418
|
+
For readers translating from Starlette, FastAPI, Flask, ASGI 3, WebSocket,
|
|
419
|
+
WebTransport, SQLAlchemy, or database-engine concepts, use
|
|
427
420
|
[`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
|
|
428
|
-
Those guides
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
-
|
|
434
|
-
- Do
|
|
435
|
-
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
-
|
|
440
|
-
- Do
|
|
441
|
-
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
-
|
|
446
|
-
- Do
|
|
447
|
-
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
-
|
|
452
|
-
- Do
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
- Avoid
|
|
458
|
-
-
|
|
459
|
-
-
|
|
460
|
-
|
|
421
|
+
Those guides explain nearby concepts without making lower-layer frameworks the
|
|
422
|
+
Tigrbl application authoring contract.
|
|
423
|
+
|
|
424
|
+
### Keep the facade as the application contract
|
|
425
|
+
|
|
426
|
+
- Avoid: Treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct database/session calls as the user-facing application contract.
|
|
427
|
+
- Do: Build application services with `TigrblApp`, `TigrblRouter`, facade decorators, table helpers, column helpers, operation specs, hook specs, binding specs, engine specs, and generated schemas.
|
|
428
|
+
- Why: Tigrbl-owned authoring surfaces are the entry points that runtime planning, docs, diagnostics, schemas, and tests understand.
|
|
429
|
+
|
|
430
|
+
### Start with tables and default canonical operations
|
|
431
|
+
|
|
432
|
+
- Avoid: Hand-writing endpoint-specific behavior before checking whether table-backed default operations already express it.
|
|
433
|
+
- Do: Model resources with Tigrbl tables and use default canonical operations such as `create`, `read`, `update`, `replace`, `delete`, `list`, and `clear` where they fit.
|
|
434
|
+
- Why: Tables plus canonical operations give Tigrbl a durable resource model that can be projected consistently across REST, JSON-RPC, schemas, docs, hooks, diagnostics, and tests.
|
|
435
|
+
|
|
436
|
+
### Use operations and custom handlers for domain actions
|
|
437
|
+
|
|
438
|
+
- Avoid: Splitting one domain action across separate REST handlers, JSON-RPC handlers, stream handlers, docs snippets, and protocol-specific wrappers.
|
|
439
|
+
- Do: Model domain actions as Tigrbl operations with operation specs and custom handlers when the default canonical operations are not enough.
|
|
440
|
+
- Why: Operations are the unit Tigrbl can bind, document, inspect, test, and project across protocol surfaces.
|
|
441
|
+
|
|
442
|
+
### Use lifecycle hooks around operations
|
|
443
|
+
|
|
444
|
+
- Avoid: Embedding lifecycle policy directly inside transport-specific handlers or lower-level framework middleware.
|
|
445
|
+
- Do: Use lifecycle hooks around operations for validation, authorization, enrichment, auditing, response shaping, rollback handling, and post-response work.
|
|
446
|
+
- Why: Hooks make behavior visible before and after the operation, while preserving lifecycle ordering across REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport-aware runtime plans.
|
|
447
|
+
|
|
448
|
+
### Support persistence and non-persistence operations
|
|
449
|
+
|
|
450
|
+
- Avoid: Assuming every operation or custom handler must be database-backed.
|
|
451
|
+
- Do: Use operations and custom handlers for persistence workflows and for non-persistence workflows such as computed responses, orchestration, control-plane commands, stream/session commands, or external-service actions.
|
|
452
|
+
- Why: The operation model gives both persistence and non-persistence behavior the same docs, hooks, diagnostics, protocol projection, and runtime planning path.
|
|
453
|
+
|
|
454
|
+
### Put field behavior in Tigrbl specs
|
|
455
|
+
|
|
456
|
+
- Avoid: Duplicating field behavior across SQLAlchemy declarations, Pydantic models, route handlers, and docs.
|
|
457
|
+
- Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
|
|
458
|
+
- Why: These specs keep field semantics aligned for storage lowering, validation, schemas, docs, hooks, diagnostics, and runtime planning.
|
|
459
|
+
|
|
460
|
+
### Use generated schemas for operation payloads
|
|
461
|
+
|
|
462
|
+
- Avoid: Hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
|
|
463
|
+
- Do: Use `get_schema(...)` or other Tigrbl schema helpers for operation request and response payloads.
|
|
464
|
+
- Why: Generated schemas keep payloads aligned with operation specs, docs, validation, and protocol projections.
|
|
465
|
+
|
|
466
|
+
### Keep engines and transactions declarative
|
|
467
|
+
|
|
468
|
+
- Avoid: Creating ad-hoc SQLAlchemy engines, sessions, sessionmakers, commits, or flushes inside application handlers.
|
|
469
|
+
- Do: Bind engines declaratively at app, router, table, or operation scope, and let kernel/runtime phases own dispatch and transaction progression.
|
|
470
|
+
- Why: Declarative binding lets the runtime own session selection, transaction scope, rollback behavior, pooling, diagnostics, backend adapters, and post-response work.
|
|
471
|
+
|
|
472
|
+
### Keep examples in Tigrbl style
|
|
473
|
+
|
|
474
|
+
- Avoid: README examples that present lower-level framework internals as normal application style.
|
|
475
|
+
- Do: Use Tigrbl facade imports and Tigrbl-owned authoring surfaces in application examples unless the example is explicitly marked as a lower-layer test, benchmark, migration, engine adapter, or framework-internal compatibility example.
|
|
476
|
+
- Why: Examples should show the framework path that keeps operations, schemas, docs, hooks, diagnostics, and runtime planning aligned.
|
|
477
|
+
|
|
478
|
+
### Keep workspace docs in their right lanes
|
|
479
|
+
|
|
480
|
+
- Avoid: Using the root README as the only documentation for a distributable package.
|
|
481
|
+
- Do: Use package-local README files to explain package boundaries, install targets, import roots, dependency surfaces, usage examples, and links to governed docs.
|
|
482
|
+
- Why: The root README orients the workspace, while package READMEs serve PyPI users who arrive at one install target.
|
|
483
|
+
|
|
484
|
+
### Do not wire endpoints around the operation plan
|
|
485
|
+
|
|
486
|
+
- Do not: Bypass operation specs, handlers, kernel plans, runtime atoms, or lifecycle phases with one-off route wrappers for REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior.
|
|
487
|
+
- Do: Define the operation once, bind it through Tigrbl specs, and let kernel/runtime planning own protocol dispatch.
|
|
488
|
+
- Why: This preserves legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
|
|
489
|
+
|
|
490
|
+
### Do not make lower-level frameworks the application surface
|
|
491
|
+
|
|
492
|
+
- Do not: Author Tigrbl application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or application lifecycle wiring.
|
|
493
|
+
- Do: Use Tigrbl app/router factories, decorators, tables, default canonical operations, operation specs, custom handlers, lifecycle hooks, schema helpers, and engine decorators.
|
|
494
|
+
- Why: FastAPI is a substrate here; Tigrbl is the application contract that keeps operations, bindings, hooks, schemas, docs, diagnostics, and tests together.
|
|
495
|
+
|
|
496
|
+
### Do not route around the runtime substrate boundary
|
|
497
|
+
|
|
498
|
+
- Do not: Author application endpoints directly with Starlette route, request, response, middleware, background-task, or application lifecycle classes.
|
|
499
|
+
- Do: Express application behavior through Tigrbl operations, bindings, lifecycle hooks, and runtime-managed execution.
|
|
500
|
+
- Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
|
|
501
|
+
|
|
502
|
+
### Do not fragment behavior into Flask route objects
|
|
503
|
+
|
|
504
|
+
- Do not: Author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or application lifecycle hooks.
|
|
505
|
+
- Do: Keep resources in tables, use default canonical operations where they fit, and use operation specs plus custom handlers for domain actions.
|
|
506
|
+
- Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, hook ordering, or transport plan.
|
|
507
|
+
|
|
508
|
+
### Do not use raw ORM declarations as the primary application model
|
|
509
|
+
|
|
510
|
+
- Do not: Use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl specs can represent the field behavior.
|
|
511
|
+
- Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
|
|
512
|
+
- Why: Raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
|
|
513
|
+
|
|
514
|
+
### Do not manage database state inside handlers
|
|
515
|
+
|
|
516
|
+
- Do not: Call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers.
|
|
517
|
+
- Do: Let lifecycle phases such as `START_TX`, `PRE_HANDLER`, `HANDLER`, `POST_HANDLER`, `PRE_COMMIT`, and `TX_COMMIT` own transaction progression.
|
|
518
|
+
- Why: Direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
|
|
519
|
+
|
|
520
|
+
### Do not blur package boundaries
|
|
521
|
+
|
|
522
|
+
- Do not: Widen a package boundary by adding dependencies, imports, examples, or docs that belong in another split package.
|
|
523
|
+
- Do: Keep facade guidance in `tigrbl`, framework internals in the lower-level packages that own them, and package-specific usage in package-local READMEs.
|
|
524
|
+
- Why: Clear package boundaries make the split distribution convenient instead of surprising, especially for users installing only one package.
|
|
525
|
+
|
|
526
|
+
### Keep release and certification claims governed
|
|
527
|
+
|
|
528
|
+
- Avoid: Duplicating release, certification, target-state, or conformance claims outside governed evidence records.
|
|
529
|
+
- Do: Use `.ssot/`, conformance docs, release evidence, and certification reports for governed feature, claim, release, evidence, and target-state questions.
|
|
530
|
+
- Why: Release status and proof chains need one source of truth so package docs do not drift from CI and certification evidence.
|
|
461
531
|
|
|
462
532
|
## Default CRUD and Operation Semantics
|
|
463
533
|
|
|
@@ -715,6 +785,14 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
|
|
|
715
785
|
|
|
716
786
|
This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl`. 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.
|
|
717
787
|
|
|
788
|
+
## Certification Status
|
|
789
|
+
|
|
790
|
+
- Package status: governed package in the `tigrbl/tigrbl` workspace.
|
|
791
|
+
- Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
|
|
792
|
+
- 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`.
|
|
794
|
+
- Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
|
|
795
|
+
|
|
718
796
|
## License
|
|
719
797
|
|
|
720
798
|
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 @@ Application developers, platform teams, and service owners building schema-first
|
|
|
35
35
|
|
|
36
36
|
It re-exports stable author-facing classes and decorators while delegating resident behavior to core, base, runtime, kernel, atoms, ORM, and operation packages.
|
|
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
|
|
|
@@ -154,46 +147,123 @@ Tigrbl is organized as a split framework behind this facade:
|
|
|
154
147
|
|
|
155
148
|
Use the facade for application code unless you are maintaining a framework layer, testing a boundary in isolation, or writing a package that intentionally plugs into one of the lower layers.
|
|
156
149
|
|
|
157
|
-
## Authoring BCP
|
|
150
|
+
## Convenient Authoring Path and Best Current Practice (BCP)
|
|
158
151
|
|
|
159
|
-
|
|
152
|
+
Tigrbl is most convenient when application code describes behavior once and lets the framework project that behavior into routes, RPC methods, schemas, docs, lifecycle hooks, diagnostics, tests, and transport-aware runtime plans. The best current practice is to use tables, default canonical operations, operation specs, custom handlers, and lifecycle hooks together instead of spreading one behavior across lower-level framework surfaces. The detailed policy is in [`docs/developer/AUTHORING_BCP.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_BCP.md).
|
|
160
153
|
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
For readers translating from Starlette, FastAPI, Flask, ASGI 3, WebSocket,
|
|
155
|
+
WebTransport, SQLAlchemy, or database-engine concepts, use
|
|
163
156
|
[`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
|
|
164
|
-
Those guides
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
-
|
|
170
|
-
- Do
|
|
171
|
-
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
-
|
|
176
|
-
- Do
|
|
177
|
-
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
- Do
|
|
183
|
-
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
-
|
|
188
|
-
- Do
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
- Avoid
|
|
194
|
-
-
|
|
195
|
-
-
|
|
196
|
-
|
|
157
|
+
Those guides explain nearby concepts without making lower-layer frameworks the
|
|
158
|
+
Tigrbl application authoring contract.
|
|
159
|
+
|
|
160
|
+
### Keep the facade as the application contract
|
|
161
|
+
|
|
162
|
+
- Avoid: Treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct database/session calls as the user-facing application contract.
|
|
163
|
+
- Do: Build application services with `TigrblApp`, `TigrblRouter`, facade decorators, table helpers, column helpers, operation specs, hook specs, binding specs, engine specs, and generated schemas.
|
|
164
|
+
- Why: Tigrbl-owned authoring surfaces are the entry points that runtime planning, docs, diagnostics, schemas, and tests understand.
|
|
165
|
+
|
|
166
|
+
### Start with tables and default canonical operations
|
|
167
|
+
|
|
168
|
+
- Avoid: Hand-writing endpoint-specific behavior before checking whether table-backed default operations already express it.
|
|
169
|
+
- Do: Model resources with Tigrbl tables and use default canonical operations such as `create`, `read`, `update`, `replace`, `delete`, `list`, and `clear` where they fit.
|
|
170
|
+
- Why: Tables plus canonical operations give Tigrbl a durable resource model that can be projected consistently across REST, JSON-RPC, schemas, docs, hooks, diagnostics, and tests.
|
|
171
|
+
|
|
172
|
+
### Use operations and custom handlers for domain actions
|
|
173
|
+
|
|
174
|
+
- Avoid: Splitting one domain action across separate REST handlers, JSON-RPC handlers, stream handlers, docs snippets, and protocol-specific wrappers.
|
|
175
|
+
- Do: Model domain actions as Tigrbl operations with operation specs and custom handlers when the default canonical operations are not enough.
|
|
176
|
+
- Why: Operations are the unit Tigrbl can bind, document, inspect, test, and project across protocol surfaces.
|
|
177
|
+
|
|
178
|
+
### Use lifecycle hooks around operations
|
|
179
|
+
|
|
180
|
+
- Avoid: Embedding lifecycle policy directly inside transport-specific handlers or lower-level framework middleware.
|
|
181
|
+
- Do: Use lifecycle hooks around operations for validation, authorization, enrichment, auditing, response shaping, rollback handling, and post-response work.
|
|
182
|
+
- Why: Hooks make behavior visible before and after the operation, while preserving lifecycle ordering across REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport-aware runtime plans.
|
|
183
|
+
|
|
184
|
+
### Support persistence and non-persistence operations
|
|
185
|
+
|
|
186
|
+
- Avoid: Assuming every operation or custom handler must be database-backed.
|
|
187
|
+
- Do: Use operations and custom handlers for persistence workflows and for non-persistence workflows such as computed responses, orchestration, control-plane commands, stream/session commands, or external-service actions.
|
|
188
|
+
- Why: The operation model gives both persistence and non-persistence behavior the same docs, hooks, diagnostics, protocol projection, and runtime planning path.
|
|
189
|
+
|
|
190
|
+
### Put field behavior in Tigrbl specs
|
|
191
|
+
|
|
192
|
+
- Avoid: Duplicating field behavior across SQLAlchemy declarations, Pydantic models, route handlers, and docs.
|
|
193
|
+
- Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
|
|
194
|
+
- Why: These specs keep field semantics aligned for storage lowering, validation, schemas, docs, hooks, diagnostics, and runtime planning.
|
|
195
|
+
|
|
196
|
+
### Use generated schemas for operation payloads
|
|
197
|
+
|
|
198
|
+
- Avoid: Hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
|
|
199
|
+
- Do: Use `get_schema(...)` or other Tigrbl schema helpers for operation request and response payloads.
|
|
200
|
+
- Why: Generated schemas keep payloads aligned with operation specs, docs, validation, and protocol projections.
|
|
201
|
+
|
|
202
|
+
### Keep engines and transactions declarative
|
|
203
|
+
|
|
204
|
+
- Avoid: Creating ad-hoc SQLAlchemy engines, sessions, sessionmakers, commits, or flushes inside application handlers.
|
|
205
|
+
- Do: Bind engines declaratively at app, router, table, or operation scope, and let kernel/runtime phases own dispatch and transaction progression.
|
|
206
|
+
- Why: Declarative binding lets the runtime own session selection, transaction scope, rollback behavior, pooling, diagnostics, backend adapters, and post-response work.
|
|
207
|
+
|
|
208
|
+
### Keep examples in Tigrbl style
|
|
209
|
+
|
|
210
|
+
- Avoid: README examples that present lower-level framework internals as normal application style.
|
|
211
|
+
- Do: Use Tigrbl facade imports and Tigrbl-owned authoring surfaces in application examples unless the example is explicitly marked as a lower-layer test, benchmark, migration, engine adapter, or framework-internal compatibility example.
|
|
212
|
+
- Why: Examples should show the framework path that keeps operations, schemas, docs, hooks, diagnostics, and runtime planning aligned.
|
|
213
|
+
|
|
214
|
+
### Keep workspace docs in their right lanes
|
|
215
|
+
|
|
216
|
+
- Avoid: Using the root README as the only documentation for a distributable package.
|
|
217
|
+
- Do: Use package-local README files to explain package boundaries, install targets, import roots, dependency surfaces, usage examples, and links to governed docs.
|
|
218
|
+
- Why: The root README orients the workspace, while package READMEs serve PyPI users who arrive at one install target.
|
|
219
|
+
|
|
220
|
+
### Do not wire endpoints around the operation plan
|
|
221
|
+
|
|
222
|
+
- Do not: Bypass operation specs, handlers, kernel plans, runtime atoms, or lifecycle phases with one-off route wrappers for REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior.
|
|
223
|
+
- Do: Define the operation once, bind it through Tigrbl specs, and let kernel/runtime planning own protocol dispatch.
|
|
224
|
+
- Why: This preserves legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
|
|
225
|
+
|
|
226
|
+
### Do not make lower-level frameworks the application surface
|
|
227
|
+
|
|
228
|
+
- Do not: Author Tigrbl application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or application lifecycle wiring.
|
|
229
|
+
- Do: Use Tigrbl app/router factories, decorators, tables, default canonical operations, operation specs, custom handlers, lifecycle hooks, schema helpers, and engine decorators.
|
|
230
|
+
- Why: FastAPI is a substrate here; Tigrbl is the application contract that keeps operations, bindings, hooks, schemas, docs, diagnostics, and tests together.
|
|
231
|
+
|
|
232
|
+
### Do not route around the runtime substrate boundary
|
|
233
|
+
|
|
234
|
+
- Do not: Author application endpoints directly with Starlette route, request, response, middleware, background-task, or application lifecycle classes.
|
|
235
|
+
- Do: Express application behavior through Tigrbl operations, bindings, lifecycle hooks, and runtime-managed execution.
|
|
236
|
+
- Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
|
|
237
|
+
|
|
238
|
+
### Do not fragment behavior into Flask route objects
|
|
239
|
+
|
|
240
|
+
- Do not: Author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or application lifecycle hooks.
|
|
241
|
+
- Do: Keep resources in tables, use default canonical operations where they fit, and use operation specs plus custom handlers for domain actions.
|
|
242
|
+
- Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, hook ordering, or transport plan.
|
|
243
|
+
|
|
244
|
+
### Do not use raw ORM declarations as the primary application model
|
|
245
|
+
|
|
246
|
+
- Do not: Use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl specs can represent the field behavior.
|
|
247
|
+
- Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
|
|
248
|
+
- Why: Raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
|
|
249
|
+
|
|
250
|
+
### Do not manage database state inside handlers
|
|
251
|
+
|
|
252
|
+
- Do not: Call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers.
|
|
253
|
+
- Do: Let lifecycle phases such as `START_TX`, `PRE_HANDLER`, `HANDLER`, `POST_HANDLER`, `PRE_COMMIT`, and `TX_COMMIT` own transaction progression.
|
|
254
|
+
- Why: Direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
|
|
255
|
+
|
|
256
|
+
### Do not blur package boundaries
|
|
257
|
+
|
|
258
|
+
- Do not: Widen a package boundary by adding dependencies, imports, examples, or docs that belong in another split package.
|
|
259
|
+
- Do: Keep facade guidance in `tigrbl`, framework internals in the lower-level packages that own them, and package-specific usage in package-local READMEs.
|
|
260
|
+
- Why: Clear package boundaries make the split distribution convenient instead of surprising, especially for users installing only one package.
|
|
261
|
+
|
|
262
|
+
### Keep release and certification claims governed
|
|
263
|
+
|
|
264
|
+
- Avoid: Duplicating release, certification, target-state, or conformance claims outside governed evidence records.
|
|
265
|
+
- Do: Use `.ssot/`, conformance docs, release evidence, and certification reports for governed feature, claim, release, evidence, and target-state questions.
|
|
266
|
+
- Why: Release status and proof chains need one source of truth so package docs do not drift from CI and certification evidence.
|
|
197
267
|
|
|
198
268
|
## Default CRUD and Operation Semantics
|
|
199
269
|
|
|
@@ -451,6 +521,14 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
|
|
|
451
521
|
|
|
452
522
|
This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl`. 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.
|
|
453
523
|
|
|
524
|
+
## Certification Status
|
|
525
|
+
|
|
526
|
+
- Package status: governed package in the `tigrbl/tigrbl` workspace.
|
|
527
|
+
- Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
|
|
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`.
|
|
530
|
+
- Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
|
|
531
|
+
|
|
454
532
|
## License
|
|
455
533
|
|
|
456
534
|
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"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.5.dev1"
|
|
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" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|