[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "fastapi"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
readme = "README.md"
requires-python = ">=3.7"
license = "MIT"
authors = [
    { name = "Sebastián Ramírez", email = "tiangolo@gmail.com" },
]
classifiers = [
    "Intended Audience :: Information Technology",
    "Intended Audience :: System Administrators",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python",
    "Topic :: Internet",
    "Topic :: Software Development :: Libraries :: Application Frameworks",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development",
    "Typing :: Typed",
    "Development Status :: 4 - Beta",
    "Environment :: Web Environment",
    "Framework :: AsyncIO",
    "Framework :: FastAPI",
    "Framework :: Pydantic",
    "Framework :: Pydantic :: 1",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3 :: Only",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
    "Topic :: Internet :: WWW/HTTP",
]
dependencies = [
    "starlette>=0.27.0,<0.28.0",
    "pydantic >=1.6.2,!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0",
]
dynamic = ["version"]

[project.urls]
Homepage = "https://github.com/tiangolo/fastapi"
Documentation = "https://fastapi.tiangolo.com/"

[project.optional-dependencies]
test = [
    "pytest >=7.1.3,<8.0.0",
    "coverage[toml] >= 6.5.0,< 8.0",
    "mypy ==0.982",
    "ruff ==0.0.138",
    "black == 23.1.0",
    "isort >=5.0.6,<6.0.0",
    "httpx >=0.23.0,<0.24.0",
    "email_validator >=1.1.1,<2.0.0",
    # TODO: once removing databases from tutorial, upgrade SQLAlchemy
    # probably when including SQLModel
    "sqlalchemy >=1.3.18,<1.4.43",
    "peewee >=3.13.3,<4.0.0",
    "databases[sqlite] >=0.3.2,<0.7.0",
    "orjson >=3.2.1,<4.0.0",
    "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0",
    "python-multipart >=0.0.5,<0.0.7",
    "flask >=1.1.2,<3.0.0",
    "anyio[trio] >=3.2.1,<4.0.0",
    "python-jose[cryptography] >=3.3.0,<4.0.0",
    "pyyaml >=5.3.1,<7.0.0",
    "passlib[bcrypt] >=1.7.2,<2.0.0",

    # types
    "types-ujson ==5.7.0.1",
    "types-orjson ==3.6.2",
]
doc = [
    "mkdocs >=1.1.2,<2.0.0",
    "mkdocs-material >=8.1.4,<9.0.0",
    "mdx-include >=1.4.1,<2.0.0",
    "mkdocs-markdownextradata-plugin >=0.1.7,<0.3.0",
    "typer-cli >=0.0.13,<0.0.14",
    "typer[all] >=0.6.1,<0.8.0",
    "pyyaml >=5.3.1,<7.0.0",
]
dev = [
    "ruff ==0.0.138",
    "uvicorn[standard] >=0.12.0,<0.21.0",
    "pre-commit >=2.17.0,<3.0.0",
]
all = [
    "httpx >=0.23.0",
    "jinja2 >=2.11.2",
    "python-multipart >=0.0.5",
    "itsdangerous >=1.1.0",
    "pyyaml >=5.3.1",
    "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0",
    "orjson >=3.2.1",
    "email_validator >=1.1.1",
    "uvicorn[standard] >=0.12.0",
]

[tool.hatch.version]
path = "fastapi/__init__.py"

[tool.isort]
profile = "black"
known_third_party = ["fastapi", "pydantic", "starlette"]

[tool.mypy]
strict = true

[[tool.mypy.overrides]]
module = "fastapi.concurrency"
warn_unused_ignores = false
ignore_missing_imports = true

[[tool.mypy.overrides]]
module = "fastapi.tests.*"
ignore_missing_imports = true
check_untyped_defs = true

[tool.pytest.ini_options]
addopts = [
  "--strict-config",
  "--strict-markers",
]
xfail_strict = true
junit_family = "xunit2"
filterwarnings = [
    "error",
    # TODO: needed by asyncio in Python 3.9.7 https://bugs.python.org/issue45097, try to remove on 3.9.8
    'ignore:The loop argument is deprecated since Python 3\.8, and scheduled for removal in Python 3\.10:DeprecationWarning:asyncio',
    'ignore:starlette.middleware.wsgi is deprecated and will be removed in a future release\..*:DeprecationWarning:starlette',
    # TODO: remove after upgrading HTTPX to a version newer than 0.23.0
    # Including PR: https://github.com/encode/httpx/pull/2309
    "ignore:'cgi' is deprecated:DeprecationWarning",
    # For passlib
    "ignore:'crypt' is deprecated and slated for removal in Python 3.13:DeprecationWarning",
    # see https://trio.readthedocs.io/en/stable/history.html#trio-0-22-0-2022-09-28
    "ignore:You seem to already have a custom.*:RuntimeWarning:trio",
    "ignore::trio.TrioDeprecationWarning",
    # TODO remove pytest-cov
    'ignore::pytest.PytestDeprecationWarning:pytest_cov',
]

[tool.coverage.run]
parallel = true
source = [
    "docs_src",
    "tests",
    "fastapi"
]
context = '${CONTEXT}'
omit = [
    "docs_src/response_model/tutorial003_04.py",
    "docs_src/response_model/tutorial003_04_py310.py",
]

[tool.ruff]
select = [
    "E",  # pycodestyle errors
    "W",  # pycodestyle warnings
    "F",  # pyflakes
    # "I",  # isort
    "C",  # flake8-comprehensions
    "B",  # flake8-bugbear
]
ignore = [
    "E501",  # line too long, handled by black
    "B008",  # do not perform function calls in argument defaults
    "C901",  # too complex
]

[tool.ruff.per-file-ignores]
"__init__.py" = ["F401"]
"docs_src/dependencies/tutorial007.py" = ["F821"]
"docs_src/dependencies/tutorial008.py" = ["F821"]
"docs_src/dependencies/tutorial009.py" = ["F821"]
"docs_src/dependencies/tutorial010.py" = ["F821"]
"docs_src/custom_response/tutorial007.py" = ["B007"]
"docs_src/dataclasses/tutorial003.py" = ["I001"]
"docs_src/path_operation_advanced_configuration/tutorial007.py" = ["B904"]
"docs_src/custom_request_and_route/tutorial002.py" = ["B904"]
"docs_src/dependencies/tutorial008_an.py" = ["F821"]
"docs_src/dependencies/tutorial008_an_py39.py" = ["F821"]
"docs_src/query_params_str_validations/tutorial012_an.py" = ["B006"]
"docs_src/query_params_str_validations/tutorial012_an_py39.py" = ["B006"]
"docs_src/query_params_str_validations/tutorial013_an.py" = ["B006"]
"docs_src/query_params_str_validations/tutorial013_an_py39.py" = ["B006"]

[tool.ruff.isort]
known-third-party = ["fastapi", "pydantic", "starlette"]
