line-length = 88
indent-width = 4 # Google Style Guide §3.4: 4 spaces

target-version = "py310" # Minimum Python version

[lint]
ignore = [
    "COM812", # Trailing comma missing.
    "FBT001", # Boolean positional arg in function definition
    "FBT002", # Boolean default value in function definition
    "D203",   # 1 blank line required before class docstring (Google: 0)
    "D213",   # Multi-line docstring summary should start at the second line (Google: first line)
    "D100",   # Ignore Missing docstring in public module (often desired at top level __init__.py)
    "D104",   # Ignore Missing docstring in public package (often desired at top level __init__.py)
    "D107",   # Ignore Missing docstring in __init__ (use class docstring)
    "TD002",  # Ignore Missing author in TODOs (often not required)
    "TD003",  # Ignore Missing issue link in TODOs (often not required/available)
    "T201",   # Ignore print presence
    "RUF012", # Ignore Mutable class attributes should be annotated with `typing.ClassVar`
    "E501",   # Ignore line length (handled by Ruff's dynamic line length)
    "UP007",  # Do not upgrade `Optional[T]` to `T | None` (PEP 604 syntax)
    "ANN002",
    "ANN003",
    "ANN401",
    "TRY003",
    "G004",
    "TRY201",
]

select = [
    "E",  # pycodestyle errors (PEP 8)
    "W",  # pycodestyle warnings (PEP 8)
    "F",  # Pyflakes (logical errors, unused imports/variables)
    "I",  # isort (import sorting - Google Style §3.1.2)
    "D",  # pydocstyle (docstring conventions - Google Style §3.8)
    "N",  # pep8-naming (naming conventions - Google Style §3.16)
    "UP", # pyupgrade (use modern Python syntax)
    "ANN",# flake8-annotations (type hint usage/style - Google Style §2.22)
    "A",  # flake8-builtins (avoid shadowing builtins)
    "B",  # flake8-bugbear (potential logic errors & style issues - incl. mutable defaults B006, B008)
    "C4", # flake8-comprehensions (unnecessary list/set/dict comprehensions)
    "ISC",# flake8-implicit-str-concat (disallow implicit string concatenation across lines)
    "T20",# flake8-print (discourage `print` - prefer logging)
    "SIM",# flake8-simplify (simplify code, e.g., `if cond: return True else: return False`)
    "PTH",# flake8-use-pathlib (use pathlib instead of os.path where possible)
    "PL", # Pylint rules ported to Ruff (PLC, PLE, PLR, PLW)
    "PIE",# flake8-pie (misc code improvements, e.g., no-unnecessary-pass)
    "RUF",# Ruff-specific rules (e.g., RUF001-003 ambiguous unicode, RUF013 implicit optional)
    "RET",# flake8-return (consistency in return statements)
    "SLF",# flake8-self (check for private member access via `self`)
    "TID",# flake8-tidy-imports (relative imports, banned imports - configure if needed)
    "YTT",# flake8-boolean-trap (checks for boolean positional arguments, truthiness tests - Google Style §3.10)
    "TD", # flake8-todos (check TODO format - Google Style §3.7)
    "TCH",# flake8-type-checking (helps manage TYPE_CHECKING blocks and imports)
    "PYI",# flake8-pyi (best practices for .pyi stub files, some rules are useful for .py too)
    "S",  # flake8-bandit (security issues)
    "DTZ",# flake8-datetimez (timezone-aware datetimes)
    "ERA",# flake8-eradicate (commented-out code)
    "Q",  # flake8-quotes (quote style consistency)
    "RSE",# flake8-raise (modern raise statements)
    "TRY",# tryceratops (exception handling best practices)
    "PERF",# perflint (performance anti-patterns)
    "BLE",
    "T10",
    "ICN",
    "G",
    "FIX",
    "ASYNC",
    "INP",
]

exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".hg",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "venv",
]

[lint.isort]
#force-sort-within-sections = true
#combine-as-imports = true
case-sensitive = true
#force-single-line = false
#known-first-party = []
#known-third-party = []
lines-after-imports = 1
#lines-between-types = 1
#no-lines-before = ["LOCALFOLDER"]
#required-imports = []
#section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"]

[lint.pydocstyle]
convention = "google"
ignore-decorators = ["typing.overload", "abc.abstractmethod"]

[lint.flake8-annotations]
mypy-init-return = true
allow-star-arg-any = false

[lint.pep8-naming]
ignore-names = ["test_*", "setUp", "tearDown", "mock_*"]
classmethod-decorators = ["classmethod", "pydantic.validator", "pydantic.root_validator"]
staticmethod-decorators = ["staticmethod"]

[lint.flake8-tidy-imports]
ban-relative-imports = "all" # Google generally prefers absolute imports (§3.1.2)

[lint.flake8-quotes]
docstring-quotes = "double"
inline-quotes = "double"

[format]
docstring-code-format = true
docstring-code-line-length = "dynamic" # Or set to 80
quote-style = "double"
indent-style = "space"
