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.
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/PKG-INFO +30 -3
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/README.md +26 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/pyproject.toml +7 -3
- fastapi_fastkit-1.2.1/src/fastapi_fastkit/__init__.py +1 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/main.py +35 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/poetry_manager.py +68 -7
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/config_generator.py +1 -1
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/cli.py +31 -11
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/settings.py +1 -1
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_config_builder.py +1 -3
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_main.py +60 -12
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_package_managers.py +80 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_project_builder_config_generator.py +39 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli_extended.py +107 -8
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli_interactive_integration.py +70 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_core.py +10 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_utils.py +2 -4
- fastapi_fastkit-1.2.0/src/fastapi_fastkit/__init__.py +0 -1
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/LICENSE +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/__main__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/inspector.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/config_builder.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/prompts.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/selectors.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/interactive/validators.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/base.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/factory.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/pdm_manager.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/pip_manager.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/package_managers/uv_manager.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/project_builder/dependency_collector.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/backend/transducer.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/core/exceptions.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/README.md +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/requirements.txt-tpl +0 -0
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/setup.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/requirements.txt-tpl +0 -0
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/setup.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/requirements.txt-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/format.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/lint.sh-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/scripts/test.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/setup.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/__init__.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/src/main.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-default/tests/conftest.py-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/Dockerfile-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/requirements.txt-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/format.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/lint.sh-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/scripts/test.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/setup.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/__init__.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/src/main.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/tests/conftest.py-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/requirements.txt-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/setup.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/__init__.py-tpl +0 -0
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/src/main.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-empty/tests/conftest.py-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/format.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/lint.sh-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/test.sh-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/__init__.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/main.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/conftest.py-tpl +0 -0
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.gitignore-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/Dockerfile-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/alembic.ini-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/requirements.txt-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/setup.py-tpl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/README.md-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/pyproject.toml-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/requirements.txt-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.cfg-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/setup.py-tpl +0 -0
- {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
- {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
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/api/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/api/routes/__init__.py-tpl +0 -0
- {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
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/crud/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/crud/new_route.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/schemas/__init__.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/fastapi_project_template/modules/schemas/new_route.py-tpl +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/py.typed +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/logging.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/src/fastapi_fastkit/utils/main.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/conftest.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_configure.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_console_sizing.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_inspector.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_prompts.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_selectors.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_interactive_validators.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_project_builder_dependency_collector.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_transducer.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_cli_operations/test_cli.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_rich/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_rich/test_rich.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/__init__.py +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/template_configs.yaml +0 -0
- {fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_templates/test_all_templates.py +0 -0
- {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.
|
|
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>=
|
|
15
|
+
Requires-Dist: pytest>=9.0.3; extra == "dev"
|
|
16
16
|
Requires-Dist: pytest-cov>=6.2.1; extra == "dev"
|
|
17
|
-
Requires-Dist: black>=
|
|
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.
|
|
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>=
|
|
27
|
+
"pytest>=9.0.3",
|
|
28
28
|
"pytest-cov>=6.2.1",
|
|
29
|
-
"black>=
|
|
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
|
-
|
|
189
|
-
if
|
|
190
|
-
|
|
191
|
-
|
|
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'{
|
|
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
|
-
|
|
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
|
-
|
|
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, "
|
|
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(
|
|
513
|
+
print_success("Generated Docker deployment files")
|
|
496
514
|
|
|
497
|
-
print_success(
|
|
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
|
-
|
|
518
|
-
|
|
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
|
-
|
|
666
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
{fastapi_fastkit-1.2.0 → fastapi_fastkit-1.2.1}/tests/test_backends/test_package_managers.py
RENAMED
|
@@ -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."""
|