Skip to content

Commit 05a4c29

Browse files
print MDTEST_TEST_FILTER value in single-quotes (and escaped) (#16548)
<!-- Thank you for contributing to Ruff! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary <!-- What's the purpose of the change? What does it do, and why? --> If an mdtest fails, the error output will include an example command that can be run to re-run just the failing test, e.g ``` To rerun this specific test, set the environment variable: MDTEST_TEST_FILTER="sync.md - With statements - Context manager with non-callable `__exit__` attribute" MDTEST_TEST_FILTER="sync.md - With statements - Context manager with non-callable `__exit__` attribute" cargo test -p red_knot_python_semantic --test mdtest -- mdtest__with_sync ``` This is very helpful, but because we're printing the envvar value surrounded in double-quotes, the bits between backticks in this example get interpreted as a shell interpolation. When running this in zsh, for example, I see ```console ❯ MDTEST_TEST_FILTER="sync.md - With statements - Context manager with non-callable `__exit__` attribute" cargo test -p red_knot_python_semantic --test mdtest -- mdtest__with_sync zsh: command not found: __exit__ Compiling red_knot_python_semantic v0.0.0 (/home/ericmarkmartin/Development/ruff/crates/red_knot_python_semantic) Compiling red_knot_test v0.0.0 (/home/ericmarkmartin/Development/ruff/crates/red_knot_test) Finished `test` profile [unoptimized + debuginfo] target(s) in 6.09s Running tests/mdtest.rs (target/debug/deps/mdtest-149b8f9d937e36bc) running 1 test test mdtest__with_sync ... ok ``` [^1] This is a minor annoyance which we can solve by using single-quotes instead of double-quotes for this string. To do so safely, we also escape single-quotes possibly contained within the string. There is a [shell-quote](https://github.com/allenap/shell-quote) crate, which seems to handle all this escaping stuff for you but fixing this issue perfectly isn't a big deal (if there are more things to escape we can deal with it then), so adding a new dependency (even a dev one) seemed overkill. [^1]: The filter does still work---it turns out that the filter `MDTEST_TEST_FILTER="sync.md - With statements - Context manager with non-callable attribute"` (what you get after the failed interpolation) is still good enough ## Test Plan <!-- How was it tested? --> I broke the ``## Context manager with non-callable `__exit__` attribute`` test by deleting the error assertion, then successfully ran the new command it printed out.
1 parent b3c884f commit 05a4c29

File tree

1 file changed

+4
-4
lines changed
  • crates/red_knot_test/src

1 file changed

+4
-4
lines changed

crates/red_knot_test/src/lib.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ pub fn run(
7979
}
8080
}
8181

82+
let escaped_test_name = test.name().replace('\'', "\\'");
83+
8284
println!(
83-
"\nTo rerun this specific test, set the environment variable: {MDTEST_TEST_FILTER}=\"{}\"",
84-
test.name()
85+
"\nTo rerun this specific test, set the environment variable: {MDTEST_TEST_FILTER}='{escaped_test_name}'",
8586
);
8687
println!(
87-
"{MDTEST_TEST_FILTER}=\"{}\" cargo test -p red_knot_python_semantic --test mdtest -- {test_name}",
88-
test.name()
88+
"{MDTEST_TEST_FILTER}='{escaped_test_name}' cargo test -p red_knot_python_semantic --test mdtest -- {test_name}",
8989
);
9090
}
9191
}

0 commit comments

Comments
 (0)