From f6992cc98c0ce2ec83aa28ae09b9a067fde0c833 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 10 Nov 2022 19:22:00 -0500 Subject: [PATCH] Add a test utility for running lint checks (#672) --- src/flake8_annotations/mod.rs | 33 +++++---------------- src/flake8_quotes/mod.rs | 31 +++++--------------- src/isort/mod.rs | 25 +++------------- src/linter.rs | 55 ++++++++++++++++------------------- 4 files changed, 44 insertions(+), 100 deletions(-) diff --git a/src/flake8_annotations/mod.rs b/src/flake8_annotations/mod.rs index db0877f926..fe84ba0449 100644 --- a/src/flake8_annotations/mod.rs +++ b/src/flake8_annotations/mod.rs @@ -6,32 +6,15 @@ mod tests { use std::path::Path; use anyhow::Result; - use rustpython_parser::lexer::LexResult; use crate::autofix::fixer; - use crate::checks::{Check, CheckCode}; - use crate::linter::tokenize; - use crate::{flake8_annotations, fs, linter, noqa, Settings, SourceCodeLocator}; - - fn check_path(path: &Path, settings: &Settings, autofix: &fixer::Mode) -> Result> { - let contents = fs::read_file(path)?; - let tokens: Vec = tokenize(&contents); - let locator = SourceCodeLocator::new(&contents); - let noqa_line_for = noqa::extract_noqa_line_for(&tokens); - linter::check_path( - path, - &contents, - tokens, - &locator, - &noqa_line_for, - settings, - autofix, - ) - } + use crate::checks::CheckCode; + use crate::linter::test_path; + use crate::{flake8_annotations, Settings}; #[test] fn defaults() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_annotations/annotation_presence.py"), &Settings { ..Settings::for_rules(vec![ @@ -57,7 +40,7 @@ mod tests { #[test] fn suppress_dummy_args() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_annotations/suppress_dummy_args.py"), &Settings { flake8_annotations: flake8_annotations::settings::Settings { @@ -83,7 +66,7 @@ mod tests { #[test] fn mypy_init_return() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_annotations/mypy_init_return.py"), &Settings { flake8_annotations: flake8_annotations::settings::Settings { @@ -109,7 +92,7 @@ mod tests { #[test] fn suppress_none_returning() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_annotations/suppress_none_returning.py"), &Settings { flake8_annotations: flake8_annotations::settings::Settings { @@ -135,7 +118,7 @@ mod tests { #[test] fn allow_star_arg_any() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_annotations/allow_star_arg_any.py"), &Settings { flake8_annotations: flake8_annotations::settings::Settings { diff --git a/src/flake8_quotes/mod.rs b/src/flake8_quotes/mod.rs index 89229f951c..9604355668 100644 --- a/src/flake8_quotes/mod.rs +++ b/src/flake8_quotes/mod.rs @@ -6,30 +6,13 @@ mod tests { use std::path::Path; use anyhow::Result; - use rustpython_parser::lexer::LexResult; use test_case::test_case; use crate::autofix::fixer; - use crate::checks::{Check, CheckCode}; + use crate::checks::CheckCode; use crate::flake8_quotes::settings::Quote; - use crate::linter::tokenize; - use crate::{flake8_quotes, fs, linter, noqa, Settings, SourceCodeLocator}; - - fn check_path(path: &Path, settings: &Settings, autofix: &fixer::Mode) -> Result> { - let contents = fs::read_file(path)?; - let tokens: Vec = tokenize(&contents); - let locator = SourceCodeLocator::new(&contents); - let noqa_line_for = noqa::extract_noqa_line_for(&tokens); - linter::check_path( - path, - &contents, - tokens, - &locator, - &noqa_line_for, - settings, - autofix, - ) - } + use crate::linter::test_path; + use crate::{flake8_quotes, Settings}; #[test_case(Path::new("doubles.py"))] #[test_case(Path::new("doubles_escaped.py"))] @@ -38,7 +21,7 @@ mod tests { #[test_case(Path::new("doubles_wrapped.py"))] fn doubles(path: &Path) -> Result<()> { let snapshot = format!("doubles_{}", path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_quotes") .join(path) .as_path(), @@ -70,7 +53,7 @@ mod tests { #[test_case(Path::new("singles_wrapped.py"))] fn singles(path: &Path) -> Result<()> { let snapshot = format!("singles_{}", path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_quotes") .join(path) .as_path(), @@ -107,7 +90,7 @@ mod tests { #[test_case(Path::new("docstring_singles_function.py"))] fn double_docstring(path: &Path) -> Result<()> { let snapshot = format!("double_docstring_{}", path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_quotes") .join(path) .as_path(), @@ -144,7 +127,7 @@ mod tests { #[test_case(Path::new("docstring_singles_function.py"))] fn single_docstring(path: &Path) -> Result<()> { let snapshot = format!("single_docstring_{}", path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/flake8_quotes") .join(path) .as_path(), diff --git a/src/isort/mod.rs b/src/isort/mod.rs index d404f1c493..4d5bb38b49 100644 --- a/src/isort/mod.rs +++ b/src/isort/mod.rs @@ -201,29 +201,12 @@ mod tests { use std::path::Path; use anyhow::Result; - use rustpython_parser::lexer::LexResult; use test_case::test_case; use crate::autofix::fixer; - use crate::checks::{Check, CheckCode}; - use crate::linter::tokenize; - use crate::{fs, linter, noqa, Settings, SourceCodeLocator}; - - fn check_path(path: &Path, settings: &Settings, autofix: &fixer::Mode) -> Result> { - let contents = fs::read_file(path)?; - let tokens: Vec = tokenize(&contents); - let locator = SourceCodeLocator::new(&contents); - let noqa_line_for = noqa::extract_noqa_line_for(&tokens); - linter::check_path( - path, - &contents, - tokens, - &locator, - &noqa_line_for, - settings, - autofix, - ) - } + use crate::checks::CheckCode; + use crate::linter::test_path; + use crate::Settings; #[test_case(Path::new("reorder_within_section.py"))] #[test_case(Path::new("no_reorder_within_section.py"))] @@ -239,7 +222,7 @@ mod tests { #[test_case(Path::new("trailing_suffix.py"))] fn isort(path: &Path) -> Result<()> { let snapshot = format!("{}", path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/isort") .join(path) .as_path(), diff --git a/src/linter.rs b/src/linter.rs index 83769bc727..13f2bd1e30 100644 --- a/src/linter.rs +++ b/src/linter.rs @@ -263,6 +263,23 @@ pub fn autoformat_path(path: &Path) -> Result<()> { Ok(()) } +#[cfg(test)] +pub fn test_path(path: &Path, settings: &Settings, autofix: &fixer::Mode) -> Result> { + let contents = fs::read_file(path)?; + let tokens: Vec = tokenize(&contents); + let locator = SourceCodeLocator::new(&contents); + let noqa_line_for = noqa::extract_noqa_line_for(&tokens); + check_path( + path, + &contents, + tokens, + &locator, + &noqa_line_for, + settings, + autofix, + ) +} + #[cfg(test)] mod tests { use std::convert::AsRef; @@ -270,34 +287,12 @@ mod tests { use anyhow::Result; use regex::Regex; - use rustpython_parser::lexer::LexResult; use test_case::test_case; use crate::autofix::fixer; - use crate::checks::{Check, CheckCode}; - use crate::linter::tokenize; - use crate::source_code_locator::SourceCodeLocator; - use crate::{fs, linter, noqa, settings}; - - fn check_path( - path: &Path, - settings: &settings::Settings, - autofix: &fixer::Mode, - ) -> Result> { - let contents = fs::read_file(path)?; - let tokens: Vec = tokenize(&contents); - let locator = SourceCodeLocator::new(&contents); - let noqa_line_for = noqa::extract_noqa_line_for(&tokens); - linter::check_path( - path, - &contents, - tokens, - &locator, - &noqa_line_for, - settings, - autofix, - ) - } + use crate::checks::CheckCode; + use crate::linter::test_path; + use crate::settings; #[test_case(CheckCode::A001, Path::new("A001.py"); "A001")] #[test_case(CheckCode::A002, Path::new("A002.py"); "A002")] @@ -470,7 +465,7 @@ mod tests { #[test_case(CheckCode::RUF003, Path::new("RUF003.py"); "RUF003")] fn checks(check_code: CheckCode, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", check_code.as_ref(), path.to_string_lossy()); - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures").join(path).as_path(), &settings::Settings::for_rule(check_code.clone()), &fixer::Mode::Generate, @@ -482,7 +477,7 @@ mod tests { #[test] fn f841_dummy_variable_rgx() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/F841.py"), &settings::Settings { dummy_variable_rgx: Regex::new(r"^z$").unwrap(), @@ -497,7 +492,7 @@ mod tests { #[test] fn m001() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/M001.py"), &settings::Settings::for_rules(vec![CheckCode::M001, CheckCode::E501, CheckCode::F841]), &fixer::Mode::Generate, @@ -509,7 +504,7 @@ mod tests { #[test] fn init() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/__init__.py"), &settings::Settings::for_rules(vec![CheckCode::F821, CheckCode::F822]), &fixer::Mode::Generate, @@ -521,7 +516,7 @@ mod tests { #[test] fn future_annotations() -> Result<()> { - let mut checks = check_path( + let mut checks = test_path( Path::new("./resources/test/fixtures/future_annotations.py"), &settings::Settings::for_rules(vec![CheckCode::F401, CheckCode::F821]), &fixer::Mode::Generate,