diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c14e7d7..a802faaf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,45 @@
+
+## 5.5.1 (2023-05-17)
+
+#### Fixed
+
+- Reverted `rust-project.json` path generation due to an upstream `rust-analyzer` fix.
+
+
+## 5.5.0 (2023-05-17)
+
+#### Added
+
+- `strings2`: Added a reference to the book chapter for reference conversion
+- `lifetimes`: Added a link to the lifetimekata project
+- Added a new `tests4` exercises, which teaches about testing for panics
+- Added a `!` prefix command to watch mode that runs an external command
+- Added a `--success-hints` option to watch mode that shows hints on exercise success
+
+#### Changed
+
+- `vecs2`: Renamed iterator variable bindings for clarify
+- `lifetimes`: Changed order of book references
+- `hashmaps2`: Clarified instructions in the todo block
+- Moved lifetime exercises before test exercises (via the recommended book ordering)
+- `options2`: Improved tests for layering options
+- `modules2`: Added more information to the hint
+
+#### Fixed
+
+- `errors2`: Corrected a comment wording
+- `iterators2`: Fixed a spelling mistake in the hint text
+- `variables`: Wrapped the mut keyword with backticks for readability
+- `move_semantics2`: Removed references to line numbers
+- `cow1`: Clarified the `owned_no_mutation` comments
+- `options3`: Changed exercise to panic when no match is found
+- `rustlings lsp` now generates absolute paths, which should fix VSCode `rust-analyzer` usage on Windows
+
+#### Housekeeping
+
+- Added a markdown linter to run on GitHub actions
+- Split quick installation section into two code blocks
+
## 5.4.1 (2023-03-10)
diff --git a/Cargo.lock b/Cargo.lock
index 192a4ac0..a09d98f7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -441,7 +441,7 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "rustlings"
-version = "5.4.1"
+version = "5.5.1"
dependencies = [
"argh",
"assert_cmd",
diff --git a/Cargo.toml b/Cargo.toml
index d22816ca..eca091f4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,7 @@
[package]
name = "rustlings"
-version = "5.4.1"
+description = "Small exercises to get you used to reading and writing Rust code!"
+version = "5.5.1"
authors = [
"Liv ",
"Carol (Nichols || Goulding) ",
diff --git a/README.md b/README.md
index be470fdb..12bd3925 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,9 @@
+
+
# rustlings 🦀❤️
+
+
Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages!
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
@@ -36,8 +40,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run
Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`.
```bash
-# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1)
-git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings
+# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1)
+git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
# if nix version > 2.3
nix develop
@@ -74,8 +78,8 @@ If you get a permission denied message, you might have to exclude the directory
Basically: Clone the repository at the latest tag, run `cargo install --path .`.
```bash
-# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1)
-git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings
+# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1)
+git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
cargo install --force --path .
```
diff --git a/exercises/iterators/iterators5.rs b/exercises/iterators/iterators5.rs
index eae3a0a7..c8271440 100644
--- a/exercises/iterators/iterators5.rs
+++ b/exercises/iterators/iterators5.rs
@@ -65,12 +65,27 @@ mod tests {
}
#[test]
- fn count_equals_for() {
+ fn count_some() {
let map = get_map();
- assert_eq!(
- count_for(&map, Progress::Complete),
- count_iterator(&map, Progress::Complete)
- );
+ assert_eq!(1, count_iterator(&map, Progress::Some));
+ }
+
+ #[test]
+ fn count_none() {
+ let map = get_map();
+ assert_eq!(2, count_iterator(&map, Progress::None));
+ }
+
+ #[test]
+ fn count_complete_equals_for() {
+ let map = get_map();
+ let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
+ for progress_state in progress_states {
+ assert_eq!(
+ count_for(&map, progress_state),
+ count_iterator(&map, progress_state)
+ );
+ }
}
#[test]
@@ -83,12 +98,28 @@ mod tests {
}
#[test]
- fn count_collection_equals_for() {
+ fn count_collection_some() {
let collection = get_vec_map();
- assert_eq!(
- count_collection_for(&collection, Progress::Complete),
- count_collection_iterator(&collection, Progress::Complete)
- );
+ assert_eq!(1, count_collection_iterator(&collection, Progress::Some));
+ }
+
+ #[test]
+ fn count_collection_none() {
+ let collection = get_vec_map();
+ assert_eq!(4, count_collection_iterator(&collection, Progress::None));
+ }
+
+ #[test]
+ fn count_collection_equals_for() {
+ let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
+ let collection = get_vec_map();
+
+ for progress_state in progress_states {
+ assert_eq!(
+ count_collection_for(&collection, progress_state),
+ count_collection_iterator(&collection, progress_state)
+ );
+ }
}
fn get_map() -> HashMap {
diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs
index 16dbe06d..11a2cf8a 100644
--- a/exercises/options/options2.rs
+++ b/exercises/options/options2.rs
@@ -17,12 +17,15 @@ mod tests {
#[test]
fn layered_option() {
- let mut range = 10;
- let mut optional_integers: Vec