[project] name = "fastapi-fullstack" version = "0.2.1" description = "Full-stack FastAPI + Next.js template generator with PydanticAI/LangChain agents, WebSocket streaming, 20+ enterprise integrations, and Logfire/LangSmith observability. Ship AI apps fast. CLI tool to generate production-ready FastAPI + Next.js projects with AI agents, auth, and observability." readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [{ name = "Vstorm", email = "hr@vstorm.co" }] keywords = [ "fastapi", "nextjs", "react", "python", "typescript", "template", "cookiecutter", "full-stack", "postgresql", "mongodb", "redis", "docker", "celery", "ai-agents", "llm", "pydantic-ai", "langchain", "langgraph", "logfire", "observability", ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Framework :: FastAPI", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Code Generators", ] dependencies = [ "click>=8.1.0", "cookiecutter>=2.6.0", "rich>=13.0.0", "questionary>=2.0.0", "pydantic>=2.0.0", "pydantic-settings>=2.0.0", "email-validator>=2.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-cov>=4.0.0", "ruff>=0.8.0", "mypy>=1.13.0", "pre-commit>=3.0.0", ] docs = [ "mkdocs>=1.6.0", "mkdocs-material>=9.5.0", "pymdown-extensions>=10.0.0", ] [project.scripts] fastapi-fullstack = "fastapi_gen.cli:main" [project.urls] Homepage = "https://github.com/vstorm-co/full-stack-ai-agent-template" Documentation = "https://github.com/vstorm-co/full-stack-ai-agent-template#readme" Repository = "https://github.com/vstorm-co/full-stack-ai-agent-template" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["fastapi_gen"] [tool.hatch.build.targets.wheel.force-include] "template" = "fastapi_gen/template" [tool.hatch.build.targets.sdist] include = [ "fastapi_gen/", "template/", "README.md", "LICENSE", "pyproject.toml", ] [tool.ruff] target-version = "py311" line-length = 100 # Exclude Jinja2 template files and generated test projects exclude = [ "template", "test", ] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "ARG", # flake8-unused-arguments "SIM", # flake8-simplify ] ignore = [ "E501", # line too long (handled by formatter) "B008", # do not perform function calls in argument defaults "B905", # zip without explicit strict ] [tool.ruff.lint.per-file-ignores] "tests/*" = ["ARG002"] # Unused method arguments are common in test fixtures [tool.ruff.lint.isort] known-first-party = ["fastapi_gen"] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true ignore_missing_imports = true # Exclude Jinja2 template files exclude = [ "template/", ] [[tool.mypy.overrides]] module = "fastapi_gen.config" # Pydantic's @computed_field on top of @property is valid but mypy doesn't like it disable_error_code = ["prop-decorator"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_functions = ["test_*"] addopts = "-v --tb=short" markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", ] [tool.coverage.run] source = ["fastapi_gen"] omit = [ "template/*", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ] [dependency-groups] dev = [ "mypy>=1.19.1", "pytest-cov>=7.0.0", ]