Adopt Ruff⚡ in your repo faster 😎
A tool for finding Ruff rules that are not yet configured, and can be added to your repository easily:
- Rules your code already follows 👏
- Rules that can be automatically fixed by Ruff 🪄
- Rules violated in the repository, sorted by ascending violation count 🔎
The output is a markdown report, easy to check as a Github action summary and CSV files with relevant Rule information per category.
See example at the bottom of this page
To decide whether to consider a rule, adopt-ruff
uses arguments. See below on how to configure them.
- Ruff considers some new or experimental rules
in preview
. These should be used with caution. You can choose whetheradopt-ruff
considers them or not. Read more about Ruff's preview here. - Ruff supports many autofixable rules - some are always autofixable, and some can only be autofixed by Ruff in specific cases. It's up to you whether to consider "sometimes-autofixable" as autofixable.
Create a yaml file under .github/workspaces
in your repo, with the following content:
name: Adopt Ruff
on: workflow_dispatch
jobs:
adopt-ruff:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Set up python
id: setup-python
uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Install ruff
run: pip install ruff
- name: Run the adopt-ruff action
uses: ScDor/adopt-ruff@master
Now, manually trigger the workflow from the Actions
panel of your repository.
Learn more about manually triggering a workflow here.
When the action is done running, head to the job summary to watch the report.
The output tables are also availalbe as CSV files, under Artifacts
.
Re-run this action to get insights about applicable rules when Ruff updates with more exciting rules ⚡
-
This flow always installs Ruff's latest version. If your project already has Ruff as a dependency (i.e. in
pyproject.toml
orrequirements.txt
), replace theInstall ruff
step with an appropriate command. -
adopt-ruff calls Ruff, assuming it's installed in the environment. adopt-ruff will fail if ruff is not found.
To pass arguments different than the default, use the with
key. The values mentioned below are the default. Omit any argument to use the default.
- name: Run the adopt-ruff action
uses: ScDor/adopt-ruff@master
with:
path: "."
repo-name: "" # won't show in report if blank
config-file-path: "" # will be searched in `path` if empty
include-preview: True
include-sometimes-fixable: False
Install by running pip install git https://github.com/ScDor/adopt-ruff
.
Run adopt-ruff --help
for more information.\
--path
: directory adopt-ruff will search for ruff violations.--ruff-conf-path
: Path to thepyproject.toml
,ruff.toml
or.ruff.toml
. When not provided,adopt-ruff
will attempt to seach one of those underpath
.--sometimes-fixable
: whether to consider sometimes-fixable rules as fixable.--preview
/--no-preview
: whether to include preview rules.--repo-name
: Will be shown in the output. When not provided, won't be shown.
374 Ruff rules are already respected in the repo - they can be added right away 🚀
Details
Code | Name | Fixable | Preview | Linter |
---|---|---|---|---|
A003 | builtin-attribute-shadowing | No | False | flake8-builtins |
AIR001 | airflow-variable-name-task-id-mismatch | No | False | Airflow |
ASYNC100 | blocking-http-call-in-async-function | No | False | flake8-async |
ASYNC101 | open-sleep-or-subprocess-in-async-function | No | False | Perflint |
PERF403 | manual-dict-comprehension | No | True | Perflint |
(table truncated for example purposes)
65 Ruff rules are violated in the repo, but can be auto-fixed 🪄
Details
Code | Name | Fixable | Preview | Linter |
---|---|---|---|---|
B010 | set-attr-with-constant | Always | False | flake8-bugbear |
B011 | assert-false | Always | False | flake8-bugbear |
C401 | unnecessary-generator-set | Always | False | flake8-comprehensions |
(table truncated for example purposes)
194 other Ruff rules are not yet configured in the repository
Details
Code | Name | Fixable | Preview | Linter | Violations |
---|---|---|---|---|---|
PLW0127 | self-assigning-variable | No | False | Pylint | 1 |
RUF009 | function-call-in-dataclass-default-argument | No | False | Ruff-specific rules | 1 |
S314 | suspicious-xml-element-tree-usage | No | False | flake8-bandit | 1 |
B005 | strip-with-multi-characters | No | False | flake8-bugbear | 1 |
PTH116 | os-stat | No | False | flake8-use-pathlib | 6 |
N803 | invalid-argument-name | No | False | pep8-naming | 6 |
UP032 | f-string | Sometimes | False | pyupgrade | 6 |
B019 | cached-instance-method | No | False | flake8-bugbear | 7 |
B017 | assert-raises-exception | No | False | flake8-bugbear | 8 |
TCH002 | typing-only-third-party-import | Sometimes | False | flake8-type-checking | 8 |
PLW1508 | invalid-envvar-default | No | False | Pylint | 9 |
S607 | start-process-with-partial-path | No | False | flake8-bandit | 9 |
DTZ007 | call-datetime-strptime-without-zone | No | False | flake8-datetimez | 10 |
D205 | blank-line-after-summary | Sometimes | False | pydocstyle | 2860 |
(table truncated for example purposes)
Configuration | Value |
---|---|
Include sometimes-fixable rules | False |
Include preview rules | True |