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.
Files changed (399) hide show
  1. pz_cli-5.0.0.dist-info/METADATA +51 -0
  2. pz_cli-5.0.0.dist-info/RECORD +399 -0
  3. pz_cli-5.0.0.dist-info/WHEEL +4 -0
  4. pz_cli-5.0.0.dist-info/entry_points.txt +5 -0
  5. pz_core/__init__.py +64 -0
  6. pz_core/__main__.py +7 -0
  7. pz_core/app.py +45 -0
  8. pz_core/assembly/__init__.py +17 -0
  9. pz_core/assembly/app_discovery.py +1240 -0
  10. pz_core/assembly/apps/__init__.py +25 -0
  11. pz_core/assembly/apps/compiler.py +824 -0
  12. pz_core/assembly/apps/providers.py +188 -0
  13. pz_core/assembly/cli/__init__.py +9 -0
  14. pz_core/assembly/cli/compiler.py +166 -0
  15. pz_core/assembly/diagnostics/__init__.py +21 -0
  16. pz_core/assembly/diagnostics/checks.py +257 -0
  17. pz_core/assembly/diagnostics/dev_sources.py +569 -0
  18. pz_core/assembly/events/__init__.py +5 -0
  19. pz_core/assembly/events/compiler.py +219 -0
  20. pz_core/assembly/extensions/__init__.py +5 -0
  21. pz_core/assembly/extensions/compiler.py +696 -0
  22. pz_core/assembly/infra/__init__.py +6 -0
  23. pz_core/assembly/infra/compiler.py +272 -0
  24. pz_core/assembly/lifecycle/__init__.py +5 -0
  25. pz_core/assembly/lifecycle/compiler.py +95 -0
  26. pz_core/assembly/middlewares/__init__.py +19 -0
  27. pz_core/assembly/middlewares/compiler.py +508 -0
  28. pz_core/assembly/project/__init__.py +7 -0
  29. pz_core/assembly/project/compiler.py +9 -0
  30. pz_core/assembly/project/context.py +17 -0
  31. pz_core/assembly/project/discovery.py +227 -0
  32. pz_core/assembly/resources/__init__.py +19 -0
  33. pz_core/assembly/resources/compiler.py +310 -0
  34. pz_core/assembly/resources/settings.py +129 -0
  35. pz_core/assembly/routes/__init__.py +7 -0
  36. pz_core/assembly/routes/compiler.py +400 -0
  37. pz_core/assembly/runtime_manifests/__init__.py +13 -0
  38. pz_core/assembly/runtime_manifests/compiler.py +159 -0
  39. pz_core/assembly/settings/__init__.py +17 -0
  40. pz_core/assembly/settings/compiler.py +786 -0
  41. pz_core/assembly/settings/host_project_overrides.py +82 -0
  42. pz_core/assembly/settings/host_runtime_endpoint.py +207 -0
  43. pz_core/authoring/__init__.py +79 -0
  44. pz_core/authoring/app_init_service.py +946 -0
  45. pz_core/authoring/app_versions.py +814 -0
  46. pz_core/authoring/cli.py +192 -0
  47. pz_core/authoring/commands.py +1810 -0
  48. pz_core/authoring/conflicts.py +180 -0
  49. pz_core/authoring/dev_bindings.py +916 -0
  50. pz_core/authoring/dev_git.py +1087 -0
  51. pz_core/authoring/dev_import.py +1061 -0
  52. pz_core/authoring/dev_manifest.py +522 -0
  53. pz_core/authoring/dev_sources.py +1638 -0
  54. pz_core/authoring/env_cli.py +454 -0
  55. pz_core/authoring/files.py +109 -0
  56. pz_core/authoring/ide_projection.py +1129 -0
  57. pz_core/authoring/naming.py +58 -0
  58. pz_core/authoring/official_dev_sources.py +432 -0
  59. pz_core/authoring/official_sources.json +156 -0
  60. pz_core/authoring/orchestration_service.py +558 -0
  61. pz_core/authoring/project_default.jsonc +53 -0
  62. pz_core/authoring/project_defaults.py +88 -0
  63. pz_core/authoring/project_metadata_service.py +199 -0
  64. pz_core/authoring/project_settings_checks.py +51 -0
  65. pz_core/authoring/project_settings_cli.py +299 -0
  66. pz_core/authoring/project_settings_service.py +1700 -0
  67. pz_core/authoring/project_state.py +399 -0
  68. pz_core/authoring/publish_git.py +423 -0
  69. pz_core/authoring/publish_lock.py +188 -0
  70. pz_core/authoring/publish_source.py +195 -0
  71. pz_core/authoring/release.py +1382 -0
  72. pz_core/authoring/repo_keys.py +29 -0
  73. pz_core/authoring/root_cli.py +28 -0
  74. pz_core/authoring/scaffold_service.py +325 -0
  75. pz_core/authoring/sync_service.py +787 -0
  76. pz_core/authoring/templates/app/__init__.py +1 -0
  77. pz_core/authoring/templates/app/api.py +25 -0
  78. pz_core/authoring/templates/app/apps.py +31 -0
  79. pz_core/authoring/templates/app/auth_package_init.py +14 -0
  80. pz_core/authoring/templates/app/auth_readme.py +29 -0
  81. pz_core/authoring/templates/app/configs_package_init.py +14 -0
  82. pz_core/authoring/templates/app/default_env.py +18 -0
  83. pz_core/authoring/templates/app/default_jsonc.py +25 -0
  84. pz_core/authoring/templates/app/locales_readme.py +25 -0
  85. pz_core/authoring/templates/app/migrations_readme.py +19 -0
  86. pz_core/authoring/templates/app/models.py +14 -0
  87. pz_core/authoring/templates/app/package_init.py +8 -0
  88. pz_core/authoring/templates/app/pages_base.py +161 -0
  89. pz_core/authoring/templates/app/pages_readme.py +25 -0
  90. pz_core/authoring/templates/app/public.py +31 -0
  91. pz_core/authoring/templates/app/pyproject.py +77 -0
  92. pz_core/authoring/templates/app/readme.py +74 -0
  93. pz_core/authoring/templates/app/settings.py +46 -0
  94. pz_core/authoring/templates/app/static_app_js.py +24 -0
  95. pz_core/authoring/templates/app/static_readme.py +31 -0
  96. pz_core/authoring/templates/app/template_config_page.py +23 -0
  97. pz_core/authoring/templates/app/template_index_html.py +28 -0
  98. pz_core/authoring/templates/app/templates_readme.py +32 -0
  99. pz_core/authoring/templates/app/urls.py +36 -0
  100. pz_core/authoring/templates/app/views.py +36 -0
  101. pz_core/authoring/templates/project/__init__.py +1 -0
  102. pz_core/authoring/templates/project/agents.py +51 -0
  103. pz_core/authoring/templates/project/apps_container_readme.py +37 -0
  104. pz_core/authoring/templates/project/main_py.py +59 -0
  105. pz_core/authoring/templates/project/project_env.py +19 -0
  106. pz_core/authoring/templates/project/pyproject.py +26 -0
  107. pz_core/authoring/templates/project/pz_env_env.py +65 -0
  108. pz_core/authoring/templates/project/pz_env_jsonc.py +69 -0
  109. pz_core/authoring/templates/project/pz_jsonc.py +12 -0
  110. pz_core/authoring/templates/project/readme.py +94 -0
  111. pz_core/authoring/templates/project/root_gitkeep.py +8 -0
  112. pz_core/authoring/templates/shared/__init__.py +5 -0
  113. pz_core/authoring/templates/shared/text.py +10 -0
  114. pz_core/authoring/venv_service.py +87 -0
  115. pz_core/authoring/workspace.py +167 -0
  116. pz_core/cli.py +291 -0
  117. pz_core/cli_options.py +74 -0
  118. pz_core/core/__init__.py +3 -0
  119. pz_core/core/errors/__init__.py +5 -0
  120. pz_core/core/errors/models.py +117 -0
  121. pz_core/core/events/__init__.py +5 -0
  122. pz_core/core/events/registry.py +54 -0
  123. pz_core/core/extensions/__init__.py +51 -0
  124. pz_core/core/extensions/registry.py +790 -0
  125. pz_core/core/health/__init__.py +6 -0
  126. pz_core/core/health/contracts.py +10 -0
  127. pz_core/core/middlewares/__init__.py +6 -0
  128. pz_core/core/middlewares/models.py +24 -0
  129. pz_core/core/routing/__init__.py +5 -0
  130. pz_core/core/routing/models.py +21 -0
  131. pz_core/core/settings_contracts.py +25 -0
  132. pz_core/docs/README.md +20 -0
  133. pz_core/docs/distribution-README.md +438 -0
  134. pz_core/docs/pz/345/221/275/344/273/244/346/200/273/350/247/210.md +1011 -0
  135. 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
  136. 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
  137. 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
  138. 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
  139. 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
  140. 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
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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
  147. 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
  148. 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
  149. 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
  150. 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
  151. 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
  152. 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
  153. 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
  154. 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
  155. 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
  156. 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
  157. 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
  158. 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
  159. 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
  160. 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
  161. pz_core/docs/pz/350/247/204/350/214/203/344/270/216/344/275/277/347/224/250/README.md +98 -0
  162. 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
  163. 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
  164. 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
  165. 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
  166. 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
  167. 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
  168. 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
  169. 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
  170. 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
  171. 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
  172. 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
  173. pz_core/docs//345/217/221/347/211/210/345/211/215/346/270/205/345/215/225-4.0.11.md +84 -0
  174. pz_core/docs//346/226/260/346/211/213/346/214/207/345/215/227.md +422 -0
  175. pz_core/infra/__init__.py +17 -0
  176. pz_core/infra/db/__init__.py +23 -0
  177. pz_core/infra/db/contracts.py +73 -0
  178. pz_core/infra/health/__init__.py +5 -0
  179. pz_core/infra/health/contracts.py +8 -0
  180. pz_core/infra/kv/__init__.py +5 -0
  181. pz_core/infra/kv/contracts.py +17 -0
  182. pz_core/infra/observability/__init__.py +23 -0
  183. pz_core/infra/observability/contracts.py +142 -0
  184. pz_core/infra/resilience/__init__.py +5 -0
  185. pz_core/infra/resilience/contracts.py +17 -0
  186. pz_core/infra/resources/__init__.py +5 -0
  187. pz_core/infra/resources/contracts.py +16 -0
  188. pz_core/infra/settings/__init__.py +17 -0
  189. pz_core/infra/settings/models.py +81 -0
  190. pz_core/infra/storage/__init__.py +5 -0
  191. pz_core/infra/storage/ports.py +27 -0
  192. pz_core/project_root_commands.py +282 -0
  193. pz_core/project_runtime_cli.py +344 -0
  194. pz_core/project_sources.py +253 -0
  195. pz_core/pz_launcher.py +209 -0
  196. pz_core/root_cli.py +70 -0
  197. pz_core/runtime/__init__.py +229 -0
  198. pz_core/runtime/access.py +86 -0
  199. pz_core/runtime/adapters/__init__.py +5 -0
  200. pz_core/runtime/adapters/base.py +18 -0
  201. pz_core/runtime/asyncio_bridge.py +18 -0
  202. pz_core/runtime/bindings/__init__.py +5 -0
  203. pz_core/runtime/bindings/container.py +50 -0
  204. pz_core/runtime/cli/__init__.py +5 -0
  205. pz_core/runtime/cli/_args.py +67 -0
  206. pz_core/runtime/cli/app_commands.py +417 -0
  207. pz_core/runtime/cli/check.py +214 -0
  208. pz_core/runtime/cli/db.py +297 -0
  209. pz_core/runtime/cli/main.py +89 -0
  210. pz_core/runtime/cli/resources.py +280 -0
  211. pz_core/runtime/discovery.py +23 -0
  212. pz_core/runtime/environment_integrity.py +157 -0
  213. pz_core/runtime/errors.py +5 -0
  214. pz_core/runtime/events.py +87 -0
  215. pz_core/runtime/facades/__init__.py +38 -0
  216. pz_core/runtime/facades/_capabilities.py +46 -0
  217. pz_core/runtime/facades/cache.py +103 -0
  218. pz_core/runtime/facades/database.py +71 -0
  219. pz_core/runtime/facades/events.py +380 -0
  220. pz_core/runtime/facades/health.py +101 -0
  221. pz_core/runtime/facades/mail.py +121 -0
  222. pz_core/runtime/facades/observability.py +102 -0
  223. pz_core/runtime/facades/providers.py +75 -0
  224. pz_core/runtime/facades/resources.py +52 -0
  225. pz_core/runtime/facades/storage.py +296 -0
  226. pz_core/runtime/health/__init__.py +5 -0
  227. pz_core/runtime/health/service.py +102 -0
  228. pz_core/runtime/host.py +188 -0
  229. pz_core/runtime/host_runner.py +282 -0
  230. pz_core/runtime/http/__init__.py +20 -0
  231. pz_core/runtime/http/app.py +576 -0
  232. pz_core/runtime/http_timing.py +173 -0
  233. pz_core/runtime/invocation.py +29 -0
  234. pz_core/runtime/json_safe.py +47 -0
  235. pz_core/runtime/lifecycle/__init__.py +25 -0
  236. pz_core/runtime/lifecycle/manager.py +533 -0
  237. pz_core/runtime/plan.py +214 -0
  238. pz_core/runtime/plan_context.py +33 -0
  239. pz_core/runtime/plan_snapshot.py +177 -0
  240. pz_core/runtime/registries/__init__.py +27 -0
  241. pz_core/runtime/registries/capabilities.py +101 -0
  242. pz_core/runtime/registries/providers.py +396 -0
  243. pz_core/runtime/resource_assets.py +344 -0
  244. pz_core/runtime/run_cli.py +211 -0
  245. pz_core/runtime/settings.py +888 -0
  246. pz_core/runtime/worker/__init__.py +21 -0
  247. pz_core/runtime/worker/engine.py +921 -0
  248. pz_core/runtime/worker/runtime.py +25 -0
  249. pz_core/testing/__init__.py +15 -0
  250. pz_core/testing/doc_route_contracts.py +305 -0
  251. pz_core/utils/__init__.py +44 -0
  252. pz_core/utils/env.py +65 -0
  253. pz_core/utils/project_jsonc/__init__.py +29 -0
  254. pz_core/utils/project_jsonc/document.py +420 -0
  255. pz_core/utils/project_settings.py +99 -0
  256. pz_foundation/__init__.py +50 -0
  257. pz_foundation/_contracts.py +81 -0
  258. pz_foundation/_errors.py +34 -0
  259. pz_foundation/api.py +14 -0
  260. pz_foundation/apps.py +127 -0
  261. pz_foundation/auth/__init__.py +1 -0
  262. pz_foundation/cache_control.py +233 -0
  263. pz_foundation/cli/__init__.py +2 -0
  264. pz_foundation/cli/workers.py +565 -0
  265. pz_foundation/configs/__init__.py +0 -0
  266. pz_foundation/configs/default.env +15 -0
  267. pz_foundation/configs/default.jsonc +452 -0
  268. pz_foundation/db/__init__.py +94 -0
  269. pz_foundation/db/aerich_executor.py +664 -0
  270. pz_foundation/db/config.py +358 -0
  271. pz_foundation/db/connection_manager.py +689 -0
  272. pz_foundation/db/connection_probe.py +204 -0
  273. pz_foundation/db/database.py +1291 -0
  274. pz_foundation/db/deps.py +47 -0
  275. pz_foundation/db/lifecycle_status.py +85 -0
  276. pz_foundation/db/migrations.py +477 -0
  277. pz_foundation/db/mysql.py +57 -0
  278. pz_foundation/db/postgresql.py +409 -0
  279. pz_foundation/db/production_pool_fallback.py +143 -0
  280. pz_foundation/db/public.py +45 -0
  281. pz_foundation/db/session.py +369 -0
  282. pz_foundation/db/sqlite.py +15 -0
  283. pz_foundation/db/tortoise_manager.py +724 -0
  284. pz_foundation/db/tortoise_psycopg.py +148 -0
  285. pz_foundation/docs/README.md +18 -0
  286. pz_foundation/docs/distribution-README.md +319 -0
  287. 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
  288. 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
  289. pz_foundation/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +288 -0
  290. 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
  291. pz_foundation/health.py +105 -0
  292. pz_foundation/host/__init__.py +11 -0
  293. pz_foundation/host/builder.py +34 -0
  294. pz_foundation/host/cache_runtime.py +44 -0
  295. pz_foundation/host/db/__init__.py +17 -0
  296. pz_foundation/host/db/aerich_config.py +36 -0
  297. pz_foundation/host/db/config.py +106 -0
  298. pz_foundation/host/db/connection_manager.py +48 -0
  299. pz_foundation/host/db/deps.py +5 -0
  300. pz_foundation/host/db/orm_retry_patch.py +566 -0
  301. pz_foundation/host/db/request_adapter.py +325 -0
  302. pz_foundation/host/db/router.py +28 -0
  303. pz_foundation/host/db/session.py +284 -0
  304. pz_foundation/host/db/tortoise_manager.py +10 -0
  305. pz_foundation/host/idempotency.py +132 -0
  306. pz_foundation/host/lifespan.py +247 -0
  307. pz_foundation/host/redis_runtime.py +100 -0
  308. pz_foundation/host/web.py +790 -0
  309. pz_foundation/infra_provider.py +236 -0
  310. pz_foundation/kv/__init__.py +25 -0
  311. pz_foundation/kv/cache.py +1166 -0
  312. pz_foundation/kv/deps.py +84 -0
  313. pz_foundation/kv/public.py +25 -0
  314. pz_foundation/kv/redis_manager.py +1531 -0
  315. pz_foundation/lazy_exports.py +43 -0
  316. pz_foundation/lazy_imports.py +124 -0
  317. pz_foundation/lifecycle.py +392 -0
  318. pz_foundation/managed_workers.py +1117 -0
  319. pz_foundation/middlewares/__init__.py +26 -0
  320. pz_foundation/middlewares/_settings.py +250 -0
  321. pz_foundation/middlewares/analytics.py +124 -0
  322. pz_foundation/middlewares/cache_control.py +156 -0
  323. pz_foundation/middlewares/compression.py +202 -0
  324. pz_foundation/middlewares/cors.py +62 -0
  325. pz_foundation/middlewares/geo_country.py +44 -0
  326. pz_foundation/middlewares/inner_router.py +50 -0
  327. pz_foundation/middlewares/rate_limited/__init__.py +3 -0
  328. pz_foundation/middlewares/rate_limited/key_limiter.py +115 -0
  329. pz_foundation/middlewares/request_logging.py +104 -0
  330. pz_foundation/middlewares/route_owner.py +309 -0
  331. pz_foundation/middlewares/security_csrf.py +44 -0
  332. pz_foundation/middlewares/security_headers/__init__.py +4 -0
  333. pz_foundation/middlewares/security_headers/conflicts.py +44 -0
  334. pz_foundation/middlewares/security_headers/csp_nonce.py +200 -0
  335. pz_foundation/middlewares/security_headers/security_headers.py +44 -0
  336. pz_foundation/migrations/__init__.py +1 -0
  337. pz_foundation/migrations/pz_foundation/__init__.py +1 -0
  338. pz_foundation/models.py +22 -0
  339. pz_foundation/notifications/__init__.py +23 -0
  340. pz_foundation/notifications/email.py +542 -0
  341. pz_foundation/notifications/public.py +31 -0
  342. pz_foundation/observability/__init__.py +71 -0
  343. pz_foundation/observability/http.py +34 -0
  344. pz_foundation/observability/logger/__init__.py +49 -0
  345. pz_foundation/observability/logger/_bot_settings.py +126 -0
  346. pz_foundation/observability/logger/bot_message.py +592 -0
  347. pz_foundation/observability/logger/core.py +385 -0
  348. pz_foundation/observability/logger/delivery_audit.py +84 -0
  349. pz_foundation/observability/logger/feishu_bot.py +199 -0
  350. pz_foundation/observability/logger/telegram_bot.py +194 -0
  351. pz_foundation/observability/metrics.py +365 -0
  352. pz_foundation/observability/runtime.py +68 -0
  353. pz_foundation/public.py +405 -0
  354. pz_foundation/resources/__init__.py +12 -0
  355. pz_foundation/resources/builder.py +900 -0
  356. pz_foundation/resources/images.py +363 -0
  357. pz_foundation/root_cli.py +20 -0
  358. pz_foundation/routing/__init__.py +203 -0
  359. pz_foundation/routing/canonical.py +486 -0
  360. pz_foundation/routing/convertors.py +82 -0
  361. pz_foundation/routing/declarations.py +843 -0
  362. pz_foundation/routing/exports.py +148 -0
  363. pz_foundation/routing/loaders.py +138 -0
  364. pz_foundation/routing/manifest.py +215 -0
  365. pz_foundation/routing/manifest_provider.py +47 -0
  366. pz_foundation/routing/mounts.py +101 -0
  367. pz_foundation/routing/ordering.py +172 -0
  368. pz_foundation/routing/registry.py +133 -0
  369. pz_foundation/routing/utils.py +28 -0
  370. pz_foundation/runtime.py +234 -0
  371. pz_foundation/settings.py +253 -0
  372. pz_foundation/settings_normalization.py +130 -0
  373. pz_foundation/storage/__init__.py +25 -0
  374. pz_foundation/storage/local.py +209 -0
  375. pz_foundation/storage/public.py +106 -0
  376. pz_foundation/storage/s3.py +116 -0
  377. pz_foundation/storage/service.py +234 -0
  378. pz_foundation/urls.py +19 -0
  379. pz_foundation/utils/__init__.py +6 -0
  380. pz_foundation/utils/merge.py +160 -0
  381. pz_foundation/worker_replicas.py +55 -0
  382. pz_settings_center/__init__.py +5 -0
  383. pz_settings_center/api/__init__.py +5 -0
  384. pz_settings_center/api/runtime_overrides.py +360 -0
  385. pz_settings_center/apps.py +28 -0
  386. pz_settings_center/configs/__init__.py +0 -0
  387. pz_settings_center/configs/default.env +2 -0
  388. pz_settings_center/configs/default.jsonc +1 -0
  389. pz_settings_center/docs/01-settings_center/350/203/275/345/212/233/350/276/271/347/225/214.md +124 -0
  390. pz_settings_center/docs/README.md +12 -0
  391. pz_settings_center/docs/distribution-README.md +150 -0
  392. pz_settings_center/docs//350/256/276/350/256/241/346/226/207/346/241/243.md +48 -0
  393. pz_settings_center/integration_payload.py +18 -0
  394. pz_settings_center/project_helpers.py +405 -0
  395. pz_settings_center/public.py +139 -0
  396. pz_settings_center/routing_helpers.py +73 -0
  397. pz_settings_center/runtime_override_provider.py +61 -0
  398. pz_settings_center/typed_settings.py +324 -0
  399. pz_settings_center/urls.py +9 -0
