# How the Python in this tree is formatted, and how its imports are ordered. # `.githooks/pre-commit` applies both to what you staged (install it with # `git config core.hooksPath .githooks`); `ruff format --check .` asks. # # Adopted when PR #1 arrived black-formatted: ruff's formatter IS black's # output, it is one static binary instead of a Python dependency chain, and it # is fast enough that a pre-commit hook is free. Configuration is deliberately # left at the defaults -- every knob turned here is an argument somebody has to # have again later. # The version this tree was formatted with, enforced by ruff itself: a # formatter whose output moves between releases turns "formatted" into # "formatted by whoever committed last", and the diff lands on the next # person. A mismatch is refused with both versions named rather than quietly # reformatting everything. Bumping it is one line here, one in the hook's # install hint, and a reformat commit (added to .git-blame-ignore-revs) -- # the honest cost of a new version. required-version = "==0.16.3" target-version = "py311" line-length = 88 [format] # 0.16 formats Python fenced blocks inside markdown by default. The snippets # in docs/ are deliberately terse repro recipes (a `try: x` one-liner reads as # one step); a formatter blowing them up to three lines makes them worse, and # nothing executes them. Real code lives in .py files, which are formatted. exclude = ["*.md"] [lint] # Import sorting, and nothing else. `ruff check` can enforce a great deal more # and one day it might, but this hook's job is formatting: one that also # refused a commit over an unused variable would be a different feature, and # not one anybody asked for. # # Sorting is safe here because ruff sorts import BLOCKS and never hoists across # a statement: every test file's `sys.path.insert(...)` sits between the # standard library and the `idatui` imports, and that line is exactly what # makes them importable. select = ["I"]