python-ddd-framework 0.6.0__py3-none-any.whl → 0.7.1__py3-none-any.whl

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 (93) hide show
  1. python_ddd_framework/authorization/checking.py +35 -0
  2. python_ddd_framework/developer_kit/generation.py +0 -9
  3. python_ddd_framework/developer_kit/templates/module/cookiecutter.json +1 -1
  4. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +29 -77
  5. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +5 -72
  6. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja +1 -3
  7. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja +2 -3
  8. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +8 -62
  9. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja +1 -2
  10. python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +12 -8
  11. python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md +22 -10
  12. python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja +4 -1
  13. python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +40 -6
  14. python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +177 -30
  15. python_ddd_framework/fastapi/__init__.py +2 -0
  16. python_ddd_framework/fastapi/access.py +127 -0
  17. python_ddd_framework/fastapi/access_options.py +13 -0
  18. python_ddd_framework/fastapi/action.py +6 -0
  19. python_ddd_framework/fastapi/adapter.py +25 -10
  20. python_ddd_framework/fastapi/health.py +20 -11
  21. python_ddd_framework/fastapi/manual_action.py +33 -2
  22. python_ddd_framework/fastapi/module.py +2 -0
  23. python_ddd_framework/fastapi/realtime/authentication.py +21 -10
  24. python_ddd_framework/fastapi/realtime/options.py +0 -1
  25. python_ddd_framework/fastapi/realtime/runtime.py +41 -26
  26. python_ddd_framework/fastapi/request_context.py +10 -2
  27. python_ddd_framework/fastapi/routing.py +13 -6
  28. python_ddd_framework/fastapi/server.py +9 -0
  29. python_ddd_framework/fastapi/service_endpoints.py +5 -0
  30. python_ddd_framework/fastapi/streaming.py +95 -0
  31. python_ddd_framework/fastapi/transfer.py +138 -3
  32. python_ddd_framework/invocation/dispatcher.py +2 -24
  33. python_ddd_framework/invocation/scopes.py +5 -3
  34. python_ddd_framework/observability/formatting.py +1 -0
  35. python_ddd_framework/sqlalchemy/migration.py +17 -1
  36. python_ddd_framework/unit_of_work/manager.py +11 -2
  37. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/METADATA +38 -9
  38. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/RECORD +42 -89
  39. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/WHEEL +1 -1
  40. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/__init__.py.jinja +0 -1
  41. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/handler.py.jinja +0 -45
  42. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/payload.py.jinja +0 -8
  43. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/__init__.py.jinja +0 -1
  44. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/handler.py.jinja +0 -35
  45. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/payload.py.jinja +0 -5
  46. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/schedule.py.jinja +0 -15
  47. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_maintenance_worker.py.jinja +0 -28
  48. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_statistics_worker.py.jinja +0 -26
  49. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja +0 -9
  50. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja +0 -9
  51. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/order_changed_handler.py.jinja +0 -23
  52. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_integration_service.py.jinja +0 -71
  53. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_observation_handler.py.jinja +0 -16
  54. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/order_reporting_service.py.jinja +0 -16
  55. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja +0 -17
  56. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja +0 -7
  57. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja +0 -65
  58. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja +0 -35
  59. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja +0 -41
  60. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/approval_setting_observer.py.jinja +0 -17
  61. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja +0 -6
  62. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja +0 -7
  63. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/order_reporting_service.py.jinja +0 -7
  64. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_approval_service.py.jinja +0 -13
  65. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_management_service.py.jinja +0 -10
  66. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_query_service.py.jinja +0 -12
  67. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_statistics_snapshot.py.jinja +0 -9
  68. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja +0 -12
  69. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -48
  70. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja +0 -13
  71. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja +0 -17
  72. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja +0 -22
  73. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja +0 -23
  74. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja +0 -17
  75. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja +0 -10
  76. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja +0 -3
  77. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja +0 -6
  78. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja +0 -11
  79. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja +0 -26
  80. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja +0 -13
  81. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permission_provider.py.jinja +0 -19
  82. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja +0 -7
  83. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja +0 -18
  84. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja +0 -15
  85. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja +0 -5
  86. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja +0 -76
  87. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja +0 -44
  88. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja +0 -29
  89. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja +0 -81
  90. python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -19
  91. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/entry_points.txt +0 -0
  92. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/licenses/LICENSE +0 -0
  93. {python_ddd_framework-0.6.0.dist-info → python_ddd_framework-0.7.1.dist-info}/licenses/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-ddd-framework
3
- Version: 0.6.0
3
+ Version: 0.7.1
4
4
  Summary: Modular DDD application framework with project CLI and bundled templates
5
5
  License-Expression: LicenseRef-Proprietary
6
6
  License-File: LICENSE
@@ -127,28 +127,33 @@ pddd add module conversions --template basic
127
127
 
128
128
  `dev-init` starts or reuses local PostgreSQL and Redis using `backend/app.development.yaml`. It preserves existing data; database migration and seeding are separate steps.
129
129
 
130
- `add module orders` generates an order-management example and registers it with the Host. The example includes an aggregate, service contracts, application services, persistence, HTTP endpoints, module tests, and a module README describing its actual behavior and boundaries.
130
+ `add module orders` generates a DDD skeleton named `orders` and registers its Application, SQLAlchemy, and HttpApi Modules with the Host. It retains all responsibility directories, package markers, lifecycle hooks, ORM Base, model discovery, migration registration, and a module README. It creates no business entities, services, tables, endpoints, tasks, or test cases. Add them from confirmed requirements. The former order implementation is available as a separate [order-management example](examples/order_management/README.md), outside the runtime wheel.
131
131
 
132
132
  `ddd` is the default six-layer template. `basic` generates only a Module, a synchronous Protocol service, its transient implementation, and an English README. It has no database/Redis requirement or implicit HTTP/interception. Both templates support `--dry-run` and refuse existing targets.
133
133
 
134
134
  ### 3. Initialize the database
135
135
 
136
- Apply the provider migrations selected by the generated Host, then generate the business module's first migration:
136
+ Apply the provider migrations selected by the generated Host:
137
137
 
138
138
  ```sh
139
139
  pddd db upgrade --module identity
140
140
  pddd db upgrade --module settings
141
141
  pddd db upgrade --module auditing
142
142
  pddd db upgrade --module background_jobs
143
+ pddd db seed --module identity
144
+ ```
145
+
146
+ An empty DDD skeleton retains model and migration registration but has no business tables or revisions. Add actual models before generating a business revision; migration commands still use the configured database. For a module named `orders`:
147
+
148
+ ```sh
143
149
  pddd db revision --module orders
144
150
  ```
145
151
 
146
- Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it. Then upgrade and seed:
152
+ Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it. Run seed only after declaring the intended contributors:
147
153
 
148
154
  ```sh
149
155
  pddd db upgrade --module orders
150
156
  pddd db status --module orders
151
- pddd db seed --module identity
152
157
  pddd db seed --module orders
153
158
  ```
154
159
 
@@ -162,7 +167,7 @@ pddd dev
162
167
 
163
168
  Open **http://127.0.0.1:8000/docs**. Use the generated `identity.seed_admin_username` and `identity.seed_admin_password` in `backend/app.development.yaml` to call `/api/auth/login`, then enter the returned access token in Swagger's **Authorize** dialog.
164
169
 
165
- With the `orders` module installed, you can create and query orders at `/api/orders`, approve an order at `/api/orders/{id}/approve`, and enqueue approval at `/api/orders/{id}/queue-approval`. Swagger shows the request schemas and all available operations. The example also includes file transfer and an authenticated WebSocket endpoint at `/ws/orders`.
170
+ The empty `orders` skeleton contributes no business routes. The independent [order-management example](examples/order_management/README.md) supplies `/api/orders`, approval and queued approval, file transfer, and an authenticated WebSocket at `/ws/orders`; use its initializer when you want to explore those capabilities.
166
171
 
