Add pyupgrade's --keep-runtime-typing option (#965)

This commit is contained in:
Charlie Marsh 2022-11-29 20:05:32 -05:00 committed by GitHub
parent ced7868559
commit b8e7d86696
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 63 additions and 4 deletions

View file

@ -1845,6 +1845,26 @@ has no `self` or `cls` argument.
staticmethod-decorators = ["staticmethod", "stcmthd"]
```
### `pyupgrade`
#### [`keep_runtime_typing`](#keep_runtime_typing)
Whether to avoid PEP 585 (`List[int]` -> `list[int]`) and PEP 604 (`Optional[str]` -> `str | None`)
rewrites even if a file imports `from __future__ import annotations`. Note that this setting is
only applicable when the target Python version is below 3.9 and 3.10 respectively.
**Default value**: `false`
**Type**: `bool`
**Example usage**:
```toml
[tool.ruff.pep8-naming]
# Preserve types, even if a file imports `from __future__ import annotations`.
keep-runtime-typing = true
```
## License
MIT

View file

@ -35,3 +35,6 @@ strip = true
[tool.isort]
profile = "black"
known_third_party = ["fastapi", "pydantic", "starlette"]
[tool.ruff.pyupgrade]

View file

@ -1197,6 +1197,7 @@ where
&& self.settings.enabled.contains(&CheckCode::U007)
&& (self.settings.target_version >= PythonVersion::Py310
|| (self.settings.target_version >= PythonVersion::Py37
&& !self.settings.pyupgrade.keep_runtime_typing
&& self.annotations_future_enabled
&& self.in_deferred_annotation))
{
@ -1239,6 +1240,7 @@ where
&& self.settings.enabled.contains(&CheckCode::U006)
&& (self.settings.target_version >= PythonVersion::Py39
|| (self.settings.target_version >= PythonVersion::Py37
&& !self.settings.pyupgrade.keep_runtime_typing
&& self.annotations_future_enabled
&& self.in_deferred_annotation))
&& typing::is_pep585_builtin(

View file

@ -1,4 +1,4 @@
//! Settings for the `pep8-naming` plugin.
//! Settings for the `flake8-bugbear` plugin.
use serde::{Deserialize, Serialize};

View file

@ -1,4 +1,5 @@
mod checks;
pub mod fixes;
pub mod plugins;
pub mod settings;
pub mod types;

22
src/pyupgrade/settings.rs Normal file
View file

@ -0,0 +1,22 @@
//! Settings for the `pyupgrade` plugin.
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct Options {
pub keep_runtime_typing: Option<bool>,
}
#[derive(Debug, Hash, Default)]
pub struct Settings {
pub keep_runtime_typing: bool,
}
impl Settings {
pub fn from_options(options: Options) -> Self {
Self {
keep_runtime_typing: options.keep_runtime_typing.unwrap_or_default(),
}
}
}

View file

@ -14,7 +14,7 @@ use crate::settings::pyproject::load_options;
use crate::settings::types::{FilePattern, PerFileIgnore, PythonVersion, SerializationFormat};
use crate::{
flake8_annotations, flake8_bugbear, flake8_quotes, flake8_tidy_imports, fs, isort, mccabe,
pep8_naming,
pep8_naming, pyupgrade,
};
#[derive(Debug)]
@ -44,6 +44,7 @@ pub struct Configuration {
pub isort: isort::settings::Settings,
pub mccabe: mccabe::settings::Settings,
pub pep8_naming: pep8_naming::settings::Settings,
pub pyupgrade: pyupgrade::settings::Settings,
}
static DEFAULT_EXCLUDE: Lazy<Vec<FilePattern>> = Lazy::new(|| {
@ -164,6 +165,10 @@ impl Configuration {
.pep8_naming
.map(pep8_naming::settings::Settings::from_options)
.unwrap_or_default(),
pyupgrade: options
.pyupgrade
.map(pyupgrade::settings::Settings::from_options)
.unwrap_or_default(),
})
}
}

View file

@ -18,7 +18,7 @@ use crate::settings::configuration::Configuration;
use crate::settings::types::{FilePattern, PerFileIgnore, PythonVersion, SerializationFormat};
use crate::{
flake8_annotations, flake8_bugbear, flake8_quotes, flake8_tidy_imports, fs, isort, mccabe,
pep8_naming,
pep8_naming, pyupgrade,
};
pub mod configuration;
@ -48,6 +48,7 @@ pub struct Settings {
pub isort: isort::settings::Settings,
pub mccabe: mccabe::settings::Settings,
pub pep8_naming: pep8_naming::settings::Settings,
pub pyupgrade: pyupgrade::settings::Settings,
}
impl Settings {
@ -82,6 +83,7 @@ impl Settings {
mccabe: config.mccabe,
line_length: config.line_length,
pep8_naming: config.pep8_naming,
pyupgrade: config.pyupgrade,
per_file_ignores: resolve_per_file_ignores(config.per_file_ignores, project_root)?,
src: config.src,
target_version: config.target_version,
@ -110,6 +112,7 @@ impl Settings {
isort: isort::settings::Settings::default(),
mccabe: mccabe::settings::Settings::default(),
pep8_naming: pep8_naming::settings::Settings::default(),
pyupgrade: pyupgrade::settings::Settings::default(),
}
}
@ -134,6 +137,7 @@ impl Settings {
isort: isort::settings::Settings::default(),
mccabe: mccabe::settings::Settings::default(),
pep8_naming: pep8_naming::settings::Settings::default(),
pyupgrade: pyupgrade::settings::Settings::default(),
}
}
}
@ -165,6 +169,7 @@ impl Hash for Settings {
self.isort.hash(state);
self.mccabe.hash(state);
self.pep8_naming.hash(state);
self.pyupgrade.hash(state);
}
}

View file

@ -7,7 +7,7 @@ use crate::checks_gen::CheckCodePrefix;
use crate::settings::types::{PythonVersion, SerializationFormat};
use crate::{
flake8_annotations, flake8_bugbear, flake8_quotes, flake8_tidy_imports, isort, mccabe,
pep8_naming,
pep8_naming, pyupgrade,
};
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
@ -37,6 +37,7 @@ pub struct Options {
pub isort: Option<isort::settings::Options>,
pub mccabe: Option<mccabe::settings::Options>,
pub pep8_naming: Option<pep8_naming::settings::Options>,
pub pyupgrade: Option<pyupgrade::settings::Options>,
// Tables are required to go last.
pub per_file_ignores: Option<FxHashMap<String, Vec<CheckCodePrefix>>>,
}