FastAPI-fastkit 1.2.1__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/PKG-INFO +8 -5
  2. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/README.md +7 -4
  3. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/pyproject.toml +1 -1
  4. fastapi_fastkit-1.3.0/src/fastapi_fastkit/__init__.py +1 -0
  5. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/inspector.py +153 -32
  6. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/interactive/__init__.py +2 -0
  7. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/interactive/config_builder.py +21 -2
  8. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/interactive/prompts.py +52 -1
  9. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/interactive/selectors.py +10 -0
  10. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/main.py +79 -6
  11. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/factory.py +1 -1
  12. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/pdm_manager.py +3 -3
  13. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/poetry_manager.py +3 -3
  14. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/uv_manager.py +3 -3
  15. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/project_builder/__init__.py +3 -0
  16. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/project_builder/config_generator.py +17 -10
  17. fastapi_fastkit-1.3.0/src/fastapi_fastkit/backend/project_builder/preset_layout.py +203 -0
  18. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/transducer.py +0 -1
  19. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/cli.py +77 -32
  20. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/core/settings.py +16 -0
  21. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/README.md +139 -0
  22. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/pyproject.toml-tpl +4 -1
  23. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/pyproject.toml-tpl +4 -1
  24. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/pyproject.toml-tpl +4 -1
  25. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/pyproject.toml-tpl +4 -1
  26. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/.env-tpl +2 -0
  27. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/.gitignore-tpl +31 -0
  28. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/README.md-tpl +128 -0
  29. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/pyproject.toml-tpl +70 -0
  30. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/requirements.txt-tpl +11 -0
  31. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/scripts/lint.sh-tpl +6 -0
  32. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/scripts/run-server.sh-tpl +8 -0
  33. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/scripts/test.sh-tpl +6 -0
  34. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/health.py-tpl +11 -0
  35. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/router.py-tpl +12 -0
  36. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/core/config.py-tpl +49 -0
  37. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/db/memory.py-tpl +48 -0
  38. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/__init__.py-tpl +9 -0
  39. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/models.py-tpl +17 -0
  40. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/repository.py-tpl +48 -0
  41. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/router.py-tpl +59 -0
  42. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/schemas.py-tpl +23 -0
  43. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/service.py-tpl +52 -0
  44. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/main.py-tpl +25 -0
  45. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/conftest.py-tpl +24 -0
  46. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/test_health.py-tpl +11 -0
  47. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/test_items.py-tpl +77 -0
  48. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/README.md-tpl +2 -2
  49. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/pyproject.toml-tpl +4 -1
  50. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl +4 -1
  51. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/pyproject.toml-tpl +4 -1
  52. fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/format.sh-tpl +5 -0
  53. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/pyproject.toml-tpl +4 -1
  54. fastapi_fastkit-1.3.0/src/fastapi_fastkit/py.typed +0 -0
  55. fastapi_fastkit-1.3.0/src/fastapi_fastkit/utils/__init__.py +0 -0
  56. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/utils/main.py +73 -6
  57. fastapi_fastkit-1.3.0/tests/__init__.py +0 -0
  58. fastapi_fastkit-1.3.0/tests/test_backends/__init__.py +0 -0
  59. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_inspector.py +261 -15
  60. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_interactive_config_builder.py +44 -3
  61. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_interactive_prompts.py +88 -3
  62. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_interactive_selectors.py +90 -3
  63. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_interactive_validators.py +0 -1
  64. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_main.py +189 -0
  65. fastapi_fastkit-1.3.0/tests/test_backends/test_preset_layout.py +224 -0
  66. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_project_builder_config_generator.py +29 -2
  67. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_project_builder_dependency_collector.py +0 -1
  68. fastapi_fastkit-1.3.0/tests/test_cli_operations/__init__.py +0 -0
  69. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_cli_operations/test_cli.py +23 -3
  70. fastapi_fastkit-1.3.0/tests/test_cli_operations/test_cli_interactive_integration.py +639 -0
  71. fastapi_fastkit-1.3.0/tests/test_rich/__init__.py +0 -0
  72. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_rich/test_rich.py +3 -6
  73. fastapi_fastkit-1.3.0/tests/test_templates/__init__.py +0 -0
  74. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_templates/test_all_templates.py +71 -2
  75. fastapi_fastkit-1.3.0/tests/test_templates/test_domain_starter_e2e.py +293 -0
  76. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_utils.py +145 -3
  77. fastapi_fastkit-1.2.1/src/fastapi_fastkit/__init__.py +0 -1
  78. fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/README.md +0 -90
  79. fastapi_fastkit-1.2.1/tests/test_cli_operations/test_cli_interactive_integration.py +0 -282
  80. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/LICENSE +0 -0
  81. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/__main__.py +0 -0
  82. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/__init__.py +0 -0
  83. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/interactive/validators.py +0 -0
  84. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/__init__.py +0 -0
  85. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/base.py +0 -0
  86. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/package_managers/pip_manager.py +0 -0
  87. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/backend/project_builder/dependency_collector.py +0 -0
  88. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/core/__init__.py +0 -0
  89. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/core/exceptions.py +0 -0
  90. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md +0 -0
  91. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/__init__.py +0 -0
  92. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.env-tpl +0 -0
  93. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.gitignore-tpl +0 -0
  94. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/README.md-tpl +0 -0
  95. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/requirements.txt-tpl +0 -0
  96. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/format.sh-tpl +0 -0
  97. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/lint.sh-tpl +0 -0
  98. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/run-server.sh-tpl +0 -0
  99. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/test.sh-tpl +0 -0
  100. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.cfg-tpl +0 -0
  101. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.py-tpl +0 -0
  102. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/__init__.py-tpl +0 -0
  103. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/__init__.py-tpl +0 -0
  104. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/api.py-tpl +0 -0
  105. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/routes/__init__.py-tpl +0 -0
  106. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/routes/items.py-tpl +0 -0
  107. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/core/__init__.py-tpl +0 -0
  108. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/core/config.py-tpl +0 -0
  109. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/crud/__init__.py-tpl +0 -0
  110. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/crud/items.py-tpl +0 -0
  111. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/main.py-tpl +0 -0
  112. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/mocks/__init__.py-tpl +0 -0
  113. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/mocks/mock_items.json-tpl +0 -0
  114. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/schemas/__init__.py-tpl +0 -0
  115. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/schemas/items.py-tpl +0 -0
  116. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/__init__.py-tpl +0 -0
  117. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/conftest.py-tpl +0 -0
  118. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/test_items.py-tpl +0 -0
  119. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.env-tpl +0 -0
  120. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.gitignore-tpl +0 -0
  121. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/README.md-tpl +0 -0
  122. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/requirements.txt-tpl +0 -0
  123. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/format.sh-tpl +0 -0
  124. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/lint.sh-tpl +0 -0
  125. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/run-server.sh-tpl +0 -0
  126. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/test.sh-tpl +0 -0
  127. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.cfg-tpl +0 -0
  128. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.py-tpl +0 -0
  129. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/__init__.py-tpl +0 -0
  130. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/__init__.py-tpl +0 -0
  131. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/api.py-tpl +0 -0
  132. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/routes/__init__.py-tpl +0 -0
  133. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/routes/items.py-tpl +0 -0
  134. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/core/__init__.py-tpl +0 -0
  135. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/core/config.py-tpl +0 -0
  136. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/crud/__init__.py-tpl +0 -0
  137. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/crud/items.py-tpl +0 -0
  138. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/__init__.py-tpl +0 -0
  139. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/exceptions.py-tpl +0 -0
  140. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/pagination.py-tpl +0 -0
  141. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/main.py-tpl +0 -0
  142. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/mocks/__init__.py-tpl +0 -0
  143. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/mocks/mock_items.json-tpl +0 -0
  144. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/__init__.py-tpl +0 -0
  145. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/base.py-tpl +0 -0
  146. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/items.py-tpl +0 -0
  147. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/utils/__init__.py-tpl +0 -0
  148. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/utils/documents.py-tpl +0 -0
  149. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/__init__.py-tpl +0 -0
  150. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/conftest.py-tpl +0 -0
  151. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/test_items.py-tpl +0 -0
  152. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.env-tpl +0 -0
  153. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.gitignore-tpl +0 -0
  154. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl +0 -0
  155. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/requirements.txt-tpl +0 -0
  156. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/format.sh-tpl +0 -0
  157. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/lint.sh-tpl +0 -0
  158. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/run-server.sh-tpl +0 -0
  159. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/test.sh-tpl +0 -0
  160. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.cfg-tpl +0 -0
  161. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.py-tpl +0 -0
  162. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/__init__.py-tpl +0 -0
  163. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/__init__.py-tpl +0 -0
  164. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/api.py-tpl +0 -0
  165. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/routes/__init__.py-tpl +0 -0
  166. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/routes/items.py-tpl +0 -0
  167. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/__init__.py-tpl +0 -0
  168. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/config.py-tpl +0 -0
  169. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/__init__.py-tpl +0 -0
  170. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/items.py-tpl +0 -0
  171. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/main.py-tpl +0 -0
  172. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/__init__.py-tpl +0 -0
  173. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/mock_items.json-tpl +0 -0
  174. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/__init__.py-tpl +0 -0
  175. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/items.py-tpl +0 -0
  176. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/__init__.py-tpl +0 -0
  177. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/conftest.py-tpl +0 -0
  178. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/test_items.py-tpl +0 -0
  179. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.env-tpl +0 -0
  180. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.gitignore-tpl +0 -0
  181. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/Dockerfile-tpl +0 -0
  182. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/README.md-tpl +0 -0
  183. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/requirements.txt-tpl +0 -0
  184. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/format.sh-tpl +0 -0
  185. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/lint.sh-tpl +0 -0
  186. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/run-server.sh-tpl +0 -0
  187. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/test.sh-tpl +0 -0
  188. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.cfg-tpl +0 -0
  189. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.py-tpl +0 -0
  190. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/__init__.py-tpl +0 -0
  191. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/__init__.py-tpl +0 -0
  192. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/api.py-tpl +0 -0
  193. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/routes/__init__.py-tpl +0 -0
  194. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/routes/items.py-tpl +0 -0
  195. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/core/__init__.py-tpl +0 -0
  196. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/core/config.py-tpl +0 -0
  197. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/crud/__init__.py-tpl +0 -0
  198. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/crud/items.py-tpl +0 -0
  199. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/main.py-tpl +0 -0
  200. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/mocks/__init__.py-tpl +0 -0
  201. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/mocks/mock_items.json-tpl +0 -0
  202. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/schemas/__init__.py-tpl +0 -0
  203. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/schemas/items.py-tpl +0 -0
  204. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/__init__.py-tpl +0 -0
  205. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/conftest.py-tpl +0 -0
  206. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/test_items.py-tpl +0 -0
  207. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter}/scripts/format.sh-tpl +0 -0
  208. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-empty → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter}/src/__init__.py-tpl +0 -0
  209. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/core → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app}/__init__.py-tpl +0 -0
  210. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api}/__init__.py-tpl +0 -0
  211. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/core}/__init__.py-tpl +0 -0
  212. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/db}/__init__.py-tpl +0 -0
  213. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/routes → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains}/__init__.py-tpl +0 -0
  214. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests}/__init__.py-tpl +0 -0
  215. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.env-tpl +0 -0
  216. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.gitignore-tpl +0 -0
  217. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/requirements.txt-tpl +0 -0
  218. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.cfg-tpl +0 -0
  219. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.py-tpl +0 -0
  220. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/crud → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src}/__init__.py-tpl +0 -0
  221. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/schemas → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/core}/__init__.py-tpl +0 -0
  222. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/core/config.py-tpl +0 -0
  223. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/main.py-tpl +0 -0
  224. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests}/__init__.py-tpl +0 -0
  225. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/conftest.py-tpl +0 -0
  226. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/test_main.py-tpl +0 -0
  227. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl +0 -0
  228. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl +0 -0
  229. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl +0 -0
  230. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/format.sh-tpl +0 -0
  231. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/lint.sh-tpl +0 -0
  232. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/run-server.sh-tpl +0 -0
  233. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/test.sh-tpl +0 -0
  234. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl +0 -0
  235. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.py-tpl +0 -0
  236. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/__init__.py-tpl +0 -0
  237. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/__init__.py-tpl +0 -0
  238. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/api.py-tpl +0 -0
  239. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/__init__.py-tpl +0 -0
  240. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl +0 -0
  241. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/items.py-tpl +0 -0
  242. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/__init__.py-tpl +0 -0
  243. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl +0 -0
  244. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/__init__.py-tpl +0 -0
  245. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl +0 -0
  246. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/main.py-tpl +0 -0
  247. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp/__init__.py-tpl +0 -0
  248. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp/router.py-tpl +0 -0
  249. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/schemas/__init__.py-tpl +0 -0
  250. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/schemas/items.py-tpl +0 -0
  251. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/__init__.py-tpl +0 -0
  252. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/conftest.py-tpl +0 -0
  253. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_auth.py-tpl +0 -0
  254. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_items.py-tpl +0 -0
  255. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_mcp.py-tpl +0 -0
  256. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl +0 -0
  257. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.gitignore-tpl +0 -0
  258. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/Dockerfile-tpl +0 -0
  259. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/README.md-tpl +0 -0
  260. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/alembic.ini-tpl +0 -0
  261. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/docker-compose.yml-tpl +0 -0
  262. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/requirements.txt-tpl +0 -0
  263. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/lint.sh-tpl +0 -0
  264. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/pre-start.sh-tpl +0 -0
  265. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/run-server.sh-tpl +0 -0
  266. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/test.sh-tpl +0 -0
  267. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.cfg-tpl +0 -0
  268. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.py-tpl +0 -0
  269. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src}/__init__.py-tpl +0 -0
  270. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/README-tpl +0 -0
  271. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/env.py-tpl +0 -0
  272. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/script.py.mako-tpl +0 -0
  273. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/versions/bedcdc35b64a_first_alembic.py-tpl +0 -0
  274. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/modules → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src}/api/__init__.py-tpl +0 -0
  275. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/api.py-tpl +0 -0
  276. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/deps.py-tpl +0 -0
  277. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/modules → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src}/api/routes/__init__.py-tpl +0 -0
  278. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/routes/items.py-tpl +0 -0
  279. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/modules/crud → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core}/__init__.py-tpl +0 -0
  280. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core/config.py-tpl +0 -0
  281. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core/db.py-tpl +0 -0
  282. {fastapi_fastkit-1.2.1/src/fastapi_fastkit/fastapi_project_template/modules/schemas → fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/crud}/__init__.py-tpl +0 -0
  283. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/crud/items.py-tpl +0 -0
  284. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/main.py-tpl +0 -0
  285. /fastapi_fastkit-1.2.1/src/fastapi_fastkit/py.typed → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/schemas/__init__.py-tpl +0 -0
  286. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/schemas/items.py-tpl +0 -0
  287. /fastapi_fastkit-1.2.1/src/fastapi_fastkit/utils/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/__init__.py-tpl +0 -0
  288. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/backend_pre_start.py-tpl +0 -0
  289. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/init_data.py-tpl +0 -0
  290. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/tests_pre_start.py-tpl +0 -0
  291. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/template-config.yml-tpl +0 -0
  292. /fastapi_fastkit-1.2.1/tests/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/__init__.py-tpl +0 -0
  293. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/conftest.py-tpl +0 -0
  294. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/test_items.py-tpl +0 -0
  295. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/README.md-tpl +0 -0
  296. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/requirements.txt-tpl +0 -0
  297. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.cfg-tpl +0 -0
  298. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.py-tpl +0 -0
  299. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/src/main.py-tpl +0 -0
  300. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/tests/conftest.py-tpl +0 -0
  301. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/tests/test_main.py-tpl +0 -0
  302. /fastapi_fastkit-1.2.1/tests/test_backends/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/modules/api/__init__.py-tpl +0 -0
  303. /fastapi_fastkit-1.2.1/tests/test_cli_operations/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/modules/api/routes/__init__.py-tpl +0 -0
  304. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/modules/api/routes/new_route.py-tpl +0 -0
  305. /fastapi_fastkit-1.2.1/tests/test_rich/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/modules/crud/__init__.py-tpl +0 -0
  306. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/modules/crud/new_route.py-tpl +0 -0
  307. /fastapi_fastkit-1.2.1/tests/test_templates/__init__.py → /fastapi_fastkit-1.3.0/src/fastapi_fastkit/fastapi_project_template/modules/schemas/__init__.py-tpl +0 -0
  308. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/fastapi_project_template/modules/schemas/new_route.py-tpl +0 -0
  309. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/src/fastapi_fastkit/utils/logging.py +0 -0
  310. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/conftest.py +0 -0
  311. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_configure.py +0 -0
  312. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_console_sizing.py +0 -0
  313. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_package_managers.py +0 -0
  314. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_backends/test_transducer.py +0 -0
  315. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_cli_operations/test_cli_extended.py +0 -0
  316. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_core.py +0 -0
  317. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_templates/template_configs.yaml +0 -0
  318. {fastapi_fastkit-1.2.1 → fastapi_fastkit-1.3.0}/tests/test_templates/test_config_based_templates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FastAPI-fastkit
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: Fast, easy-to-use starter kit for new users of Python and FastAPI
5
5
  Author-Email: bnbong <bbbong9@gmail.com>
