1
0
mirror of https://github.com/rust-lang/rustlings.git synced 2025-11-29 22:47:43 +02:00

feat(cli): Improve the list command with options, and then some

1.
`rustlings list` should now display more than just the exercise names.
Information such as file paths and exercises statuses should be displayed.
The `--paths` option limits the displayed fields to only the path names; while the `--names`
option limits the displayed fields to only exercise names.
You can also control which exercises are displayed, by using the `--filter` option, or
the `--solved` or `--unsolved` flags.

Some use cases:
- Fetching pending exercise files with the keyword "conversion" to pass to my editor:
```sh
vim $(rustlings list --filter "conversion" --paths --unsolved)
```

- Fetching exercise names with keyword "conversion" to pass to `rustlings run`:
```sh
for exercise in $(rustlings list --filter "conversion" --names)
do
    rustlings run ${exercise}
done
```

2.
This should also fix #465, and will likely fix #585, as well.
That bug mentioned in those issues has to do with the way the `watch` command handler fetches the pending exercises.
Going forward, the least recently updated exercises along with all the other exercises in a pending state are fetched.
This commit is contained in:
Abdou Seck
2020-12-12 13:48:25 -05:00
parent 0b9220c1fc
commit 8bbe4ff138
3 changed files with 197 additions and 20 deletions

View File

@@ -9,3 +9,10 @@ name = "pending_test_exercise"
path = "pending_test_exercise.rs"
mode = "test"
hint = """"""
[[exercises]]
name = "finished_exercise"
path = "finished_exercise.rs"
mode = "compile"
hint = """"""

View File

@@ -181,3 +181,81 @@ fn run_single_test_success_without_output() {
.code(0)
.stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not());
}
#[test]
fn run_rustlings_list() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list"])
.current_dir("tests/fixture/success")
.assert()
.success();
}
#[test]
fn run_rustlings_list_conflicting_display_options() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list", "--names", "--paths"])
.current_dir("tests/fixture/success")
.assert()
.failure();
}
#[test]
fn run_rustlings_list_conflicting_solve_options() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list", "--solved", "--unsolved"])
.current_dir("tests/fixture/success")
.assert()
.failure();
}
#[test]
fn run_rustlings_list_no_pending() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list"])
.current_dir("tests/fixture/success")
.assert()
.success()
.stdout(predicates::str::contains("Pending").not());
}
#[test]
fn run_rustlings_list_both_done_and_pending() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list"])
.current_dir("tests/fixture/state")
.assert()
.success()
.stdout(
predicates::str::contains("Done")
.and(predicates::str::contains("Pending"))
);
}
#[test]
fn run_rustlings_list_without_pending() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list", "--solved"])
.current_dir("tests/fixture/state")
.assert()
.success()
.stdout(predicates::str::contains("Pending").not());
}
#[test]
fn run_rustlings_list_without_done() {
Command::cargo_bin("rustlings")
.unwrap()
.args(&["list", "--unsolved"])
.current_dir("tests/fixture/state")
.assert()
.success()
.stdout(predicates::str::contains("Done").not());
}