Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

flake8_to_ruff: support isort options #2082

Merged
merged 11 commits into from
Jan 22, 2023
9 changes: 4 additions & 5 deletions flake8_to_ruff/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,13 @@ fn main() -> Result<()> {
let config = ini.load(cli.file).map_err(|msg| anyhow::anyhow!(msg))?;

// Read the pyproject.toml file.
let black = cli
let tool_configs = cli
.pyproject
.map(flake8_to_ruff::parse_black_options)
.transpose()?
.flatten();
.map(flake8_to_ruff::parse_tool_configs)
.transpose()?;

// Create Ruff's pyproject.toml section.
let pyproject = flake8_to_ruff::convert(&config, black.as_ref(), cli.plugin)?;
let pyproject = flake8_to_ruff::convert(&config, tool_configs.as_ref(), cli.plugin)?;
println!("{}", toml_edit::easy::to_string_pretty(&pyproject)?);

Ok(())
Expand Down
32 changes: 25 additions & 7 deletions src/flake8_to_ruff/converter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ use anyhow::Result;
use colored::Colorize;

use super::black::Black;
use super::isort::Isort;
use super::plugin::Plugin;
use super::tool_configs::ToolConfigs;
use super::{parser, plugin};
use crate::registry::RuleSelector;
use crate::rules::flake8_pytest_style::types::{
Expand All @@ -23,7 +25,7 @@ use crate::warn_user;

pub fn convert(
config: &HashMap<String, HashMap<String, Option<String>>>,
black: Option<&Black>,
tool_configs: Option<&ToolConfigs>,
plugins: Option<Vec<Plugin>>,
) -> Result<Pyproject> {
// Extract the Flake8 section.
Expand Down Expand Up @@ -377,14 +379,29 @@ pub fn convert(
}

// Extract any settings from the existing `pyproject.toml`.
if let Some(black) = black {
if let Some(line_length) = &black.line_length {
options.line_length = Some(*line_length);
if let Some(configs) = tool_configs {
if let Some(black) = &configs.black {
if let Some(line_length) = &black.line_length {
options.line_length = Some(*line_length);
}

if let Some(target_version) = &black.target_version {
if let Some(target_version) = target_version.iter().min() {
options.target_version = Some(*target_version);
}
}
}

if let Some(target_version) = &black.target_version {
if let Some(target_version) = target_version.iter().min() {
options.target_version = Some(*target_version);
if let Some(isort) = &configs.isort {
if let Some(src_paths) = &isort.src_paths {
match options.src.as_mut() {
Some(src) => {
src.extend(src_paths.clone());
}
None => {
options.src = Some(src_paths.clone());
}
}
}
}
}
Expand All @@ -401,6 +418,7 @@ mod tests {

use super::super::plugin::Plugin;
use super::convert;
use super::ToolConfigs;
use crate::registry::RuleSelector;
use crate::rules::pydocstyle::settings::Convention;
use crate::rules::{flake8_quotes, pydocstyle};
Expand Down
30 changes: 30 additions & 0 deletions src/flake8_to_ruff/isort.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//! Extract isort configuration settings from a pyproject.toml.

use std::path::Path;

use anyhow::Result;
use serde::{Deserialize, Serialize};

/// The [isort configuration](https://pycqa.github.io/isort/docs/configuration/config_files.html).
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Isort {
#[serde(alias = "src-paths", alias = "src_paths")]
pub src_paths: Option<Vec<String>>,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
struct Tools {
isort: Option<Isort>,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
struct Pyproject {
tool: Option<Tools>,
}
shannonrothe marked this conversation as resolved.
Show resolved Hide resolved

pub fn parse_isort_options<P: AsRef<Path>>(path: P) -> Result<Option<Isort>> {
let contents = std::fs::read_to_string(path)?;
Ok(toml_edit::easy::from_str::<Pyproject>(&contents)?
.tool
.and_then(|tool| tool.isort))
}
4 changes: 4 additions & 0 deletions src/flake8_to_ruff/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
mod black;
mod converter;
mod isort;
mod parser;
mod plugin;
mod tool_configs;

pub use black::parse_black_options;
pub use converter::convert;
pub use isort::parse_isort_options;
pub use plugin::Plugin;
pub use tool_configs::parse_tool_configs;
17 changes: 17 additions & 0 deletions src/flake8_to_ruff/tool_configs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
use std::path::Path;

use anyhow::Result;

use super::{black::Black, isort::Isort, parse_black_options, parse_isort_options};

pub struct ToolConfigs {
pub black: Option<Black>,
pub isort: Option<Isort>,
shannonrothe marked this conversation as resolved.
Show resolved Hide resolved
}

pub fn parse_tool_configs<P: AsRef<Path>>(path: P) -> Result<ToolConfigs> {
Ok(ToolConfigs {
black: parse_black_options(path.as_ref())?,
isort: parse_isort_options(path)?,
shannonrothe marked this conversation as resolved.
Show resolved Hide resolved
})
}