| [project] |
| name = "todo-app-backend" |
| version = "0.1.0" |
| description = "Phase 2 Backend API for Todo SaaS Application" |
| authors = [ |
| {name = "User", email = "user@example.com"} |
| ] |
| readme = "README.md" |
| requires-python = ">=3.11" |
| classifiers = [ |
| "Programming Language :: Python :: 3", |
| "Programming Language :: Python :: 3.11", |
| "Programming Language :: Python :: 3.12", |
| "Framework :: FastAPI", |
| "Intended Audience :: Developers", |
| ] |
|
|
| dependencies = [ |
| "fastapi>=0.109.0", |
| "uvicorn[standard]>=0.27.0", |
| "sqlmodel>=0.0.14", |
| "alembic>=1.13.0", |
| "psycopg[binary]>=3.1.0", |
| "python-jose[cryptography]>=3.3.0", |
| "passlib[bcrypt]>=1.7.4", |
| "python-multipart>=0.0.6", |
| "cloudinary>=1.40.0", |
| "huggingface-hub>=0.20.0", |
| "httpx>=0.26.0", |
| "pydantic>=2.5.0", |
| "pydantic-settings>=2.1.0", |
| "python-dotenv>=1.0.0", |
| ] |
|
|
| [project.optional-dependencies] |
| dev = [ |
| "pytest>=7.4.0", |
| "pytest-asyncio>=0.23.0", |
| "pytest-cov>=4.1.0", |
| "black>=23.12.0", |
| "ruff>=0.1.0", |
| "mypy>=1.8.0", |
| ] |
|
|
| [build-system] |
| requires = ["setuptools>=68.0"] |
| build-backend = "setuptools.build_meta" |
|
|
| [tool.black] |
| line-length = 100 |
| target-version = ['py311'] |
| include = '\.pyi?$' |
| extend-exclude = ''' |
| /( |
| # directories |
| \.eggs |
| | \.git |
| | \.hg |
| | \.mypy_cache |
| | \.tox |
| | \.venv |
| | build |
| | dist |
| | alembic/versions |
| )/ |
| ''' |
|
|
| [tool.ruff] |
| line-length = 100 |
| target-version = "py311" |
| select = [ |
| "E", |
| "W", |
| "F", |
| "I", |
| "B", |
| "C4", |
| "UP", |
| ] |
| ignore = [ |
| "E501", |
| "B008", |
| "C901", |
| ] |
|
|
| [tool.ruff.per-file-ignores] |
| "__init__.py" = ["F401"] |
|
|
| [tool.mypy] |
| python_version = "3.11" |
| warn_return_any = true |
| warn_unused_configs = true |
| disallow_untyped_defs = true |
| disallow_incomplete_defs = true |
| check_untyped_defs = true |
| no_implicit_optional = true |
| warn_redundant_casts = true |
| warn_unused_ignores = true |
| warn_no_return = true |
| follow_imports = "normal" |
| ignore_missing_imports = true |
|
|
| [[tool.mypy.overrides]] |
| module = "alembic.*" |
| ignore_missing_imports = true |
|
|
| [tool.pytest.ini_options] |
| minversion = "7.0" |
| asyncio_mode = "auto" |
| testpaths = ["src/tests"] |
| python_files = ["test_*.py"] |
| python_classes = ["Test*"] |
| python_functions = ["test_*"] |
| addopts = [ |
| "-ra", |
| "--strict-markers", |
| "--strict-config", |
| "--cov=src", |
| "--cov-report=term-missing", |
| "--cov-report=html", |
| ] |
|
|
| [tool.coverage.run] |
| source = ["src"] |
| omit = [ |
| "*/tests/*", |
| "*/alembic/versions/*", |
| ] |
|
|
| [tool.coverage.report] |
| exclude_lines = [ |
| "pragma: no cover", |
| "def __repr__", |
| "raise AssertionError", |
| "raise NotImplementedError", |
| "if __name__ == .__main__.:", |
| "if TYPE_CHECKING:", |
| "@abstractmethod", |
| ] |
|
|
| [project.scripts] |
| |
| dev = "uvicorn src.main:app --reload --port 8000 --host 0.0.0.0" |
| test = "pytest" |
| test-cov = "pytest --cov=src --cov-report=html" |
|
|
| |
| db-upgrade = "alembic upgrade head" |
| db-downgrade = "alembic downgrade -1" |
| db-migration = "alembic revision --autogenerate -m" |
|
|
| |
| format = "black ." |
| lint = "ruff check ." |
| lint-fix = "ruff check . --fix" |
| type-check = "mypy ." |
|
|