[tool.ruff]
target-version = "py312"

output-format = "full"
lint.select = [
  # https://beta.ruff.rs/docs/rules
  "A",     # flake8-builtins
  "ARG",   # flake8-unused-arguments
  "ASYNC", # flake8-async
  "B",     # flake8-bugbear
  "BLE",   # flake8-blind-except
  "C4",    # flake8-comprehensions
  "C90",   # McCabe cyclomatic complexity
  "DJ",    # flake8-django
  "DTZ",   # flake8-datetimez
  "E",     # pycodestyle
  "EM",    # flake8-errmsg
  "EXE",   # flake8-executable
  "F",     # Pyflakes
  "FA",    # flake8-future-annotations
  "FLY",   # flynt
  "G",     # flake8-logging-format
  "I",     # isort
  "ICN",   # flake8-import-conventions
  "INP",   # flake8-no-pep420
  "INT",   # flake8-gettext
  "ISC",   # flake8-implicit-str-concat
  "N",     # pep8-naming
  "NPY",   # NumPy-specific rules
  "PD",    # pandas-vet
  "PGH",   # pygrep-hooks
  "PIE",   # flake8-pie
  "PL",    # Pylint
  "PT",    # flake8-pytest-style
  "PYI",   # flake8-pyi
  "RSE",   # flake8-raise
  "RUF",   # Ruff-specific rules
  "S",     # flake8-bandit
  "SIM",   # flake8-simplify
  "SLF",   # flake8-self
  "T10",   # flake8-debugger
  "TD",    # flake8-todos
  "TID",   # flake8-tidy-imports
  "UP",    # pyupgrade
  "W",     # pycodestyle
  "YTT",   # flake8-2020
  # "ANN",  # flake8-annotations  # FIX ME?
  # "COM",  # flake8-commas
  # "D",    # pydocstyle -- FIX ME?
  # "ERA",  # eradicate -- DO NOT FIX
  # "FBT",  # flake8-boolean-trap  # FIX ME
  # "PTH",  # flake8-use-pathlib  # FIX ME
  # "Q",    # flake8-quotes
  # "RET",  # flake8-return  # FIX ME?
  # "T20",  # flake8-print
  # "TCH",  # flake8-type-checking
  # "TRY",  # tryceratops
]
lint.ignore = [
  # `ruff rule S101` for a description of that rule
  "B904",    # Within an `except` clause, raise exceptions with `raise ... from err` -- FIX ME
  "B905",    # `zip()` without an explicit `strict=` parameter -- FIX ME
  "EM101",   # Exception must not use a string literal, assign to variable first
  "EXE001",  # Shebang is present but file is not executable -- DO NOT FIX
  "G004",    # Logging statement uses f-string
  "PLC1901", # `{}` can be simplified to `{}` as an empty string is falsey
  "PLW060",  # Using global for `{name}` but no assignment is done -- DO NOT FIX
  "PLW2901", # PLW2901: Redefined loop variable -- FIX ME
  "PT011",   # `pytest.raises(Exception)` is too broad, set the `match` parameter or use a more specific exception
  "PT018",   # Assertion should be broken down into multiple parts
  "S101",    # Use of `assert` detected -- DO NOT FIX
  "S311",    # Standard pseudo-random generators are not suitable for cryptographic purposes -- FIX ME
  "SLF001",  # Private member accessed: `_Iterator` -- FIX ME
  "UP038",   # Use `X | Y` in `{}` call instead of `(X, Y)` -- DO NOT FIX
]

lint.per-file-ignores."arithmetic_analysis/newton_raphson.py" = [
  "PGH001",
]
lint.per-file-ignores."data_structures/binary_tree/binary_search_tree_recursive.py" = [
  "BLE001",
]
lint.per-file-ignores."data_structures/hashing/tests/test_hash_map.py" = [
  "BLE001",
]
lint.per-file-ignores."hashes/enigma_machine.py" = [
  "BLE001",
]
lint.per-file-ignores."machine_learning/sequential_minimum_optimization.py" = [
  "SIM115",
]
lint.per-file-ignores."matrix/sherman_morrison.py" = [
  "SIM103",
]
lint.per-file-ignores."other/l*u_cache.py" = [
  "RUF012",
]
lint.per-file-ignores."physics/newtons_second_law_of_motion.py" = [
  "BLE001",
]
lint.per-file-ignores."project_euler/problem_099/sol1.py" = [
  "SIM115",
]
lint.per-file-ignores."sorts/external_sort.py" = [
  "SIM115",
]
lint.mccabe.max-complexity = 17 # default: 10
lint.pylint.allow-magic-value-types = [
  "float",
  "int",
  "str",
]
lint.pylint.max-args = 10 # default: 5
lint.pylint.max-branches = 20 # default: 12
lint.pylint.max-returns = 8 # default: 6
lint.pylint.max-statements = 88 # default: 50

[tool.codespell]
ignore-words-list = "3rt,ans,bitap,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,toi,zar"
skip = "./.*,*.json,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"

[tool.pytest.ini_options]
markers = [
  "mat_ops: mark a test as utilizing matrix operations.",
]
addopts = [
  "--durations=10",
  "--doctest-modules",
  "--showlocals",
]

[tool.coverage.report]
omit = [
  ".env/*",
  "project_euler/*",
]
sort = "Cover"