extend-exclude = [
    "numpy/__config__.py",
    "numpy/typing/_char_codes.py",
    "spin/cmds.py",
    # Submodules.
    "doc/source/_static/scipy-mathjax",
    "vendored-meson/meson",
    "numpy/fft/pocketfft",
    "numpy/_core/src/umath/svml",
    "numpy/_core/src/npysort/x86-simd-sort",
    "numpy/_core/src/highway",
    "numpy/_core/src/common/pythoncapi-compat",
]

line-length = 88

[format]
line-ending = "lf"

[lint]
preview = true
select = [
    "B",    # flake8-bugbear
    "C4",   # flake8-comprehensions
    "ISC",  # flake8-implicit-str-concat
    "LOG",  # flake8-logging
    "G",    # flake8-logging-format
    "PIE",  # flake8-pie
    "Q",    # flake8-quotes
    "TID",  # flake8-tidy-imports
    "FLY",  # flynt
    "I",    # isort
    "PD",   # pandas-vet
    "PERF", # perflint
    "E",    # pycodestyle/error
    "W",    # pycodestyle/warning
    "F",    # pyflakes
    "PGH",  # pygrep-hooks
    "PLE",  # pylint/error
    "UP",   # pyupgrade
    "RUF012",  # ruff: mutable-class-default
    "RUF100",  # ruff: unused-noqa
]
ignore = [
    # flake8-bugbear
    "B006",    # Do not use mutable data structures for argument defaults
    "B007",    # Loop control variable not used within loop body
    "B011",    # Do not `assert False` (`python -O` removes these calls), raise `AssertionError()`
    "B023",    # Function definition does not bind loop variable
    "B028",    # No explicit `stacklevel` keyword argument found
    "B904",    # Within an `except` clause distinguish raised exceptions from errors in exception handling
    "B905",    #`zip()` without an explicit `strict=` parameter
    # flake8-comprehensions
    "C408",    # Unnecessary `dict()` call (rewrite as a literal)
    # flake8-implicit-str-concat
    "ISC002",  # Implicitly concatenated string literals over multiple lines
    # flake8-pie
    "PIE790",  # Unnecessary `pass` statement
    # perflint
    "PERF401", # Use a list comprehension to create a transformed list
    # pycodestyle/error
    "E241",    # Multiple spaces after comma
    "E265",    # Block comment should start with `# `
    "E266",    # Too many leading `#` before block comment
    "E302",    # TODO: Expected 2 blank lines, found 1
    "E402",    # Module level import not at top of file
    "E712",    # Avoid equality comparisons to `True` or `False`
    "E731",    # Do not assign a `lambda` expression, use a `def`
    "E741",    # Ambiguous variable name
    # pyflakes
    "F403",    # `from ... import *` used; unable to detect undefined names
    "F405",    # may be undefined, or defined from star imports
    "F821",    # Undefined name
    "F841",    # Local variable is assigned to but never used
    # pyupgrade
    "UP015" ,  # Unnecessary mode argument
]

[lint.per-file-ignores]
"_tempita.py" = ["B909", "RUF012"]
"bench_*.py" = ["B015", "B018", "RUF012"]
"test*.py" = ["B015", "B018", "E201", "E714", "RUF012"]

"numpy/_core/_add_newdocs.py" = ["E501"]
"numpy/_core/_add_newdocs_scalars.py" = ["E501"]
"numpy/f2py/*py" = ["E501"]
"numpy*pyi" = ["E501"]
# "useless assignments" aren't so useless when you're testing that they don't make type checkers scream
"numpy/typing/tests/data/*" = ["B015", "B018", "E501"]
# too disruptive to enable all at once
"**/*.py" = ["Q"]

"__init__.py" = ["F401", "F403", "F405"]
"__init__.pyi" = ["F401"]
"numpy/_core/defchararray.py" = ["F403", "F405"]
"numpy/_core/multiarray.py" = ["F405"]
"numpy/_core/numeric.py" = ["F403", "F405"]
"numpy/_core/umath.py" = ["F401", "F403", "F405"]
"numpy/f2py/capi_maps.py" = ["F403", "F405"]
"numpy/f2py/crackfortran.py" = ["F403", "F405"]
"numpy/f2py/f90mod_rules.py" = ["F403", "F405"]
"numpy/ma/core.pyi" = ["F403", "F405"]
"numpy/matlib.py" = ["F405"]
"numpy/matlib.pyi" = ["F811"]

[lint.flake8-builtins]
builtins-allowed-modules = ["random", "typing"]

[lint.flake8-import-conventions.extend-aliases]
"numpy" = "np"
"numpy.typing" = "npt"

[lint.isort]
# these are treated as stdlib within .pyi stubs
extra-standard-library = ["_typeshed", "typing_extensions"]
known-first-party = ["numpy"]
combine-as-imports = true
split-on-trailing-comma = false