6
6
  License: MIT
@@ -90,6 +90,7 @@ fastkit init --interactive
90
90
  ```
91
91
  - What it does: Guided step-by-step project setup with intelligent feature selection
92
92
  - Features:
93
+ - **Architecture preset**: `minimal` | `single-module` | `classic-layered` | `domain-starter` (default)
93
94
  - **Database selection**: PostgreSQL, MySQL, MongoDB, Redis, SQLite
94
95
  - **Authentication**: JWT, OAuth2, FastAPI-Users, Session-based
95
96
  - **Background tasks**: Celery, Dramatiq
@@ -100,10 +101,10 @@ fastkit init --interactive
100
101
  - **Deployment**: Docker, docker-compose with auto-generated configs
101
102
  - **Package manager**: pip, uv, pdm, poetry
102
103
  - **Custom packages**: Add your own dependencies
103
- - Auto-generates:
104
- - `main.py` with selected features integrated
105
- - Database and authentication configuration files
106
- - Docker deployment files (Dockerfile, docker-compose.yml)
104
+ - Auto-generates (varies by preset — see [the matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/) for details):
105
+ - `main.py` regenerated from selected features for `minimal` / `single-module`; preserved as-shipped for `classic-layered` / `domain-starter`
106
+ - Database and authentication configuration files at preset-specific paths
107
+ - Docker deployment files (`Dockerfile`, `docker-compose.yml`) with the preset's correct uvicorn entrypoint
107
108
  - Test configuration (pytest with coverage)
108
109
 
109
110
  ### Create a project from a template
@@ -144,9 +145,11 @@ fastkit deleteproject <project_name>
144
145
 
145
146
  For comprehensive guides and detailed usage instructions, visit our documentation:
146
147
 
148
+ - 🧭 **[Which starter should I choose?](https://bnbong.github.io/FastAPI-fastkit/user-guide/choosing-a-starter/)** - Beginner decision guide for `startdemo` templates and interactive presets
147
149
  - 📚 **[User Guide](https://bnbong.github.io/FastAPI-fastkit/user-guide/quick-start/)** - Detailed installation and usage guides
148
150
  - 🎯 **[Tutorial](https://bnbong.github.io/FastAPI-fastkit/tutorial/getting-started/)** - Step-by-step tutorials for beginners
149
151
  - 📖 **[CLI Reference](https://bnbong.github.io/FastAPI-fastkit/user-guide/cli-reference/)** - Complete command reference
152
+ - 🧱 **[Architecture Preset Matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/)** - Per-preset / per-feature contract for interactive generation
150
153
  - 🔍 **[Template Quality Assurance](https://bnbong.github.io/FastAPI-fastkit/reference/template-quality-assurance/)** - Automated testing and quality standards
151
154
 
152
155
  ## Contributing
@@ -67,6 +67,7 @@ fastkit init --interactive
67
67
  ```
