FastAPI-fastkit 1.2.0__tar.gz → 1.2.1__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 (283) hide show
  1. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/PKG-INFO +30 -3
  2. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/README.md +26 -0
  3. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/pyproject.toml +7 -3
  4. fastapi_fastkit-1.2.1/src/fastapi_fastkit/__init__.py +1 -0
  5. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/main.py +35 -0
  6. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/poetry_manager.py +68 -7
  7. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/config_generator.py +1 -1
  8. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/cli.py +31 -11
  9. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/settings.py +1 -1
  10. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_config_builder.py +1 -3
  11. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_main.py +60 -12
  12. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_package_managers.py +80 -0
  13. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_project_builder_config_generator.py +39 -0
  14. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli_extended.py +107 -8
  15. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli_interactive_integration.py +70 -0
  16. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_core.py +10 -0
  17. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_utils.py +2 -4
  18. fastapi_fastkit-1.2.0/src/fastapi_fastkit/__init__.py +0 -1
  19. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/LICENSE +0 -0
  20. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/__main__.py +0 -0
  21. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/__init__.py +0 -0
  22. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/inspector.py +0 -0
  23. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/__init__.py +0 -0
  24. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/config_builder.py +0 -0
  25. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/prompts.py +0 -0
  26. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/selectors.py +0 -0
  27. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/validators.py +0 -0
  28. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/__init__.py +0 -0
  29. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/base.py +0 -0
  30. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/factory.py +0 -0
  31. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/pdm_manager.py +0 -0
  32. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/pip_manager.py +0 -0
  33. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/uv_manager.py +0 -0
  34. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/__init__.py +0 -0
  35. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/dependency_collector.py +0 -0
  36. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/transducer.py +0 -0
  37. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/__init__.py +0 -0
  38. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/exceptions.py +0 -0
  39. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md +0 -0
  40. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/README.md +0 -0
  41. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/__init__.py +0 -0
  42. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.env-tpl +0 -0
  43. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.gitignore-tpl +0 -0
  44. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/README.md-tpl +0 -0
  45. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/pyproject.toml-tpl +0 -0
  46. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/requirements.txt-tpl +0 -0
  47. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/format.sh-tpl +0 -0
  48. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/lint.sh-tpl +0 -0
  49. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/run-server.sh-tpl +0 -0
  50. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/scripts/test.sh-tpl +0 -0
  51. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.cfg-tpl +0 -0
  52. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.py-tpl +0 -0
  53. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/__init__.py-tpl +0 -0
  54. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/__init__.py-tpl +0 -0
  55. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/api.py-tpl +0 -0
  56. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/routes/__init__.py-tpl +0 -0
  57. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/api/routes/items.py-tpl +0 -0
  58. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/core/__init__.py-tpl +0 -0
  59. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/core/config.py-tpl +0 -0
  60. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/crud/__init__.py-tpl +0 -0
  61. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/crud/items.py-tpl +0 -0
  62. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/main.py-tpl +0 -0
  63. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/mocks/__init__.py-tpl +0 -0
  64. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/mocks/mock_items.json-tpl +0 -0
  65. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/schemas/__init__.py-tpl +0 -0
  66. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/src/schemas/items.py-tpl +0 -0
  67. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/__init__.py-tpl +0 -0
  68. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/conftest.py-tpl +0 -0
  69. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/tests/test_items.py-tpl +0 -0
  70. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.env-tpl +0 -0
  71. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.gitignore-tpl +0 -0
  72. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/README.md-tpl +0 -0
  73. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/pyproject.toml-tpl +0 -0
  74. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/requirements.txt-tpl +0 -0
  75. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/format.sh-tpl +0 -0
  76. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/lint.sh-tpl +0 -0
  77. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/run-server.sh-tpl +0 -0
  78. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/scripts/test.sh-tpl +0 -0
  79. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.cfg-tpl +0 -0
  80. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.py-tpl +0 -0
  81. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/__init__.py-tpl +0 -0
  82. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/__init__.py-tpl +0 -0
  83. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/api.py-tpl +0 -0
  84. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/routes/__init__.py-tpl +0 -0
  85. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/api/routes/items.py-tpl +0 -0
  86. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/core/__init__.py-tpl +0 -0
  87. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/core/config.py-tpl +0 -0
  88. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/crud/__init__.py-tpl +0 -0
  89. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/crud/items.py-tpl +0 -0
  90. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/__init__.py-tpl +0 -0
  91. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/exceptions.py-tpl +0 -0
  92. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/helper/pagination.py-tpl +0 -0
  93. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/main.py-tpl +0 -0
  94. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/mocks/__init__.py-tpl +0 -0
  95. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/mocks/mock_items.json-tpl +0 -0
  96. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/__init__.py-tpl +0 -0
  97. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/base.py-tpl +0 -0
  98. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/schemas/items.py-tpl +0 -0
  99. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/utils/__init__.py-tpl +0 -0
  100. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/src/utils/documents.py-tpl +0 -0
  101. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/__init__.py-tpl +0 -0
  102. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/conftest.py-tpl +0 -0
  103. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/tests/test_items.py-tpl +0 -0
  104. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.env-tpl +0 -0
  105. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.gitignore-tpl +0 -0
  106. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl +0 -0
  107. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/pyproject.toml-tpl +0 -0
  108. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/requirements.txt-tpl +0 -0
  109. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/format.sh-tpl +0 -0
  110. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/lint.sh-tpl +0 -0
  111. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/run-server.sh-tpl +0 -0
  112. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/test.sh-tpl +0 -0
  113. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.cfg-tpl +0 -0
  114. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.py-tpl +0 -0
  115. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/__init__.py-tpl +0 -0
  116. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/__init__.py-tpl +0 -0
  117. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/api.py-tpl +0 -0
  118. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/routes/__init__.py-tpl +0 -0
  119. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/api/routes/items.py-tpl +0 -0
  120. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/__init__.py-tpl +0 -0
  121. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/config.py-tpl +0 -0
  122. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/__init__.py-tpl +0 -0
  123. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/items.py-tpl +0 -0
  124. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/main.py-tpl +0 -0
  125. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/__init__.py-tpl +0 -0
  126. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/mock_items.json-tpl +0 -0
  127. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/__init__.py-tpl +0 -0
  128. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/items.py-tpl +0 -0
  129. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/__init__.py-tpl +0 -0
  130. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/conftest.py-tpl +0 -0
  131. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/test_items.py-tpl +0 -0
  132. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.env-tpl +0 -0
  133. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.gitignore-tpl +0 -0
  134. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/Dockerfile-tpl +0 -0
  135. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/README.md-tpl +0 -0
  136. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/pyproject.toml-tpl +0 -0
  137. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/requirements.txt-tpl +0 -0
  138. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/format.sh-tpl +0 -0
  139. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/lint.sh-tpl +0 -0
  140. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/run-server.sh-tpl +0 -0
  141. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/test.sh-tpl +0 -0
  142. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.cfg-tpl +0 -0
  143. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.py-tpl +0 -0
  144. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/__init__.py-tpl +0 -0
  145. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/__init__.py-tpl +0 -0
  146. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/api.py-tpl +0 -0
  147. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/routes/__init__.py-tpl +0 -0
  148. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/api/routes/items.py-tpl +0 -0
  149. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/core/__init__.py-tpl +0 -0
  150. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/core/config.py-tpl +0 -0
  151. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/crud/__init__.py-tpl +0 -0
  152. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/crud/items.py-tpl +0 -0
  153. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/main.py-tpl +0 -0
  154. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/mocks/__init__.py-tpl +0 -0
  155. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/mocks/mock_items.json-tpl +0 -0
  156. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/schemas/__init__.py-tpl +0 -0
  157. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/schemas/items.py-tpl +0 -0
  158. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/__init__.py-tpl +0 -0
  159. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/conftest.py-tpl +0 -0
  160. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/test_items.py-tpl +0 -0
  161. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.env-tpl +0 -0
  162. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.gitignore-tpl +0 -0
  163. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/README.md-tpl +0 -0
  164. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/pyproject.toml-tpl +0 -0
  165. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/requirements.txt-tpl +0 -0
  166. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.cfg-tpl +0 -0
  167. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.py-tpl +0 -0
  168. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/__init__.py-tpl +0 -0
  169. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/core/__init__.py-tpl +0 -0
  170. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/core/config.py-tpl +0 -0
  171. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/main.py-tpl +0 -0
  172. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/__init__.py-tpl +0 -0
  173. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/conftest.py-tpl +0 -0
  174. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/test_main.py-tpl +0 -0
  175. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl +0 -0
  176. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl +0 -0
  177. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl +0 -0
  178. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl +0 -0
  179. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/format.sh-tpl +0 -0
  180. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/lint.sh-tpl +0 -0
  181. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/run-server.sh-tpl +0 -0
  182. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/test.sh-tpl +0 -0
  183. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl +0 -0
  184. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.py-tpl +0 -0
  185. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/__init__.py-tpl +0 -0
  186. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/__init__.py-tpl +0 -0
  187. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/api.py-tpl +0 -0
  188. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/__init__.py-tpl +0 -0
  189. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl +0 -0
  190. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/items.py-tpl +0 -0
  191. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/__init__.py-tpl +0 -0
  192. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl +0 -0
  193. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/__init__.py-tpl +0 -0
  194. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl +0 -0
  195. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/main.py-tpl +0 -0
  196. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp/__init__.py-tpl +0 -0
  197. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp/router.py-tpl +0 -0
  198. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/schemas/__init__.py-tpl +0 -0
  199. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/schemas/items.py-tpl +0 -0
  200. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/__init__.py-tpl +0 -0
  201. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/conftest.py-tpl +0 -0
  202. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_auth.py-tpl +0 -0
  203. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_items.py-tpl +0 -0
  204. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_mcp.py-tpl +0 -0
  205. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl +0 -0
  206. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.gitignore-tpl +0 -0
  207. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/Dockerfile-tpl +0 -0
  208. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/README.md-tpl +0 -0
  209. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/alembic.ini-tpl +0 -0
  210. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/docker-compose.yml-tpl +0 -0
  211. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/pyproject.toml-tpl +0 -0
  212. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/requirements.txt-tpl +0 -0
  213. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/format.sh-tpl +0 -0
  214. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/lint.sh-tpl +0 -0
  215. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/pre-start.sh-tpl +0 -0
  216. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/run-server.sh-tpl +0 -0
  217. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/scripts/test.sh-tpl +0 -0
  218. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.cfg-tpl +0 -0
  219. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.py-tpl +0 -0
  220. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/__init__.py-tpl +0 -0
  221. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/README-tpl +0 -0
  222. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/env.py-tpl +0 -0
  223. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/script.py.mako-tpl +0 -0
  224. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/alembic/versions/bedcdc35b64a_first_alembic.py-tpl +0 -0
  225. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/__init__.py-tpl +0 -0
  226. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/api.py-tpl +0 -0
  227. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/deps.py-tpl +0 -0
  228. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/routes/__init__.py-tpl +0 -0
  229. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/api/routes/items.py-tpl +0 -0
  230. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core/__init__.py-tpl +0 -0
  231. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core/config.py-tpl +0 -0
  232. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/core/db.py-tpl +0 -0
  233. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/crud/__init__.py-tpl +0 -0
  234. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/crud/items.py-tpl +0 -0
  235. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/main.py-tpl +0 -0
  236. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/schemas/__init__.py-tpl +0 -0
  237. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/schemas/items.py-tpl +0 -0
  238. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/__init__.py-tpl +0 -0
  239. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/backend_pre_start.py-tpl +0 -0
  240. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/init_data.py-tpl +0 -0
  241. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/src/utils/tests_pre_start.py-tpl +0 -0
  242. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/template-config.yml-tpl +0 -0
  243. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/__init__.py-tpl +0 -0
  244. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/conftest.py-tpl +0 -0
  245. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/tests/test_items.py-tpl +0 -0
  246. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/README.md-tpl +0 -0
  247. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/pyproject.toml-tpl +0 -0
  248. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/requirements.txt-tpl +0 -0
  249. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.cfg-tpl +0 -0
  250. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.py-tpl +0 -0
  251. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/src/main.py-tpl +0 -0
  252. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/tests/conftest.py-tpl +0 -0
  253. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/tests/test_main.py-tpl +0 -0
  254. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/api/__init__.py-tpl +0 -0
  255. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/api/routes/__init__.py-tpl +0 -0
  256. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/api/routes/new_route.py-tpl +0 -0
  257. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/crud/__init__.py-tpl +0 -0
  258. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/crud/new_route.py-tpl +0 -0
  259. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/schemas/__init__.py-tpl +0 -0
  260. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/schemas/new_route.py-tpl +0 -0
  261. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/py.typed +0 -0
  262. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/__init__.py +0 -0
  263. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/logging.py +0 -0
  264. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/main.py +0 -0
  265. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/__init__.py +0 -0
  266. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/conftest.py +0 -0
  267. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/__init__.py +0 -0
  268. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_configure.py +0 -0
  269. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_console_sizing.py +0 -0
  270. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_inspector.py +0 -0
  271. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_prompts.py +0 -0
  272. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_selectors.py +0 -0
  273. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_validators.py +0 -0
  274. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_project_builder_dependency_collector.py +0 -0
  275. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_transducer.py +0 -0
  276. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/__init__.py +0 -0
  277. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli.py +0 -0
  278. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_rich/__init__.py +0 -0
  279. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_rich/test_rich.py +0 -0
  280. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/__init__.py +0 -0
  281. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/template_configs.yaml +0 -0
  282. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/test_all_templates.py +0 -0
  283. {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/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.0
3
+ Version: 1.2.1
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
@@ -12,12 +12,13 @@ Requires-Python: >=3.12
12
12
  Requires-Dist: click>=8.1.7
13
13
  Requires-Dist: rich>=13.9.2
14
14
  Provides-Extra: dev
15
- Requires-Dist: pytest>=8.3.3; extra == "dev"
15
+ Requires-Dist: pytest>=9.0.3; extra == "dev"
16
16
  Requires-Dist: pytest-cov>=6.2.1; extra == "dev"
17
- Requires-Dist: black>=24.10.0; extra == "dev"
17
+ Requires-Dist: black>=26.3.1; extra == "dev"
18
18
  Requires-Dist: pre-commit>=4.0.1; extra == "dev"
19
19
  Requires-Dist: mypy>=1.12.0; extra == "dev"
20
20
  Requires-Dist: isort>=5.13.2; extra == "dev"
21
+ Requires-Dist: pygments>=2.20.0; extra == "dev"
21
22
  Description-Content-Type: text/markdown
22
23
 
23
24
  <p align="center">
@@ -36,6 +37,9 @@ Description-Content-Type: text/markdown
36
37
  <a href="https://codecov.io/gh/bnbong/FastAPI-fastkit" >
37
38
  <img src="https://codecov.io/gh/bnbong/FastAPI-fastkit/graph/badge.svg?token=WS0B6WWD8K"/>
38
39
  </a>
40
+ <a href="https://pepy.tech/project/fastapi-fastkit">
41
+ <img src="https://static.pepy.tech/personalized-badge/fastapi-fastkit?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads" alt="PyPI Downloads">
42
+ </a>
39
43
  </p>
40
44
 
41
45
  ---
@@ -47,6 +51,7 @@ This project was inspired by the `SpringBoot initializer` & Python Django's `dja
47
51
  ## Key Features
48
52
 
49
53
  - **⚡ Immediate FastAPI project creation** : Super-fast FastAPI workspace & project creation via CLI, inspired by `django-admin` feature of [Python Django](https://github.com/django/django)
54
+ - **✨ Interactive project builder**: Guided step-by-step feature selection for databases, authentication, caching, monitoring, and more with auto-generated code
50
55
  - **🎨 Prettier CLI output** : Beautiful CLI experience powered by [rich library](https://github.com/Textualize/rich)
51
56
  - **📋 Standards-based FastAPI project templates** : Templates follow Python standards and common FastAPI patterns.
52
57
  - **🔍 Automated template quality assurance** : Weekly automated testing ensures all templates remain functional and up-to-date
@@ -79,6 +84,28 @@ fastkit init [OPTIONS]
79
84
  - `--package-manager` [pip|uv|pdm|poetry]
80
85
  - Stack selection: `minimal` | `standard` | `full` (interactive)
81
86
 
87
+ ### Create a project with interactive mode
88
+ ```console
89
+ fastkit init --interactive
90
+ ```
91
+ - What it does: Guided step-by-step project setup with intelligent feature selection
92
+ - Features:
93
+ - **Database selection**: PostgreSQL, MySQL, MongoDB, Redis, SQLite
94
+ - **Authentication**: JWT, OAuth2, FastAPI-Users, Session-based
95
+ - **Background tasks**: Celery, Dramatiq
96
+ - **Caching**: Redis, fastapi-cache2
97
+ - **Monitoring**: Loguru, OpenTelemetry, Prometheus
98
+ - **Testing**: Basic (pytest), Coverage, Advanced (with faker, factory-boy)
99
+ - **Utilities**: CORS, Rate-Limiting, Pagination, WebSocket
100
+ - **Deployment**: Docker, docker-compose with auto-generated configs
101
+ - **Package manager**: pip, uv, pdm, poetry
102
+ - **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)
107
+ - Test configuration (pytest with coverage)
108
+
82
109
  ### Create a project from a template
83
110
  ```console
84
111
  fastkit startdemo [TEMPLATE] [OPTIONS]
@@ -14,6 +14,9 @@
14
14
  <a href="https://codecov.io/gh/bnbong/FastAPI-fastkit" >
15
15
  <img src="https://codecov.io/gh/bnbong/FastAPI-fastkit/graph/badge.svg?token=WS0B6WWD8K"/>
16
16
  </a>
17
+ <a href="https://pepy.tech/project/fastapi-fastkit">
18
+ <img src="https://static.pepy.tech/personalized-badge/fastapi-fastkit?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads" alt="PyPI Downloads">
19
+ </a>
17
20
  </p>
18
21
 
19
22
  ---
@@ -25,6 +28,7 @@ This project was inspired by the `SpringBoot initializer` & Python Django's `dja
25
28
  ## Key Features
26
29
 
27
30
  - **⚡ Immediate FastAPI project creation** : Super-fast FastAPI workspace & project creation via CLI, inspired by `django-admin` feature of [Python Django](https://github.com/django/django)
31
+ - **✨ Interactive project builder**: Guided step-by-step feature selection for databases, authentication, caching, monitoring, and more with auto-generated code
28
32
  - **🎨 Prettier CLI output** : Beautiful CLI experience powered by [rich library](https://github.com/Textualize/rich)
29
33
  - **📋 Standards-based FastAPI project templates** : Templates follow Python standards and common FastAPI patterns.
30
34
  - **🔍 Automated template quality assurance** : Weekly automated testing ensures all templates remain functional and up-to-date
@@ -57,6 +61,28 @@ fastkit init [OPTIONS]
57
61
  - `--package-manager` [pip|uv|pdm|poetry]
58
62
  - Stack selection: `minimal` | `standard` | `full` (interactive)
59
63
 
64
+ ### Create a project with interactive mode
65
+ ```console
66
+ fastkit init --interactive
67
+ ```
68
+ - What it does: Guided step-by-step project setup with intelligent feature selection
69
+ - Features:
70
+ - **Database selection**: PostgreSQL, MySQL, MongoDB, Redis, SQLite
71
+ - **Authentication**: JWT, OAuth2, FastAPI-Users, Session-based
72
+ - **Background tasks**: Celery, Dramatiq
73
+ - **Caching**: Redis, fastapi-cache2
74
+ - **Monitoring**: Loguru, OpenTelemetry, Prometheus
75
+ - **Testing**: Basic (pytest), Coverage, Advanced (with faker, factory-boy)
76
+ - **Utilities**: CORS, Rate-Limiting, Pagination, WebSocket
77
+ - **Deployment**: Docker, docker-compose with auto-generated configs
78
+ - **Package manager**: pip, uv, pdm, poetry
79
+ - **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)
84
+ - Test configuration (pytest with coverage)
85
+
60
86
  ### Create a project from a template
61
87
  ```console
62
88
  fastkit startdemo [TEMPLATE] [OPTIONS]
@@ -11,7 +11,7 @@ dependencies = [
11
11
  ]
12
12
  requires-python = ">=3.12"
13
13
  readme = "README.md"
14
- version = "1.2.0"
14
+ version = "1.2.1"
15
15
 
16
16
  [project.license]
17
17
  text = "MIT"
@@ -24,12 +24,13 @@ Changelog = "https://bnbong.github.io/FastAPI-fastkit/changelog/"
24
24
 
25
25
  [project.optional-dependencies]
26
26
  dev = [
27
- "pytest>=8.3.3",
27
+ "pytest>=9.0.3",
28
28
  "pytest-cov>=6.2.1",
29
- "black>=24.10.0",
29
+ "black>=26.3.1",
30
30
  "pre-commit>=4.0.1",
31
31
  "mypy>=1.12.0",
32
32
  "isort>=5.13.2",
33
+ "pygments>=2.20.0",
33
34
  ]
34
35
 
35
36
  [project.scripts]
@@ -120,6 +121,9 @@ docs = [
120
121
  "mkdocs-static-i18n>=1.3.0",
121
122
  "pyyaml>=6.0.3",
122
123
  "types-PyYAML>=6.0.12.20250915",
124
+ "pygments>=2.20.0",
125
+ "requests>=2.33.0",
126
+ "pymdown-extensions>=10.17.2",
123
127
  ]
124
128
  translation = [
125
129
  "openai>=2.8.1",
@@ -0,0 +1 @@
1
+ __version__ = 'v1.2.1'
@@ -185,6 +185,7 @@ def inject_project_metadata(
185
185
  description,
186
186
  )
187
187
  _process_config_file(core_modules.get("config", ""), project_name)
188
+ _process_main_file(core_modules.get("main", ""), project_name)
188
189
 
189
190
  print_success("Project metadata injected successfully")
190
191
 
@@ -235,6 +236,40 @@ def _process_setup_file(
235
236
  raise BackendExceptions(f"Failed to process setup.py: {e}")
236
237
 
237
238
 
239
+ def _process_main_file(main_py: str, project_name: str) -> None:
240
+ """
241
+ Replace project name placeholders in the template main.py file.
242
+
243
+ Some templates (e.g. fastapi-single-module) inline the project name directly
244
+ in main.py rather than reading it from a settings module, so the placeholder
245
+ must be substituted here as well.
246
+
247
+ :param main_py: Path to main.py file
248
+ :param project_name: Project name
249
+ """
250
+ if not main_py or not os.path.exists(main_py):
251
+ return
252
+
253
+ try:
254
+ with open(main_py, "r", encoding="utf-8") as f:
255
+ content = f.read()
256
+
257
+ if "<project_name>" not in content:
258
+ return
259
+
260
+ content = content.replace("<project_name>", project_name)
261
+
262
+ with open(main_py, "w", encoding="utf-8") as f:
263
+ f.write(content)
264
+
265
+ debug_log("Injected project name into main.py", "info")
266
+ print_info("Injected project name into main.py")
267
+
268
+ except (OSError, UnicodeDecodeError) as e:
269
+ debug_log(f"Error processing main.py: {e}", "error")
270
+ raise BackendExceptions(f"Failed to process main.py: {e}")
271
+
272
+
238
273
  def _process_config_file(config_py: str, project_name: str) -> None:
239
274
  """
240
275
  Process config file and inject project name.
@@ -4,7 +4,7 @@
4
4
  # @author bnbong bbbong9@gmail.com
5
5
  # --------------------------------------------------------------------------
6
6
  import subprocess
7
- from typing import List
7
+ from typing import List, Tuple
8
8
 
9
9
  from fastapi_fastkit.core.exceptions import BackendExceptions
10
10
  from fastapi_fastkit.utils.logging import debug_log, get_logger
@@ -19,6 +19,47 @@ from .base import BasePackageManager
19
19
 
20
20
  logger = get_logger(__name__)
21
21
 
22
+ # PEP 440 version specifier operators, longest-match first so "===" beats "==".
23
+ _PEP440_OPERATORS = ("===", "==", "!=", "<=", ">=", "~=", "<", ">")
24
+
25
+
26
+ def _parse_pip_requirement(
27
+ requirement: str,
28
+ ) -> Tuple[str, List[str], str, str]:
29
+ """Parse a pip/PEP 508 requirement string.
30
+
31
+ Returns ``(name, extras, version_spec, marker)`` where ``version_spec``
32
+ includes the operator (e.g. ``">=1.2.3"``) or is empty when unspecified,
33
+ and ``marker`` is the environment marker without the leading semicolon.
34
+ """
35
+ req = requirement.strip()
36
+
37
+ marker = ""
38
+ if ";" in req:
39
+ req, marker = req.split(";", 1)
40
+ req = req.strip()
41
+ marker = marker.strip()
42
+
43
+ version_spec = ""
44
+ split_at = len(req)
45
+ for op in _PEP440_OPERATORS:
46
+ idx = req.find(op)
47
+ if idx != -1 and idx < split_at:
48
+ split_at = idx
49
+ if split_at < len(req):
50
+ version_spec = req[split_at:].strip()
51
+ req = req[:split_at].strip()
52
+
53
+ extras: List[str] = []
54
+ if "[" in req and req.endswith("]"):
55
+ bare_name, _, extras_part = req.partition("[")
56
+ extras = [
57
+ extra.strip() for extra in extras_part[:-1].split(",") if extra.strip()
58
+ ]
59
+ req = bare_name.strip()
60
+
61
+ return req, extras, version_spec, marker
62
+
22
63
 
23
64
  class PoetryManager(BasePackageManager):
24
65
  """Poetry package manager implementation."""
@@ -182,15 +223,35 @@ build-backend = "poetry.core.masonry.api"
182
223
  pyproject_path = self.get_dependency_file_path()
183
224
 
184
225
  try:
185
- # Create dependencies section for Poetry
226
+ # Create dependencies section for Poetry. Parse each requirement as
227
+ # PEP 508 so non-``==`` specifiers (``>=``, ``~=``, ...), extras, and
228
+ # environment markers all round-trip to valid TOML.
186
229
  deps_section = ""
187
230
  for dep in dependencies:
188
- # Convert pip-style to poetry-style
189
- if "==" in dep:
190
- name, version = dep.split("==", 1)
191
- deps_section += f'{name} = "{version}"\n'
231
+ name_part, extras, version_spec, marker = _parse_pip_requirement(dep)
232
+ if not name_part:
233
+ continue
234
+
235
+ if not version_spec:
236
+ version_str = "*"
237
+ elif version_spec.startswith("=="):
238
+ # Poetry treats a bare version as a pin; keep the old
239
+ # formatting to avoid churn in generated files.
240
+ version_str = version_spec[2:].strip()
241
+ else:
242
+ version_str = version_spec
243
+
244
+ if extras or marker:
245
+ parts = [f'version = "{version_str}"']
246
+ if extras:
247
+ extras_str = ", ".join(f'"{extra}"' for extra in extras)
248
+ parts.append(f"extras = [{extras_str}]")
249
+ if marker:
250
+ escaped_marker = marker.replace('"', '\\"')
251
+ parts.append(f'markers = "{escaped_marker}"')
252
+ deps_section += f"{name_part} = {{{', '.join(parts)}}}\n"
192
253
  else:
193
- deps_section += f'{dep} = "*"\n'
254
+ deps_section += f'{name_part} = "{version_str}"\n'
194
255
 
195
256
  # Create basic pyproject.toml content for Poetry
196
257
  pyproject_content = f"""[tool.poetry]
@@ -488,7 +488,7 @@ class DynamicConfigGenerator:
488
488
  content.append("")
489
489
  content.append("# Run application")
490
490
  content.append(
491
- "CMD ['uvicorn', 'src.main:app', '--host', '0.0.0.0', '--port', '8000']"
491
+ 'CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]'
492
492
  )
493
493
  content.append("")
494
494
 
@@ -43,9 +43,28 @@ from fastapi_fastkit.utils.main import (
43
43
  validate_email,
44
44
  )
45
45
 
46
+ from . import __version__
47
+
46
48
  console = utils_console
47
49
 
48
- from . import __version__
50
+
51
+ def _cleanup_failed_project(
52
+ project_dir: str, user_workspace: str, create_project_folder: bool
53
+ ) -> None:
54
+ """
55
+ Clean up a partially created project after an error.
56
+
57
+ Only deletes a freshly created project folder. When the project was deployed
58
+ in-place (create_project_folder=False), project_dir equals the user's workspace,
59
+ and removing it would destroy unrelated files, so no cleanup is performed.
60
+ """
61
+ if not create_project_folder:
62
+ return
63
+ if not project_dir or not os.path.exists(project_dir):
64
+ return
65
+ if os.path.abspath(project_dir) == os.path.abspath(user_workspace):
66
+ return
67
+ shutil.rmtree(project_dir, ignore_errors=True)
49
68
 
50
69
 
51
70
  @click.group()
@@ -483,8 +502,7 @@ def init(
483
502
  if testing_type != "None":
484
503
  test_config_content = generator.generate_test_config()
485
504
  if test_config_content:
486
- test_config_path = os.path.join(project_dir, "tests", "conftest.py")
487
- os.makedirs(os.path.dirname(test_config_path), exist_ok=True)
505
+ test_config_path = os.path.join(project_dir, "pytest.ini")
488
506
  with open(test_config_path, "w") as f:
489
507
  f.write(test_config_content)
490
508
 
@@ -492,9 +510,9 @@ def init(
492
510
  deployment = config.get("deployment", [])
493
511
  if deployment and deployment != ["None"]:
494
512
  generator.generate_docker_files()
495
- print_success(f"Generated Docker deployment files")
513
+ print_success("Generated Docker deployment files")
496
514
 
497
- print_success(f"Generated configuration files for selected stack")
515
+ print_success("Generated configuration files for selected stack")
498
516
 
499
517
  # Create virtual environment and install dependencies
500
518
  venv_path = create_venv_with_manager(project_dir, package_manager)
@@ -514,8 +532,9 @@ def init(
514
532
  logger = get_logger()
515
533
  logger.exception(f"Error during project creation in init: {str(e)}")
516
534
  print_error(f"Error during project creation: {str(e)}")
517
- if os.path.exists(project_dir):
518
- shutil.rmtree(project_dir, ignore_errors=True)
535
+ _cleanup_failed_project(
536
+ project_dir, settings.USER_WORKSPACE, create_project_folder
537
+ )
519
538
 
520
539
  return
521
540
 
@@ -662,8 +681,9 @@ def init(
662
681
  logger = get_logger()
663
682
  logger.exception(f"Error during project creation in init: {str(e)}")
664
683
  print_error(f"Error during project creation: {str(e)}")
665
- if os.path.exists(project_dir):
666
- shutil.rmtree(project_dir, ignore_errors=True)
684
+ _cleanup_failed_project(
685
+ project_dir, settings.USER_WORKSPACE, create_project_folder
686
+ )
667
687
 
668
688
 
669
689
  @fastkit_cli.command()
@@ -930,9 +950,9 @@ def runserver(
930
950
  logger.exception(f"FileNotFoundError when starting server: {e}")
931
951
  if venv_python:
932
952
  print_error(
933
- f"Failed to run Python from the virtual environment. Make sure uvicorn is installed in the project's virtual environment."
953
+ "Failed to run Python from the virtual environment. Make sure uvicorn is installed in the project's virtual environment."
934
954
  )
935
955
  else:
936
956
  print_error(
937
- f"uvicorn not found. Make sure it's installed in your system Python."
957
+ "uvicorn not found. Make sure it's installed in your system Python."
938
958
  )
@@ -102,7 +102,7 @@ class FastkitConfig:
102
102
  "MySQL": ["pymysql", "aiomysql", "sqlalchemy", "alembic"],
103
103
  "MongoDB": ["motor", "beanie"],
104
104
  "Redis": ["redis[hiredis]", "aioredis"],
105
- "SQLite": ["sqlalchemy", "alembic"],
105
+ "SQLite": ["sqlalchemy", "aiosqlite", "alembic"],
106
106
  "None": [],
107
107
  },
108
108
  "authentication": {
@@ -7,9 +7,7 @@ from unittest.mock import MagicMock, call, patch
7
7
 
8
8
  import pytest
9
9
 
10
- from fastapi_fastkit.backend.interactive.config_builder import (
11
- InteractiveConfigBuilder,
12
- )
10
+ from fastapi_fastkit.backend.interactive.config_builder import InteractiveConfigBuilder
13
11
  from fastapi_fastkit.core.settings import FastkitConfig
14
12
 
15
13
 
@@ -14,6 +14,7 @@ import pytest
14
14
  from fastapi_fastkit.backend.main import (
15
15
  _parse_setup_dependencies,
16
16
  _process_config_file,
17
+ _process_main_file,
17
18
  _process_setup_file,
18
19
  add_new_route,
19
20
  create_venv,
@@ -186,8 +187,7 @@ class TestBackendMain:
186
187
  # given
187
188
  # Create setup.py file
188
189
  setup_py = self.project_path / "setup.py"
189
- setup_py.write_text(
190
- """
190
+ setup_py.write_text("""
191
191
  from setuptools import setup
192
192
 
193
193
  setup(
@@ -196,8 +196,7 @@ setup(
196
196
  author_email="<author_email>",
197
197
  description="<description>",
198
198
  )
199
- """
200
- )
199
+ """)
201
200
 
202
201
  # Create config file
203
202
  config_py = self.project_path / "config.py"
@@ -222,6 +221,59 @@ setup(
222
221
  config_content = config_py.read_text()
223
222
  assert 'PROJECT_NAME = "test-project"' in config_content
224
223
 
224
+ def test_inject_project_metadata_replaces_placeholder_in_main(self) -> None:
225
+ """Main module placeholders (single-module template) must be substituted."""
226
+ # given
227
+ src_dir = self.project_path / "src"
228
+ src_dir.mkdir()
229
+ main_py = src_dir / "main.py"
230
+ main_py.write_text(
231
+ 'from fastapi import FastAPI\n\napp = FastAPI(title="<project_name>")\n'
232
+ )
233
+
234
+ # when
235
+ inject_project_metadata(
236
+ str(self.project_path),
237
+ "my-single-module",
238
+ "Test Author",
239
+ "test@example.com",
240
+ "desc",
241
+ )
242
+
243
+ # then
244
+ main_content = main_py.read_text()
245
+ assert "<project_name>" not in main_content
246
+ assert 'title="my-single-module"' in main_content
247
+
248
+ def test_process_main_file_no_placeholder_is_noop(self) -> None:
249
+ """main.py without the placeholder must be left untouched and not rewritten."""
250
+ # given
251
+ main_py = self.project_path / "main.py"
252
+ original = 'from fastapi import FastAPI\n\napp = FastAPI(title="static")\n'
253
+ main_py.write_text(original)
254
+ original_mtime = main_py.stat().st_mtime_ns
255
+
256
+ # when
257
+ _process_main_file(str(main_py), "my-project")
258
+
259
+ # then: file content unchanged and not rewritten
260
+ assert main_py.read_text() == original
261
+ assert main_py.stat().st_mtime_ns == original_mtime
262
+
263
+ def test_process_main_file_os_error_raises_backend_exception(self) -> None:
264
+ """IO errors while rewriting main.py must surface as BackendExceptions."""
265
+ # given: file exists so the existence check passes, but reading raises
266
+ main_py = self.project_path / "main.py"
267
+ main_py.write_text('app = FastAPI(title="<project_name>")')
268
+
269
+ with patch(
270
+ "fastapi_fastkit.backend.main.open",
271
+ side_effect=OSError("disk read failure"),
272
+ ):
273
+ # when & then
274
+ with pytest.raises(BackendExceptions, match="Failed to process main.py"):
275
+ _process_main_file(str(main_py), "my-project")
276
+
225
277
  @patch("fastapi_fastkit.backend.main.find_template_core_modules")
226
278
  def test_inject_project_metadata_with_exception(
227
279
  self, mock_find_modules: MagicMock
@@ -248,8 +300,7 @@ setup(
248
300
  template_path = Path(tempfile.mkdtemp())
249
301
  try:
250
302
  setup_py_tpl = template_path / "setup.py-tpl"
251
- setup_py_tpl.write_text(
252
- """
303
+ setup_py_tpl.write_text("""
253
304
  from setuptools import setup
254
305
 
255
306
  install_requires: list[str] = [
@@ -262,8 +313,7 @@ setup(
262
313
  name="test",
263
314
  install_requires=install_requires,
264
315
  )
265
- """
266
- )
316
+ """)
267
317
 
268
318
  # when
269
319
  result = read_template_stack(str(template_path))
@@ -393,16 +443,14 @@ install_requires = [
393
443
  """Test _process_setup_file function with successful processing."""
394
444
  # given
395
445
  setup_py = self.project_path / "setup.py"
396
- setup_py.write_text(
397
- """
446
+ setup_py.write_text("""
398
447
  setup(
399
448
  name="<project_name>",
400
449
  author="<author>",
401
450
  author_email="<author_email>",
402
451
  description="<description>",
403
452
  )
404
- """
405
- )
453
+ """)
406
454
 
407
455
  # when
408
456
  _process_setup_file(
@@ -912,6 +912,86 @@ class TestPoetryManagerExtended:
912
912
  with pytest.raises(BackendExceptions):
913
913
  self.manager.generate_dependency_file(["fastapi"])
914
914
 
915
+ def test_generate_dependency_file_with_extras_is_valid_toml(self) -> None:
916
+ """Dependencies with extras must be emitted as inline tables, not bare keys."""
917
+ import tomllib
918
+
919
+ deps = [
920
+ "redis[hiredis]",
921
+ "python-jose[cryptography]==3.3.0",
922
+ "fastapi-users[sqlalchemy]",
923
+ "fastapi==0.104.1",
924
+ "uvicorn",
925
+ ]
926
+ self.manager.generate_dependency_file(
927
+ deps,
928
+ project_name="test-project",
929
+ author="Test Author",
930
+ author_email="test@example.com",
931
+ description="Test description",
932
+ )
933
+
934
+ pyproject_file = Path(self.temp_dir) / "pyproject.toml"
935
+ content = pyproject_file.read_text()
936
+
937
+ # Must parse as valid TOML - this is what previously broke poetry install.
938
+ parsed = tomllib.loads(content)
939
+ deps_table = parsed["tool"]["poetry"]["dependencies"]
940
+
941
+ assert deps_table["redis"] == {"version": "*", "extras": ["hiredis"]}
942
+ assert deps_table["python-jose"] == {
943
+ "version": "3.3.0",
944
+ "extras": ["cryptography"],
945
+ }
946
+ assert deps_table["fastapi-users"] == {
947
+ "version": "*",
948
+ "extras": ["sqlalchemy"],
949
+ }
950
+ assert deps_table["fastapi"] == "0.104.1"
951
+ assert deps_table["uvicorn"] == "*"
952
+
953
+ def test_generate_dependency_file_with_pep508_specifiers(self) -> None:
954
+ """Non-``==`` pip specifiers and PEP 508 markers must round-trip to valid TOML.
955
+
956
+ Regression test for the Copilot review that flagged ``requests>=2.33``,
957
+ ``httpx~=0.27``, and ``uvloop; sys_platform != 'win32'`` producing
958
+ invalid ``pyproject.toml`` because the whole string was emitted as a key.
959
+ """
960
+ import tomllib
961
+
962
+ deps = [
963
+ "requests>=2.33",
964
+ "httpx~=0.27",
965
+ "sqlalchemy>=2.0,<3.0",
966
+ "uvloop; sys_platform != 'win32'",
967
+ "redis[hiredis]>=4.0",
968
+ ]
969
+ self.manager.generate_dependency_file(
970
+ deps,
971
+ project_name="test-project",
972
+ author="Test Author",
973
+ author_email="test@example.com",
974
+ description="Test description",
975
+ )
976
+
977
+ pyproject_file = Path(self.temp_dir) / "pyproject.toml"
978
+ content = pyproject_file.read_text()
979
+
980
+ parsed = tomllib.loads(content)
981
+ deps_table = parsed["tool"]["poetry"]["dependencies"]
982
+
983
+ assert deps_table["requests"] == ">=2.33"
984
+ assert deps_table["httpx"] == "~=0.27"
985
+ assert deps_table["sqlalchemy"] == ">=2.0,<3.0"
986
+ assert deps_table["uvloop"] == {
987
+ "version": "*",
988
+ "markers": "sys_platform != 'win32'",
989
+ }
990
+ assert deps_table["redis"] == {
991
+ "version": ">=4.0",
992
+ "extras": ["hiredis"],
993
+ }
994
+
915
995
  @patch("subprocess.run")
916
996
  def test_add_dependency_success(self, mock_run: Mock) -> None:
917
997
  """Test successful dependency addition with Poetry."""