mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-12 07:35:07 +00:00

## Summary This PR partially addresses #16418 via the following: - `LinterSettings::unresolved_python_version` is now a `TargetVersion`, which is a thin wrapper around an `Option<PythonVersion>` - `Checker::target_version` now calls `TargetVersion::linter_version` internally, which in turn uses `unwrap_or_default` to preserve the current default behavior - Calls to the parser now call `TargetVersion::parser_version`, which calls `unwrap_or_else(PythonVersion::latest)` - The `Checker`'s implementation of `SemanticSyntaxContext::python_version` also uses `TargetVersion::parser_version` to use `PythonVersion::latest` for semantic errors In short, all lint rule behavior should be unchanged, but we default to the latest Python version for the new syntax errors, which should minimize confusing version-related syntax errors for users without a version configured. ## Test Plan Existing tests, which showed no changes (except for printing default settings).
99 lines
2.9 KiB
Rust
99 lines
2.9 KiB
Rust
#![cfg(target_arch = "wasm32")]
|
|
|
|
use wasm_bindgen_test::wasm_bindgen_test;
|
|
|
|
use ruff_linter::registry::Rule;
|
|
use ruff_source_file::OneIndexed;
|
|
use ruff_wasm::{ExpandedMessage, Location, Workspace};
|
|
|
|
macro_rules! check {
|
|
($source:expr, $config:expr, $expected:expr) => {{
|
|
let config = js_sys::JSON::parse($config).unwrap();
|
|
match Workspace::new(config).unwrap().check($source) {
|
|
Ok(output) => {
|
|
let result: Vec<ExpandedMessage> = serde_wasm_bindgen::from_value(output).unwrap();
|
|
assert_eq!(result, $expected);
|
|
}
|
|
Err(e) => assert!(false, "{:#?}", e),
|
|
}
|
|
}};
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn empty_config() {
|
|
check!(
|
|
"if (1, 2):\n pass",
|
|
r#"{}"#,
|
|
[ExpandedMessage {
|
|
code: Some(Rule::IfTuple.noqa_code().to_string()),
|
|
message: "If test is a tuple, which is always `True`".to_string(),
|
|
start_location: Location {
|
|
row: OneIndexed::from_zero_indexed(0),
|
|
column: OneIndexed::from_zero_indexed(3)
|
|
},
|
|
end_location: Location {
|
|
row: OneIndexed::from_zero_indexed(0),
|
|
column: OneIndexed::from_zero_indexed(9)
|
|
},
|
|
fix: None,
|
|
}]
|
|
);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn syntax_error() {
|
|
check!(
|
|
"x =\ny = 1\n",
|
|
r#"{}"#,
|
|
[ExpandedMessage {
|
|
code: None,
|
|
message: "SyntaxError: Expected an expression".to_string(),
|
|
start_location: Location {
|
|
row: OneIndexed::from_zero_indexed(0),
|
|
column: OneIndexed::from_zero_indexed(3)
|
|
},
|
|
end_location: Location {
|
|
row: OneIndexed::from_zero_indexed(1),
|
|
column: OneIndexed::from_zero_indexed(0)
|
|
},
|
|
fix: None,
|
|
}]
|
|
);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn unsupported_syntax_error() {
|
|
check!(
|
|
"match 2:\n case 1: ...",
|
|
r#"{"preview": true, "target-version": "py39"}"#,
|
|
[ExpandedMessage {
|
|
code: None,
|
|
message: "SyntaxError: Cannot use `match` statement on Python 3.9 (syntax was added in Python 3.10)".to_string(),
|
|
start_location: Location {
|
|
row: OneIndexed::from_zero_indexed(0),
|
|
column: OneIndexed::from_zero_indexed(0)
|
|
},
|
|
end_location: Location {
|
|
row: OneIndexed::from_zero_indexed(0),
|
|
column: OneIndexed::from_zero_indexed(5)
|
|
},
|
|
fix: None,
|
|
}]
|
|
);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn partial_config() {
|
|
check!("if (1, 2):\n pass", r#"{"ignore": ["F"]}"#, []);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn partial_nested_config() {
|
|
let config = r#"{
|
|
"select": ["Q"],
|
|
"flake8-quotes": {
|
|
"inline-quotes": "single"
|
|
}
|
|
}"#;
|
|
check!(r#"print('hello world')"#, config, []);
|
|
}
|