content: [tool.ruff]
  exclude = [
    "python-stdlib",
    "unix-ffi",
  ]
  select = [
    "ASYNC",  # flake8-comprehensions
    "C4",     # flake8-comprehensions
    "C90",    # McCabe cyclomatic complexity
    "DTZ",    # flake8-datetimez
    "E",      # pycodestyle
    "EXE",    # flake8-executable
    "F",      # Pyflakes
    "G",      # flake8-logging-format
    "ICN",    # flake8-import-conventions
    "INT",    # flake8-gettext
    "ISC",    # flake8-implicit-str-concat
    "PGH",    # pygrep-hooks
    "PIE",    # flake8-pie
    "PL",     # Pylint
    "PYI",    # flake8-pyi
    "RSE",    # flake8-raise
    "RUF",    # Ruff-specific rules
    "T10",    # flake8-debugger
    "TCH",    # flake8-type-checking
    "W",      # pycodestyle
    "YTT",    # flake8-2020
    # "A",    # flake8-builtins
    # "ANN",  # flake8-annotations
    # "ARG",  # flake8-unused-arguments
    # "B",    # flake8-bugbear
    # "BLE",  # flake8-blind-except
    # "COM",  # flake8-commas
    # "D",    # pydocstyle
    # "DJ",   # flake8-django
    # "EM",   # flake8-errmsg
    # "ERA",  # eradicate
    # "FBT",  # flake8-boolean-trap
    # "I",    # isort
    # "INP",  # flake8-no-pep420
    # "N",    # pep8-naming
    # "NPY",  # NumPy-specific rules
    # "PD",   # pandas-vet
    # "PT",   # flake8-pytest-style
    # "PTH",  # flake8-use-pathlib
    # "Q",    # flake8-quotes
    # "RET",  # flake8-return
    # "S",    # flake8-bandit
    # "SIM",  # flake8-simplify
    # "SLF",  # flake8-self
    # "T20",  # flake8-print
    # "TID",  # flake8-tidy-imports
    # "TRY",  # tryceratops
    # "UP",   # pyupgrade
  ]
  ignore = [
    "E722",
    "E741",  # 'l' is currently widely used
    "F401",
    "F403",
    "F405",
    "E501",  # line length, recommended to disable
    "ISC001",
    "ISC003",  # micropython does not support implicit concatenation of f-strings
    "PIE810",  # micropython does not support passing tuples to .startswith or .endswith
    "PLC1901",
    "PLR1704",  # sometimes desirable to redefine an argument to save code size
    "PLR1714",
    "PLR5501",
    "PLW0602",
    "PLW0603",
    "PLW2901",
    "RUF012",
    "RUF100",
    "SIM101",
    "W191",  # tab-indent, redundant when using formatter
  ]
  line-length = 99
  target-version = "py37"
  
  [tool.ruff.mccabe]
  max-complexity = 61
  
  [tool.ruff.pylint]
  allow-magic-value-types = ["bytes", "int", "str"]
  max-args = 14
  max-branches = 58
  max-returns = 13
  max-statements = 166
  
  [tool.ruff.per-file-ignores]
  "micropython/aiorepl/aiorepl.py" = ["PGH001"]
  
  # manifest.py files are evaluated with some global names pre-defined
  "**/manifest.py" = ["F821"]
  "ports/**/boards/manifest*.py" = ["F821"]
  
  # ble multitests are evaluated with some names pre-defined
  "micropython/bluetooth/aioble/multitests/*" = ["F821"]
  
  [tool.ruff.format]
  