# Package ######################################################################

[project]
name = "liuren_modeling"
description = "Light-weight full-system simulation framework"
readme = "README.md"
requires-python = ">=3.9"

# Linter tools #################################################################

[tool.black]
line-length = 88

[tool.isort]
src_paths = [".", "tensor_cast", "tests"]
extra_standard_library = ["typing_extensions"]
skip_gitignore = true
skip_glob = ["third_party/*"]
atomic = true
profile = "black"
indent = 4
line_length = 88
lines_after_imports = 2
multi_line_output = 3
include_trailing_comma = true
combine_as_imports = true

[tool.usort.known]
first_party = [".", "tensor_cast", "tests"]
standard_library = ["typing_extensions"]

[tool.ruff]
line-length = 88
src = [".", "tensor_cast", "tests"]

[tool.ruff.format]
docstring-code-format = true
quote-style = "double"

[tool.ruff.lint]
# NOTE: Synchoronize the ignores with .flake8
external = [
    "B001",
    "B902",
    "B950",
    "E121",
    "E122",
    "E128",
    "E131",
    "E704",
    "E723",
    "F723",
    "F812",
    "P201",
    "P204",
    "T484",
    "TOR901",
]
ignore = [
    # these ignores are from flake8-bugbear; please fix!
    "B007", "B008", "B017",
    "B018", # Useless expression
    "B023",
    "B028", # No explicit `stacklevel` keyword argument found
    "E402",
    "C408", # C408 ignored because we like the dict keyword argument syntax
    "E501", # E501 is not flexible enough, we're using B950 instead
    "E721",
    "E741",
    "EXE001",
    "F405",
    "FURB122", # writelines
    # these ignores are from flake8-logging-format; please fix!
    "G101",
    "G004",
    # these ignores are from ruff NPY; please fix!
    "NPY002",
    # these ignores are from ruff PERF; please fix!
    "PERF203",
    "PERF401",
    # these ignores are from PYI; please fix!
    "PYI024",
    "PYI036",
    "PYI041",
    "PYI056",
    "SIM102", "SIM103", "SIM112", # flake8-simplify code styles
    "SIM105", # these ignores are from flake8-simplify. please fix or ignore with commented reason
    "SIM108", # SIM108 ignored because we prefer if-else-block instead of ternary expression
    "SIM110",
    "SIM114", # Combine `if` branches using logical `or` operator
    "SIM115",
    "SIM116", # Disable Use a dictionary instead of consecutive `if` statements
    "SIM117",
    "SIM118",
    "UP007", # keep-runtime-typing
    "UP045", # keep-runtime-typing
    "UP035", # ignore typing.List warning
    "UP006",
    "TC006",
]
select = [
    "B",
    "B904", # Re-raised error without specifying the cause via the from keyword
    "C4",
    "G",
    "E",
    "EXE",
    "F",
    "SIM1",
    "SIM911",
    "W",
    # Not included in flake8
    "FURB",
    "LOG",
    "NPY",
    "PERF",
    "PGH004",
    "PIE790",
    "PIE794",
    "PIE800",
    "PIE804",
    "PIE807",
    "PIE810",
    "PLC0131", # type bivariance
    "PLC0132", # type param mismatch
    "PLC0205", # string as __slots__
    "PLC3002", # unnecessary-direct-lambda-call
    "PLE",
    "PLR0133", # constant comparison
    "PLR0206", # property with params
    "PLR1722", # use sys exit
    "PLR1736", # unnecessary list index
    "PLW0129", # assert on string literal
    "PLW0131", # named expr without context
    "PLW0133", # useless exception statement
    "PLW0245", # super without brackets
    "PLW0406", # import self
    "PLW0711", # binary op exception
    "PLW1501", # bad open mode
    "PLW1507", # shallow copy os.environ
    "PLW1509", # preexec_fn not safe with threads
    "PLW2101", # useless lock statement
    "PLW3301", # nested min max
    "PT006", # TODO: enable more PT rules
    "PT014", # duplicate parameterize case
    "PT022",
    "PT023",
    "PT024",
    "PT025",
    "PT026",
    "PYI",
    "Q003",  # avoidable escaped quote
    "Q004",  # unnecessary escaped quote
    "RSE",
    "RUF008", # mutable dataclass default
    "RUF013", # ban implicit optional
    "RUF015", # access first ele in constant time
    "RUF016", # type error non-integer index
    "RUF017",
    "RUF018", # no assignment in assert
    "RUF019", # unnecessary-key-check
    "RUF020", # never union
    "RUF024", # from keys mutable
    "RUF026", # default factory kwarg
    "RUF030", # No print statement in assert
    "RUF033", # default values __post_init__ dataclass
    "RUF041", # simplify nested Literal
    "RUF048", # properly parse `__version__`
    "RUF200", # validate pyproject.toml
    "S324", # for hashlib FIPS compliance
    "SLOT",
    "TC",
    "TRY002", # ban vanilla raise (todo fix NOQAs)
    "TRY203",
    "TRY401", # verbose-log-message
    "UP",
    "YTT",
]

[tool.ruff.lint.pyupgrade]
# Preserve types, even if a file imports `from __future__ import annotations`.
keep-runtime-typing = true