@@ -0,0 +1 @@
1
+ from __future__ import annotations
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_api_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ from __future__ import annotations
10
+
11
+
12
+ # 最小健康检查接口示例。
13
+ async def healthz() -> dict[str, str]:
14
+ return {{"app": "{app_id}", "status": "ok"}}
15
+
16
+
17
+ # 最小业务 API 示例。
18
+ # 推荐让前端通过 AJAX 调用这类后端接口,而不是把业务逻辑塞进页面脚本里。
19
+ async def api_example() -> dict[str, str]:
20
+ return {{"app": "{app_id}", "message": "Use AJAX to talk to backend APIs."}}
21
+ """
22
+ )
23
+
24
+
25
+ __all__ = ["app_api_template"]
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_apps_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ from __future__ import annotations
10
+
11
+
12
+ class App:
13
+ id = "{app_id}"
14
+ name = "{app_id}"
15
+ version = "0.1.0"
16
+ required_pz = ">=5.0.0"
17
+ priority = 900
18
+
19
+ def extensions(self):
20
+ return ()
21
+
22
+
23
+ app = App()
24
+
25
+
26
+ __all__ = ["App", "app"]
27
+ """
28
+ )
29
+
30
+
31
+ __all__ = ["app_apps_template"]
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_auth_package_init_template() -> str:
7
+ return dedent(
8
+ '''\
9
+ """Reserved package for advanced auth registration logic."""
10
+ '''
11
+ )
12
+
13
+
14
+ __all__ = ["app_auth_package_init_template"]
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_auth_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} auth examples
10
+
11
+ This directory is reserved for advanced auth integration.
12
+
13
+ Nothing in this directory is imported or registered by default. The generated app exposes
14
+ `route_policy` through the project settings generated from `configs/default.jsonc`; the installed
15
+ formal auth owner consumes that runtime settings contract.
16
+
17
+ Only add Python modules here when `route_policy` is not expressive enough and the target auth owner
18
+ documents a formal registration protocol.
19
+
20
+ ```python
21
+ # Demo only. Do not import this from apps.py until an auth owner protocol requires it.
22
+ def example_policy_context(request):
23
+ return {{"owner_app": "{app_id}", "path": request.url.path}}
24
+ ```
25
+ """
26
+ )
27
+
28
+
29
+ __all__ = ["app_auth_readme_template"]
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_configs_package_init_template() -> str:
7
+ return dedent(
8
+ '''\
9
+ """Packaged app configuration defaults."""
10
+ '''
11
+ )
12
+
13
+
14
+ __all__ = ["app_configs_package_init_template"]
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_default_env_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # Secret placeholders for {app_id}.
10
+ # This file is git-trackable and is used by `pz settings init/update`
11
+ # to hydrate project `.env*` files.
12
+ # Put only schema-backed password, secret, token, or key placeholders here.
13
+ # Keep real values in project `.env`, `.env.develop`, `.env.test`, or `.env.product`.
14
+ """
15
+ )
16
+
17
+
18
+ __all__ = ["app_default_env_template"]
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_default_jsonc_template() -> str:
7
+ return dedent(
8
+ """\
9
+ {
10
+ "enabled": true,
11
+ "route_policy": {
12
+ "default_mode": "auth",
13
+ "auth_paths": [],
14
+ "public_paths": [],
15
+ "delegate_paths": [],
16
+ "auth_owner": null,
17
+ "public_owner": null,
18
+ "delegate_owner": null
19
+ }
20
+ }
21
+ """
22
+ )
23
+
24
+
25
+ __all__ = ["app_default_jsonc_template"]
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_locales_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} locale examples
10
+
11
+ Locale files are not registered by default. Add real locale resources only when the installed
12
+ i18n/locale owner documents the expected file name and schema.
13
+
14
+ Demo payload:
15
+
16
+ ```json
17
+ {{
18
+ "hello": "Hello from {app_id}"
19
+ }}
20
+ ```
21
+ """
22
+ )
23
+
24
+
25
+ __all__ = ["app_locales_readme_template"]
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_migrations_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} migrations
10
+
11
+ This package owns database migrations for `{app_id}`.
12
+
13
+ No migration is registered by default. Add migration files only after the app declares real models
14
+ and the project needs a schema change.
15
+ """
16
+ )
17
+
18
+
19
+ __all__ = ["app_migrations_readme_template"]
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_models_template() -> str:
7
+ return dedent(
8
+ """\
9
+ from __future__ import annotations
10
+ """
11
+ )
12
+
13
+
14
+ __all__ = ["app_models_template"]
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ def app_package_init_template() -> str:
5
+ return ""
6
+
7
+
8
+ __all__ = ["app_package_init_template"]
@@ -0,0 +1,161 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_pages_base_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ {{
10
+ // 根默认层:资源合并后对应 pages/base.jsonc。
11
+ // 覆盖顺序是 pages/base.jsonc < pages/{app_id}/base.jsonc < pages/{app_id}/key.jsonc。
12
+ // 另外,资源覆盖是文件级覆盖;多个 app 提供同一相对路径时,installed_apps 中靠后的 app 覆盖靠前的同名文件。
13
+ "api_version": "page_center.base.v1",
14
+ // kind=base 表示这里只提供页面默认值,不会被当作具体页面注册。
15
+ "kind": "base",
16
+ // owner_app 固定为当前最小子包 app_id,用于审计来源;不是第二套页面命名空间字段。
17
+ "owner_app": "{app_id}",
18
+ // 默认语言:具体页面没有覆盖时继承这里的语言控制面。
19
+ "default_language": "en",
20
+ // Page Center 页面必须声明支持语言;具体页面可在页面层覆盖。
21
+ "page_supported_language": ["en"],
22
+ // 根默认层不声明默认关键词,避免所有页面误继承同一个发布级关键词。
23
+ "default_term": null,
24
+ // 根默认层不提供公开路由词;具体页面应在 pages/{app_id}/key.jsonc 中声明 slug。
25
+ "slug": "",
26
+ // 当前层不允许后续同路径页面覆盖;具体页面可按需要显式改为 true。
27
+ "route_allow_override": false,
28
+ // 兜底模板名:命名空间 base 或具体页面通常会覆盖它。
29
+ "template_name": "{app_id}_index",
30
+ // 根默认层只放确实要影响所有页面的通用 bundle。
31
+ "translation_bundles": [],
32
+ "localized": {{
33
+ "en": {{
34
+ // 默认语言变体占位;具体页面应覆盖成真实页面关键词。
35
+ "term": "base",
36
+ "synonyms": []
37
+ }}
38
+ }},
39
+ // seo.provider/sitemap_provider 为 null 表示本层不提供 provider 默认值,由下层或运行时策略决定。
40
+ "seo": {{
41
+ "provider": null
42
+ }},
43
+ "sitemap_provider": null,
44
+ // nav 属于页面展示默认配置;默认 dict 会深合并,所以下层如果要把 nav 当作完整配置替换根默认层,
45
+ // 应在对应 page_config 层声明编译期指令:
46
+ // "$merge": {{"replace_paths": ["nav"]}}
47
+ // 如果 replace 树里还要保留局部深合并,可补更深的 deep_merge_paths,例如 "nav.collapse"。
48
+ // $merge 只参与 page_config 编译,不进入 runtime 页面配置。
49
+ "nav": {{
50
+ "items": [],
51
+ // collapse 是可选的桌面 nav SSR/CSS 溢出折叠计划:导航容器变窄时,把顶层 nav item 移入 More 下拉。
52
+ // 它只影响展示,不改变路由、SEO、sitemap,也不由前端 JS 在运行时重新测量或重排。
53
+ "collapse": {{
54
+ "defaults": {{
55
+ // breakpoints 使用 nav 容器宽度;第 N 个断点会折叠 order 中前 N 个 item。
56
+ "breakpoints": [980, 860, 760],
57
+ // order 使用 nav.items[].id 去掉 # 后的 key;留空时 site_ui 会从右到左折叠。
58
+ // nav.items 为空时没有可折叠项;添加多个 nav item 后可按需要填写。
59
+ "order": []
60
+ }},
61
+ // 需要按语言调整折叠计划时,在这里写对应语言覆盖,例如 zh-CN / ja。
62
+ "langs": {{}}
63
+ }}
64
+ }}
65
+ }}
66
+ """
67
+ )
68
+
69
+
70
+ def app_pages_namespace_base_template(app_id: str) -> str:
71
+ return dedent(
72
+ f"""\
73
+ {{
74
+ // 命名空间默认层:资源合并后对应 pages/{app_id}/base.jsonc。
75
+ // 覆盖顺序是 pages/base.jsonc < pages/{app_id}/base.jsonc < pages/{app_id}/key.jsonc。
76
+ // 这一层只放 {app_id} 命名空间下所有页面共享的默认值。
77
+ "api_version": "page_center.base.v1",
78
+ "kind": "base",
79
+ // 如果本层要把某个 dict 路径作为完整配置替换根默认层,可在这里声明编译期 $merge。
80
+ // 示例: "$merge": {{"replace_paths": ["nav"]}}
81
+ // 需要排除 replace 树里的更深路径时,用 deep_merge_paths,例如 "nav.collapse"。
82
+ // $merge 只控制 page_config 层叠加,不进入 runtime 页面配置。
83
+ "owner_app": "{app_id}",
84
+ // 继承或覆盖根默认层的默认语言。
85
+ "default_language": "en",
86
+ // 命名空间内默认只发布英文页面;具体页面可显式扩展。
87
+ "page_supported_language": ["en"],
88
+ // 命名空间默认层仍不声明发布级关键词,避免具体页面误继承。
89
+ "default_term": null,
90
+ // 命名空间的基础 route token;长尾/导流页没有 path_segments 时可作为父级 token fallback。
91
+ "slug": "{app_id.replace('_', '-')}",
92
+ "route_allow_override": false,
93
+ // 当前命名空间默认模板;具体页面可以覆盖为自己的 template_name。
94
+ "template_name": "{app_id}_index",
95
+ // 命名空间通用页面 bundle 放这里;单页 bundle 放具体页面文件。
96
+ "translation_bundles": [],
97
+ "localized": {{
98
+ "en": {{
99
+ "term": "{app_id.replace('_', ' ')}",
100
+ "synonyms": []
101
+ }}
102
+ }},
103
+ "seo": {{
104
+ "provider": null
105
+ }},
106
+ "sitemap_provider": null
107
+ }}
108
+ """
109
+ )
110
+
111
+
112
+ def app_pages_key_template(app_id: str) -> str:
113
+ slug = app_id.replace("_", "-")
114
+ term = app_id.replace("_", " ")
115
+ return dedent(
116
+ f"""\
117
+ {{
118
+ // 具体页面层:资源合并后对应 pages/{app_id}/key.jsonc。
119
+ // 覆盖顺序是 pages/base.jsonc < pages/{app_id}/base.jsonc < pages/{app_id}/key.jsonc。
120
+ // 复制本文件新增页面时,把文件名 key.jsonc、default_term、slug 和 localized.*.term 改成真实页面值。
121
+ "api_version": "page_center.page.v1",
122
+ // kind=page 表示这是会被 Page Center 编译、注册路由、进入 SEO/Sitemap 投影的正式页面声明。
123
+ "kind": "page",
124
+ "owner_app": "{app_id}",
125
+ // 默认语言决定默认语言 canonical 与自动 alias 的生成方向。
126
+ "default_language": "en",
127
+ // 当前页面只声明英文版本。
128
+ "page_supported_language": ["en"],
129
+ // 默认关键词是发布级字段;它不参与 URL 拼接,但会参与自动 alias 与 SEO 语义。
130
+ "default_term": "{term}",
131
+ // slug 是所有语言共享的正式 URL token。
132
+ "slug": "{slug}",
133
+ // 为空表示普通承接页;导流/长尾页可声明父级路径段,例如 ["{slug}"]。
134
+ "path_segments": [],
135
+ // 允许后安装 app 或后声明页面覆盖同一路由时才设为 true。
136
+ "route_allow_override": false,
137
+ // 必须能在 template_config/{app_id}/{app_id}_index.json 找到同名模板声明,否则 Page Center 编译会失败。
138
+ "template_name": "{app_id}_index",
139
+ // 单页特有翻译 bundle 放这里;命名空间通用 bundle 放 pages/{app_id}/base.jsonc。
140
+ "translation_bundles": [],
141
+ "seo": {{
142
+ "provider": null
143
+ }},
144
+ "sitemap_provider": null,
145
+ "localized": {{
146
+ "en": {{
147
+ // 当前语言真实关键词;不要再写 primary_keyword。
148
+ "term": "{term}",
149
+ "synonyms": []
150
+ }}
151
+ }}
152
+ }}
153
+ """
154
+ )
155
+
156
+
157
+ __all__ = [
158
+ "app_pages_base_template",
159
+ "app_pages_key_template",
160
+ "app_pages_namespace_base_template",
161
+ ]
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_pages_readme_template(app_id: str) -> str:
7
+ return dedent(
8
+ f"""\
9
+ # {app_id} page declarations
10
+
11
+ `pages/` is the formal source of page declarations for `pz_page_center`.
12
+
13
+ Authoring rules:
14
+
15
+ - Put page declarations here, not in `settings.py` or `configs/default.jsonc`.
16
+ - Treat `pages/` as the page-configuration namespace for this app.
17
+ - Merge order is `pages/base.jsonc` < `pages/{app_id}/base.jsonc` < `pages/{app_id}/key.jsonc`.
18
+ - Resource override is file-level: if multiple apps provide the same relative path, the later app in `installed_apps` wins.
19
+ - Use `base.jsonc` for root defaults, `{app_id}/base.jsonc` for app namespace defaults, then override per page file.
20
+ - Keep templates and static assets in `templates/` and `static/`; `pages/` stores declaration data only.
21
+ """
22
+ )
23
+
24
+
25
+ __all__ = ["app_pages_readme_template"]
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_public_template() -> str:
7
+ return dedent(
8
+ """\
9
+ from __future__ import annotations
10
+
11
+ from fastapi import FastAPI
12
+
13
+
14
+ # `mount(...)` 示例使用的最小子应用工厂。
15
+ # 需要挂载独立后台、代理应用或单独生命周期子应用时,可以按这个形式提供 app factory。
16
+ def create_demo_mount_app() -> FastAPI:
17
+ app = FastAPI()
18
+
19
+ @app.get("/healthz")
20
+ async def healthz() -> dict[str, str]:
21
+ return {"status": "ok", "source": "mounted-demo"}
22
+
23
+ return app
24
+
25
+
26
+ __all__ = ["create_demo_mount_app"]
27
+ """
28
+ )
29
+
30
+
31
+ __all__ = ["app_public_template"]
@@ -0,0 +1,77 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_pyproject_template(app_id: str) -> str:
7
+ distribution = app_id.replace("_", "-")
8
+ return dedent(
9
+ f"""\
10
+ [build-system]
11
+ requires = ["setuptools>=69", "wheel"]
12
+ build-backend = "setuptools.build_meta"
13
+
14
+ [project]
15
+ name = "{distribution}"
16
+ version = "0.1.0"
17
+ description = "{app_id} local minimal package"
18
+ readme = "README.md"
19
+ requires-python = ">=3.11"
20
+ dependencies = [
21
+ "fastapi>=0.110,<1.0",
22
+ "pydantic>=2.10,<3.0",
23
+ "pz-cli==5.0.0",
24
+ ]
25
+
26
+ [dependency-groups]
27
+ dev = [
28
+ "pytest>=8.4,<9",
29
+ ]
30
+
31
+ [tool.setuptools]
32
+ include-package-data = true
33
+ package-dir = {{ "" = "." }}
34
+ packages = [
35
+ "{app_id}",
36
+ "{app_id}.auth",
37
+ "{app_id}.configs",
38
+ "{app_id}.pages",
39
+ "{app_id}.template_config",
40
+ "{app_id}.template_config.{app_id}",
41
+ "{app_id}.templates",
42
+ "{app_id}.templates.{app_id}",
43
+ "{app_id}.static",
44
+ "{app_id}.static.{app_id}",
45
+ "{app_id}.locales",
46
+ "{app_id}.migrations",
47
+ "{app_id}.migrations.{app_id}",
48
+ ]
49
+
50
+ [tool.setuptools.package-data]
51
+ "*" = [
52
+ "*.md",
53
+ "*.env",
54
+ "*.json",
55
+ "*.jsonc",
56
+ "*.html",
57
+ "*.js",
58
+ "*.css",
59
+ "*.txt",
60
+ "*.yaml",
61
+ "*.yml",
62
+ "**/*.md",
63
+ "**/*.env",
64
+ "**/*.json",
65
+ "**/*.jsonc",
66
+ "**/*.html",
67
+ "**/*.js",
68
+ "**/*.css",
69
+ "**/*.txt",
70
+ "**/*.yaml",
71
+ "**/*.yml",
72
+ ]
73
+ """
74
+ )
75
+
76
+
77
+ __all__ = ["app_pyproject_template"]
@@ -0,0 +1,74 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_readme_template(app_id: str) -> str:
7
+ distribution = app_id.replace("_", "-")
8
+ return dedent(
9
+ f"""\
10
+ # {app_id}
11
+
12
+ 这个最小子包由 `pz startapp` 生成。
13
+
14
+ ## 文件结构
15
+
16
+ - `pyproject.toml`:`{distribution}` 的最小分发元数据
17
+ - `{app_id}/apps.py`:app 声明与正式扩展入口
18
+ - `{app_id}/urls.py`:本 app 的 URL 真相源
19
+ - `{app_id}/models.py`:MVC 心智下的数据模型入口
20
+ - `{app_id}/views.py`:页面入口函数与控制器职责
21
+ - `{app_id}/api.py`:后端 API 入口函数
22
+ - `{app_id}/pages/`:页面声明目录,由 `pz_page_center` 编译
23
+ - `{app_id}/pages/base.jsonc`:页面根默认声明
24
+ - `{app_id}/pages/{app_id}/base.jsonc`:本 app 页面命名空间默认声明
25
+ - `{app_id}/pages/{app_id}/key.jsonc`:具体页面声明示例
26
+ - `{app_id}/template_config/{app_id}/{app_id}_index.json`:Page Center 模板声明示例
27
+ - `{app_id}/templates/`、`{app_id}/static/`:MVC 心智下的展示层资源目录
28
+ - `{app_id}/templates/{app_id}/index.html`:页面模板示例
29
+ - `{app_id}/static/{app_id}/app.js`:AJAX + API 交互示例脚本
30
+ - `{app_id}/configs/default.jsonc`:本 app 的默认配置模板,只服务 `pz settings init/update`
31
+ - `{app_id}/configs/default.env`:本 app 的密钥/密码/令牌/Key 占位模板
32
+ - `{app_id}/locales/`:预留语言资源目录;默认只放 demo 说明
33
+ - `{app_id}/settings.py`:正式 `<app>.settings` 声明入口
34
+ - `{app_id}/public.py`:对外稳定公开面
35
+ - `{app_id}/auth/`:预留的 auth 注册包;默认只放未注册 demo 说明,仅在需要超出 `route_policy` 表达力的高级 auth 扩展时使用
36
+
37
+ ## 日常开发入口
38
+
39
+ - 大多数代码修改都应发生在 `{app_id}/` 目录内。
40
+ - URL 声明从 `{app_id}/urls.py` 开始看,配置声明从 `{app_id}/settings.py` 开始看,默认配置模板从 `{app_id}/configs/default.jsonc` 开始看,密钥占位模板从 `{app_id}/configs/default.env` 开始看。
41
+ - 页面开发默认遵循 MVC 心智:`models.py` 管数据模型,`templates/` / `static/` 管展示,`views.py` 承担页面入口函数与控制器职责,`api.py` 承担后端 API 入口。
42
+ - 页面声明从 `{app_id}/pages/` 开始看;页面默认值按 `{app_id}/pages/base.jsonc` < `{app_id}/pages/{app_id}/base.jsonc` < `{app_id}/pages/{app_id}/key.jsonc` 叠加。
43
+ - 如果要写一个最小可运行示例,可以先看 `{app_id}/urls.py`、`{app_id}/views.py`、`{app_id}/api.py`、`{app_id}/pages/{app_id}/key.jsonc`、`{app_id}/template_config/{app_id}/{app_id}_index.json`、`{app_id}/templates/{app_id}/index.html` 和 `{app_id}/static/{app_id}/app.js`。
44
+ - `{app_id}/apps.py` 只负责 app 元信息与正式扩展声明。
45
+ - `{app_id}/public.py` 是跨 app 调用时唯一稳定公开面。
46
+ - `{app_id}/auth/` 默认只是保留位;不要在还没形成正式高级 auth 规则前往里面堆私有逻辑。
47
+ - 只有在分发元数据或依赖确实变化时,才修改 `pyproject.toml`。
48
+
49
+ ## 重要约定
50
+
51
+ - host 装配保持在项目根 `main.py` 与正式 host 扩展里,不在这个 app 内重复造壳。
52
+ - `urls.py` 是本 app 唯一正式 URL 声明文件,只放 Django 风格的 `urlpatterns` 声明。
53
+ - `urls.py` 不负责构建路由;具体路由构建与绑定由 `pz_foundation.routing` 统一编译。
54
+ - `urls.py` 里的 `path(...)` 用于声明当前 app 自己提供的普通 HTTP 路由,`mount(...)` 用于声明需要挂载的独立子应用。
55
+ - 页面入口函数放到 `views.py`,后端 API 入口函数放到 `api.py`。
56
+ - `pages/` 保留给页面声明目录;不要再把页面入口实现文件命名成 `pages.py`。
57
+ - 默认配置模板放在 `configs/default.jsonc`,只用于 `pz settings init/update` 生成或补全项目 `pz*.jsonc`。
58
+ - `configs/default.env` 只放 schema 已声明的密钥/密码/令牌/Key 占位符;它只用于 `pz settings init/update` 生成项目 `.env*`,不是启动期配置来源。
59
+ - `pages/` 是页面声明真相源;页面配置命名空间由 `owner_app + 页面相对路径` 确定。
60
+ - `pages/base.jsonc`、`pages/{app_id}/base.jsonc` 只放页面默认声明,不在里面塞业务运行逻辑;具体页面字段放到 `pages/{app_id}/key.jsonc` 或其它具体页面文件。
61
+ - 页面资源覆盖是文件级覆盖;多个 app 提供同一相对路径时,`installed_apps` 中靠后的 app 覆盖靠前的同名文件。
62
+ - `templates/{app_id}/index.html` 与 `static/{app_id}/app.js` 是 authoring demo;只有被 `pages/{app_id}/key.jsonc` 和 `template_config/{app_id}/{app_id}_index.json` 引用时才进入 Page Center 页面链路。
63
+ - `templates/README.md`、`static/README.md`、`locales/README.md` 都只是 demo;默认不会自动渲染或加载。
64
+ - `settings.py` 只负责 schema、校验、normalize 与 runtime override metadata,import 阶段不得读取包内默认模板或项目 `.env*`。
65
+ - 新 app 默认预留 `route_policy` 配置块与 `auth/` 空包;具体认证实现由已安装的正式 auth owner 消费该配置。
66
+ - 只要 `AppSettings` 声明了 `route_policy`,正式 settings runtime owner 就可以把它纳入可治理 URL 规则。
67
+ - 运行时代码通过 `settings_center.settings.{app_id}.<field>` 读配置,不直接从 `settings.py` 取值。
68
+ - 不要在这个 app 里创建本地 FastAPI host shell。
69
+ - 前端默认只负责展示与局部增强;数据交互优先走 AJAX + 后端 API。
70
+ """
71
+ )
72
+
73
+
74
+ __all__ = ["app_readme_template"]
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from ..shared import dedent
4
+
5
+
6
+ def app_settings_template() -> str:
7
+ return dedent(
8
+ """\
9
+ from __future__ import annotations
10
+
11
+ from typing import Literal
12
+
13
+ from pydantic import BaseModel, Field
14
+
15
+
16
+ class RoutePolicySettings(BaseModel):
17
+ default_mode: Literal["auth", "public"] = "auth"
18
+ auth_paths: tuple[str, ...] = ()
19
+ public_paths: tuple[str, ...] = ()
20
+ delegate_paths: tuple[str, ...] = ()
21
+ auth_owner: str | None = None
22
+ public_owner: str | None = None
23
+ delegate_owner: str | None = None
24
+
25
+
26
+ class AppSettings(BaseModel):
27
+ enabled: bool
28
+ route_policy: RoutePolicySettings = Field(default_factory=RoutePolicySettings)
29
+
30
+ __runtime_overrides__ = {
31
+ "enabled": {"mode": "live", "label": "启用开关"},
32
+ "route_policy": {
33
+ "type": dict,
34
+ "mode": "live",
35
+ "label": "认证路由规则",
36
+ "description": "默认整包受保护;只在这里声明公开例外、强制保护、delegate 路径或 owner 覆盖。该字段会自动进入 settings runtime owner。",
37
+ },
38
+ }
39
+
40
+
41
+ __all__ = ["AppSettings"]
42
+ """
43
+ )
44
+
45
+
46
+ __all__ = ["app_settings_template"]