pz-cli 5.0.0__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.
- pz_cli-5.0.0.dist-info/METADATA +51 -0
- pz_cli-5.0.0.dist-info/RECORD +399 -0
- pz_cli-5.0.0.dist-info/WHEEL +4 -0
- pz_cli-5.0.0.dist-info/entry_points.txt +5 -0
- pz_core/__init__.py +64 -0
- pz_core/__main__.py +7 -0
- pz_core/app.py +45 -0
- pz_core/assembly/__init__.py +17 -0
- pz_core/assembly/app_discovery.py +1240 -0
- pz_core/assembly/apps/__init__.py +25 -0
- pz_core/assembly/apps/compiler.py +824 -0
- pz_core/assembly/apps/providers.py +188 -0
- pz_core/assembly/cli/__init__.py +9 -0
- pz_core/assembly/cli/compiler.py +166 -0
- pz_core/assembly/diagnostics/__init__.py +21 -0
- pz_core/assembly/diagnostics/checks.py +257 -0
- pz_core/assembly/diagnostics/dev_sources.py +569 -0
- pz_core/assembly/events/__init__.py +5 -0
- pz_core/assembly/events/compiler.py +219 -0
- pz_core/assembly/extensions/__init__.py +5 -0
- pz_core/assembly/extensions/compiler.py +696 -0
- pz_core/assembly/infra/__init__.py +6 -0
- pz_core/assembly/infra/compiler.py +272 -0
- pz_core/assembly/lifecycle/__init__.py +5 -0
- pz_core/assembly/lifecycle/compiler.py +95 -0
- pz_core/assembly/middlewares/__init__.py +19 -0
- pz_core/assembly/middlewares/compiler.py +508 -0
- pz_core/assembly/project/__init__.py +7 -0
- pz_core/assembly/project/compiler.py +9 -0
- pz_core/assembly/project/context.py +17 -0
- pz_core/assembly/project/discovery.py +227 -0
- pz_core/assembly/resources/__init__.py +19 -0
- pz_core/assembly/resources/compiler.py +310 -0
- pz_core/assembly/resources/settings.py +129 -0
- pz_core/assembly/routes/__init__.py +7 -0
- pz_core/assembly/routes/compiler.py +400 -0
- pz_core/assembly/runtime_manifests/__init__.py +13 -0
- pz_core/assembly/runtime_manifests/compiler.py +159 -0
- pz_core/assembly/settings/__init__.py +17 -0
- pz_core/assembly/settings/compiler.py +786 -0
- pz_core/assembly/settings/host_project_overrides.py +82 -0
- pz_core/assembly/settings/host_runtime_endpoint.py +207 -0
- pz_core/authoring/__init__.py +79 -0
- pz_core/authoring/app_init_service.py +946 -0
- pz_core/authoring/app_versions.py +814 -0
- pz_core/authoring/cli.py +192 -0
- pz_core/authoring/commands.py +1810 -0
- pz_core/authoring/conflicts.py +180 -0
- pz_core/authoring/dev_bindings.py +916 -0
- pz_core/authoring/dev_git.py +1087 -0
- pz_core/authoring/dev_import.py +1061 -0
- pz_core/authoring/dev_manifest.py +522 -0
- pz_core/authoring/dev_sources.py +1638 -0
- pz_core/authoring/env_cli.py +454 -0
- pz_core/authoring/files.py +109 -0
- pz_core/authoring/ide_projection.py +1129 -0
- pz_core/authoring/naming.py +58 -0
- pz_core/authoring/official_dev_sources.py +432 -0
- pz_core/authoring/official_sources.json +156 -0
- pz_core/authoring/orchestration_service.py +558 -0
- pz_core/authoring/project_default.jsonc +53 -0
- pz_core/authoring/project_defaults.py +88 -0
- pz_core/authoring/project_metadata_service.py +199 -0
- pz_core/authoring/project_settings_checks.py +51 -0
- pz_core/authoring/project_settings_cli.py +299 -0
- pz_core/authoring/project_settings_service.py +1700 -0
- pz_core/authoring/project_state.py +399 -0
- pz_core/authoring/publish_git.py +423 -0
- pz_core/authoring/publish_lock.py +188 -0
- pz_core/authoring/publish_source.py +195 -0
- pz_core/authoring/release.py +1382 -0
- pz_core/authoring/repo_keys.py +29 -0
- pz_core/authoring/root_cli.py +28 -0
- pz_core/authoring/scaffold_service.py +325 -0
- pz_core/authoring/sync_service.py +787 -0
- pz_core/authoring/templates/app/__init__.py +1 -0
- pz_core/authoring/templates/app/api.py +25 -0
- pz_core/authoring/templates/app/apps.py +31 -0
- pz_core/authoring/templates/app/auth_package_init.py +14 -0
- pz_core/authoring/templates/app/auth_readme.py +29 -0
- pz_core/authoring/templates/app/configs_package_init.py +14 -0
- pz_core/authoring/templates/app/default_env.py +18 -0
- pz_core/authoring/templates/app/default_jsonc.py +25 -0
- pz_core/authoring/templates/app/locales_readme.py +25 -0
- pz_core/authoring/templates/app/migrations_readme.py +19 -0
- pz_core/authoring/templates/app/models.py +14 -0
- pz_core/authoring/templates/app/package_init.py +8 -0
- pz_core/authoring/templates/app/pages_base.py +161 -0
- pz_core/authoring/templates/app/pages_readme.py +25 -0
- pz_core/authoring/templates/app/public.py +31 -0
- pz_core/authoring/templates/app/pyproject.py +77 -0
- pz_core/authoring/templates/app/readme.py +74 -0
- pz_core/authoring/templates/app/settings.py +46 -0
- pz_core/authoring/templates/app/static_app_js.py +24 -0
- pz_core/authoring/templates/app/static_readme.py +31 -0
- pz_core/authoring/templates/app/template_config_page.py +23 -0
- pz_core/authoring/templates/app/template_index_html.py +28 -0
- pz_core/authoring/templates/app/templates_readme.py +32 -0
- pz_core/authoring/templates/app/urls.py +36 -0
- pz_core/authoring/templates/app/views.py +36 -0
- pz_core/authoring/templates/project/__init__.py +1 -0
- pz_core/authoring/templates/project/agents.py +51 -0
- pz_core/authoring/templates/project/apps_container_readme.py +37 -0
- pz_core/authoring/templates/project/main_py.py +59 -0
- pz_core/authoring/templates/project/project_env.py +19 -0
- pz_core/authoring/templates/project/pyproject.py +26 -0
- pz_core/authoring/templates/project/pz_env_env.py +65 -0
- pz_core/authoring/templates/project/pz_env_jsonc.py +69 -0
- pz_core/authoring/templates/project/pz_jsonc.py +12 -0
- pz_core/authoring/templates/project/readme.py +94 -0
- pz_core/authoring/templates/project/root_gitkeep.py +8 -0
- pz_core/authoring/templates/shared/__init__.py +5 -0
- pz_core/authoring/templates/shared/text.py +10 -0
- pz_core/authoring/venv_service.py +87 -0
- pz_core/authoring/workspace.py +167 -0
- pz_core/cli.py +291 -0
- pz_core/cli_options.py +74 -0
- pz_core/core/__init__.py +3 -0
- pz_core/core/errors/__init__.py +5 -0
- pz_core/core/errors/models.py +117 -0
- pz_core/core/events/__init__.py +5 -0
- pz_core/core/events/registry.py +54 -0
- pz_core/core/extensions/__init__.py +51 -0
- pz_core/core/extensions/registry.py +790 -0
- pz_core/core/health/__init__.py +6 -0
- pz_core/core/health/contracts.py +10 -0
- pz_core/core/middlewares/__init__.py +6 -0
- pz_core/core/middlewares/models.py +24 -0
- pz_core/core/routing/__init__.py +5 -0
- pz_core/core/routing/models.py +21 -0
- pz_core/core/settings_contracts.py +25 -0
- pz_core/docs/README.md +20 -0
- pz_core/docs/distribution-README.md +438 -0
- pz_core/docs/pz/345/221/275/344/273/244/346/200/273/350/247/210.md +1011 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/00-pz/346/236/266/346/236/204/346/200/273/347/272/262.md +240 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/01-/347/233/256/345/275/225/344/270/216/345/210/206/345/261/202/350/247/204/350/214/203.md +216 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/02-/345/214/205/344/270/216/345/210/206/345/217/221/350/247/204/350/214/203.md +403 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/03-App/346/234/200/345/260/217/345/255/220/345/214/205/350/247/204/350/214/203.md +571 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/04-Settings/344/270/216/351/205/215/347/275/256/350/247/204/350/214/203.md +1177 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/05-/350/265/204/346/272/220/344/270/216/350/277/220/350/241/214/347/233/256/345/275/225/350/247/204/350/214/203.md +575 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/06-/346/225/260/346/215/256/345/272/223/344/270/216/345/217/257/351/200/211/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/350/214/203.md +499 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/07-App/346/233/277/346/215/242/350/247/204/350/214/203.md +206 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/08-/345/271/263/345/217/260/347/272/247App/344/270/216/350/277/220/350/241/214/346/227/266/345/215/225/344/276/213/350/247/204/350/214/203.md +445 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/09-CLI/344/270/216Worker/345/205/245/345/217/243/350/247/204/350/214/203.md +950 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/10-/346/265/213/350/257/225/344/270/216/345/245/221/347/272/246/350/247/204/350/214/203.md +1001 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/11-/344/273/223/345/272/223/347/234/237/347/233/270/346/272/220/345/234/260/345/233/276.md +102 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/12-/346/236/204/345/273/272/344/270/216/345/217/221/345/270/203/346/243/200/346/237/245/346/270/205/345/215/225.md +171 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/13-/346/255/243/345/274/217Facade/346/200/273/350/241/250.md +402 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/14-/345/210/206/345/261/202/344/270/216/346/211/251/345/261/225/350/247/204/350/214/203.md +550 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/15-/345/255/220/345/214/205/345/274/200/345/217/221/344/275/277/347/224/250/346/211/213/345/206/214.md +1004 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/16-/346/211/251/345/261/225/347/202/271/346/255/243/345/274/217/345/215/217/350/256/256/346/270/205/345/215/225.md +352 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/17-pz.protocols.v1/346/255/243/345/274/217/345/215/217/350/256/256.md +266 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/18-/346/211/251/345/261/225/347/202/271/345/206/262/347/252/201/350/243/201/345/206/263/346/200/273/350/241/250.md +131 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/19-/351/224/231/350/257/257/347/240/201/344/270/216/350/257/212/346/226/255/345/215/217/350/256/256.md +176 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/20-/347/247/201/346/234/211/345/214/205/344/273/223/344/270/216/347/273/237/344/270/200/350/256/244/350/257/201/351/203/250/347/275/262/350/247/204/350/214/203.md +243 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/21-contrib/347/272/246/345/256/232/344/270/216Provider/346/216/245/345/205/245/350/247/204/350/214/203.md +365 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/22-/345/244/232/345/233/275/350/257/255/350/250/200/350/265/204/346/272/220/346/262/273/347/220/206/344/270/216/346/214/211/351/234/200/345/212/240/350/275/275/350/247/204/350/214/203.md +912 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/23-/351/246/226/345/261/217/345/261/225/347/244/272/344/270/216/351/246/226/345/270/247/347/250/263/345/256/232/350/247/204/350/214/203.md +269 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/24-pz/345/220/257/345/212/250/344/270/216/350/277/220/350/241/214/346/227/266/347/274/226/350/257/221/346/265/201/347/250/213.md +245 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/25-/351/235/242/345/220/221/345/257/271/350/261/241/345/274/200/345/217/221/350/247/204/350/214/203.md +300 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/README.md +98 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/00-legacy_core/346/240/207/345/207/206pip/345/214/205/345/214/226/351/207/215/346/236/204/346/200/273/347/272/262.md +1073 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/01-/347/233/256/345/275/225/344/270/216/345/210/206/345/261/202/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +224 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/02-/345/214/205/344/270/216/345/210/206/345/217/221/350/247/204/350/214/203-/345/220/253/345/216/206/345/217/262/345/217/243/345/276/204.md +671 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/13-/344/270/200/346/254/241/346/200/247/345/256/236/346/226/275/346/270/205/345/215/225.md +387 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/14-/345/255/220/345/214/205/351/200/202/351/205/215/346/224/271/351/200/240/346/270/205/345/215/225.md +592 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/15-infra/350/243/201/345/211/252/344/270/216/350/220/275/344/275/215/346/270/205/345/215/225.md +81 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/19-core/345/215/225/344/270/200/346/255/243/345/274/217/346/226/271/346/241/210/346/224/266/346/225/233/346/211/247/350/241/214/346/270/205/345/215/225.md +161 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/25-/345/215/217/350/256/256/345/210/260/346/272/220/347/240/201/345/267/256/350/267/235/346/270/205/345/215/225.md +377 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/26-cutover/345/256/214/345/267/245/346/243/200/346/237/245/346/270/205/345/215/225.md +117 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/29-/345/244/232/345/233/275/350/257/255/350/250/200/350/265/204/346/272/220/346/262/273/347/220/206/344/270/216/346/214/211/351/234/200/345/212/240/350/275/275/350/247/204/350/214/203-/345/220/253/350/277/201/347/247/273/347/255/226/347/225/245.md +956 -0
- pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/archive//344/270/255/351/227/264/346/200/201/99-/350/265/204/346/272/220/346/224/266/345/217/243/345/220/216/347/273/255TODO.md +84 -0
- pz_core/docs//345/217/221/347/211/210/345/211/215/346/270/205/345/215/225-4.0.11.md +84 -0
- pz_core/docs//346/226/260/346/211/213/346/214/207/345/215/227.md +422 -0
- pz_core/infra/__init__.py +17 -0
- pz_core/infra/db/__init__.py +23 -0
- pz_core/infra/db/contracts.py +73 -0
- pz_core/infra/health/__init__.py +5 -0
- pz_core/infra/health/contracts.py +8 -0
- pz_core/infra/kv/__init__.py +5 -0
- pz_core/infra/kv/contracts.py +17 -0
- pz_core/infra/observability/__init__.py +23 -0
- pz_core/infra/observability/contracts.py +142 -0
- pz_core/infra/resilience/__init__.py +5 -0
- pz_core/infra/resilience/contracts.py +17 -0
- pz_core/infra/resources/__init__.py +5 -0
- pz_core/infra/resources/contracts.py +16 -0
- pz_core/infra/settings/__init__.py +17 -0
- pz_core/infra/settings/models.py +81 -0
- pz_core/infra/storage/__init__.py +5 -0
- pz_core/infra/storage/ports.py +27 -0
- pz_core/project_root_commands.py +282 -0
- pz_core/project_runtime_cli.py +344 -0
- pz_core/project_sources.py +253 -0
- pz_core/pz_launcher.py +209 -0
- pz_core/root_cli.py +70 -0
- pz_core/runtime/__init__.py +229 -0
- pz_core/runtime/access.py +86 -0
- pz_core/runtime/adapters/__init__.py +5 -0
- pz_core/runtime/adapters/base.py +18 -0
- pz_core/runtime/asyncio_bridge.py +18 -0
- pz_core/runtime/bindings/__init__.py +5 -0
- pz_core/runtime/bindings/container.py +50 -0
- pz_core/runtime/cli/__init__.py +5 -0
- pz_core/runtime/cli/_args.py +67 -0
- pz_core/runtime/cli/app_commands.py +417 -0
- pz_core/runtime/cli/check.py +214 -0
- pz_core/runtime/cli/db.py +297 -0
- pz_core/runtime/cli/main.py +89 -0
- pz_core/runtime/cli/resources.py +280 -0
- pz_core/runtime/discovery.py +23 -0
- pz_core/runtime/environment_integrity.py +157 -0
- pz_core/runtime/errors.py +5 -0
- pz_core/runtime/events.py +87 -0
- pz_core/runtime/facades/__init__.py +38 -0
- pz_core/runtime/facades/_capabilities.py +46 -0
- pz_core/runtime/facades/cache.py +103 -0
- pz_core/runtime/facades/database.py +71 -0
- pz_core/runtime/facades/events.py +380 -0
- pz_core/runtime/facades/health.py +101 -0
- pz_core/runtime/facades/mail.py +121 -0
- pz_core/runtime/facades/observability.py +102 -0
- pz_core/runtime/facades/providers.py +75 -0
- pz_core/runtime/facades/resources.py +52 -0
- pz_core/runtime/facades/storage.py +296 -0
- pz_core/runtime/health/__init__.py +5 -0
- pz_core/runtime/health/service.py +102 -0
- pz_core/runtime/host.py +188 -0
- pz_core/runtime/host_runner.py +282 -0
- pz_core/runtime/http/__init__.py +20 -0
- pz_core/runtime/http/app.py +576 -0
- pz_core/runtime/http_timing.py +173 -0
- pz_core/runtime/invocation.py +29 -0
- pz_core/runtime/json_safe.py +47 -0
- pz_core/runtime/lifecycle/__init__.py +25 -0
- pz_core/runtime/lifecycle/manager.py +533 -0
- pz_core/runtime/plan.py +214 -0
- pz_core/runtime/plan_context.py +33 -0
- pz_core/runtime/plan_snapshot.py +177 -0
- pz_core/runtime/registries/__init__.py +27 -0
- pz_core/runtime/registries/capabilities.py +101 -0
- pz_core/runtime/registries/providers.py +396 -0
- pz_core/runtime/resource_assets.py +344 -0
- pz_core/runtime/run_cli.py +211 -0
- pz_core/runtime/settings.py +888 -0
- pz_core/runtime/worker/__init__.py +21 -0
- pz_core/runtime/worker/engine.py +921 -0
- pz_core/runtime/worker/runtime.py +25 -0
- pz_core/testing/__init__.py +15 -0
- pz_core/testing/doc_route_contracts.py +305 -0
- pz_core/utils/__init__.py +44 -0
- pz_core/utils/env.py +65 -0
- pz_core/utils/project_jsonc/__init__.py +29 -0
- pz_core/utils/project_jsonc/document.py +420 -0
- pz_core/utils/project_settings.py +99 -0
- pz_foundation/__init__.py +50 -0
- pz_foundation/_contracts.py +81 -0
- pz_foundation/_errors.py +34 -0
- pz_foundation/api.py +14 -0
- pz_foundation/apps.py +127 -0
- pz_foundation/auth/__init__.py +1 -0
- pz_foundation/cache_control.py +233 -0
- pz_foundation/cli/__init__.py +2 -0
- pz_foundation/cli/workers.py +565 -0
- pz_foundation/configs/__init__.py +0 -0
- pz_foundation/configs/default.env +15 -0
- pz_foundation/configs/default.jsonc +452 -0
- pz_foundation/db/__init__.py +94 -0
- pz_foundation/db/aerich_executor.py +664 -0
- pz_foundation/db/config.py +358 -0
- pz_foundation/db/connection_manager.py +689 -0
- pz_foundation/db/connection_probe.py +204 -0
- pz_foundation/db/database.py +1291 -0
- pz_foundation/db/deps.py +47 -0
- pz_foundation/db/lifecycle_status.py +85 -0
- pz_foundation/db/migrations.py +477 -0
- pz_foundation/db/mysql.py +57 -0
- pz_foundation/db/postgresql.py +409 -0
- pz_foundation/db/production_pool_fallback.py +143 -0
- pz_foundation/db/public.py +45 -0
- pz_foundation/db/session.py +369 -0
- pz_foundation/db/sqlite.py +15 -0
- pz_foundation/db/tortoise_manager.py +724 -0
- pz_foundation/db/tortoise_psycopg.py +148 -0
- pz_foundation/docs/README.md +18 -0
- pz_foundation/docs/distribution-README.md +319 -0
- pz_foundation/docs/infra/350/243/201/345/211/252/344/270/216/350/220/275/344/275/215/350/257/264/346/230/216.md +39 -0
- pz_foundation/docs//345/205/254/345/274/200/345/205/215/350/264/271/346/216/245/345/217/243/351/230/262/346/273/245/347/224/250/344/270/216/344/272/272/346/234/272/346/240/241/351/252/214.md +680 -0
- pz_foundation/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +288 -0
- pz_foundation/docs//350/267/257/347/224/261/344/270/216URL/345/244/204/347/220/206/350/247/204/350/214/203.md +119 -0
- pz_foundation/health.py +105 -0
- pz_foundation/host/__init__.py +11 -0
- pz_foundation/host/builder.py +34 -0
- pz_foundation/host/cache_runtime.py +44 -0
- pz_foundation/host/db/__init__.py +17 -0
- pz_foundation/host/db/aerich_config.py +36 -0
- pz_foundation/host/db/config.py +106 -0
- pz_foundation/host/db/connection_manager.py +48 -0
- pz_foundation/host/db/deps.py +5 -0
- pz_foundation/host/db/orm_retry_patch.py +566 -0
- pz_foundation/host/db/request_adapter.py +325 -0
- pz_foundation/host/db/router.py +28 -0
- pz_foundation/host/db/session.py +284 -0
- pz_foundation/host/db/tortoise_manager.py +10 -0
- pz_foundation/host/idempotency.py +132 -0
- pz_foundation/host/lifespan.py +247 -0
- pz_foundation/host/redis_runtime.py +100 -0
- pz_foundation/host/web.py +790 -0
- pz_foundation/infra_provider.py +236 -0
- pz_foundation/kv/__init__.py +25 -0
- pz_foundation/kv/cache.py +1166 -0
- pz_foundation/kv/deps.py +84 -0
- pz_foundation/kv/public.py +25 -0
- pz_foundation/kv/redis_manager.py +1531 -0
- pz_foundation/lazy_exports.py +43 -0
- pz_foundation/lazy_imports.py +124 -0
- pz_foundation/lifecycle.py +392 -0
- pz_foundation/managed_workers.py +1117 -0
- pz_foundation/middlewares/__init__.py +26 -0
- pz_foundation/middlewares/_settings.py +250 -0
- pz_foundation/middlewares/analytics.py +124 -0
- pz_foundation/middlewares/cache_control.py +156 -0
- pz_foundation/middlewares/compression.py +202 -0
- pz_foundation/middlewares/cors.py +62 -0
- pz_foundation/middlewares/geo_country.py +44 -0
- pz_foundation/middlewares/inner_router.py +50 -0
- pz_foundation/middlewares/rate_limited/__init__.py +3 -0
- pz_foundation/middlewares/rate_limited/key_limiter.py +115 -0
- pz_foundation/middlewares/request_logging.py +104 -0
- pz_foundation/middlewares/route_owner.py +309 -0
- pz_foundation/middlewares/security_csrf.py +44 -0
- pz_foundation/middlewares/security_headers/__init__.py +4 -0
- pz_foundation/middlewares/security_headers/conflicts.py +44 -0
- pz_foundation/middlewares/security_headers/csp_nonce.py +200 -0
- pz_foundation/middlewares/security_headers/security_headers.py +44 -0
- pz_foundation/migrations/__init__.py +1 -0
- pz_foundation/migrations/pz_foundation/__init__.py +1 -0
- pz_foundation/models.py +22 -0
- pz_foundation/notifications/__init__.py +23 -0
- pz_foundation/notifications/email.py +542 -0
- pz_foundation/notifications/public.py +31 -0
- pz_foundation/observability/__init__.py +71 -0
- pz_foundation/observability/http.py +34 -0
- pz_foundation/observability/logger/__init__.py +49 -0
- pz_foundation/observability/logger/_bot_settings.py +126 -0
- pz_foundation/observability/logger/bot_message.py +592 -0
- pz_foundation/observability/logger/core.py +385 -0
- pz_foundation/observability/logger/delivery_audit.py +84 -0
- pz_foundation/observability/logger/feishu_bot.py +199 -0
- pz_foundation/observability/logger/telegram_bot.py +194 -0
- pz_foundation/observability/metrics.py +365 -0
- pz_foundation/observability/runtime.py +68 -0
- pz_foundation/public.py +405 -0
- pz_foundation/resources/__init__.py +12 -0
- pz_foundation/resources/builder.py +900 -0
- pz_foundation/resources/images.py +363 -0
- pz_foundation/root_cli.py +20 -0
- pz_foundation/routing/__init__.py +203 -0
- pz_foundation/routing/canonical.py +486 -0
- pz_foundation/routing/convertors.py +82 -0
- pz_foundation/routing/declarations.py +843 -0
- pz_foundation/routing/exports.py +148 -0
- pz_foundation/routing/loaders.py +138 -0
- pz_foundation/routing/manifest.py +215 -0
- pz_foundation/routing/manifest_provider.py +47 -0
- pz_foundation/routing/mounts.py +101 -0
- pz_foundation/routing/ordering.py +172 -0
- pz_foundation/routing/registry.py +133 -0
- pz_foundation/routing/utils.py +28 -0
- pz_foundation/runtime.py +234 -0
- pz_foundation/settings.py +253 -0
- pz_foundation/settings_normalization.py +130 -0
- pz_foundation/storage/__init__.py +25 -0
- pz_foundation/storage/local.py +209 -0
- pz_foundation/storage/public.py +106 -0
- pz_foundation/storage/s3.py +116 -0
- pz_foundation/storage/service.py +234 -0
- pz_foundation/urls.py +19 -0
- pz_foundation/utils/__init__.py +6 -0
- pz_foundation/utils/merge.py +160 -0
- pz_foundation/worker_replicas.py +55 -0
- pz_settings_center/__init__.py +5 -0
- pz_settings_center/api/__init__.py +5 -0
- pz_settings_center/api/runtime_overrides.py +360 -0
- pz_settings_center/apps.py +28 -0
- pz_settings_center/configs/__init__.py +0 -0
- pz_settings_center/configs/default.env +2 -0
- pz_settings_center/configs/default.jsonc +1 -0
- pz_settings_center/docs/01-settings_center/350/203/275/345/212/233/350/276/271/347/225/214.md +124 -0
- pz_settings_center/docs/README.md +12 -0
- pz_settings_center/docs/distribution-README.md +150 -0
- pz_settings_center/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +48 -0
- pz_settings_center/integration_payload.py +18 -0
- pz_settings_center/project_helpers.py +405 -0
- pz_settings_center/public.py +139 -0
- pz_settings_center/routing_helpers.py +73 -0
- pz_settings_center/runtime_override_provider.py +61 -0
- pz_settings_center/typed_settings.py +324 -0
- pz_settings_center/urls.py +9 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# pz 架构总纲
|
|
2
|
+
|
|
3
|
+
> settings 统一口径:Python 运行时代码只允许 `import pz_settings_center.public as settings_center`,并通过 `settings_center.settings.<app_id>.<field>` 读取;`settings.py` / `settings/` 只负责声明。
|
|
4
|
+
> namespace 统一口径:每个正式最小子包都必须有稳定唯一的 `app.id`,settings namespace 必须与 `app.id` 一致;目录名、import 包名和 distribution 应围绕这个稳定身份收敛,但不强制统一技术前缀;没有叶子 app 身份的内部模块不得自定义 namespace。
|
|
5
|
+
|
|
6
|
+
## 0. 架构公约
|
|
7
|
+
|
|
8
|
+
- `pz` 是唯一正式基础包,也是唯一可独立启动的包。
|
|
9
|
+
- 除 `pz` 外,系统里的正式运行单位只有最小子包。
|
|
10
|
+
- `pz` 只负责稳定合同、发现、编译、组装与启动其他最小子包。
|
|
11
|
+
- 官方能力、业务能力、本地 app 都必须走同一套最小子包装配模型。
|
|
12
|
+
- 顶层源码组织根只用于 Git 与源码组织,不是正式架构层,也不进入运行时 namespace。
|
|
13
|
+
- 正式 import 单位、正式安装单位、正式 app 身份、正式源码目录必须对齐到同一个最小子包。
|
|
14
|
+
- `installed_apps` 的唯一正式语法是写目录名;目录名可以是最小子包名,也可以是容器目录名。
|
|
15
|
+
- 运行时不硬编码 `apps`;默认项目配置声明 `apps` 作为扫描目录,框架只按当前项目 `installed_apps` 的实际条目展开。
|
|
16
|
+
- 当项目配置声明 `apps` 时,`apps` 是项目级扫描目录;框架递归发现 `apps/` 下业务仓拥有的真实本地 app 与经过 manifest 校验的可见 binding。物理 `apps/.sources/` checkout 不直接贡献 app,也不形成第二条发现路径。
|
|
17
|
+
- 同一 `app_id` 同时存在于项目源码扫描范围和当前 Python 环境已安装 distribution 时,项目源码优先;只有多个项目本地源码来源同时暴露同一 `app_id` 才构成冲突。
|
|
18
|
+
- 每个最小子包必须只有一个稳定 `app_id` 真相源;新建子包默认让目录名、import 包名与 `app_id` 保持一致,distribution 使用对应的 Python 分发名。
|
|
19
|
+
- 历史子包已发布的 `app_id` 不因目录治理口径变化而强制重命名;若确需重命名,必须作为显式迁移处理,不能在运行时引入第二套 alias namespace。
|
|
20
|
+
|
|
21
|
+
## 1. 设计目标
|
|
22
|
+
|
|
23
|
+
- 单一基础包:基础合同、发现协议、编译与通用启动协议统一落在 `pz`。
|
|
24
|
+
- 最小子包平权:官方维护子包、业务子包、第三方子包在装配模型上完全一致。
|
|
25
|
+
- 单一真相源:路由、settings、公开 surface、安装单位、环境选择、扩展声明、启动入口都只有一个正式来源。
|
|
26
|
+
- 编译先于运行:Web、CLI、worker 启动前必须先形成统一 `RuntimePlan` / `SettingsSnapshot` / manifest。
|
|
27
|
+
- 分层清晰:`pz` 不承载官方具体实现、业务逻辑、宿主路径细节或临时兼容方案。
|
|
28
|
+
- 可安装优先:所有路径、入口与资源输出默认面向 wheel / pip 安装场景。
|
|
29
|
+
- 可替换优先:跨 app 协作只通过 public surface、capability、facade、events、provider contract 或必要的 HTTP/CLI/task 协议完成。
|
|
30
|
+
|
|
31
|
+
## 2. 设计原则
|
|
32
|
+
|
|
33
|
+
- Django 风格:功能以 app 为最小装配单元。
|
|
34
|
+
- 约定优先:目录名、import 包名、distribution、`app_id`、`installed_apps` 写法、环境命令按统一规则收敛。
|
|
35
|
+
- 单一职责:每个核心构件只解决一个问题,不混入第二条主职责。
|
|
36
|
+
- 依赖倒置:上层只依赖契约、facade、capability,不依赖具体实现模块。
|
|
37
|
+
- 面向对象的设计贯穿整个设计周期。
|
|
38
|
+
- 面向对象边界:凡是存在身份、生命周期、状态、不变量、依赖协作或跨模块合同的能力,必须用清晰对象边界表达。
|
|
39
|
+
- 组合优先继承:默认通过组合、Protocol、provider、strategy、adapter 复用与替换;只有稳定 is-a 合同成立时才允许继承。
|
|
40
|
+
- 状态归 owner:运行时状态只能由明确 owner 对象拥有和释放,不得散落在模块级全局变量、临时 dict 或 import-time 单例里。
|
|
41
|
+
- 单一路径原则:一个问题只保留一种正式解决方案。
|
|
42
|
+
- 不重复造轮子:不同层不得各自重写同类扫描、聚合、推导、注册逻辑。
|
|
43
|
+
- 单一顺序源:`installed_apps` 是唯一 app 装载顺序来源。
|
|
44
|
+
- 文件级资源覆盖:资源覆盖顺序只看 `installed_apps`,后出现 app 覆盖前者同相对路径。
|
|
45
|
+
- 显式优于隐式:替换、覆盖、装配、资源输出路径必须显式声明。
|
|
46
|
+
- 可选基础设施:数据库、Redis、metrics、tracing 等能力按需启用,不成为 base 运行前提。
|
|
47
|
+
|
|
48
|
+
## 3. 分层模型
|
|
49
|
+
|
|
50
|
+
正式架构统一分为五层。
|
|
51
|
+
|
|
52
|
+
这些层必须落实为对象职责,而不是只落实为目录名。声明期合同使用 typed spec/model,编译裁决使用 compiler/resolver/builder,运行时资源由 runtime owner 管理,跨层消费只暴露 facade/capability/provider contract。具体对象边界以 [`25-面向对象开发规范`](./25-面向对象开发规范.md) 为准。
|
|
53
|
+
|
|
54
|
+
1. 契约层
|
|
55
|
+
- schema
|
|
56
|
+
- settings model
|
|
57
|
+
- manifest
|
|
58
|
+
- capability interface
|
|
59
|
+
- provider contract
|
|
60
|
+
|
|
61
|
+
2. 编译/聚合层
|
|
62
|
+
- app registry compiler
|
|
63
|
+
- route manifest compiler
|
|
64
|
+
- middleware manifest compiler
|
|
65
|
+
- resource manifest compiler
|
|
66
|
+
- infra snapshot compiler
|
|
67
|
+
|
|
68
|
+
3. facade/capability 层
|
|
69
|
+
- context-bound facade
|
|
70
|
+
- capability registry
|
|
71
|
+
- provider registry
|
|
72
|
+
|
|
73
|
+
4. 适配器层
|
|
74
|
+
- FastAPI/ASGI
|
|
75
|
+
- Aerich/Tortoise
|
|
76
|
+
- Redis client
|
|
77
|
+
- Prometheus exporter
|
|
78
|
+
- 其它具体 SDK adapter
|
|
79
|
+
|
|
80
|
+
5. 入口层
|
|
81
|
+
- CLI
|
|
82
|
+
- Web app
|
|
83
|
+
- worker
|
|
84
|
+
|
|
85
|
+
依赖方向固定为:
|
|
86
|
+
|
|
87
|
+
- 入口层 -> facade/capability 层 -> 编译/聚合层 -> 契约层
|
|
88
|
+
- 适配器层 -> 契约层 或 facade/capability 层
|
|
89
|
+
- app 代码 -> public facade / capability contract
|
|
90
|
+
|
|
91
|
+
禁止:
|
|
92
|
+
|
|
93
|
+
- 入口层直接操作底层模块级单例。
|
|
94
|
+
- app 直接 import `pz` 内部实现细节。
|
|
95
|
+
- facade 反向依赖某个具体入口。
|
|
96
|
+
- 同一能力在多层各自维护一份规则与状态。
|
|
97
|
+
|
|
98
|
+
## 4. 最小子包关系
|
|
99
|
+
|
|
100
|
+
- 官方维护最小子包与其它最小子包在装配层面完全一致。
|
|
101
|
+
- 两者都只能通过 `installed_apps` 进入系统。
|
|
102
|
+
- 两者都没有装配优先级特权。
|
|
103
|
+
|
|
104
|
+
公开交互面分层:
|
|
105
|
+
|
|
106
|
+
- 官方维护最小子包定义为官方 library app,允许其它 app 通过稳定 `public.py` 依赖。
|
|
107
|
+
- 独立子包定义为 integration app,不允许其它 app 直接 import 其内部 Python 模块。
|
|
108
|
+
- 跨 app 协作统一走 capability、facade、events、provider contract、CLI/task 协议或必要的 HTTP API。
|
|
109
|
+
|
|
110
|
+
禁止:
|
|
111
|
+
|
|
112
|
+
- 让独立子包变成可直接 import 的内部实现仓库。
|
|
113
|
+
- 让任何容器目录在装配上拥有高于其它 app 的优先级。
|
|
114
|
+
- 让 `pz` 点名某个具体 owner app。
|
|
115
|
+
|
|
116
|
+
## 5. 唯一真相源
|
|
117
|
+
|
|
118
|
+
以下对象必须各自成为唯一真相源:
|
|
119
|
+
|
|
120
|
+
- `project_dir`:项目边界唯一真相源。
|
|
121
|
+
- `pz.jsonc`:项目正式配置唯一真相源。
|
|
122
|
+
- `<project_dir>/.env` 与 `<project_dir>/.env.{PZ_ENV}`:环境覆盖文件唯一入口集合。
|
|
123
|
+
- `PZ_ENV`:环境选择唯一正式入口。
|
|
124
|
+
- `installed_apps`:app 装载顺序唯一真相源。
|
|
125
|
+
- `[app_replacements]`:app 替换关系唯一真相源。
|
|
126
|
+
- `RouteManifest`:路由裁决唯一真相源。
|
|
127
|
+
- `MiddlewareManifest`:中间件裁决唯一真相源。
|
|
128
|
+
- `ResourceManifest`:资源合并结果唯一真相源。
|
|
129
|
+
- `SettingsSnapshot`:运行期配置快照唯一真相源。
|
|
130
|
+
- `RuntimePlan`:当前进程运行图唯一真相源。
|
|
131
|
+
|
|
132
|
+
任何 helper、回退路径或局部门面都不得再生成第二套并行真相源。
|
|
133
|
+
|
|
134
|
+
## 6. RuntimePlan
|
|
135
|
+
|
|
136
|
+
正式架构中,必须存在且只存在一个组合根:
|
|
137
|
+
|
|
138
|
+
- `RuntimePlan` 编译入口
|
|
139
|
+
|
|
140
|
+
`RuntimePlan` 负责把下层正式产物一次性编译为当前进程的运行计划,至少包含:
|
|
141
|
+
|
|
142
|
+
- `ProjectContext`
|
|
143
|
+
- `SettingsSnapshot`
|
|
144
|
+
- `AppRegistry`
|
|
145
|
+
- `ResourceManifest`
|
|
146
|
+
- `InfraContext`
|
|
147
|
+
- `RouteManifest`
|
|
148
|
+
- `MiddlewareManifest`
|
|
149
|
+
- `CapabilityRegistry`
|
|
150
|
+
|
|
151
|
+
正式要求:
|
|
152
|
+
|
|
153
|
+
- Web、CLI、worker 都只能先构建 `RuntimePlan`,再消费它。
|
|
154
|
+
- `RuntimePlan` 及其 activation 是基础层唯一组合根;具体对象图只能在这里或各 owner runtime 的局部组合根中构造。
|
|
155
|
+
- 不允许某个入口跳过 `RuntimePlan`,单独拼 settings、app registry、resource manifest 或 infra context。
|
|
156
|
+
- `RuntimePlan` 一旦生成,就作为当前进程唯一运行图输入。
|
|
157
|
+
- `RuntimePlan` 产物必须视为不可变快照;后续阶段只能消费,不得原地改写。
|
|
158
|
+
- `lifespan/startup/shutdown` 只允许激活或关闭 `RuntimePlan` 中已经编译好的 capability。
|
|
159
|
+
- `CapabilityRegistry` 只作为运行图内部对象存在,不提升为 app 稳定公共依赖面。
|
|
160
|
+
|
|
161
|
+
禁止:
|
|
162
|
+
|
|
163
|
+
- Web 入口自己再扫一遍 apps。
|
|
164
|
+
- worker 入口自己再推一遍 infra config。
|
|
165
|
+
- CLI 命令自己再定位一遍 resources/migrations。
|
|
166
|
+
- bootstrap/lifespan 再补 route、middleware、settings 稳定字段。
|
|
167
|
+
|
|
168
|
+
## 7. 编译阶段与执行阶段
|
|
169
|
+
|
|
170
|
+
正式架构统一分为两个阶段。
|
|
171
|
+
|
|
172
|
+
编译阶段负责:
|
|
173
|
+
|
|
174
|
+
- 读取配置。
|
|
175
|
+
- 解析 app。
|
|
176
|
+
- 编译 manifest。
|
|
177
|
+
- 编译 typed snapshot。
|
|
178
|
+
- 生成 `RuntimePlan`。
|
|
179
|
+
|
|
180
|
+
执行阶段负责:
|
|
181
|
+
|
|
182
|
+
- 挂载 route。
|
|
183
|
+
- 初始化 provider/client。
|
|
184
|
+
- 创建 facade/capability 实例。
|
|
185
|
+
- 启动 Web/CLI/worker。
|
|
186
|
+
- 执行 shutdown/cleanup。
|
|
187
|
+
|
|
188
|
+
正式要求:
|
|
189
|
+
|
|
190
|
+
- 编译阶段负责裁决与产出,不负责启动任何运行时副作用。
|
|
191
|
+
- 执行阶段只消费编译结果,不再重新裁决规则。
|
|
192
|
+
- 冲突检测、替换关系、顺序决定、路径决定、enabled/disabled 判定,全部必须在编译阶段完成。
|
|
193
|
+
- DB/Redis client 初始化、logger handler 注册、worker loop 启动、route mutation,只允许发生在执行阶段。
|
|
194
|
+
|
|
195
|
+
禁止:
|
|
196
|
+
|
|
197
|
+
- 在编译阶段初始化 DB/Redis/metrics/exporter。
|
|
198
|
+
- 在执行阶段重新扫描 installed apps、重新推导 settings、重新生成 manifest。
|
|
199
|
+
- 在 `startup()`、`lifespan`、middleware 构造期重新做冲突裁决。
|
|
200
|
+
- 在 adapter 层重新实现一套编译规则。
|
|
201
|
+
|
|
202
|
+
## 8. 运行边界
|
|
203
|
+
|
|
204
|
+
- 包目录必须视为只读。
|
|
205
|
+
- 合并产物统一写入外部 `cache_dir` / `runtime_dir`。
|
|
206
|
+
- 运行期不得假设当前工作目录就是项目根目录。
|
|
207
|
+
- 宿主启动统一走 `pz run = pz run develop = pz run dev`、`pz run test`、`pz run product`。
|
|
208
|
+
- `pz` 基础层冻结后,官方能力具体实现默认进入 `pz_contrib/` 或其它官方最小子包。
|
|
209
|
+
|
|
210
|
+
## 9. 稳定公共契约
|
|
211
|
+
|
|
212
|
+
稳定公共契约包括:
|
|
213
|
+
|
|
214
|
+
- `pz` CLI 入口语义。
|
|
215
|
+
- `pz` 正式 Python API。
|
|
216
|
+
- `pz.jsonc` / `pz.{PZ_ENV}.jsonc` 配置结构。
|
|
217
|
+
- app 最小协议。
|
|
218
|
+
- `installed_apps` / app registry / migrations / resources 的正式约定。
|
|
219
|
+
- 官方声明为 `public.py`、capability contract、provider contract 的稳定边界。
|
|
220
|
+
|
|
221
|
+
默认不属于稳定公共契约的内容:
|
|
222
|
+
|
|
223
|
+
- `pz` 内部 helper 的具体文件布局。
|
|
224
|
+
- 官方维护最小子包/独立子包的内部 service / runtime / module 目录。
|
|
225
|
+
- 未在文档中声明为 stable 的私有模块 import path。
|
|
226
|
+
|
|
227
|
+
要求:
|
|
228
|
+
|
|
229
|
+
- 文档必须明确哪些入口是 stable,哪些不属于稳定公共边界。
|
|
230
|
+
- 内部目录可以重构,但不得破坏已声明的 stable 契约。
|
|
231
|
+
|
|
232
|
+
## 10. 禁止事项
|
|
233
|
+
|
|
234
|
+
- 新增第二套 core、第二套主 CLI、第二套宿主基础壳。
|
|
235
|
+
- 在 `pz` 中新增业务逻辑、宿主逻辑或 owner-specific 共享运行时逻辑。
|
|
236
|
+
- 通过集合层 namespace 表达正式运行时身份。
|
|
237
|
+
- 在 app 运行时代码中直接读取 `os.environ`、包内默认配置模板或项目 `.env*`。
|
|
238
|
+
- 在 import 阶段创建 DB/Redis/client/exporter、注册全局 handler 或读取项目配置。
|
|
239
|
+
- 为单个 app、单个宿主或单个路径加入硬编码特判。
|
|
240
|
+
- 长期保留两套入口、两套协议、两套实现。
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# 目录与分层规范
|
|
2
|
+
|
|
3
|
+
本文档定义 `pz` 正式目录结构、源码组织边界与分层职责。迁移步骤、执行清单和历史路径映射不属于本文范围。
|
|
4
|
+
|
|
5
|
+
## 1. 正式原则
|
|
6
|
+
|
|
7
|
+
- 同一类职责只允许落在一个目录层。
|
|
8
|
+
- `pz` 只保留基础层协议、发现、编译、组装与启动。
|
|
9
|
+
- `runtime / assembly / core / infra` 是 `pz` 基础层内部职责分层,不是 app namespace。
|
|
10
|
+
- 除 `pz` 外,其它正式能力都必须落成独立最小子包。
|
|
11
|
+
- 每个最小子包必须有稳定唯一的 `app_id`;新建子包默认让目录名、import 包名与 `app_id` 对齐,历史已发布子包以稳定值为准。
|
|
12
|
+
- 外层目录只用于 Git 与源码组织,不表达正式运行时 namespace。
|
|
13
|
+
- 所有公开入口都只通过正式 facade、capability、provider contract、`public.py` 或 CLI/task/API 协议暴露。
|
|
14
|
+
|
|
15
|
+
## 2. 唯一完整目录结构
|
|
16
|
+
|
|
17
|
+
完整目录结构只在本文档定义一次,其它文档只允许引用,不再重复展开目录树。
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
workspace/
|
|
21
|
+
pz/ (最小基础仓 Git checkout,不是运行时 namespace)
|
|
22
|
+
pyproject.toml (`pz-cli` 唯一 distribution 真相源)
|
|
23
|
+
uv.lock
|
|
24
|
+
pz_core/
|
|
25
|
+
pz_core/
|
|
26
|
+
__init__.py
|
|
27
|
+
__main__.py
|
|
28
|
+
app.py
|
|
29
|
+
settings.py
|
|
30
|
+
runtime/
|
|
31
|
+
assembly/
|
|
32
|
+
core/
|
|
33
|
+
infra/
|
|
34
|
+
tests/
|
|
35
|
+
pz_contrib/ (同 wheel 内的官方基础子包源码容器;不进入 import namespace)
|
|
36
|
+
pz_foundation/
|
|
37
|
+
pz_settings_center/
|
|
38
|
+
pz_apps/ (其余最小子包仓 Git checkout;不进入 import namespace)
|
|
39
|
+
<app_id>/
|
|
40
|
+
pyproject.toml
|
|
41
|
+
<app_id>/
|
|
42
|
+
__init__.py
|
|
43
|
+
public.py
|
|
44
|
+
apps.py
|
|
45
|
+
settings.py
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
边界:
|
|
49
|
+
|
|
50
|
+
- `pz/` 是唯一正式基础包,也是唯一可独立启动的包。
|
|
51
|
+
- 每个正式能力都必须落成独立最小子包 `<app_id>/`。
|
|
52
|
+
- `pz/` 与 `pz_apps/` 两个顶层源码组织根只承担 Git 与 ownership 分组职责。
|
|
53
|
+
- `pz_contrib/` 只表示框架仓内的官方维护子包容器,不表示特殊运行时层。
|
|
54
|
+
- 不保留 `plugins`、`platform namespace`、`site_runtime namespace` 作为正式目录概念。
|
|
55
|
+
|
|
56
|
+
## 3. `pz_core` 包根
|
|
57
|
+
|
|
58
|
+
`pz/pz_core/pz_core/` 包根只保留公开入口与基础声明:
|
|
59
|
+
|
|
60
|
+
- `__init__.py`
|
|
61
|
+
- `__main__.py`
|
|
62
|
+
- `app.py`
|
|
63
|
+
- `settings.py`
|
|
64
|
+
- `runtime/`
|
|
65
|
+
- `assembly/`
|
|
66
|
+
- `core/`
|
|
67
|
+
- `infra/`
|
|
68
|
+
|
|
69
|
+
约束:
|
|
70
|
+
|
|
71
|
+
- `__init__.py` 只暴露公开 Python API。
|
|
72
|
+
- `__main__.py` 只负责 CLI 入口调用。
|
|
73
|
+
- `app.py` 只暴露 ASGI/Python 入口。
|
|
74
|
+
- `settings.py` / `settings/` 只保留 schema / normalize / 默认值声明职责;运行时读取统一走 settings surface owner。
|
|
75
|
+
- 包根不得承载官方具体实现、业务逻辑、宿主路径细节或临时兼容方案。
|
|
76
|
+
|
|
77
|
+
## 4. `runtime/`
|
|
78
|
+
|
|
79
|
+
`runtime/` 只放执行期运行图与入口胶水。
|
|
80
|
+
|
|
81
|
+
允许放入:
|
|
82
|
+
|
|
83
|
+
- `ProjectContext`、`RuntimePlan` 的运行时持有与访问入口。
|
|
84
|
+
- context-bound registry / facade / provider binding 激活逻辑。
|
|
85
|
+
- request/app-state/runtime helper。
|
|
86
|
+
- Web / CLI / worker 的执行期入口 glue。
|
|
87
|
+
- `startup()` / `shutdown()` 的执行器。
|
|
88
|
+
- health / metrics / debug surface 的执行期暴露。
|
|
89
|
+
- 把已编译 `RouteManifest` / `MiddlewareManifest` / `ResourceManifest` 应用到宿主框架的 adapter glue。
|
|
90
|
+
|
|
91
|
+
禁止放入:
|
|
92
|
+
|
|
93
|
+
- settings 读取器、`.env` 发现器、project root 推断器。
|
|
94
|
+
- app 扫描、资源扫描、迁移扫描、middleware 扫描。
|
|
95
|
+
- route / middleware / resource / infra 的编译规则。
|
|
96
|
+
- 具体 middleware 类。
|
|
97
|
+
- 具体 provider/client/SDK 实现。
|
|
98
|
+
- import-time 单例、全局 setter、全局 manager。
|
|
99
|
+
|
|
100
|
+
## 5. `assembly/`
|
|
101
|
+
|
|
102
|
+
`assembly/` 只放编译、裁决与诊断编排。
|
|
103
|
+
|
|
104
|
+
允许放入:
|
|
105
|
+
|
|
106
|
+
- settings compiler。
|
|
107
|
+
- app registry compiler。
|
|
108
|
+
- route / middleware / resource / infra manifest compiler。
|
|
109
|
+
- project/app/resource 路径归一化逻辑。
|
|
110
|
+
- 冲突检测、替换裁决、顺序裁决。
|
|
111
|
+
- 资源 merge 计划、迁移归属计划、诊断产物编译。
|
|
112
|
+
|
|
113
|
+
禁止放入:
|
|
114
|
+
|
|
115
|
+
- FastAPI/ASGI 对象创建与 mutation。
|
|
116
|
+
- DB/Redis/mail/storage client 初始化。
|
|
117
|
+
- logger/exporter/worker loop 启动。
|
|
118
|
+
- 具体 middleware 类与具体 provider 实现。
|
|
119
|
+
- request helper、app.state helper、thread-local/runtime-local 状态。
|
|
120
|
+
- 在编译阶段触发文件写入、网络 I/O、依赖探测。
|
|
121
|
+
|
|
122
|
+
## 6. `core/`
|
|
123
|
+
|
|
124
|
+
`core/` 只放纯 contract 与纯规则。
|
|
125
|
+
|
|
126
|
+
允许放入:
|
|
127
|
+
|
|
128
|
+
- app protocol、declaration model、dependency rule。
|
|
129
|
+
- route / middleware / resource 的声明模型与纯校验规则。
|
|
130
|
+
- error code、error envelope、health result model。
|
|
131
|
+
- request correlation id / trace correlation model 的纯协议定义。
|
|
132
|
+
- capability contract、provider contract 的纯接口定义。
|
|
133
|
+
- 不依赖具体 app / 具体 provider / 具体目录真相源的纯规则。
|
|
134
|
+
|
|
135
|
+
禁止放入:
|
|
136
|
+
|
|
137
|
+
- 具体 app 清单、具体官方 app import path 特判。
|
|
138
|
+
- FastAPI/Request/app.state/CLI 运行时 helper。
|
|
139
|
+
- `startup()` / `shutdown()` / lifespan 副作用。
|
|
140
|
+
- 具体 middleware 类、模板运行时、i18n 运行时、静态资源服务。
|
|
141
|
+
- 具体 DB/Redis/storage/mail/observability provider 实现。
|
|
142
|
+
- 任何临时实现或历史兼容桥接。
|
|
143
|
+
|
|
144
|
+
## 7. `infra/`
|
|
145
|
+
|
|
146
|
+
`infra/` 只保留可选基础设施的薄绑定层与 contract。
|
|
147
|
+
|
|
148
|
+
允许放入:
|
|
149
|
+
|
|
150
|
+
- typed infra settings / typed context / capability state model。
|
|
151
|
+
- provider contract / adapter protocol / binder interface。
|
|
152
|
+
- capability 装配所需的最小 runtime binder。
|
|
153
|
+
- 最小 noop / null / disabled 语义实现。
|
|
154
|
+
- 不带业务语义的 resilience 工具。
|
|
155
|
+
|
|
156
|
+
禁止放入:
|
|
157
|
+
|
|
158
|
+
- 共享 middleware 实现目录。
|
|
159
|
+
- i18n / jinja / site runtime / template helper。
|
|
160
|
+
- 平台 app 专属 registry、provider 注册表、模块配置逻辑。
|
|
161
|
+
- 具体第三方 SDK / 云服务 / exporter / bot handler 实现。
|
|
162
|
+
- import-time 默认 client、默认 registry、默认 logger。
|
|
163
|
+
- 官方 app 或独立子包的业务逻辑。
|
|
164
|
+
|
|
165
|
+
## 8. 一票否决规则
|
|
166
|
+
|
|
167
|
+
某个文件只要满足以下任一条件,就不得进入 `core` 或 `infra`:
|
|
168
|
+
|
|
169
|
+
- 需要知道某个具体官方 app / 独立子包的名字。
|
|
170
|
+
- 需要直接 import 具体 provider / 具体 middleware 类。
|
|
171
|
+
- 需要在导入期或编译期产生运行时副作用。
|
|
172
|
+
- 需要依赖 repo-root、`cwd` 或历史目录布局才能工作。
|
|
173
|
+
- 需要通过临时回退补正式主链缺口。
|
|
174
|
+
|
|
175
|
+
## 9. 最小子包
|
|
176
|
+
|
|
177
|
+
最小子包是系统里除 `pz` 外唯一正式能力单位。
|
|
178
|
+
|
|
179
|
+
源码落位固定为:
|
|
180
|
+
|
|
181
|
+
- 每个正式能力都必须落在自己的包根:`<app_id>/`。
|
|
182
|
+
- 包根内部的正式 Python 包目录同样必须叫 `<app_id>/`。
|
|
183
|
+
- `<app_id>/` 可以放在任意顶层源码组织根下,但外层目录不参与运行时命名。
|
|
184
|
+
- `installed_apps` 可以直接声明某个 `<app_id>/`,也可以声明容器目录;框架负责递归发现其中嵌套的最小子包。
|
|
185
|
+
|
|
186
|
+
边界:
|
|
187
|
+
|
|
188
|
+
- `pz/` 不承载任何业务能力或官方能力的具体实现。
|
|
189
|
+
- 任何能力型代码都必须进入某个最小子包,而不是挂在集合层目录名下。
|
|
190
|
+
- 各最小子包默认不通过内部 Python import 直接协作,只通过 facade / capability / events / provider contract / CLI/task/API 等稳定交互面协作。
|
|
191
|
+
|
|
192
|
+
## 10. 非运行时目录
|
|
193
|
+
|
|
194
|
+
不进入正式运行主链:
|
|
195
|
+
|
|
196
|
+
- `.runtime/`
|
|
197
|
+
- `dist/`
|
|
198
|
+
- `.venv/`
|
|
199
|
+
- `logs/`
|
|
200
|
+
- `docs/`
|
|
201
|
+
|
|
202
|
+
要求:
|
|
203
|
+
|
|
204
|
+
- `.runtime/` 只作为运行时输出目录,不纳入包分发语义。
|
|
205
|
+
- `dist/` 只作为构建产物目录。
|
|
206
|
+
- `logs/` 不得作为源码默认依赖目录。
|
|
207
|
+
- `docs/` 只承载文档,不承载运行时发现、配置、资源或装配事实。
|
|
208
|
+
|
|
209
|
+
## 11. 验收标准
|
|
210
|
+
|
|
211
|
+
- 包根只剩公开入口与基础声明。
|
|
212
|
+
- `pz / <app_id>` 与 `runtime / assembly / core / infra` 职责边界稳定。
|
|
213
|
+
- 不存在 repo-root / `cwd` / `app/*` 作为正式路径心智。
|
|
214
|
+
- base-only wheel 安装可以正常执行 `pz --help`。
|
|
215
|
+
- 可选依赖缺失不会在 import-time 打崩基础命令。
|
|
216
|
+
- 正式 tests 能按分层验证入口、配置、资源、可选 infra、官方 app 装配。
|