Skip to content

Commit ddad859

Browse files
fix: Support ruff 0.12 (#1270)
This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [ruff](https://docs.astral.sh/ruff) ([source](https://redirect.github.com/astral-sh/ruff), [changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | `>=0.2,<0.12` -> `>=0.2,<0.13` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.11.13/0.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.11.13/0.12.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.12.0`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0120) [Compare Source](https://redirect.github.com/astral-sh/ruff/compare/0.11.13...0.12.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.12.0) for a migration guide and overview of the changes! ##### Breaking changes - **Detection of more syntax errors** Ruff now detects version-related syntax errors, such as the use of the `match` statement on Python versions before 3.10, and syntax errors emitted by CPython's compiler, such as irrefutable `match` patterns before the final `case` arm. - **New default Python version handling for syntax errors** Ruff will default to the *latest* supported Python version (3.13) when checking for the version-related syntax errors mentioned above to prevent false positives in projects without a Python version configured. The default in all other cases, like applying lint rules, is unchanged and remains at the minimum supported Python version (3.9). - **Updated f-string formatting** Ruff now formats multi-line f-strings with format specifiers to avoid adding a line break after the format specifier. This addresses a change to the Python grammar in version 3.13.4 that made such a line break a syntax error. - **`rust-toolchain.toml` is no longer included in source distributions** The `rust-toolchain.toml` is used to specify a higher Rust version than Ruff's minimum supported Rust version (MSRV) for development and building release artifacts. However, when present in source distributions, it would also cause downstream package maintainers to pull in the same Rust toolchain, even if their available toolchain was MSRV-compatible. ##### Removed Rules The following rules have been removed: - [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) (`S320`) ##### Deprecated Rules The following rules have been deprecated: - [`pandas-df-variable-name`](https://docs.astral.sh/ruff/rules/pandas-df-variable-name/) ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`for-loop-writes`](https://docs.astral.sh/ruff/rules/for-loop-writes) (`FURB122`) - [`check-and-remove-from-set`](https://docs.astral.sh/ruff/rules/check-and-remove-from-set) (`FURB132`) - [`verbose-decimal-constructor`](https://docs.astral.sh/ruff/rules/verbose-decimal-constructor) (`FURB157`) - [`fromisoformat-replace-z`](https://docs.astral.sh/ruff/rules/fromisoformat-replace-z) (`FURB162`) - [`int-on-sliced-str`](https://docs.astral.sh/ruff/rules/int-on-sliced-str) (`FURB166`) - [`exc-info-outside-except-handler`](https://docs.astral.sh/ruff/rules/exc-info-outside-except-handler) (`LOG014`) - [`import-outside-top-level`](https://docs.astral.sh/ruff/rules/import-outside-top-level) (`PLC0415`) - [`unnecessary-dict-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-dict-index-lookup) (`PLR1733`) - [`nan-comparison`](https://docs.astral.sh/ruff/rules/nan-comparison) (`PLW0177`) - [`eq-without-hash`](https://docs.astral.sh/ruff/rules/eq-without-hash) (`PLW1641`) - [`pytest-parameter-with-default-argument`](https://docs.astral.sh/ruff/rules/pytest-parameter-with-default-argument) (`PT028`) - [`pytest-warns-too-broad`](https://docs.astral.sh/ruff/rules/pytest-warns-too-broad) (`PT030`) - [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements) (`PT031`) - [`invalid-formatter-suppression-comment`](https://docs.astral.sh/ruff/rules/invalid-formatter-suppression-comment) (`RUF028`) - [`dataclass-enum`](https://docs.astral.sh/ruff/rules/dataclass-enum) (`RUF049`) - [`class-with-mixed-type-vars`](https://docs.astral.sh/ruff/rules/class-with-mixed-type-vars) (`RUF053`) - [`unnecessary-round`](https://docs.astral.sh/ruff/rules/unnecessary-round) (`RUF057`) - [`starmap-zip`](https://docs.astral.sh/ruff/rules/starmap-zip) (`RUF058`) - [`non-pep604-annotation-optional`](https://docs.astral.sh/ruff/rules/non-pep604-annotation-optional) (`UP045`) - [`non-pep695-generic-class`](https://docs.astral.sh/ruff/rules/non-pep695-generic-class) (`UP046`) - [`non-pep695-generic-function`](https://docs.astral.sh/ruff/rules/non-pep695-generic-function) (`UP047`) - [`private-type-parameter`](https://docs.astral.sh/ruff/rules/private-type-parameter) (`UP049`) The following behaviors have been stabilized: - \[`collection-literal-concatenation`] (`RUF005`) now recognizes slices, in addition to list literals and variables. - The fix for \[`readlines-in-for`] (`FURB129`) is now marked as always safe. - \[`if-else-block-instead-of-if-exp`] (`SIM108`) will now further simplify expressions to use `or` instead of an `if` expression, where possible. - \[`unused-noqa`] (`RUF100`) now checks for file-level `noqa` comments as well as inline comments. - \[`subprocess-without-shell-equals-true`] (`S603`) now accepts literal strings, as well as lists and tuples of literal strings, as trusted input. - \[`boolean-type-hint-positional-argument`] (`FBT001`) now applies to types that include `bool`, like `bool | int` or `typing.Optional[bool]`, in addition to plain `bool` annotations. - \[`non-pep604-annotation-union`] (`UP007`) has now been split into two rules. `UP007` now applies only to `typing.Union`, while \[`non-pep604-annotation-optional`] (`UP045`) checks for use of `typing.Optional`. `UP045` has also been stabilized in this release, but you may need to update existing `include`, `ignore`, or `noqa` settings to accommodate this change. ##### Preview features - \[`ruff`] Check for non-context-manager use of `pytest.raises`, `pytest.warns`, and `pytest.deprecated_call` (`RUF061`) ([#&#8203;17368](https://redirect.github.com/astral-sh/ruff/pull/17368)) - \[syntax-errors] Raise unsupported syntax error for template strings prior to Python 3.14 ([#&#8203;18664](https://redirect.github.com/astral-sh/ruff/pull/18664)) ##### Bug fixes - Add syntax error when conversion flag does not immediately follow exclamation mark ([#&#8203;18706](https://redirect.github.com/astral-sh/ruff/pull/18706)) - Add trailing space around `readlines` ([#&#8203;18542](https://redirect.github.com/astral-sh/ruff/pull/18542)) - Fix `\r` and `\r\n` handling in t- and f-string debug texts ([#&#8203;18673](https://redirect.github.com/astral-sh/ruff/pull/18673)) - Hug closing `}` when f-string expression has a format specifier ([#&#8203;18704](https://redirect.github.com/astral-sh/ruff/pull/18704)) - \[`flake8-pyi`] Avoid syntax error in the case of starred and keyword arguments (`PYI059`) ([#&#8203;18611](https://redirect.github.com/astral-sh/ruff/pull/18611)) - \[`flake8-return`] Fix `RET504` autofix generating a syntax error ([#&#8203;18428](https://redirect.github.com/astral-sh/ruff/pull/18428)) - \[`pep8-naming`] Suppress fix for `N804` and `N805` if the recommended name is already used ([#&#8203;18472](https://redirect.github.com/astral-sh/ruff/pull/18472)) - \[`pycodestyle`] Avoid causing a syntax error in expressions spanning multiple lines (`E731`) ([#&#8203;18479](https://redirect.github.com/astral-sh/ruff/pull/18479)) - \[`pyupgrade`] Suppress `UP008` if `super` is shadowed ([#&#8203;18688](https://redirect.github.com/astral-sh/ruff/pull/18688)) - \[`refurb`] Parenthesize lambda and ternary expressions (`FURB122`, `FURB142`) ([#&#8203;18592](https://redirect.github.com/astral-sh/ruff/pull/18592)) - \[`ruff`] Handle extra arguments to `deque` (`RUF037`) ([#&#8203;18614](https://redirect.github.com/astral-sh/ruff/pull/18614)) - \[`ruff`] Preserve parentheses around `deque` in fix for `unnecessary-empty-iterable-within-deque-call` (`RUF037`) ([#&#8203;18598](https://redirect.github.com/astral-sh/ruff/pull/18598)) - \[`ruff`] Validate arguments before offering a fix (`RUF056`) ([#&#8203;18631](https://redirect.github.com/astral-sh/ruff/pull/18631)) - \[`ruff`] Skip fix for `RUF059` if dummy name is already bound ([#&#8203;18509](https://redirect.github.com/astral-sh/ruff/pull/18509)) - \[`pylint`] Fix `PLW0128` to check assignment targets in square brackets and after asterisks ([#&#8203;18665](https://redirect.github.com/astral-sh/ruff/pull/18665)) ##### Rule changes - Fix false positive on mutations in `return` statements (`B909`) ([#&#8203;18408](https://redirect.github.com/astral-sh/ruff/pull/18408)) - Treat `ty:` comments as pragma comments ([#&#8203;18532](https://redirect.github.com/astral-sh/ruff/pull/18532)) - \[`flake8-pyi`] Apply `custom-typevar-for-self` to string annotations (`PYI019`) ([#&#8203;18311](https://redirect.github.com/astral-sh/ruff/pull/18311)) - \[`pyupgrade`] Don't offer a fix for `Optional[None]` (`UP007`, `UP045)` ([#&#8203;18545](https://redirect.github.com/astral-sh/ruff/pull/18545)) - \[`pyupgrade`] Fix `super(__class__, self)` detection (`UP008`) ([#&#8203;18478](https://redirect.github.com/astral-sh/ruff/pull/18478)) - \[`refurb`] Make the fix for `FURB163` unsafe for `log2`, `log10`, `*args`, and deleted comments ([#&#8203;18645](https://redirect.github.com/astral-sh/ruff/pull/18645)) ##### Server - Support cancellation requests ([#&#8203;18627](https://redirect.github.com/astral-sh/ruff/pull/18627)) ##### Documentation - Drop confusing second `*` from glob pattern example for `per-file-target-version` ([#&#8203;18709](https://redirect.github.com/astral-sh/ruff/pull/18709)) - Update Neovim configuration examples ([#&#8203;18491](https://redirect.github.com/astral-sh/ruff/pull/18491)) - \[`pylint`] De-emphasize `__hash__ = Parent.__hash__` (`PLW1641`) ([#&#8203;18613](https://redirect.github.com/astral-sh/ruff/pull/18613)) - \[`refurb`] Add a note about float literal handling (`FURB157`) ([#&#8203;18615](https://redirect.github.com/astral-sh/ruff/pull/18615)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/openapi-generators/openapi-python-client). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC41MC4wIiwidXBkYXRlZEluVmVyIjoiNDAuNTAuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Dylan Anthony <[email protected]> Co-authored-by: Dylan Anthony <[email protected]>
1 parent 57e9f86 commit ddad859

File tree

20 files changed

+66
-218
lines changed

20 files changed

+66
-218
lines changed

.github/workflows/checks.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,6 @@ jobs:
101101
- name: Run mypy
102102
run: pdm mypy --show-error-codes
103103

104-
- name: Lint
105-
run: pdm run ruff check .
106-
107104
- name: Run unit tests only # snapshots are expected to fail
108105
run: pdm unit_test
109106

openapi_python_client/cli.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@
66

77
import typer
88

9-
from openapi_python_client import MetaType
9+
from openapi_python_client import MetaType, __version__
1010
from openapi_python_client.config import Config, ConfigFile
1111
from openapi_python_client.parser.errors import ErrorLevel, GeneratorError, ParseError
1212

1313
app = typer.Typer(name="openapi-python-client")
1414

1515

1616
def _version_callback(value: bool) -> None:
17-
from openapi_python_client import __version__
18-
1917
if value:
2018
typer.echo(f"openapi-python-client version: {__version__}")
2119
raise typer.Exit()
@@ -153,7 +151,7 @@ def generate(
153151
),
154152
) -> None:
155153
"""Generate a new OpenAPI Client library"""
156-
from . import generate
154+
from . import generate # noqa: PLC0415
157155

158156
config = _process_config(
159157
url=url,

openapi_python_client/parser/properties/any.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def build(
3333

3434
@classmethod
3535
def convert_value(cls, value: Any) -> Value | None:
36-
from .string import StringProperty
36+
from .string import StringProperty # noqa: PLC0415
3737

3838
if value is None:
3939
return value

openapi_python_client/parser/properties/list_property.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def build(
5656
`(result, schemas)` where `schemas` is an updated version of the input named the same including any inner
5757
classes that were defined and `result` is either the `ListProperty` or a `PropertyError`.
5858
"""
59-
from . import property_from_data
59+
from . import property_from_data # noqa: PLC0415
6060

6161
if data.items is None and not data.prefixItems:
6262
return (

openapi_python_client/parser/properties/model_property.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ def _process_properties( # noqa: PLR0912, PLR0911
242242
config: Config,
243243
roots: set[ReferencePath | utils.ClassName],
244244
) -> _PropertyData | PropertyError:
245-
from . import property_from_data
246-
from .merge_properties import merge_properties
245+
from . import property_from_data # noqa: PLC0415
246+
from .merge_properties import merge_properties # noqa: PLC0415
247247

248248
properties: dict[str, Property] = {}
249249
relative_imports: set[str] = set()
@@ -353,7 +353,7 @@ def _get_additional_properties(
353353
config: Config,
354354
roots: set[ReferencePath | utils.ClassName],
355355
) -> tuple[Property | None | PropertyError, Schemas]:
356-
from . import property_from_data
356+
from . import property_from_data # noqa: PLC0415
357357

358358
if schema_additional is None:
359359
return ANY_ADDITIONAL_PROPERTY, schemas

openapi_python_client/parser/properties/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def to_docstring(self) -> str:
174174
@property
175175
def is_base_type(self) -> bool:
176176
"""Base types, represented by any other of `Property` than `ModelProperty` should not be quoted."""
177-
from . import ListProperty, ModelProperty, UnionProperty
177+
from . import ListProperty, ModelProperty, UnionProperty # noqa: PLC0415
178178

179179
return self.__class__.__name__ not in {
180180
ModelProperty.__name__,

openapi_python_client/parser/properties/schemas.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def update_schemas_with_data(
118118
See Also:
119119
- https://swagger.io/docs/specification/using-ref/
120120
"""
121-
from . import property_from_data
121+
from . import property_from_data # noqa: PLC0415
122122

123123
prop: Union[PropertyError, Property]
124124
prop, schemas = property_from_data(

openapi_python_client/parser/properties/union.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def build(
4545
`(result, schemas)` where `schemas` is the updated version of the input `schemas` and `result` is the
4646
constructed `UnionProperty` or a `PropertyError` describing what went wrong.
4747
"""
48-
from . import property_from_data
48+
from . import property_from_data # noqa: PLC0415
4949

5050
sub_properties: list[PropertyProtocol] = []
5151

@@ -180,7 +180,7 @@ def get_lazy_imports(self, *, prefix: str) -> set[str]:
180180

181181
def validate_location(self, location: oai.ParameterLocation) -> ParseError | None:
182182
"""Returns an error if this type of property is not allowed in the given location"""
183-
from ..properties import Property
183+
from ..properties import Property # noqa: PLC0415
184184

185185
for inner_prop in self.inner_properties:
186186
if evolve(cast(Property, inner_prop), required=self.required).validate_location(location) is not None:

pdm.lock

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies = [
1414
"python-dateutil>=2.8.1,<3.0.0",
1515
"httpx>=0.23.0,<0.29.0",
1616
"ruamel.yaml>=0.18.6,<0.19.0",
17-
"ruff>=0.2,<0.12",
17+
"ruff>=0.2,<0.13",
1818
"typing-extensions>=4.8.0,<5.0.0",
1919
]
2020
name = "openapi-python-client"

tests/conftest.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ def model_property_factory() -> ModelFactory:
5656
5757
You can pass the same params into this as the ModelProperty constructor to override defaults.
5858
"""
59-
from openapi_python_client.parser.properties import Class
6059

6160
def _factory(**kwargs):
6261
kwargs = _common_kwargs(kwargs)
@@ -130,7 +129,6 @@ def enum_property_factory() -> EnumFactory[EnumProperty]:
130129
131130
You can pass the same params into this as the EnumProerty constructor to override defaults.
132131
"""
133-
from openapi_python_client.parser.properties import Class
134132

135133
return _simple_factory(
136134
EnumProperty,
@@ -149,7 +147,6 @@ def literal_enum_property_factory() -> EnumFactory[LiteralEnumProperty]:
149147
150148
You can pass the same params into this as the LiteralEnumProerty constructor to override defaults.
151149
"""
152-
from openapi_python_client.parser.properties import Class
153150

154151
return _simple_factory(
155152
LiteralEnumProperty,

tests/test___init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import MagicMock
2+
13
import pytest
24

35
from openapi_python_client import Config, ErrorLevel, Project
@@ -7,10 +9,6 @@
79

810

911
def make_project(config: Config) -> Project:
10-
from unittest.mock import MagicMock
11-
12-
from openapi_python_client import Project
13-
1412
return Project(openapi=MagicMock(title="My Test API"), config=config)
1513

1614

tests/test_cli.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
from typer.testing import CliRunner
22

3+
from openapi_python_client.cli import app
4+
35
runner = CliRunner()
46

57

68
def test_version() -> None:
7-
from openapi_python_client.cli import app
8-
99
result = runner.invoke(app, ["--version", "generate"])
1010

1111
assert result.exit_code == 0
1212
assert "openapi-python-client version: " in result.stdout
1313

1414

1515
def test_bad_config() -> None:
16-
from openapi_python_client.cli import app
17-
1816
config_path = "config/path"
1917
path = "cool/path"
2018

@@ -26,15 +24,11 @@ def test_bad_config() -> None:
2624

2725
class TestGenerate:
2826
def test_generate_no_params(self) -> None:
29-
from openapi_python_client.cli import app
30-
3127
result = runner.invoke(app, ["generate"])
3228

3329
assert result.exit_code == 1, result.output
3430

3531
def test_generate_url_and_path(self) -> None:
36-
from openapi_python_client.cli import app
37-
3832
result = runner.invoke(app, ["generate", "--path=blah", "--url=otherblah"])
3933

4034
assert result.exit_code == 1
@@ -43,8 +37,6 @@ def test_generate_url_and_path(self) -> None:
4337
def test_generate_encoding_errors(self) -> None:
4438
path = "cool/path"
4539
file_encoding = "error-file-encoding"
46-
from openapi_python_client.cli import app
47-
4840
result = runner.invoke(app, ["generate", f"--path={path}", f"--file-encoding={file_encoding}"])
4941

5042
assert result.exit_code == 1

0 commit comments

Comments
 (0)