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

[tool.hatch.version]
path = 'pydantic_settings/version.py'

[project]
name = 'pydantic-settings'
description = 'Settings management using Pydantic'
authors = [
    {name = 'Samuel Colvin', email = 's@muelcolvin.com'},
    {name = 'Eric Jolibois', email = 'em.jolibois@gmail.com'},
    {name = 'Hasan Ramezani', email = 'hasan.r67@gmail.com'},
]
license = 'MIT'
readme = 'README.md'
classifiers = [
    'Development Status :: 5 - Production/Stable',
    'Programming Language :: Python',
    'Programming Language :: Python :: 3',
    'Programming Language :: Python :: 3 :: Only',
    'Programming Language :: Python :: 3.10',
    'Programming Language :: Python :: 3.11',
    'Programming Language :: Python :: 3.12',
    'Programming Language :: Python :: 3.13',
    'Programming Language :: Python :: 3.14',
    'Intended Audience :: Developers',
    'Intended Audience :: Information Technology',
    'Intended Audience :: System Administrators',
    'License :: OSI Approved :: MIT License',
    'Framework :: Pydantic',
    'Framework :: Pydantic :: 2',
    'Operating System :: Unix',
    'Operating System :: POSIX :: Linux',
    'Environment :: Console',
    'Environment :: MacOS X',
    'Topic :: Software Development :: Libraries :: Python Modules',
    'Topic :: Internet',
]
requires-python = '>=3.10'
dependencies = [
    'pydantic>=2.7.0',
    'python-dotenv>=0.21.0',
    'typing-inspection>=0.4.0',
]
dynamic = ['version']

[project.optional-dependencies]
yaml = ["pyyaml>=6.0.1"]
toml = ["tomli>=2.0.1"]
azure-key-vault = ["azure-keyvault-secrets>=4.8.0", "azure-identity>=1.16.0"]
aws-secrets-manager = ["boto3>=1.35.0", "boto3-stubs[secretsmanager]"]
gcp-secret-manager = [
    "google-cloud-secret-manager>=2.23.1",
]

[project.urls]
Homepage = 'https://github.com/pydantic/pydantic-settings'
Funding = 'https://github.com/sponsors/samuelcolvin'
Source = 'https://github.com/pydantic/pydantic-settings'
Changelog = 'https://github.com/pydantic/pydantic-settings/releases'
Documentation = 'https://docs.pydantic.dev/dev-v2/concepts/pydantic_settings/'

[dependency-groups]
linting = [
    "black",
    "mypy",
    "pre-commit",
    "pyyaml",
    "ruff",
    "types-pyyaml",
    "boto3-stubs[secretsmanager]",
]
testing = [
    "coverage[toml]",
    "pytest",
    "pytest-examples",
    "pytest-mock",
    "pytest-pretty",
    "moto[secretsmanager]",
    "diff-cover>=9.2.0",
]

[tool.pytest.ini_options]
testpaths = 'tests'
filterwarnings = [
    'error',
    'ignore:This is a placeholder until pydantic-settings.*:UserWarning',
    'ignore::DeprecationWarning:botocore.*:',
]

# https://coverage.readthedocs.io/en/latest/config.html#run
[tool.coverage.run]
include = [
    "pydantic_settings/**/*.py",
    "tests/**/*.py",
]
branch = true

# https://coverage.readthedocs.io/en/latest/config.html#report
[tool.coverage.report]
skip_covered = true
show_missing = true
ignore_errors = true
precision = 2
exclude_lines = [
    'pragma: no cover',
    'raise NotImplementedError',
    'if TYPE_CHECKING:',
    'if typing.TYPE_CHECKING:',
    '@overload',
    '@deprecated',
    '@typing.overload',
    '@abstractmethod',
    '\(Protocol\):$',
    'typing.assert_never',
    '$\s*assert_never\(',
    'if __name__ == .__main__.:',
    'except ImportError as _import_error:',
    '$\s*pass$',
]

[tool.coverage.paths]
source = [
    'pydantic_settings/',
]

[tool.ruff]
line-length = 120
target-version = 'py310'

[tool.ruff.lint.pyupgrade]
keep-runtime-typing = true

[tool.ruff.lint]
extend-select = ['Q', 'RUF100', 'C90', 'UP', 'I']
flake8-quotes = {inline-quotes = 'single', multiline-quotes = 'double'}
isort = { known-first-party = ['pydantic_settings', 'tests'] }
mccabe = { max-complexity = 14 }
pydocstyle = { convention = 'google' }

[tool.ruff.format]
quote-style = 'single'

[tool.mypy]
python_version = '3.10'
show_error_codes = true
follow_imports = 'silent'
strict_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
disallow_any_generics = true
check_untyped_defs = true
no_implicit_reexport = true
warn_unused_configs = true
disallow_subclassing_any = true
disallow_incomplete_defs = true
disallow_untyped_decorators = true
disallow_untyped_calls = true

# for strict mypy: (this is the tricky one :-))
disallow_untyped_defs = true

# remaining arguments from `mypy --strict` which cause errors
# no_implicit_optional = true
# warn_return_any = true

# ansi2html and devtools are required to avoid the need to install these packages when running linting,
# they're used in the docs build script
[[tool.mypy.overrides]]
module = [
    'dotenv.*',
]
ignore_missing_imports = true

# configuring https://github.com/pydantic/hooky
[tool.hooky]
assignees = ['samuelcolvin', 'dmontagu', 'hramezani']
reviewers = ['samuelcolvin', 'dmontagu', 'hramezani']
require_change_file = false