68
68
  - What it does: Guided step-by-step project setup with intelligent feature selection
69
69
  - Features:
70
+ - **Architecture preset**: `minimal` | `single-module` | `classic-layered` | `domain-starter` (default)
70
71
  - **Database selection**: PostgreSQL, MySQL, MongoDB, Redis, SQLite
71
72
  - **Authentication**: JWT, OAuth2, FastAPI-Users, Session-based
72
73
  - **Background tasks**: Celery, Dramatiq
@@ -77,10 +78,10 @@ fastkit init --interactive
77
78
  - **Deployment**: Docker, docker-compose with auto-generated configs
78
79
  - **Package manager**: pip, uv, pdm, poetry
79
80
  - **Custom packages**: Add your own dependencies
80
- - Auto-generates:
81
- - `main.py` with selected features integrated
82
- - Database and authentication configuration files
83
- - Docker deployment files (Dockerfile, docker-compose.yml)
81
+ - Auto-generates (varies by preset — see [the matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/) for details):
82
+ - `main.py` regenerated from selected features for `minimal` / `single-module`; preserved as-shipped for `classic-layered` / `domain-starter`
83
+ - Database and authentication configuration files at preset-specific paths
84
+ - Docker deployment files (`Dockerfile`, `docker-compose.yml`) with the preset's correct uvicorn entrypoint
84
85
  - Test configuration (pytest with coverage)
