You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Call for testing ruff on channel latest/candidate #135
ruff 0.17.0 (5b27c1ccf 2026-10-09)
::endgroup::
::group::Help
Ruff: An extremely fast Python linter and code formatter.
Usage: ruff [OPTIONS] <COMMAND>
Commands:
check Run Ruff on the given files or directories
rule Explain a rule (or all rules)
config List or describe the available configuration options
linter List all supported upstream linters
clean Clear any caches in the current directory and any subdirectories
format Run the Ruff formatter on the given files or directories
server Run the language server
analyze Run analysis over Python source code
version Display Ruff's version
help Print this message or the help of the given subcommand(s)
Options:
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
Log levels:
-v, --verbose
Enable verbose logging
-q, --quiet
Print diagnostics, but nothing else
-s, --silent
Disable all logging (but still exit with status code "1" upon detecting diagnostics)
Global options:
--config <CONFIG_OPTION>
Either a path to a TOML configuration file (`pyproject.toml` or `ruff.toml`), or a TOML
`<KEY> = <VALUE>` pair (such as you might find in a `ruff.toml` configuration file)
overriding a specific configuration option (e.g., `--config "line-length = 100"` or
`--config "format.quote-style = 'single'"`). Overrides of individual settings using this
option always take precedence over all configuration files, including configuration files
that were also specified using `--config`
--isolated
Ignore all configuration files
--color <WHEN>
Control when colored output is used
Possible values:
- auto: Display colors if the output goes to an interactive terminal
- always: Always display colors
- never: Never display colors
For help with a specific command, see: `ruff help <command>`.
::endgroup::
::group::Rules:
# airflow-variable-name-task-id-mismatch (AIR001)
Derived from the **Airflow** linter.
## What it does
Checks that the task variable name matches the `task_id` value for
Airflow Operators.
## Why is this bad?
When initializing an Airflow Operator, for consistency, the variable
name should match the `task_id` value. This makes it easier to
follow the flow of the Dag.
## Example
```python
from airflow.operators import PythonOperator
incorrect_name = PythonOperator(task_id="my_task")
Checks for a DAG() class or @dag() decorator without an explicit schedule (or schedule_interval for Airflow 1) parameter.
Why is this bad?
The default value of the schedule parameter on Airflow 2 and schedule_interval on Airflow 1 is timedelta(days=1), which is almost
never what a user is looking for. Airflow 3 changed the default value to None,
Found 155 errors (129 fixed, 26 remaining).
38 files reformatted, 343 files left unchanged
52 files reformatted, 329 files left unchanged
::endgroup::
::group::Repository: https://github.com/tiangolo/fastapi
Cloning into 'ruff-snap-test-dcPaAEkj'...
All checks passed!
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/python_types/tutorial010_py310.py:1:1
|
1 | / class Person:
2 | | def init(self, name: str):
3 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:18:1
|
18 | / class Person:
19 | | def init(self, name: str):
20 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:23:1
|
23 | / class Pet:
24 | | def init(self, owner: Person, name: str):
25 | | self.owner = owner
26 | | self.name = name
| |________________________^
Found 16 errors (7 fixed, 9 remaining).
135 files reformatted, 2737 files left unchanged
328 files reformatted, 2544 files left unchanged
::endgroup::
ruff 0.17.0 (5b27c1ccf 2026-10-09)
::endgroup::
::group::Help
Ruff: An extremely fast Python linter and code formatter.
Usage: ruff [OPTIONS] <COMMAND>
Commands:
check Run Ruff on the given files or directories
rule Explain a rule (or all rules)
config List or describe the available configuration options
linter List all supported upstream linters
clean Clear any caches in the current directory and any subdirectories
format Run the Ruff formatter on the given files or directories
server Run the language server
analyze Run analysis over Python source code
version Display Ruff's version
help Print this message or the help of the given subcommand(s)
Options:
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
Log levels:
-v, --verbose
Enable verbose logging
-q, --quiet
Print diagnostics, but nothing else
-s, --silent
Disable all logging (but still exit with status code "1" upon detecting diagnostics)
Global options:
--config <CONFIG_OPTION>
Either a path to a TOML configuration file (`pyproject.toml` or `ruff.toml`), or a TOML
`<KEY> = <VALUE>` pair (such as you might find in a `ruff.toml` configuration file)
overriding a specific configuration option (e.g., `--config "line-length = 100"` or
`--config "format.quote-style = 'single'"`). Overrides of individual settings using this
option always take precedence over all configuration files, including configuration files
that were also specified using `--config`
--isolated
Ignore all configuration files
--color <WHEN>
Control when colored output is used
Possible values:
- auto: Display colors if the output goes to an interactive terminal
- always: Always display colors
- never: Never display colors
For help with a specific command, see: `ruff help <command>`.
::endgroup::
::group::Rules:
# airflow-variable-name-task-id-mismatch (AIR001)
Derived from the **Airflow** linter.
## What it does
Checks that the task variable name matches the `task_id` value for
Airflow Operators.
## Why is this bad?
When initializing an Airflow Operator, for consistency, the variable
name should match the `task_id` value. This makes it easier to
follow the flow of the Dag.
## Example
```python
from airflow.operators import PythonOperator
incorrect_name = PythonOperator(task_id="my_task")
Checks for a DAG() class or @dag() decorator without an explicit schedule (or schedule_interval for Airflow 1) parameter.
Why is this bad?
The default value of the schedule parameter on Airflow 2 and schedule_interval on Airflow 1 is timedelta(days=1), which is almost
never what a user is looking for. Airflow 3 changed the default value to None,
Found 155 errors (129 fixed, 26 remaining).
38 files reformatted, 343 files left unchanged
52 files reformatted, 329 files left unchanged
::endgroup::
::group::Repository: https://github.com/tiangolo/fastapi
Cloning into 'ruff-snap-test-3EMAKMEw'...
All checks passed!
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/python_types/tutorial010_py310.py:1:1
|
1 | / class Person:
2 | | def init(self, name: str):
3 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:18:1
|
18 | / class Person:
19 | | def init(self, name: str):
20 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:23:1
|
23 | / class Pet:
24 | | def init(self, owner: Person, name: str):
25 | | self.owner = owner
26 | | self.name = name
| |________________________^
Found 16 errors (7 fixed, 9 remaining).
135 files reformatted, 2737 files left unchanged
328 files reformatted, 2544 files left unchanged
::endgroup::
Activity
github-actions commentedon Oct 14, 2026
Automated testing success.
Full logs are available at https://github.com/snapcrafters/ruff/actions/runs/38064457516. The first 100, and last 100 lines of the log are displayed in the Summary below.
Logs
Use instead:
airflow-dag-no-schedule-argument (AIR002)
Derived from the Airflow linter.
What it does
Checks for a
DAG()class or@dag()decorator without an explicitschedule(orschedule_intervalfor Airflow 1) parameter.Why is this bad?
The default value of the
scheduleparameter on Airflow 2 andschedule_intervalon Airflow 1 istimedelta(days=1), which is almostnever what a user is looking for. Airflow 3 changed the default value to
None,(Logs truncated. See full logs at: https://github.com/snapcrafters/ruff/actions/runs/38064457516)
| |______________________________^
Found 155 errors (129 fixed, 26 remaining).
38 files reformatted, 343 files left unchanged
52 files reformatted, 329 files left unchanged
::endgroup::
::group::Repository: https://github.com/tiangolo/fastapi
Cloning into 'ruff-snap-test-dcPaAEkj'...
All checks passed!
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/python_types/tutorial010_py310.py:1:1
|
1 | / class Person:
2 | | def init(self, name: str):
3 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:18:1
|
18 | / class Person:
19 | | def init(self, name: str):
20 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:23:1
|
23 | / class Pet:
24 | | def init(self, owner: Person, name: str):
25 | | self.owner = owner
26 | | self.name = name
| |________________________^
Found 16 errors (7 fixed, 9 remaining).
135 files reformatted, 2737 files left unchanged
328 files reformatted, 2544 files left unchanged
::endgroup::
github-actions commentedon Oct 14, 2026
Automated testing success.
Full logs are available at https://github.com/snapcrafters/ruff/actions/runs/38064457516. The first 100, and last 100 lines of the log are displayed in the Summary below.
Logs
Use instead:
airflow-dag-no-schedule-argument (AIR002)
Derived from the Airflow linter.
What it does
Checks for a
DAG()class or@dag()decorator without an explicitschedule(orschedule_intervalfor Airflow 1) parameter.Why is this bad?
The default value of the
scheduleparameter on Airflow 2 andschedule_intervalon Airflow 1 istimedelta(days=1), which is almostnever what a user is looking for. Airflow 3 changed the default value to
None,(Logs truncated. See full logs at: https://github.com/snapcrafters/ruff/actions/runs/38064457516)
| |______________________________^
Found 155 errors (129 fixed, 26 remaining).
38 files reformatted, 343 files left unchanged
52 files reformatted, 329 files left unchanged
::endgroup::
::group::Repository: https://github.com/tiangolo/fastapi
Cloning into 'ruff-snap-test-3EMAKMEw'...
All checks passed!
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial002_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial003_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_an_py310.py:11:1
|
11 | / class CommonQueryParams:
12 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
13 | | self.q = q
14 | | self.skip = skip
15 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/dependencies/tutorial004_py310.py:9:1
|
9 | / class CommonQueryParams:
10 | | def init(self, q: str | None = None, skip: int = 0, limit: int = 100):
11 | | self.q = q
12 | | self.skip = skip
13 | | self.limit = limit
| |__________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> docs_src/python_types/tutorial010_py310.py:1:1
|
1 | / class Person:
2 | | def init(self, name: str):
3 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:18:1
|
18 | / class Person:
19 | | def init(self, name: str):
20 | | self.name = name
| |________________________^
class-as-data-structure: Class could be dataclass or namedtuple
--> tests/test_jsonable_encoder.py:23:1
|
23 | / class Pet:
24 | | def init(self, owner: Person, name: str):
25 | | self.owner = owner
26 | | self.name = name
| |________________________^
Found 16 errors (7 fixed, 9 remaining).
135 files reformatted, 2737 files left unchanged
328 files reformatted, 2544 files left unchanged
::endgroup::
jnsgruk commentedon Oct 14, 2026
/promote 1709,1708,1711,1712,1710 latest/stable done
github-actions commentedon Oct 14, 2026
The following revisions were released to the
latest/stablechannel:1709,1708,1711,1712,1710.