167
172
  The default business API prefix is `/api`. Liveness and readiness are exposed at `/health/live` and `/health/ready`; readiness describes application lifecycle state, not continuous database or Redis health.
168
173
 
@@ -295,6 +300,30 @@ The image uses `python -m host.main` without development reload. Runtime install
295
300
 
296
301
  <a id="版本与升级"></a>
297
302
 
303
+ ### DDD skeleton generation (0.7)
304
+
305
+ New `ddd` modules contain the full responsibility directories and necessary composition, with no preset business code or tests. `basic` is unchanged. This affects subsequent generation only: upgrades do not delete or rewrite existing consumers' order code. Keep existing business contracts and data under their application owners. The former order implementation and its existing domain test now live in [the independent example](examples/order_management/README.md); its initializer uses the official CLI, requires a new destination, and is not bundled in the runtime wheel. No CLI parameter or dependency has been added.
306
+
307
+ ## HTTP lifecycle and global migration checks (0.7.1)
308
+
309
+ - Health endpoints now read their Application from request-local access to the FastAPI instance state. Adapter rollback and lifespan cleanup release the binding; rejected duplicate or concurrent lifespan entry preserves the active lifespan's binding and readiness. Health URLs, responses and readiness semantics are unchanged.
310
+ - Replace Owner filtering used solely to exclude empty ORM skeletons with one `await SqlAlchemyMigrator(application).check_current_heads()` call. Global checks and upgrades waive missing revisions only for ordinary ORM sources whose metadata and revision history are both empty. Sources with tables, historical revisions, migration-only declarations or extensions retain their checks, including unknown database history.
311
+ - Keep the Host's startup orchestration and cleanup. Run the check while the Application is COMPOSED, before starting it; there is no automatic startup check or new configuration. Explicit module operations and first-revision authoring keep their existing behavior.
312
+
313
+ See the [migration guide](docs/development.md#数据库聚合与迁移) and [verification record](docs/status.md#http-回收与迁移来源判定未发布).
314
+
315
+ <a id="streaming-and-access-migration-07-unreleased"></a>
316
+
317
+ ## Streaming and access migration (0.7)
318
+
319
+ - Move `fastapi_realtime.authentication_refresh_seconds` to `fastapi_access.authentication_refresh_seconds`. The shared `FastApiAccessOptions` applies to managed HTTP streams and WebSocket connections; its default is 60 seconds and minimum is 1. The old realtime field is rejected.
320
+ - HTTP endpoints on `HttpRouter` can directly yield synchronous or asynchronous values using native FastAPI SSE, JSONL, or `StreamingResponse`. Keep checks required before the response starts in preparation dependencies or Filters. Authorization precedes binding; function dependencies, commit, and business resource cleanup finish before sending. The framework does not read the first item during preparation. Application services keep their existing return contract and may return a native streaming Response.
321
+ - Register subscriptions acquired during preparation with a native request-scoped yield dependency. An unstarted generator's `finally` cannot release those subscriptions. Database work in preparation or during iteration must use an independent short service call or UoW and finish before yielding data. Generator cleanup that awaits must shield its own `finally`, without holding a cancellation scope across `yield`.
322
+ - Streams with authorization declarations automatically recheck identity and endpoint permissions, including while idle or blocked on a slow client. Anonymous declarations retain their meaning. WebSocket `invoke` continues to authorize each service call separately. Failed checks terminate the transport; after `http.response.start`, no replacement JSON response is sent.
323
+ - `run_host(..., timeout_graceful_shutdown=10)` passes a non-negative integer to Uvicorn. When that period expires, cancellation is requested and framework drain still waits for actual resource release. Direct Uvicorn consumers must configure its native timeout themselves. A synchronous generator's running `next()` must eventually return; a timeout does not abandon its thread.
324
+
325
+ Runnable examples: [HTTP generators](docs/development.md#http-生成器与持续访问). Verification and limitations: [0.7.0 status](docs/status.md#070-通用生成器与持续访问未发布).
326
+
298
327
  ## Capability module migration (0.4)
299
328
 
300
329
  Capability composition now uses the same `AppModule` model as customer modules. Existing applications must migrate their declarations together; there is no compatibility path.
@@ -452,7 +481,7 @@ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,
452
481
 
453
482
  The developer-kit dependency constrains `binaryornot` to `0.5.x`, because `0.6.0` can classify bundled templates containing Chinese comments as binary and skip rendering them. Re-resolve the developer-kit environment when installing 0.4.0. Updating the dependency does not replace existing generated application code.
454
483
 
455
- The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints. Newly generated modules place approval policy in `domain/services/order_approval_service.py`; existing projects can adopt that example explicitly after upgrading. The application checks existence and the submitted version before the domain policy; a stale or missing order therefore takes precedence over a disabled approval setting when both inputs are invalid. Domain rules, schema, and installation files are not automatically rewritten.
484
+ The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints. The independent order example places approval policy in `domain/services/order_approval_service.py`; existing projects can adopt it explicitly after upgrading. The example application checks existence and the submitted version before the domain policy; a stale or missing order therefore takes precedence over a disabled approval setting when both inputs are invalid. Domain rules, schema, and installation files are not automatically rewritten.
456
485
 
457
486
  <a id="框架更名迁移未发布"></a>
458
487
 
@@ -525,7 +554,7 @@ Do not remove durable job payload versions merely because their Python APIs were
525
554
  <details>
526
555
  <summary>For maintainers: publishing a changed version</summary>
527
556
 
528
- Routine code and documentation commits may retain the current version. Pull requests to `main` run build, static checks, and short architecture/typing/release-intent checks with read-only permissions. Pushes to `main` run the full release gates, including locked, lowest-direct, and highest allowed dependency samples, but skip publication unless the version increased across the push; initial creation of `main` publishes its current version. Manual workflow runs validate only. A failed run may be retried, but a later same-version push does not resume publication: changed contents require another version bump. Follow [release operations](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#发布操作) for publisher setup and retry boundaries. Dependency samples and current API/type checks do not establish backward compatibility or a cross-version upgrade guarantee.
557
+ Routine code and documentation commits may retain the current version. Pushes to `main` run the full release gates, including locked, lowest-direct, and highest allowed dependency samples, but skip publication unless the version increased across the push; initial creation of `main` publishes its current version. Manual workflow runs validate only. A failed run may be retried, but a later same-version push does not resume publication: changed contents require another version bump. Follow [release operations](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#发布操作) for publisher setup and retry boundaries. Dependency samples and current API/type checks do not establish backward compatibility or a cross-version upgrade guarantee.
529
558
 
530
559
  </details>
531
560
 
@@ -541,7 +570,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
541
570
  | Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
542
571
  | Change the framework itself | [Contributor guidance](https://github.com/componet-architecture/python-ddd-framework/blob/main/AGENTS.md) and [focused reading paths](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/README.md#重构的最短阅读路径) |
543
572
 
544
- Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. `AGENTS.md` guides contributors from business rules and ownership to framework capability selection and verification. The development guide maps common tasks to framework capabilities and includes commands to locate the installed version's source and bundled examples; each DDD module README records the sample business model and traces approval through its owners. The application maintains these documents after generation; framework upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference when updating affected guidance, preserving their own business model and decisions.
573
+ Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. They require an owner/layer/directory/API check before implementation and a review of the seven design principles, DDD boundaries, and actual verification before delivery. The development guide provides CLI entry points, installed-artifact/source comparison, capability recipes, and a complete native HTTP generator example; architecture owns streaming/access boundaries, and the generated README owns configuration migration and shutdown operations. These instructions do not imply an automated architecture gate. Each DDD module README records the empty skeleton and guides the first authorized use case; the independent order example owns its own business documentation and acceptance source. The application maintains these documents after generation; upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference while preserving application rules and decisions. A user-provided framework checkout is also read-only; matching version numbers alone do not prove it matches the consumed artifact.
545
574
 
546
575
  ## License
547
576
 
@@ -27,6 +27,7 @@ python_ddd_framework/auditing/sqlalchemy/module.py,sha256=KLS-Kz9mYcU4Kr1PAErWGw
27
27
  python_ddd_framework/auditing/sqlalchemy/store.py,sha256=1_hD_yIrLTiwioqGxVcyxqcVBXcOUTxrcD5R0zZwpWo,2280
28
28
  python_ddd_framework/authorization/__init__.py,sha256=vDkdpaIgdW0RR7TAF7c860VVc_TzTWRARvKEfi2qngo,1052
29
29
  python_ddd_framework/authorization/catalog.py,sha256=ul9iHLggH3uGXi3DwrzxVRqT9E_qXioQnarMpuhlcMc,2437
30
+ python_ddd_framework/authorization/checking.py,sha256=cMbTFHib6mnlYWcElgl-kKcNeAjz0Qv9B8K88KZsAfA,1402
30
31
  python_ddd_framework/authorization/contracts.py,sha256=H8oYlZwlERkRa4VXp_EkX81vhIztZb8hvCm4PjIusUM,9380
31
32
  python_ddd_framework/authorization/definition_discovery.py,sha256=4NTEb4VGMuw573dmCOsWMxJWnhprl3YCJfTi6o0ZCVY,3337
32
33
  python_ddd_framework/authorization/definitions.py,sha256=efeU_GGhPremX6YYDI31CzTzywuZcch42pkMmwd3FAA,1682
@@ -93,7 +94,7 @@ python_ddd_framework/configuration/sources.py,sha256=Xd7Sxk0umHS7h5SRq08NSWGhLmJ
93
94
  python_ddd_framework/configuration/values.py,sha256=4S8Ae2CRRekA9ge0ZxoMJcdJn3XqnF06E6DOaAZZuHc,14591
94
95
  python_ddd_framework/configuration/yaml_source.py,sha256=hZhKftmip6rRQUwqQBfTi_d-UYthUqWPbL5dQUvb89Q,2016
95
96
  python_ddd_framework/developer_kit/__init__.py,sha256=PWBBMijgV-eaks044Q9KoSkGJ6Nr1BGvyDJpEKLUMsw,76
96
- python_ddd_framework/developer_kit/generation.py,sha256=GOvSBbsmFVr3GczS0lSOckIIiySzr4t9II2bCu3eurg,9842
97
+ python_ddd_framework/developer_kit/generation.py,sha256=rihu5Tumct705_dD_q6ZuSj4gJdC8MFZQEyP4pPQjnc,9413
97
98
  python_ddd_framework/developer_kit/project_metadata.py,sha256=_GMMdxSgVdJ6NHMdv9RKvRiokJMD2ok9it6p8LFY1G0,2011
98
99
  python_ddd_framework/developer_kit/publication.py,sha256=8sN4FeyQw7PJTuL7GnLyvEUtYU99XAjJQOi91IBrjQs,19024
99
100
  python_ddd_framework/developer_kit/source.py,sha256=KgAqGJS1MpLpOuvGR7C8ree8zE33FfeC6Zn12Svb6Lg,2062
@@ -105,111 +106,60 @@ python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/
105
106
  python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/module.py.jinja,sha256=6SfgAEQlwiGJYHAg9wQ2WJLOIbduwXVmL3qIcO8dL6M,1004
106
107
  python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/__init__.py.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
108
  python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/default_conversion_service.py.jinja,sha256=YIYXqDycBVoUlLCwwUZ2tcyUk2fKSu-20mI00u5QUhc,342
108
- python_ddd_framework/developer_kit/templates/module/cookiecutter.json,sha256=yirXpnODe6TAOyf2VR0LhAMPdrX-_Qvjobu4K0mC8ck,120
109
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md,sha256=15Zzhk7kFmi1fv4RulXbJ_CdVHxbeMbOmN0QGfdvVzs,14906
109
+ python_ddd_framework/developer_kit/templates/module/cookiecutter.json,sha256=edD_zSqmFuOKvMZyxmFFabAavBQJk0tbGO4YrnsgZN0,60
110
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md,sha256=bojfHi_8PIPSeJheOdS6hSIaG2LrXDwmqymnwm0ZPDs,5674
110
111
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/__init__.py.jinja,sha256=byPOI4PKtQDi5IQa9tzZZEVYy5zGx9PJdBzPrgcxm64,89
111
112
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/__init__.py.jinja,sha256=pm9_TqjN20deRELpopxK412O3mra0OZ6QdesPdcsaRU,90
112
113
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
113
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
114
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/handler.py.jinja,sha256=6rSMbsLXX9gB8WpTnJJenJdL3hJ4E8QAK6RCsRYNMEw,2411
115
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/payload.py.jinja,sha256=a3d-y9BZPKhxvSytOw2-Bq11CJ6kHygAcUD9DduB3z4,180
116
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
117
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/handler.py.jinja,sha256=5dSFkMycni0TTB5JvnwixcSGAzA-Q0_RdeAJug0h6N8,1494
118
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/payload.py.jinja,sha256=PdiJtzMYOi0nWtemkSA5T_TzYb0QrKS1MJaxTMLJ1sY,140
119
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/schedule.py.jinja,sha256=GllIbgUWgmLoEBbKTsN3Sf1KfvEW0vbWjV2ivc-iZJU,542
120
114
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
121
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_maintenance_worker.py.jinja,sha256=R-9ELZrL7vV3PRF6Bhvrfo5hzw6uJryxKfw1ZzFgfVw,1315
122
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_statistics_worker.py.jinja,sha256=e55c_NxAmUof1cHXvLJrnpyHCCRCQRMKbbfXyLsxTa8,1106
123
115
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
124
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja,sha256=JSqqIY7PugJn0Lw40zhuoDRQHCLvsxEYb3arTW-IPcc,335
125
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja,sha256=KsRq9Z29Tfa5sF342X-3zt9p8vLoNq8Ml55CVDxitfw,394
126
116
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
127
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/order_changed_handler.py.jinja,sha256=Tu40Q_HPbF0dNO0hqNJDBFCs6G2n9kNt3RHanIcfhUM,1311
128
117
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
129
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_integration_service.py.jinja,sha256=ibx4gynGNZiLxoxoRanQ2alx0l6CexvK9Wyr_qyiGh4,3038
130
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_observation_handler.py.jinja,sha256=KbFmFLZIJ9-3nDdWggwi46IkLERGrFKrg5Fv0rMArcE,656
131
118
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
132
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/order_reporting_service.py.jinja,sha256=cdJ7odGr4z-Ag-yMQRiDdjmOnGK4r_s7ncOLMYOuq8A,650
133
119
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
134
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja,sha256=1sHnsVkmhnppTUSCHLGw7XLvJGcmTdM4Rw9uuqBBf_A,544
135
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja,sha256=7chw1b1HbWCAul9sWcHlApyYvT0tD6XZLp0M6k9Y0gA,5216
120
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja,sha256=qGmq1ggBmxGY2B8H8gB8tEY-uxMuWpyr60l0ZAouho8,1950
136
121
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
137
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja,sha256=KWROjwhiHoq4XLSFBB1upiEFW7YPgjQKVVN52jaxbsM,223
138
122
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
139
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja,sha256=U45LiIi71Q-pLp63HNpDuZBFrQCYR_c_4cIabrx-V-k,3301
140
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja,sha256=BhfVZZpK6FcbqfBohU1VcFXwM-uyd_4q9Vfm0Lsw-5g,1843
141
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja,sha256=JK5jTXJPfTcovlmo3TochsAi_DoKYPrLiuGctyi4KyI,2079
142
123
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
143
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/approval_setting_observer.py.jinja,sha256=7n00AKKcDhPAMMQtPEwcyliM_xOmQkcN-pMJ_eO1fc8,511
144
124
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/__init__.py.jinja,sha256=grSDmU4IKdRYZsqi56aEVvsgx92AYF2k3jlDzANqra4,51
145
125
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
146
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja,sha256=WV78b_z40n7IL3Pxm7CMSzZxeZktPdUwXRoccM78TfQ,182
147
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja,sha256=3mDGPddJ9DmK0a8PfbMTQlNds4T55LQvWy87GCQ_aBM,315
148
126
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
149
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/order_reporting_service.py.jinja,sha256=5_fvkJORmvmVJjhH63_of3rEW2ocXryYVdoNsTlKYMk,200
150
127
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/module.py.jinja,sha256=_OONVbsuCD5Lu1NGgrO1P8XsZcGnyxMKsGpdpUUtgHA,1734
151
128
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
152
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_approval_service.py.jinja,sha256=YZMDiLprKSfzi7Nq8Wx3Bmt0vIgcT1YYiI3FIvEofTQ,561
153
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_management_service.py.jinja,sha256=9wajkaXiEC-qLBxSOlexsDg1h23-3fKcMqbH8M4HkxU,469
154
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_query_service.py.jinja,sha256=S0T_223keC4oLDCSrkkHt7L0_XmnmKPH4aJgmcUqcQA,426
155
129
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
156
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_statistics_snapshot.py.jinja,sha256=EB4pUY8MpAqRPHrLf023DHkGdialHqJnd7TgI-9FEQo,223
157
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja,sha256=1Vj-E0uzpLrj2nbUv7YQEbxTkFXK2xWbbGb3bnjOKG8,326
158
130
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/__init__.py.jinja,sha256=m2rqZegGy5XHzGMUVk9vwVcjEF7TufveMAELuJLynnk,60
159
131
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
160
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja,sha256=MSzdvdo274tMYKv1nfYfE47N6XPD0kNdL4xgFAvU5dU,1970
161
132
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
162
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja,sha256=rppAqmZUE__uuB9LUhn82K43WjMhpkKJvpQ4LPpcArM,310
163
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja,sha256=QkQSHBHhqkui0TEkW78gkB_KB7KYBl6JhF1nFA7M2U8,1819
133
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja,sha256=Hvxf536at2LA5Y-I1SOdwVRpz4SxvSsBBZhFS5MD7CU,1742
164
134
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
165
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja,sha256=fq-sEnbavHmMdzMl4i2pCyIefLxHNnE8TsRR_Batcvg,804
166
135
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
167
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja,sha256=c3moNxkFyXqaI3GBTUGyLj183BJqvtpVJ-45yEh36OM,1254
168
136
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
169
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja,sha256=Nz0r5QJlDVJrR_PmbMq543YUayO58MXUGgGTOS5UYxc,1194
170
137
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
171
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja,sha256=azxRfoZZyFN_R5duP12uzEICU5PZMxXdK2ZNrmLFLf8,759
172
138
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
173
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja,sha256=w9LB9gUzq75yE1GhZUUNt2eOBc3cZd48Z4TRZc88tBw,316
174
139
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/__init__.py.jinja,sha256=LU6KHrXMq__7fxyg38mtvQcKT53lPyyZh5NdWOJco6I,64
175
140
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
176
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja,sha256=3YxN9H7_F3cEg01RC22xJ1i1RuBy1hbtaO9C25USehE,71
177
141
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
178
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja,sha256=XGsuAY0lHzPMhABp2Kw1mztHjj8VTH63ivrx_ehe3oI,104
179
142
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
180
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja,sha256=sbiJjLG1lIlLN_-sUvAaADShxnGHex3qg98nZIizXdI,399
181
143
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
182
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja,sha256=0imvpRYha7golR8cC83HGdGRV-GvdJx67aoUZGgaKdE,741
183
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja,sha256=c-BnXSKbExBKLX5kWDkSq_FvxyLEqpG-tCl4B1yx-iw,286
184
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja,sha256=0iJiL9whwHHtm324C7TAjbZDQaBb8loImArhRmAULHc,1613
144
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja,sha256=IPVB9LZnoyr9Mgktjg6G65dKdiP_9lhJajM3dmgLS0g,1595
185
145
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
186
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permission_provider.py.jinja,sha256=GWQCECuEhksTxGfGfw-G3UfJ82DcTyk2C6fcI9vfyw4,802
187
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja,sha256=s7oAdtLGMfDHmpO6tla1nHN9O0_ROwikMETcWMkI_5o,260
188
146
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/__init__.py.jinja,sha256=nBHEqMXm9wNPIjUvK-sD6SdyiyD0vMZKER0Oy1OUM1I,76
189
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja,sha256=AwSZal8EhlbLaoOo05Ro2r5xKIlvDRyP4nKZlokGUiY,601
190
147
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/__init__.py.jinja,sha256=0YILK1GtpKuf4icbuq3C9BhggZlv5MUD65FHMth6YG0,89
191
148
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
192
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja,sha256=qfHBAxGV2q-hmG3ffyB4Af-HgeG9Rb75SaVsSn-WlNc,639
193
149
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
194
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja,sha256=0NDWyOJThlCGgZQUS1FRZSVoLBCryF9nw5qgHaps6To,136
195
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja,sha256=GG_msIQ74kcD3G0pIIxsaDQ160VSxudutviLi43XzQk,4780
150
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja,sha256=WnXi4H5W30qyV_uZQt7ZslpFBxY5v2B_o8WDQV8cwtY,1861
196
151
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
197
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja,sha256=GKvUT5DAeUbUn3wqfKSLM8XdM7KgQQy-ZGY2p3Iswx0,3465
198
152
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
199
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja,sha256=1QjmBavWJgS360bG3rN-csGwkjYX_l3ff9hwOZbty10,1903
200
153
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/__init__.py.jinja,sha256=orK7ZIMzTjfc5ZcFnbqqAZwe3vc3LaB4_dCisIbuUZc,50
201
154
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/migrations/__init__.py.jinja,sha256=SOgnSnlPoYAJLxOxAyJMnJ-btjLHCRwFGXxASSXaaZE,92
202
155
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/__init__.py.jinja,sha256=Z-KE6r2YqebbJLxeTG28gHFou7ylPiEn0u-kRJnUbzk,52
203
156
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/base.py.jinja,sha256=T25cme03rmEWFZtfn4dmsER11ZmD_vz3FiUYeqgGMlE,181
204
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja,sha256=jIUiI8yka9NzccXG5hzl9fcXoppdfsujadSNpAsdxkU,1328
205
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja,sha256=PGfDaKfUTC2_G31RUchvZVshVGRrrCrxEcpTiulxHJ4,2409
157
+ python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja,sha256=7yqBjG3t6isz95CrQcwmDL_YnyUJ-L-y3vpSqbHDTbI,2327
206
158
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/__init__.py.jinja,sha256=VdqphDwvoB9nhl5Q9vHpSnmMWwDUlDp_YckRkionwWw,46
207
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja,sha256=pV4ULCnNqkckWfb10Rh7UrxlE_rfo6dQsAgIazyfoZA,4032
208
159
  python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja,sha256=Kbig4VsdpmVUDHx5SLPf7ZZM6S5ftVmzBxBAJIjwvng,40
209
- python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja,sha256=7aELY93ty7EiJOS6s3GpXYE1z5CLy658rnAUElTyy-U,738
210
160
  python_ddd_framework/developer_kit/templates/project/cookiecutter.json,sha256=vmN799k9eRHAEGeYt8uUjPsusbblvgpNIsXVOsXUno4,314
211
- python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md,sha256=-b072ZN0GQ80Ke2QbvcIxJjinpkPZskAGw_9AyAnVFk,10656
212
- python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md,sha256=xJZD8VyGjAkTbYMdOAWKn3gMgCo_aYzcH0jeVqiZKZI,8605
161
+ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md,sha256=u4fnjZJgqmIGf2CI9yYNRsfDLFktvGvuOVm2M-DQmKs,13059
162
+ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md,sha256=i65NyuY-MXu1eZ3M_Ob5hFpcqCSd8hzc3iYr3Cn27g4,11146
213
163
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.dockerignore,sha256=TG053vIzikxG8h53vCcU_s5wcr7p4GEKwsedbrRrSOo,71
214
164
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.gitignore,sha256=OF6nwgb-RiP8EAXc5osbk3bsOEYkk0JaV99v3FcglTU,66
215
165
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.python-version,sha256=lN0hZ-3c-Wk_uFRrQasUfy9YJrXrdvSzYKhuHeXIXbY,34
@@ -219,12 +169,12 @@ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name
219
169
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.production.yaml.jinja,sha256=_6bOPW2232spgvInM1PA9lgRZMlWdkf_HW7GgTM0s0Q,748
220
170
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/pyproject.toml.jinja,sha256=zZ-kDjgfOYo4g35VLoctEEoyvlZm9fEB2ddHW30JzUs,932
221
171
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/__init__.py.jinja,sha256=RfLT7dqPnSotCDorSp6Taz9jBYOmepu6De_wZNelWZ8,74
222
- python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja,sha256=aFaJNbpcU6fZjF0oWB8NTe2f18fucbFQmZ3PwVHWnYA,1868
172
+ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja,sha256=SPxJ86SW1dx-BuoWITWifq-6NseoxnVMLTufcFFsxF4,1996
223
173
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/module.py.jinja,sha256=6j63muRR7tQmYIFso-egk8L5_Zw57I61ijWR8SDpw5U,3235
224
174
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/conftest.py.jinja,sha256=I_SlSxioBsCFNJLM52iM-neYBJR71qOUn7C4dI9t-7I,149
225
175
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/host/test_http.py.jinja,sha256=pmiz6k0oWWrPeW_rVG2Ynibg4j3yuKvgvYFc0K7J_no,2766
226
- python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md,sha256=oQw2Ca-63qkkIFwJx0T6uSZMieahPPvhpsjTalaXoPY,19536
227
- python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md,sha256=mYEpq1GhPtxIUFcoonbUnN_s1xIWFn06CXSdksSILsU,41251
176
+ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md,sha256=qU6lE4iwhTUDCY3OvtSgNYw99k8JGaOsyrmdaFt_Py4,26920
177
+ python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md,sha256=hEn_ucr8NmZnEp80TyAYB1IoLMWUoh9Hk8wCBzCizDM,53182
228
178
  python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/scripts/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
179
  python_ddd_framework/developer_kit/wiring.py,sha256=80ZhxpGXK6NP3b_BTTc1kt3oIU21MU70cT9kgm8ZgAE,7835
230
180
  python_ddd_framework/diagnostics/__init__.py,sha256=HdgzjQqMJ_SUGKJc5EcQ5PL1rM4GcTeem-L0q1r7vjQ,455
@@ -266,37 +216,40 @@ python_ddd_framework/extensions/catalog.py,sha256=khN3pHIFoWLyLf_cemToDyLYMsnp9a
266
216
  python_ddd_framework/extensions/contracts.py,sha256=MKYIko55LuJUDne_othsclqyDZ0TujJZkhZpkqomgrs,3059
267
217
  python_ddd_framework/extensions/models.py,sha256=wwv2IoL48hbNwk4BLZgqEPejoZxg7Yt3X5tOEy-wxVo,5969
268
218
  python_ddd_framework/extensions/module.py,sha256=V-m2tO_lTvrtBYxBltpc6qvRndYtPUIErPacL7qh--4,799
269
- python_ddd_framework/fastapi/__init__.py,sha256=L1FTfMPpVp7WR-aPC-Rxh8ZXfjjLRbp7XFfyRf5U5cc,1396
270
- python_ddd_framework/fastapi/action.py,sha256=8gzfu7iCn8n-3EDFlXvx8BxZ9Lfopx59eeEdQ0H9WmQ,7122
271
- python_ddd_framework/fastapi/adapter.py,sha256=9cDdBX0uLp6kiorv49eOX15sNxJM4U8rqu8GMjOj6Mk,13376
219
+ python_ddd_framework/fastapi/__init__.py,sha256=H_c5k2XhbaNdjRXXxfnd1ibwApaDtSh5f4B6KMlypuE,1473
220
+ python_ddd_framework/fastapi/access.py,sha256=SWMB_ILM8iItiS0gftX1rNmKy9gO2BCJDaEiWa54ScI,5346
221
+ python_ddd_framework/fastapi/access_options.py,sha256=iXP7X4JCZ-7TcifgOdFB65RhZdZNVKF7l21AUKD-3ws,383
222
+ python_ddd_framework/fastapi/action.py,sha256=OnOrnlgS2xEkpMqVX0s_y2uS4MaGR7QdKfS9bJWlx1U,7459
223
+ python_ddd_framework/fastapi/adapter.py,sha256=SgnCqcVmq_DwK2UiI2PmZPA5Bygxi1QBtp31ym7SKAg,14120
272
224
  python_ddd_framework/fastapi/application_services.py,sha256=RixZNC5niVAWzShUqfxFU_THHQlzxTbwfUTdxETU3qM,11909
273
225
  python_ddd_framework/fastapi/background.py,sha256=MZASgFRz1tQkzMo7A33ZA41qS90wpboLrOdL3RHc87w,1616
274
226
  python_ddd_framework/fastapi/contracts.py,sha256=I9EFDcAuv_Xlv1iNxKWIo4krt3-vkfJgV4ngPKWhxPM,11888
275
227
  python_ddd_framework/fastapi/error_handlers.py,sha256=jH8tbW9nGd_znwhZHSDZv3KwN7k59FFi0QZQWpCWLcg,4492
276
228
  python_ddd_framework/fastapi/errors.py,sha256=XPhxj-WyWQ2wj1q1JkalnyVi2UaOKHbFk_-RbMnS5Ok,984
277
229
  python_ddd_framework/fastapi/filters.py,sha256=aQQB4imJa9XaZUsVkIwmkZ9iZH54P_36wulc7RIKuXU,3954
278
- python_ddd_framework/fastapi/health.py,sha256=GjHN8AnUAU5LpeUl9-U7ScnI7deeHJ3u4pm4fOnCMA0,1312
230
+ python_ddd_framework/fastapi/health.py,sha256=Gjoebhx-6fH4go48xmw3dfo9qUKhVHBxcZfbxkB5Ndg,1703
279
231
  python_ddd_framework/fastapi/http.py,sha256=W0jFoqVYOc_rvT7BGa9m1btEThixX7o0ujt_TMxegsg,2725
280
232
  python_ddd_framework/fastapi/http_router.py,sha256=pgfzy7zcUgy8bNOUTIRn7vgeSHLLcVcVbufLute_m_Y,9254
281
- python_ddd_framework/fastapi/manual_action.py,sha256=f-0GawXtqWIcScN_0hd43uhDNw3EAyZwzmNSQwdlsh8,4284
233
+ python_ddd_framework/fastapi/manual_action.py,sha256=1HMqRttXK1JiN3uuKGmYuss9hRAzussI-dilGhGfns8,5992
282
234
  python_ddd_framework/fastapi/middleware.py,sha256=uIT3KFyVPy-ruBvNzjANclqLp4RAx3X01F9_yN3JEMQ,3968
283
- python_ddd_framework/fastapi/module.py,sha256=ZODzWZGj1f5dtjLPq-1WCaiaxyVxqWKyOfvqusebatQ,510
235
+ python_ddd_framework/fastapi/module.py,sha256=aqVUC0Ups8IzdUR-BFc7hgAh7hHB5fcWNMmzc02TOOo,633
284
236
  python_ddd_framework/fastapi/parameters.py,sha256=AiAppAiY8m7QUT6sqe_fWmwoQ-xk2Afn2ccMv45DWvs,3858
285
237
  python_ddd_framework/fastapi/realtime/__init__.py,sha256=-GtZxXilBiLP3-jQpRa7HPKOMLFNh1sWeV_bcP9iONo,360
286
- python_ddd_framework/fastapi/realtime/authentication.py,sha256=_FBZiAfe0On-jvtemCqfTX8MrlBhsY-X5etcsuqmpcc,6909
238
+ python_ddd_framework/fastapi/realtime/authentication.py,sha256=sIBB3387KV_O2TZ23_bDqP4jBjkWgmPvAaPkL1Y_AXE,7401
287
239
  python_ddd_framework/fastapi/realtime/connection.py,sha256=YSEaRbmKpcrNx8sfh0t4Dn5_CkC4TJjOv5yqbco3Xsc,6099
288
240
  python_ddd_framework/fastapi/realtime/module.py,sha256=mw_99MpA8UdGWuuRkizNmzAhUW6L4lx5v2QUiKewibY,1528
289
- python_ddd_framework/fastapi/realtime/options.py,sha256=5xiv2pgiKb2FG3asZp5Q1jPYiZf6JmzXhFyqRTFj-Gc,1963
290
- python_ddd_framework/fastapi/realtime/runtime.py,sha256=h9A_rOpyBp9Wk9_4TZ5CHyqo23CR7AkyFUPouNs0R2w,14284
291
- python_ddd_framework/fastapi/request_context.py,sha256=g1nUEuJKY2UcUDgs-yrWPUbjGAws9bBI9YCVDqGsAgQ,10125
241
+ python_ddd_framework/fastapi/realtime/options.py,sha256=wfEPu6q6dmydx5m6h9E_muieLDEqcNTQquvC77haieI,1897
242
+ python_ddd_framework/fastapi/realtime/runtime.py,sha256=OL0tAOcLDUY_IXlkzXMLzPkAynpa1jExbtliDbmtct8,15197
243
+ python_ddd_framework/fastapi/request_context.py,sha256=3EWO44HgumKQOFHeyP_dVF3qTRbo1lzbhR1K1qSvxqo,10592
292
244
  python_ddd_framework/fastapi/route_integrity.py,sha256=_tDeeE6XHbsgrA2i1m6Yz_I9NU_JVuYb1E3iMvbwMxE,3174
293
- python_ddd_framework/fastapi/routing.py,sha256=hKCf6Sx8IICkUhuN4NDOluj9RX7KSWyGIRL_S3wexhY,15959
294
- python_ddd_framework/fastapi/server.py,sha256=zk2b5QZkdZsTgzyhffWJNNB02XomRExRRVYT75x6GC4,7072
295
- python_ddd_framework/fastapi/service_endpoints.py,sha256=2uUDKfyiiVpNcXbFXeYh66w8u7SeW3J-mUVj-jciWkc,7258
245
+ python_ddd_framework/fastapi/routing.py,sha256=dvTBWAJVV8TINtY98vCCsN_NVCZGi5h75XqoDfzfRMQ,16342
246
+ python_ddd_framework/fastapi/server.py,sha256=o8klk9sUJvBuLRBM8VU5bp1pFJwRHYafrImI5VGK8GQ,7538
247
+ python_ddd_framework/fastapi/service_endpoints.py,sha256=RpbC-9sEu2JF2JiwsogKnp7bpOhgvgjw6EtAadLzHuM,7549
296
248
  python_ddd_framework/fastapi/service_routes.py,sha256=qOWYcIkOtIdYcMXdDIHan0DtklkRieqtBWXd9BQPuBU,9329
297
249
  python_ddd_framework/fastapi/settings.py,sha256=ix_iplijT4qvxqix0cP99ZNeP9U_yQ9F_n-Zz7FPLUQ,1463
250
+ python_ddd_framework/fastapi/streaming.py,sha256=D1TFx6tFyvEOk7W8enoGMUwf0f0S_5mYlgnIdRSYOJ8,4176
298
251
  python_ddd_framework/fastapi/tracing.py,sha256=oKdPbDAZ-VQUGCOcaNMIAQNwgi6OA2nOA8wffn9ZE70,2494
299
- python_ddd_framework/fastapi/transfer.py,sha256=1qj3CU41SaMrBBLkmaFFyZvQE9mCDTjT6aLLJmTaM5I,6186
252
+ python_ddd_framework/fastapi/transfer.py,sha256=EkP6cuqsDSlZ97YWnnqPMwnvDw41kU2YRu6ChROMhBE,12348
300
253
  python_ddd_framework/fastapi/upload_limits.py,sha256=vK1wuH34zrqrZhg6WDwMn730nX9fUDsMFhBbHKmv2kg,1959
301
254
  python_ddd_framework/fastapi/uploads.py,sha256=SUQVB7tEXUXti6GFUenBNdlW3YaIchtCi0GcBJGhU88,3839
302
255
  python_ddd_framework/hosted_services/__init__.py,sha256=r9yz2PpCUgpxvZsv1WyVrzslvfYCcfmAEsFIlrxejx8,991
@@ -345,7 +298,7 @@ python_ddd_framework/invocation/arguments.py,sha256=7LRZfOifZwWHc9EqtQYda83sBrqp
345
298
  python_ddd_framework/invocation/callables.py,sha256=E0LZzxUxrjvo8i_Jqa_YjUns82y6q9br0tKZYbFx9Uk,6705
346
299
  python_ddd_framework/invocation/contracts.py,sha256=VxT-kj4v90cq1yUx9lTs-enDeqzofRG5pecPqiazcWE,908
347
300
  python_ddd_framework/invocation/contribution.py,sha256=DcNZg4qRhDX7eXypQaesGIhRtsyyZ4iNn5ATg6U8Qpg,2017
348
- python_ddd_framework/invocation/dispatcher.py,sha256=aTCLhnn6IdcwbayC_PIg7dm7yCW6MoIkWYGsgMkJMjs,11588
301
+ python_ddd_framework/invocation/dispatcher.py,sha256=7ZByWfQa8rUDaNded5sFQkkRXRP4ngmppC-ikjfoN7w,10645
349
302
  python_ddd_framework/invocation/entries.py,sha256=0ubnHAkqY7uFgW4QJtdYw9__KPsKuNJmcvw-VdksMJo,1080
350
303
  python_ddd_framework/invocation/entrypoints.py,sha256=9VKoYHW2LM8uwSyrbOGHHujWboy8f8YmCEOjUwfX5N0,4183
351
304
  python_ddd_framework/invocation/execution.py,sha256=A4kzeEK8Ii8_5T-jkdw__2d2Tq-p4M6K-__VKpJw7hE,7267
@@ -358,7 +311,7 @@ python_ddd_framework/invocation/methods.py,sha256=EjqfoZJbdXxY1ocIBYBuUMskK59c0H
358
311
  python_ddd_framework/invocation/module.py,sha256=FQldD1G9vlsiw48JLwQV9ZfM-tnsTuGGJO2tmQv3Vb0,4387
359
312
  python_ddd_framework/invocation/policies.py,sha256=1RE1yQKZN2NMPZOQXQcqVIwaInb0Oz3EFqujqxTfXFw,1879
360
313
  python_ddd_framework/invocation/runtime.py,sha256=U7dziK1Rq-gmElCM6VnBvyegHj947Ax87R-6Wu6QDI0,18519
361
- python_ddd_framework/invocation/scopes.py,sha256=Mx2fLnXMeUQmTMHRqeh9S_bWCjROmhU3kRdM9hBDq4w,3622
314
+ python_ddd_framework/invocation/scopes.py,sha256=NNMGTHFpsMb3AImHih9z_ASR6mKl6JJuPLu4UGwqYrI,3724
362
315
  python_ddd_framework/invocation/signature.py,sha256=EfzIeOggbE25juu1j_cCpgGM-OouLHLtFxH8oIE8Xvs,2083
363
316
  python_ddd_framework/invocation/validation.py,sha256=sy3YyGFtQ-Y69XcjzfJw7PO13zwD8guzvoOt2TG2vd8,986
364
317
  python_ddd_framework/lifecycle/__init__.py,sha256=8L_wDnclU6xAPmPAtx2iGX8lf4qFczcE_ubqFsGfhJA,745
@@ -388,7 +341,7 @@ python_ddd_framework/notifications/module.py,sha256=UlLmEOGyMB5kBg6vd_1QBGhItKZf
388
341
  python_ddd_framework/observability/__init__.py,sha256=Qg_2CPs0MTexfNvu9KvD0K59T-_9r_K3AWHe6bWKgwI,193
389
342
  python_ddd_framework/observability/context.py,sha256=GOXpe34Dt46h3mZ7qrm2t9NWYGZb1gMpr8EsJY4N-PY,1546
390
343
  python_ddd_framework/observability/export.py,sha256=HitQCY3b7n1kIyk4tI7GuVAthhX5fAJUnRdqfQrOOT4,2639
391
- python_ddd_framework/observability/formatting.py,sha256=72WSSYTNhKMEn7NjFyih8ekFFUxYfS0txXw1UTHU5xY,3352
344
+ python_ddd_framework/observability/formatting.py,sha256=6eiCnEIomaye2BeQsf8NNSRucrNYuE8sBQEfLsRHAjw,3381
392
345
  python_ddd_framework/observability/logging.py,sha256=pTrBkX2pYfCDCypF8t8x9dcUPe0pCYirqyMWTgPQ9wc,4392
393
346
  python_ddd_framework/observability/options.py,sha256=LHE_EWw6TKHGqPZKzJIvDJS5l5Fb8kTbzmwUl19diGw,1768
394
347
  python_ddd_framework/observability/tracing.py,sha256=ceTpNU46761zdjwojUJyE15xMZnlkQUJeyBUtQ3Bx6o,3703
@@ -477,7 +430,7 @@ python_ddd_framework/sqlalchemy/metadata.py,sha256=cuQV6ER_PY-LdmKmpK-riQRY1mpyp
477
430
  python_ddd_framework/sqlalchemy/metadata_builder.py,sha256=FaMs0jPqO4uWuK_ZjIF25xIycy6SK2BfFCpx_UXii6Y,9588
478
431
  python_ddd_framework/sqlalchemy/metadata_fingerprint.py,sha256=LDP0Q9I_RmtJYxa84Pvhw8GLLhlxRwy010qe6FC0MYw,4307
479
432
  python_ddd_framework/sqlalchemy/metadata_ownership.py,sha256=OO2Y-1wbn8qwz35qXdW7nV9HJqf7dc82qFHjCwr8K7I,2750
480
- python_ddd_framework/sqlalchemy/migration.py,sha256=jBOUA6Bg-nY7O-Q5kHb5eqdohm1GrhdMYA5-f3Kp7pA,17569
433
+ python_ddd_framework/sqlalchemy/migration.py,sha256=H8ke8F-4AnjTvRdZfaZD2WJYMhUYDO3kNddtad3cy4k,18305
481
434
  python_ddd_framework/sqlalchemy/migration_operations.py,sha256=y_hH8yc11k8wftVMhTHGGpR6-DuIPftxDeUa_YCEn0U,3770
482
435
  python_ddd_framework/sqlalchemy/migration_options.py,sha256=4_VK8Ei1U0twC3dnpfnzUblM9x2kqhuRPgEoB9ahtQc,2082
483
436
  python_ddd_framework/sqlalchemy/migration_sources.py,sha256=mre0ktTV9ooDXjNf_LI9zNuh1eJWatpwaWIRGd60wsA,1175
@@ -494,14 +447,14 @@ python_ddd_framework/unit_of_work/__init__.py,sha256=Vmm9NgsqvFURwW0KHbPAyP54dl3
494
447
  python_ddd_framework/unit_of_work/contracts.py,sha256=vgBCTdhVS2NtFJe1TvhkgD70Gtw6M8w2eyMVrKCwh94,9654
495
448
  python_ddd_framework/unit_of_work/errors.py,sha256=lQH40FnyiZpFQ-WM-DfiZY57YtjFMoXgzG7fsMztzxE,1133
496
449
  python_ddd_framework/unit_of_work/lifecycle.py,sha256=cr08KIRwXS3up0-pkB07UgAgvDlKY1IMZYJppDkTjK8,518
497
- python_ddd_framework/unit_of_work/manager.py,sha256=Myes-OlSsMLnGZDH_HtHq1EM8u8aUHREPuAFfb-WyUc,10634
450
+ python_ddd_framework/unit_of_work/manager.py,sha256=jLTe3l_FvnljiFBcSDP5mdRqjMGtyCigvfqFWUo8JTU,10966
498
451
  python_ddd_framework/unit_of_work/module.py,sha256=EjsUtCG7w56NmLU_xqBRiwJ65Mw5hYrXpUPanVYV0Qc,2479
499
452
  python_ddd_framework/unit_of_work/options.py,sha256=AVcEmwwn39qvj8PLQetBeGzdU_eblABGuNLDIQU5tyI,3365
500
453
  python_ddd_framework/validation/__init__.py,sha256=nTN_BgIXMLHeUtMgSj2hpisWc1_sk6UWTapk30oh1us,100
501
454
  python_ddd_framework/validation/models.py,sha256=Ydz5ZYgqYMPZEXi9A3DA6beN5lD9AcMaImnxDf1aRXs,1737
502
- python_ddd_framework-0.6.0.dist-info/licenses/LICENSE,sha256=2sSWLZdtk4EhG2GlwpksXzmyux-G6Qiov0D27lE_bqw,805
503
- python_ddd_framework-0.6.0.dist-info/licenses/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt,sha256=0lCGUd5Pke2Up1Kqn1kRnHcwLlBz60E8xvR7WL4k_kE,1066
504
- python_ddd_framework-0.6.0.dist-info/WHEEL,sha256=766qEDcnZQDL36MOdWBQ0gowd8OjUWAOwMNC7Vgvxts,81
505
- python_ddd_framework-0.6.0.dist-info/entry_points.txt,sha256=CMy4XBD8IKGUfHwe0YBmHmSJtjfnA3yyDHqsMZCLsc8,447
506
- python_ddd_framework-0.6.0.dist-info/METADATA,sha256=bYYumBr01AbN0h6r6lKfSkvTAt33r5BU3bVJ7zSKw90,60461
507
- python_ddd_framework-0.6.0.dist-info/RECORD,,
455
+ python_ddd_framework-0.7.1.dist-info/licenses/LICENSE,sha256=2sSWLZdtk4EhG2GlwpksXzmyux-G6Qiov0D27lE_bqw,805
456
+ python_ddd_framework-0.7.1.dist-info/licenses/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt,sha256=0lCGUd5Pke2Up1Kqn1kRnHcwLlBz60E8xvR7WL4k_kE,1066
457
+ python_ddd_framework-0.7.1.dist-info/WHEEL,sha256=xTCBFIZIIyRSxyowOv5Wqg_jFU6KsdIffuulBB09Ph8,80
458
+ python_ddd_framework-0.7.1.dist-info/entry_points.txt,sha256=CMy4XBD8IKGUfHwe0YBmHmSJtjfnA3yyDHqsMZCLsc8,447
459
+ python_ddd_framework-0.7.1.dist-info/METADATA,sha256=wuV2ZKpyQAD-DUgVtmUbUsGa-fTUYranSs28gys5IgI,65390
460
+ python_ddd_framework-0.7.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.12.20
2
+ Generator: uv 0.13.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,45 +0,0 @@
1
- from datetime import timedelta
2
-
3
- from modules.{{ cookiecutter.module_name }}.application.background_jobs.order_approval.payload import (
4
- ApprovalPayload,
5
- )
6
- from modules.{{ cookiecutter.module_name }}.application.options.order_options import {{ cookiecutter.class_prefix }}Options
7
- from modules.{{ cookiecutter.module_name }}.domain.repositories.order_repository import OrderRepository
8
- from modules.{{ cookiecutter.module_name }}.domain.services.order_approval_service import OrderApprovalService
9
- from modules.{{ cookiecutter.module_name }}.domain_shared.constants.order_constants import MODULE_NAME
10
- from modules.{{ cookiecutter.module_name }}.domain_shared.enums.order_status import OrderStatus
11
- from modules.{{ cookiecutter.module_name }}.domain_shared.errors.order_errors import APPROVAL_DISABLED
12
-
13
- from python_ddd_framework import Options
14
- from python_ddd_framework.background_jobs import BackgroundJobContext, BackgroundJobHandler
15
- from python_ddd_framework.errors import BusinessError
16
-
17
-
18
- class ApprovalJob(BackgroundJobHandler[ApprovalPayload]):
19
- name = f"{MODULE_NAME}.approve"
20
- version = 1
21
- current = True
22
- timeout = timedelta(seconds=30)
23
-
24
- def __init__(
25
- self,
26
- repository: OrderRepository,
27
- approval: OrderApprovalService,
28
- options: Options[{{ cookiecutter.class_prefix }}Options],
29
- ) -> None:
30
- self._repository, self._approval, self._options = repository, approval, options
31
-
32
- async def execute(self, payload: ApprovalPayload, context: BackgroundJobContext) -> None:
33
- # 业务扩展:这里执行可重试的后台用例;任务可能重复投递,先核对当前业务状态再产生副作用。
34
- # 把审批替换为自己的业务,并同步调整载荷;不要删除幂等判断或吞掉应触发重试的异常。
35
- if self._options.value.allow_background_approval:
36
- order = await self._repository.find(payload.order_id)
37
- if order is not None and order.status is OrderStatus.PENDING:
38
- try:
39
- await self._approval.approve(order)
40
- except BusinessError as error:
41
- # 保留后台业务的既有语义:设置禁止时跳过;其他失败仍交给任务重试。
42
- if error.definition == APPROVAL_DISABLED:
43
- return
44
- raise
45
- await self._repository.save(order)
@@ -1,8 +0,0 @@
1
- from uuid import UUID
2
-
3
- from pydantic import BaseModel, ConfigDict
4
-
5
-
6
- class ApprovalPayload(BaseModel):
7
- model_config = ConfigDict(frozen=True, extra="forbid")
8
- order_id: UUID
@@ -1,35 +0,0 @@
1
- import logging
2
- from datetime import UTC, datetime, timedelta
3
-
4
- from modules.{{ cookiecutter.module_name }}.application.background_jobs.order_statistics.payload import (
5
- StatisticsPayload,
6
- )
7
- from modules.{{ cookiecutter.module_name }}.application.caching.statistics_cache import OrderStatisticsCacheItem
8
- from modules.{{ cookiecutter.module_name }}.application_contracts.integration_services.order_reporting_service import (
9
- OrderReportingService,
10
- )
11
- from modules.{{ cookiecutter.module_name }}.domain_shared.constants.order_constants import MODULE_NAME
12
-
13
- from python_ddd_framework.background_jobs import BackgroundJobContext, BackgroundJobHandler
14
- from python_ddd_framework.caching import DistributedCache
15
-
16
-
17
- class OrderStatisticsJob(BackgroundJobHandler[StatisticsPayload]):
18
- name = f"{MODULE_NAME}.scheduled-statistics"
19
- version = 1
20
- current = True
21
- timeout = timedelta(seconds=10)
22
-
23
- def __init__(self, reporting: OrderReportingService, cache: DistributedCache[OrderStatisticsCacheItem]) -> None:
24
- self._reporting, self._cache = reporting, cache
25
-
26
- async def execute(self, payload: StatisticsPayload, context: BackgroundJobContext) -> None:
27
- count = await self._reporting.get_count()
28
- await self._cache.set(
29
- "current",
30
- OrderStatisticsCacheItem(
31
- count=count,
32
- captured_at=datetime.now(UTC),
33
- ),
34
- )
35
- logging.getLogger(__name__).info("Scheduled order statistics: %s", count)
@@ -1,5 +0,0 @@
1
- from pydantic import BaseModel, ConfigDict
2
-
3
-
4
- class StatisticsPayload(BaseModel):
5
- model_config = ConfigDict(frozen=True, extra="forbid")
@@ -1,15 +0,0 @@
1
- """周期入队声明;Module 显式引用后才启用,处理体由持久 Job 拥有。"""
2
-
3
- from modules.{{ cookiecutter.module_name }}.domain_shared.constants.order_constants import MODULE_NAME
4
-
5
- from python_ddd_framework.background_jobs import BackgroundJobSchedule
6
-
7
- from .handler import OrderStatisticsJob
8
- from .payload import StatisticsPayload
9
-
10
- STATISTICS_SCHEDULE = BackgroundJobSchedule(
11
- name=f"{MODULE_NAME}.statistics.every-ten-seconds",
12
- cron="* * * * * */10",
13
- job=OrderStatisticsJob,
14
- payload=StatisticsPayload(),
15
- )
@@ -1,28 +0,0 @@
1
- import logging
2
- from datetime import timedelta
3
-
4
- from modules.{{ cookiecutter.module_name }}.domain.repositories.order_repository import OrderRepository
5
- from modules.{{ cookiecutter.module_name }}.domain_shared.constants.order_constants import MODULE_NAME
6
-
7
- from python_ddd_framework import BackgroundWorker, BackgroundWorkerContext
8
- from python_ddd_framework.distributed_lock import DistributedLock
9
-
10
- logger = logging.getLogger(__name__)
11
-
12
-
13
- class OrderMaintenanceWorker(BackgroundWorker):
14
- name = f"{MODULE_NAME}.maintenance"
15
- enabled = False
16
- interval = timedelta(seconds=30)
17
- iteration_timeout = timedelta(seconds=10)
18
-
19
- def __init__(self, repository: OrderRepository, lock: DistributedLock) -> None:
20
- self._repository, self._lock = repository, lock
21
-
22
- async def run_iteration(self, context: BackgroundWorkerContext) -> None:
23
- # 租约失效由框架请求取消并等待本轮清理;业务不吞 CancelledError。
24
- async with self._lock.acquire(f"{MODULE_NAME}:maintenance") as acquired:
25
- if acquired:
26
- # 业务扩展:需要互斥的维护逻辑写在成功持锁的分支内;当前读取并计数只是演示。
27
- orders = await self._repository.get_list()
28
- logger.info("Order maintenance completed: %s", len(orders))