85
86
 
86
87
  ### Create a project from a template
@@ -121,9 +122,11 @@ fastkit deleteproject <project_name>
121
122
 
122
123
  For comprehensive guides and detailed usage instructions, visit our documentation:
123
124
 
125
+ - 🧭 **[Which starter should I choose?](https://bnbong.github.io/FastAPI-fastkit/user-guide/choosing-a-starter/)** - Beginner decision guide for `startdemo` templates and interactive presets
124
126
  - 📚 **[User Guide](https://bnbong.github.io/FastAPI-fastkit/user-guide/quick-start/)** - Detailed installation and usage guides
125
127
  - 🎯 **[Tutorial](https://bnbong.github.io/FastAPI-fastkit/tutorial/getting-started/)** - Step-by-step tutorials for beginners
126
128
  - 📖 **[CLI Reference](https://bnbong.github.io/FastAPI-fastkit/user-guide/cli-reference/)** - Complete command reference
129
+ - 🧱 **[Architecture Preset Matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/)** - Per-preset / per-feature contract for interactive generation
127
130
  - 🔍 **[Template Quality Assurance](https://bnbong.github.io/FastAPI-fastkit/reference/template-quality-assurance/)** - Automated testing and quality standards
128
131
 
129
132
  ## Contributing
@@ -11,7 +11,7 @@ dependencies = [
11
11
  ]
12
12
  requires-python = ">=3.12"
13
13
  readme = "README.md"
14
- version = "1.2.1"
14
+ version = "1.3.0"
15
15
 
16
16
  [project.license]
17
17
  text = "MIT"
@@ -0,0 +1 @@
1
+ __version__ = 'v1.3.0'
@@ -23,19 +23,23 @@ import os
23
23
  import shutil
24
24
  import subprocess
25
25
  import sys
26
+ import tomllib
26
27
  from pathlib import Path
27
28
  from typing import Any, Callable, Dict, List, Optional, Tuple
28
29
 
29
30
  import yaml
30
31
 
31
32
  from fastapi_fastkit.backend.main import (
33
+ _parse_setup_dependencies,
32
34
  create_venv,
33
35
  find_template_core_modules,
34
36
  inject_project_metadata,
35
37
  install_dependencies_with_manager,
36
38
  )
39
+ from fastapi_fastkit.backend.package_managers.poetry_manager import (
40
+ _parse_pip_requirement,
41
+ )
37
42
  from fastapi_fastkit.backend.transducer import copy_and_convert_template
38
- from fastapi_fastkit.core.settings import settings
39
43
  from fastapi_fastkit.utils.logging import debug_log, get_logger
40
44
  from fastapi_fastkit.utils.main import print_error, print_success, print_warning
41
45
 
@@ -127,7 +131,6 @@ class TemplateInspector:
127
131
 
128
132
  def _force_cleanup_directory(self, directory_path: str) -> None:
129
133
  """Force cleanup of directory with multiple strategies."""
130
- import stat
131
134
  import time
132
135
 
133
136
  max_retries = 5
@@ -396,20 +399,39 @@ class TemplateInspector:
396
399
  return True
397
400
 
398
401
  def _check_file_structure(self) -> bool:
399
- """Check the required file and directory structure."""
400
- required_paths = [
401
- "tests",
402
- "requirements.txt-tpl",
403
- "setup.py-tpl",
404
- "README.md-tpl",
402
+ """Check the required file and directory structure.
403
+
404
+ Modern templates may ship ``pyproject.toml-tpl`` as the primary metadata
405
+ file; ``setup.py-tpl`` remains accepted for backward compatibility.
406
+ A template must provide at least one of the two. ``requirements.txt-tpl``
407
+ is no longer strictly required when ``pyproject.toml-tpl`` declares
408
+ ``[project].dependencies``.
409
+ """
410
+ always_required = ["tests", "README.md-tpl"]
411
+ metadata_candidates = ["pyproject.toml-tpl", "setup.py-tpl"]
412
+
413
+ missing_required = [
414
+ path for path in always_required if not (self.template_path / path).exists()
405
415
  ]
416
+ has_metadata = any(
417
+ (self.template_path / name).exists() for name in metadata_candidates
418
+ )
406
419
 
407
- for path in required_paths:
408
- if not (self.template_path / path).exists():
420
+ if missing_required:
421
+ for path in missing_required:
409
422
  error_msg = f"Missing required path: {path}"
410
423
  self.errors.append(error_msg)
411
424
  debug_log(f"File structure check failed: {error_msg}", "error")
412
- return False
425
+ if not has_metadata:
426
+ error_msg = (
427
+ "Missing metadata file: expected pyproject.toml-tpl "
428
+ "(preferred) or setup.py-tpl"
429
+ )
430
+ self.errors.append(error_msg)
431
+ debug_log(f"File structure check failed: {error_msg}", "error")
432
+
433
+ if missing_required or not has_metadata:
434
+ return False
413
435
 
414
436
  debug_log("File structure check passed", "info")
415
437
  return True
@@ -427,40 +449,139 @@ class TemplateInspector:
427
449
  return True
428
450
 
429
451
  def _check_dependencies(self) -> bool:
430
- """Check the dependencies in both setup.py-tpl and requirements.txt-tpl."""
452
+ """Check that FastAPI is declared in at least one supported source.
453
+
454
+ All three metadata sources are consulted independently:
455
+
456
+ - ``requirements.txt-tpl``
457
+ - ``pyproject.toml-tpl`` ``[project].dependencies``
458
+ - ``setup.py-tpl`` ``install_requires``
459
+
460
+ The check passes if *any* source declares ``fastapi``, so a template
461
+ with a stale ``requirements.txt-tpl`` still passes when
462
+ ``pyproject.toml-tpl`` is authoritative. It fails only when every
463
+ present source is missing ``fastapi`` (or when no source exists at
464
+ all — that also implies no metadata file, which
465
+ ``_check_file_structure`` already rejects).
466
+ """
431
467
  req_path = self.template_path / "requirements.txt-tpl"
468
+ pyproject_path = self.template_path / "pyproject.toml-tpl"
432
469
  setup_path = self.template_path / "setup.py-tpl"
433
470
 
434
- if not req_path.exists():
435
- error_msg = "requirements.txt-tpl not found"
436
- self.errors.append(error_msg)
437
- debug_log(f"Dependencies check failed: {error_msg}", "error")
438
- return False
439
- if not setup_path.exists():
440
- error_msg = "setup.py-tpl not found"
471
+ sources_checked: List[str] = []
472
+ fastapi_declared = False
473
+
474
+ if req_path.exists():
475
+ sources_checked.append("requirements.txt-tpl")
476
+ try:
477
+ with open(req_path, encoding="utf-8") as f:
478
+ deps = f.read().splitlines()
479
+ package_names = {
480
+ _parse_pip_requirement(dep)[0].lower()
481
+ for dep in deps
482
+ if dep.strip() and not dep.strip().startswith("#")
483
+ }
484
+ debug_log(
485
+ f"requirements.txt-tpl dependencies: {sorted(package_names)}",
486
+ "debug",
487
+ )
488
+ if "fastapi" in package_names:
489
+ fastapi_declared = True
490
+ except (OSError, UnicodeDecodeError) as e:
491
+ error_msg = f"Error reading requirements.txt-tpl: {e}"
492
+ self.errors.append(error_msg)
493
+ debug_log(f"Dependencies check failed: {error_msg}", "error")
494
+ return False
495
+
496
+ if pyproject_path.exists():
497
+ sources_checked.append("pyproject.toml-tpl")
498
+ package_names, parse_error = self._extract_pyproject_dependency_names(
499
+ pyproject_path
500
+ )
501
+ if parse_error is not None:
502
+ self.errors.append(parse_error)
503
+ debug_log(f"Dependencies check failed: {parse_error}", "error")
504
+ return False
505
+ debug_log(
506
+ f"pyproject.toml-tpl dependencies: {sorted(package_names)}", "debug"
507
+ )
508
+ if "fastapi" in package_names:
509
+ fastapi_declared = True
510
+
511
+ if setup_path.exists():
512
+ sources_checked.append("setup.py-tpl")
513
+ try:
514
+ with open(setup_path, encoding="utf-8") as f:
515
+ content = f.read()
516
+ deps = _parse_setup_dependencies(content)
517
+ package_names = {
518
+ _parse_pip_requirement(dep)[0].lower() for dep in deps if dep
519
+ }
520
+ debug_log(
521
+ f"setup.py-tpl dependencies: {sorted(package_names)}", "debug"
522
+ )
523
+ if "fastapi" in package_names:
524
+ fastapi_declared = True
525
+ except (OSError, UnicodeDecodeError) as e:
526
+ error_msg = f"Error reading setup.py-tpl: {e}"
527
+ self.errors.append(error_msg)
528
+ debug_log(f"Dependencies check failed: {error_msg}", "error")
529
+ return False
530
+
531
+ if not sources_checked:
532
+ error_msg = (
533
+ "No dependency source found: expected one of requirements.txt-tpl, "
534
+ "pyproject.toml-tpl, or setup.py-tpl"
535
+ )
441
536
  self.errors.append(error_msg)
442
537
  debug_log(f"Dependencies check failed: {error_msg}", "error")
443
538
  return False
444
539
 
445
- try:
446
- with open(req_path, encoding="utf-8") as f:
447
- deps = f.read().splitlines()
448
- package_names = [dep.split("==")[0] for dep in deps if dep]
449
- debug_log(f"Found dependencies: {package_names}", "debug")
450
- if "fastapi" not in package_names:
451
- error_msg = "FastAPI dependency not found in requirements.txt-tpl"
452
- self.errors.append(error_msg)
453
- debug_log(f"Dependencies check failed: {error_msg}", "error")
454
- return False
455
- except (OSError, UnicodeDecodeError) as e:
456
- error_msg = f"Error reading requirements.txt-tpl: {e}"
540
+ if not fastapi_declared:
541
+ error_msg = (
542
+ "FastAPI dependency not found in any source ("
543
+ + ", ".join(sources_checked)
544
+ + ")"
545
+ )
457
546
  self.errors.append(error_msg)
458
547
  debug_log(f"Dependencies check failed: {error_msg}", "error")
459
548
  return False
460
549
 
461
- debug_log("Dependencies check passed", "info")
550
+ debug_log(
551
+ f"Dependencies check passed (sources: {', '.join(sources_checked)})",
552
+ "info",
553
+ )
462
554
  return True
463
555
 
556
+ @staticmethod
557
+ def _extract_pyproject_dependency_names(
558
+ pyproject_path: Path,
559
+ ) -> Tuple[set, Optional[str]]: # type: ignore
560
+ """Parse a pyproject.toml-tpl and return (lowercased dep names, error).
561
+
562
+ ``error`` is ``None`` on success. Returns an empty set with a descriptive
563
+ error string when the file is unreadable or malformed.
564
+ """
565
+ try:
566
+ with open(pyproject_path, "rb") as f:
567
+ data = tomllib.load(f)
568
+ except (OSError, tomllib.TOMLDecodeError, UnicodeDecodeError) as e:
569
+ return set(), f"Invalid pyproject.toml-tpl: {e}"
570
+
571
+ project = data.get("project", {})
572
+ raw_deps = project.get("dependencies", []) or []
573
+ if not isinstance(raw_deps, list):
574
+ return set(), "pyproject.toml-tpl [project].dependencies must be a list"
575
+
576
+ names: set = set() # type: ignore
577
+ for dep in raw_deps:
578
+ if not isinstance(dep, str) or not dep.strip():
579
+ continue
580
+ name = _parse_pip_requirement(dep)[0]
581
+ if name:
582
+ names.add(name.lower())
583
+ return names, None
584
+
464
585
  def _check_fastapi_implementation(self) -> bool:
465
586
  """Check if the template has a proper FastAPI server implementation."""
466
587
  try:
@@ -9,6 +9,7 @@
9
9
  from .config_builder import InteractiveConfigBuilder
10
10
  from .prompts import (
11
11
  prompt_additional_features,
12
+ prompt_architecture_preset,
12
13
  prompt_authentication_selection,
13
14
  prompt_basic_info,
14
15
  prompt_caching_selection,
@@ -31,6 +32,7 @@ from .validators import (
31
32
  __all__ = [
32
33
  "InteractiveConfigBuilder",
33
34
  "prompt_basic_info",
35
+ "prompt_architecture_preset",
34
36
  "prompt_template_selection",
35
37
  "prompt_database_selection",
36
38
  "prompt_authentication_selection",
@@ -12,6 +12,7 @@ from fastapi_fastkit.utils.main import console, print_warning
12
12
 
13
13
  from .prompts import (
14
14
  prompt_additional_features,
15
+ prompt_architecture_preset,
15
16
  prompt_basic_info,
16
17
  prompt_template_selection,
17
18
  )
@@ -51,11 +52,15 @@ class InteractiveConfigBuilder:
51
52
  # Step 1: Basic information
52
53
  self._collect_basic_info()
53
54
 
54
- # Step 2: Always use Empty template as base for interactive mode
55
+ # Step 2: Architecture preset chosen early so downstream prompts
56
+ # (and later, preset-specific scaffolding) can branch on the layout.
57
+ self._collect_architecture_preset()
58
+
59
+ # Step 3: Always use Empty template as base for interactive mode
55
60
  # (Feature selection will build the project incrementally)
56
61
  self.config["base_template"] = None # None = Empty project
57
62
 
58
- # Step 3: Feature selections
63
+ # Step 4: Feature selections
59
64
  self._collect_feature_selections()
60
65
 
61
66
  # Step 4: Build final configuration
@@ -78,6 +83,20 @@ class InteractiveConfigBuilder:
78
83
  basic_info = prompt_basic_info()
79
84
  self.config.update(basic_info)
80
85
 
86
+ def _collect_architecture_preset(self) -> None:
87
+ """Collect the user's architecture preset choice.
88
+
89
+ Persists the canonical id on the config under ``architecture_preset``
90
+ (used by downstream code) plus the human-readable description under
91
+ ``architecture_preset_description`` (used by the confirmation summary
92
+ so users see what their choice means, not just the raw id).
93
+ """
94
+ preset = prompt_architecture_preset(self.settings)
95
+ self.config["architecture_preset"] = preset
96
+ self.config["architecture_preset_description"] = (
97
+ self.settings.ARCHITECTURE_PRESETS.get(preset, "")
98
+ )
99
+
81
100
  def _collect_template_selection(self) -> None:
82
101
  """Collect template selection."""
83
102
  template = prompt_template_selection(self.settings)
@@ -15,7 +15,6 @@
15
15
  from typing import Any, Dict, List, Optional, cast
16
16
 
17
17
  import click
18
- from rich.panel import Panel
19
18
 
20
19
  from fastapi_fastkit.utils.main import console, print_error
21
20
 
@@ -64,6 +63,58 @@ def prompt_basic_info() -> Dict[str, str]:
64
63
  }
65
64
 
66
65
 
66
+ def prompt_architecture_preset(settings: Any) -> str:
67
+ """
68
+ Prompt for the project's architecture preset.
69
+
70
+ Run early in the interactive flow so downstream prompts (and later,
71
+ preset-specific scaffolding) can branch on the user's choice. Returns
72
+ the canonical preset id (one of the keys in
73
+ ``settings.ARCHITECTURE_PRESETS``).
74
+
75
+ The recommended default (``settings.DEFAULT_ARCHITECTURE_PRESET``) is
76
+ annotated as such in the rendered table so users can spot it at a glance
77
+ and accept it with a single Enter press.
78
+
79
+ Args:
80
+ settings: FastkitConfig instance
81
+
82
+ Returns:
83
+ Preset id, e.g. ``"domain-starter"``.
84
+ """
85
+ console.print("\n[bold cyan]🧱 Architecture Preset[/bold cyan]")
86
+ console.print(
87
+ "[dim]Pick a project layout. Generation logic for each preset is "
88
+ "rolled out incrementally — your choice is recorded in the "
89
+ "config either way.[/dim]\n"
90
+ )
91
+
92
+ presets: Dict[str, str] = settings.ARCHITECTURE_PRESETS
93
+ default_id: str = settings.DEFAULT_ARCHITECTURE_PRESET
94
+ # Derive a display-only mapping so the recommended default is visibly
95
+ # annotated without mutating the canonical catalog in settings.
96
+ display_options: Dict[str, str] = {
97
+ preset_id: (
98
+ f"{description} [bold green](recommended default)[/bold green]"
99
+ if preset_id == default_id
100
+ else description
101
+ )
102
+ for preset_id, description in presets.items()
103
+ }
104
+ render_selection_table("Architecture Presets", display_options)
105
+
106
+ preset_ids = list(presets.keys())
107
+ default_idx = preset_ids.index(default_id) + 1
108
+
109
+ choice = click.prompt(
110
+ f"\nSelect architecture preset (default: {default_id})",
111
+ type=click.IntRange(1, len(preset_ids)),
112
+ default=default_idx,
113
+ )
114
+
115
+ return cast(str, preset_ids[choice - 1])
116
+
117
+
67
118
  def prompt_template_selection(settings: Any) -> Optional[str]:
68
119
  """
69
120
  Prompt for base template selection.
@@ -133,6 +133,16 @@ def confirm_selections(config: Dict[str, Any]) -> bool:
133
133
  table.add_row("Email", config.get("author_email", "N/A"))
134
134
  table.add_row("Description", config.get("description", "N/A"))
135
135
 
136
+ # Architecture preset (interactive ``init`` always sets this; older
137
+ # callers may not — guard with a falsy check to stay backward compatible).
138
+ preset = config.get("architecture_preset")
139
+ if preset:
140
+ preset_description = config.get("architecture_preset_description", "")
141
+ table.add_row(
142
+ "Architecture Preset",
143
+ f"{preset} — {preset_description}" if preset_description else preset,
144
+ )
145
+
136
146
  # Template
137
147
  if config.get("base_template"):
138
148
  table.add_row("Base Template", config["base_template"])
@@ -5,6 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  import os
7
7
  import re
8
+ import tomllib
8
9
  from typing import Dict, List
9
10
 
10
11
  import click
@@ -18,8 +19,9 @@ from fastapi_fastkit.core.exceptions import BackendExceptions
18
19
  from fastapi_fastkit.core.settings import settings
19
20
  from fastapi_fastkit.utils.logging import debug_log, get_logger
20
21
  from fastapi_fastkit.utils.main import (
22
+ FASTKIT_DESCRIPTION_MARKER,
23
+ FASTKIT_TOOL_SECTION,
21
24
  handle_exception,
22
- print_error,
23
25
  print_info,
24
26
  print_success,
25
27
  print_warning,
@@ -82,12 +84,19 @@ def find_template_core_modules(project_dir: str) -> Dict[str, str]:
82
84
 
83
85
  def read_template_stack(template_path: str) -> List[str]:
84
86
  """
85
- Read dependencies from template requirements.txt-tpl file or setup.py-tpl file.
87
+ Read dependencies from a template's metadata files.
88
+
89
+ Lookup order preserves legacy behaviour for templates that still ship
90
+ ``requirements.txt-tpl`` while allowing modern pyproject-first templates
91
+ to resolve their stack from ``pyproject.toml-tpl``:
92
+
93
+ 1. ``requirements.txt-tpl`` (legacy, highest precedence)
94
+ 2. ``pyproject.toml-tpl`` ``[project].dependencies``
95
+ 3. ``setup.py-tpl`` ``install_requires``
86
96
 
87
97
  :param template_path: Path to the template directory
88
- :return: List of dependencies
98
+ :return: List of PEP 508 requirement strings
89
99
  """
90
- # First try requirements.txt-tpl
91
100
  req_file = os.path.join(template_path, "requirements.txt-tpl")
92
101
  if os.path.exists(req_file):
93
102
  try:
@@ -100,7 +109,12 @@ def read_template_stack(template_path: str) -> List[str]:
100
109
  )
101
110
  return []
102
111
 
103
- # Fallback: try to read from setup.py-tpl for legacy templates
112
+ pyproject_file = os.path.join(template_path, "pyproject.toml-tpl")
113
+ if os.path.exists(pyproject_file):
114
+ deps = _parse_pyproject_dependencies(pyproject_file)
115
+ if deps:
116
+ return deps
117
+
104
118
  setup_file = os.path.join(template_path, "setup.py-tpl")
105
119
  if os.path.exists(setup_file):
106
120
  try:
@@ -153,6 +167,28 @@ def _parse_setup_dependencies(content: str) -> List[str]:
153
167
  return []
154
168
 
155
169
 
170
+ def _parse_pyproject_dependencies(pyproject_path: str) -> List[str]:
171
+ """
172
+ Parse dependencies from a ``pyproject.toml-tpl`` file.
173
+
174
+ Returns the list of PEP 508 requirement strings from
175
+ ``[project].dependencies``. Returns an empty list on parse errors so
176
+ callers can fall through to the next metadata source.
177
+ """
178
+ try:
179
+ with open(pyproject_path, "rb") as f:
180
+ data = tomllib.load(f)
181
+ except (OSError, tomllib.TOMLDecodeError, UnicodeDecodeError) as e:
182
+ debug_log(f"Error reading pyproject.toml template: {e}", "error")
183
+ return []
184
+
185
+ project = data.get("project", {})
186
+ raw_deps = project.get("dependencies", []) or []
187
+ if not isinstance(raw_deps, list):
188
+ return []
189
+ return [dep.strip() for dep in raw_deps if isinstance(dep, str) and dep.strip()]
190
+
191
+
156
192
  # ------------------------------------------------------------
157
193
  # Project Setup Functions
158
194
  # ------------------------------------------------------------
@@ -332,6 +368,8 @@ def _process_pyproject_file(
332
368
  for placeholder, value in replacements.items():
333
369
  content = content.replace(placeholder, value)
334
370
 
371
+ content = _ensure_pyproject_fastkit_markers(content)
372
+
335
373
  with open(pyproject_toml, "w", encoding="utf-8") as f:
336
374
  f.write(content)
337
375
 
@@ -343,6 +381,41 @@ def _process_pyproject_file(
343
381
  raise BackendExceptions(f"Failed to process pyproject.toml: {e}")
344
382
 
345
383
 
384
+ _DESCRIPTION_LINE_PATTERN = re.compile(
385
+ r'^(?P<prefix>description\s*=\s*)"(?P<value>.*?)"(?P<suffix>\s*)$',
386
+ re.MULTILINE,
387
+ )
388
+
389
+
390
+ def _ensure_pyproject_fastkit_markers(content: str) -> str:
391
+ """Idempotently ensure pyproject content carries FastAPI-fastkit markers.
392
+
393
+ Adds the canonical description marker if the ``description`` field does
394
+ not already include it (case-insensitive check), and appends a
395
+ ``[tool.fastapi-fastkit]`` section with ``managed = true`` if one is not
396
+ already present. Safe to run on already-marked content — no duplicates
397
+ are introduced.
398
+ """
399
+ marker = FASTKIT_DESCRIPTION_MARKER
400
+ match = _DESCRIPTION_LINE_PATTERN.search(content)
401
+ if match and marker.lower() not in match.group("value").lower():
402
+ existing = match.group("value")
403
+ new_value = f"{marker} {existing}".strip() if existing else marker
404
+ content = (
405
+ content[: match.start()]
406
+ + f'{match.group("prefix")}"{new_value}"{match.group("suffix")}'
407
+ + content[match.end() :]
408
+ )
409
+
410
+ tool_header = f"[tool.{FASTKIT_TOOL_SECTION}]"
411
+ if tool_header not in content:
412
+ if not content.endswith("\n"):
413
+ content += "\n"
414
+ content += f"\n{tool_header}\nmanaged = true\n"
415
+
416
+ return content
417
+
418
+
346
419
  def update_setup_py_dependencies(project_dir: str, dependencies: List[str]) -> None:
347
420
  """
348
421
  Update setup.py file's install_requires list with new dependencies.
@@ -554,7 +627,7 @@ def _ensure_project_structure(src_dir: str) -> Dict[str, str]:
554
627
  # Create __init__.py if it doesn't exist
555
628
  init_file = os.path.join(dir_path, "__init__.py")
556
629
  if not os.path.exists(init_file):
557
- with open(init_file, "w") as f:
630
+ with open(init_file, "w"):
558
631
  pass
559
632
 
560
633
  return target_dirs
@@ -136,7 +136,7 @@ class PackageManagerFactory:
136
136
  :param manager_class: Package manager class
137
137
  """
138
138
  if not issubclass(manager_class, BasePackageManager):
139
- raise ValueError(f"Manager class must inherit from BasePackageManager")
139
+ raise ValueError("Manager class must inherit from BasePackageManager")
140
140
 
141
141
  self._managers[name.lower()] = manager_class
142
142
  debug_log(f"Registered package manager: {name}", "info")
@@ -152,11 +152,11 @@ class PdmManager(BasePackageManager):
152
152
 
153
153
  # Create basic pyproject.toml content as string
154
154
  pyproject_content = f"""[project]
155
- name = "{project_name or 'fastapi-project'}"
155
+ name = "{project_name or "fastapi-project"}"
156
156
  version = "0.1.0"
157
- description = "{description or 'A FastAPI project'}"
157
+ description = "{description or "A FastAPI project"}"
158
158
  authors = [
159
- {{name = "{author or 'Author'}", email = "{author_email or 'author@example.com'}"}},
159
+ {{name = "{author or "Author"}", email = "{author_email or "author@example.com"}"}},
160
160
  ]
161
161
  dependencies = {deps_toml}
162
162
  requires-python = ">=3.8"
@@ -255,10 +255,10 @@ build-backend = "poetry.core.masonry.api"
255
255
 
256
256
  # Create basic pyproject.toml content for Poetry
257
257
  pyproject_content = f"""[tool.poetry]
258
- name = "{project_name or 'fastapi-project'}"
258
+ name = "{project_name or "fastapi-project"}"
259
259
  version = "0.1.0"
260
- description = "{description or 'A FastAPI project'}"
261
- authors = ["{author or 'Author'} <{author_email or 'author@example.com'}>"]
260
+ description = "{description or "A FastAPI project"}"
261
+ authors = ["{author or "Author"} <{author_email or "author@example.com"}>"]
262
262
  readme = "README.md"
263
263
  license = "MIT"
264
264
  packages = [{{include = "src"}}]