[project] name = "bookmarks" version = "0.1.0" description = "Bookmarks and Goggles generator for FMHY" readme = "README.md" requires-python = ">=3.13" dependencies = [ "aiohttp>=3.12.15", ] [tool.pyright] # We use ruff for this. reportInvalidStringEscapeSequence = false [tool.ruff] target-version = "py312" line-length = 100 # Group violations by containing file. output-format = "grouped" [tool.ruff.lint] ignore = [ # (missing public docstrings) These work off of the Python sense of "public", rather than our # bespoke definition based off of `@public`. When ruff supports custom plugins then we can write # appropriate rules to require docstrings for `@public`. "D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107", # (docstring imperative mood) Overly restrictive. "D401", # (module level import not at top) There are several places where we use e.g. # warnings.filterwarings calls before imports. "E402", # (line too long): This fires for comments, which the ruff formatter won't auto-wrap. Disabling # until there is an autoformat solution available for comments. "E501", # (no type comparison): There are a few places where we use `== type(None)` which are more clear # than the equivalent `isinstance` check. 'E721', # (bare exception): There are many places where we want to catch a maximally generic exception. 'E722', # (no assign lambda): existing code assigns lambdas in a few places. With ruff formatting # requiring extra empty lines between defs, disallowing lambda assignment can make code less # readable. "E731", # (try-except-in-loop) we use this pattern in many places and the performance impact is negligible "PERF203", # (no concatenation) Existing codebase has many concatentations, no reason to disallow them. "RUF005", # (use ClassVar for attr declarations with defaults) This is a good rule for vanilla Python, but # triggers false positives for many libs that have DSLs that make use of attr defaults. "RUF012", # (assorted perf rules) We have a lot of violations, enable when autofix is available "PERF401", # (manual-list-comprehension) "PERF402", # (manual-list-copy) ] # By default, ruff only uses all "E" (pycodestyle) and "F" (pyflakes) rules. # Here we append to the defaults. extend-select = [ # (flake8-builtins) detect shadowing of python builtin symbols by variables and arguments. # Attributes are OK (which is why A003) is not included here. "A001", "A002", # (useless expression): Expressions that aren't assigned to anything are typically bugs. "B018", # (static key dict comprehension): Flag reuse of a key in dict comprehensions. "B035", # (pydocstyle) Docstring-related rules. A large subset of these are ignored by the # "convention=google" setting, we set under tool.ruff.pydocstyle. "D", # (pycodestyle) pycodestyle rules "E", # (pyflakes) pyflakes rules "F", # (pyupgrade) pyupgrade rules "UP", # (isort) detect improperly sorted imports "I001", # ban relative imports "TID252", # (pylint) use all pylint rules from categories "Convention", "Error", and "Warning" (ruff # currently implements only a subset of pylint's rules) "PLE", "PLW", # (ruff-specific) Enable all ruff-specific checks (i.e. not ports of # functionality from an existing linter). "RUF", # (private member access) Flag access to `_`-prefixed symbols. By default the various special # methods on `NamedTuple` are ignored (e.g. `_replace`). "SLF001", # (flake8-type-checking) Auto-sort imports into TYPE_CHECKING blocks depending on whether # they are runtime or type-only imports. "TCH", # (banned-api) Flag use of banned APIs. See tool.ruff.flake8-tidy-imports.banned-api for details. "TID251", # (disallow print statements) keep debugging statements out of the codebase "T20", # (f-strings) use f-strings instead of .format() "UP032", # (invalid escape sequence) flag errant backslashes "W605", ] [tool.ruff.lint.flake8-builtins] # We use `id` in many places and almost never want to use the python builtin. builtins-ignorelist = ["id"] [tool.ruff.lint.flake8-tidy-imports.banned-api] "__future__.annotations".msg = "Directly quote annotations instead." [tool.ruff.lint.isort] # Combine multiple `from foo import bar as baz` statements with the same source # (`foo`) into a single statement. combine-as-imports = true # In cases where imports are automatically removed, allows the imports to be automatically collapsed split-on-trailing-comma = false # Imports of the form `from foo import bar as baz` show one `import bar as baz` # per line. Useful for __init__.py files that just re-export symbols. force-wrap-aliases = true [tool.ruff.lint.flake8-tidy-imports] # Disallow all relative imports. ban-relative-imports = "all" [tool.ruff.lint.pydocstyle] # Enforce google-style docstrings. This is equivalent to ignoring a large number of pydocstyle (D) # rules incompatible with google-style docstrings. See: # https://google.github.io/styleguide/pyguide.html#383-functions-and-methods convention = "google" [tool.ruff.format] docstring-code-format = true