diff --git a/CHANGES.md b/CHANGES.md
index 8436a4146..0b28539cb 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -5,7 +5,7 @@ Changes highlights for recent major versions.
## Version 9.0
-* 9.1.0: Add absolute difference macros: `assert_abs_diff*`.
+* 9.2.0: Add absolute difference macros: `assert_abs_diff*`.
* 9.0.0: Breaking change: many macros now return data upon success.
diff --git a/Cargo.toml b/Cargo.toml
index 85a3f8dda..490a6cd77 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "assertables"
-version = "9.1.0"
+version = "9.2.0"
authors = ["Joel Parker Henderson "]
edition = "2021"
description = "Assertables: assert macros for better testing, debugging, quality assurance, and runtime reliability."
diff --git a/LICENSE.md b/LICENSE.md
index 03d907682..afbc6c2bc 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
# License
-MIT or Apache or GPL or or BSD or contact us for custom license choices.
+License is any of these or contact us for custom license options.
* [MIT](https://opensource.org/license/mit) ([SPDX: MIT](https://spdx.org/licenses/MIT.html))
diff --git a/README.md b/README.md
index a65197703..27bd09778 100644
--- a/README.md
+++ b/README.md
@@ -14,165 +14,153 @@ The Assertables Rust crate provides many assert macros
that can help you develop, test, and debug.
* Test values with
- [assert_lt](https://docs.rs/assertables/9.1.0/assertables/assert_lt),
- [assert_gt](https://docs.rs/assertables/9.1.0/assertables/assert_gt),
- [etc.](https://docs.rs/assertables/)
-* Test strings with
- [assert_starts_with](https://docs.rs/assertables/9.1.0/assertables/assert_starts_with),
- [assert_ends_with](https://docs.rs/assertables/9.1.0/assertables/assert_ends_with),
- [etc.](https://docs.rs/assertables/)
+ [assert_lt](https://docs.rs/assertables/9.2.0/assertables/assert_lt),
+ [assert_gt](https://docs.rs/assertables/9.2.0/assertables/assert_gt),
+ [more…](https://docs.rs/assertables/9.2.0/assertables/assert_approx)
+* Test results with
+ [assert_ok](https://docs.rs/assertables/9.2.0/assertables/assert_ok),
+ [assert_err](https://docs.rs/assertables/9.2.0/assertables/assert_err),
+ [more…](https://docs.rs/assertables/9.2.0/assertables/assert_ok_eq_x)
* Test groups with
- [assert_all](https://docs.rs/assertables/9.1.0/assertables/assert_all),
- [assert_any](https://docs.rs/assertables/9.1.0/assertables/assert_any),
- [etc.](https://docs.rs/assertables/)
-
-There are many more for
- [results](https://docs.rs/assertables/9.1.0/assertables/assert_result),
- [options](https://docs.rs/assertables/9.1.0/assertables/assert_option),
- [polls](https://docs.rs/assertables/9.1.0/assertables/assert_poll),
- [matches](https://docs.rs/assertables/9.1.0/assertables/assert_matches),
- [iterators](https://docs.rs/assertables/9.1.0/assertables/assert_iter),
- [sets](https://docs.rs/assertables/9.1.0/assertables/assert_set),
- [files](https://docs.rs/assertables/9.1.0/assertables/assert_fs_read_to_string),
- [bytes](https://docs.rs/assertables/9.1.0/assertables/assert_io_read_to_string),
- [commands](https://docs.rs/assertables/9.1.0/assertables/assert_command),
- [etc.](https://docs.rs/assertables/)
+ [assert_all](https://docs.rs/assertables/9.2.0/assertables/assert_all),
+ [assert_any](https://docs.rs/assertables/9.2.0/assertables/assert_any),
+ [more…](https://docs.rs/assertables/9.2.0/assertables/assert_iter)
+* Many more below.
To use this crate, add it to your file `Cargo.toml`:
```toml
-assertables = "9.1.0"
+assertables = "9.2.0"
```
-Top benefits:
+Benefits:
-1. You can write better tests to improve reliability and maintainability.
-2. You can handle more corner cases without needing to write custom code.
-3. You can troubleshoot faster because error messages show specifics.
+* You can write better tests to improve reliability and maintainability.
+* You can handle more corner cases without needing to write custom code.
+* You can troubleshoot faster because error messages show more detail.
-Top features:
+Features:
-1. Easy to use: everything is well-documented with runnable examples.
-2. Zero overhead: if you don't use a macro, then it's not compiled.
-3. Multiple forms: for debugging, for results, and for success returns.
+* Easy to use: everything is well-documented with runnable examples.
+* Zero overhead: if you don't use a macro, then it's not compiled.
+* Multiple forms: for panic, debug, result return, success return.
-Help:
+Learning:
+[FAQ](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq),
+[examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/),
+[changes](https://github.com/SixArm/assertables-rust-crate/tree/main/CHANGES.md),
+[upgrades](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9),
+[docs](https://docs.rs/assertables/).
-* [Documentation](https://docs.rs/assertables/)
-* [Frequently asked questions](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq)
-* [Examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/)
-* [Upgrade from version 8 to 9](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9)
-* [Comparisons to more_asserts, cool_asserts, assert2, claims, etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons)
+Comparisons:
+[more_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts), [cool_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/cool_asserts),
+[assert2](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/assert2),
+[claims](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts),
+[etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons)
## Highlights
Values:
-* [`assert_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_eq) `// a == b`
-* [`assert_ne!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_ne) `// a != b`
-* [`assert_lt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_lt) `// a < b`
-* [`assert_le!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_le) `// a <= b`
-* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_gt) `// a > b`
-* [`assert_ge!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_ge) `// a >= b`
+* [`assert_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_eq) ≈ a = b
+* [`assert_ne!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_ne) ≈ a ≠ b
+* [`assert_lt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_lt) ≈ a < b
+* [`assert_le!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_le) ≈ a ≤ b
+* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_gt) ≈ a > b
+* [`assert_ge!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_ge) ≈ a ≥ b
-Differences:
+Approximations:
-* [`assert_approx_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_approx/assert_approx_eq) `// |a-b| <= 1e-6`
-* [`assert_abs_diff_eq!(a, b, delta)`](https://docs.rs/assertables/9.1.0/assertables/assert_abs_diff/assert_abs_diff_eq) `// |a-b| == Δ`
-* [`assert_in_delta!(a, b, delta)`](https://docs.rs/assertables/9.1.0/assertables/assert_in/assert_in_delta) `// |a-b| <= Δ`
-* [`assert_in_epsilon!(a, b, epsilon)`](https://docs.rs/assertables/9.1.0/assertables/assert_in/assert_in_epsilon) `// |a-b| <= ε min(a,b)`
+* [`assert_approx_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_approx/assert_approx_eq) ≈ |a-b| ≤ 1e-6
+* [`assert_abs_diff_eq!(a, b, delta)`](https://docs.rs/assertables/9.2.0/assertables/assert_abs_diff/assert_abs_diff_eq) ≈ |a-b| = Δ
+* [`assert_in_delta!(a, b, delta)`](https://docs.rs/assertables/9.2.0/assertables/assert_in/assert_in_delta) ≈ |a-b| ≤ Δ
+* [`assert_in_epsilon!(a, b, epsilon)`](https://docs.rs/assertables/9.2.0/assertables/assert_in/assert_in_epsilon) ≈ |a-b| ≤ ε min(a,b)
-Groups for iterators, chars, etc.:
+Groups:
-* [`assert_all!(group, predicate)`](https://docs.rs/assertables/9.1.0/assertables/assert_all) `// group.all(predicate)`
-* [`assert_any!(group, predicate)`](https://docs.rs/assertables/9.1.0/assertables/assert_any) `// group.any(predicate)`
-
-Infix for order operators, logic operators, etc.:
-
-* [`assert_infix!(a == b)`](https://docs.rs/assertables/9.1.0/assertables/assert_infix) `// order: == != < <= > >=`
-* [`assert_infix!(a && b)`](https://docs.rs/assertables/9.1.0/assertables/assert_infix) `// logic: && || ^ & |`
-
-Lengths and counts for strings, vectors, iterators, etc.:
-
-* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_len/assert_len_eq) `// a.len() == b.len()`
-* [`assert_count_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/assert_count/assert_count_eq) `// a.count() == b.count()`
-* [`assert_is_empty!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_is_empty/assert_is_empty) `// a.is_empty()`
+* [`assert_all!(group, predicate)`](https://docs.rs/assertables/9.2.0/assertables/assert_all) ≈ group.all(predicate)
+* [`assert_any!(group, predicate)`](https://docs.rs/assertables/9.2.0/assertables/assert_any) ≈ group.any(predicate)
+* [`assert_is_empty!(group)`](https://docs.rs/assertables/9.2.0/assertables/assert_is_empty/assert_is_empty) ≈ a.is_empty()
+* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_len/assert_len_eq) ≈ a.len() = b.len()
+* [`assert_count_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/assert_count/assert_count_eq) ≈ a.count() = b.count()
Matching:
-* [`assert_starts_with!(whole, part)`](https://docs.rs/assertables/9.1.0/assertables/assert_starts_with) `// whole.starts_with(part)`
-* [`assert_ends_with!(whole, part)`](https://docs.rs/assertables/9.1.0/assertables/assert_ends_with) `// whole.ends_with(part)`
-* [`assert_contains!(container, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_contains) `// container.contains(x)`
-* [`assert_matches!(expr, pattern)`](https://docs.rs/assertables/9.1.0/assertables/assert_matches) `// matches!(expr, pattern)`
-* [`assert_is_match!(matcher, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_is_match) `// matcher.is_match(x)`
+* [`assert_starts_with!(sequence, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_starts_with) ≈ sequence.starts_with(x)
+* [`assert_ends_with!(sequence, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ends_with) ≈ sequence.ends_with(x)
+* [`assert_contains!(container, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_contains) ≈ container.contains(x)
+* [`assert_is_match!(matcher, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_is_match) ≈ matcher.is_match(x)
+* [`assert_matches!(expr, pattern)`](https://docs.rs/assertables/9.2.0/assertables/assert_matches) ≈ matches!(expr, pattern)
Results:
-* [`assert_ok!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_ok) `// a is Ok`
-* [`assert_ok_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_ok/assert_ok_eq_x) `// a is Ok(x)`
-* [`assert_err!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_err) `// a is Err`
+* [`assert_ok!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_ok) ≈ a is Ok
+* [`assert_err!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_err) ≈ a is Err
+* [`assert_ok_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ok/assert_ok_eq_x) ≈ (a is Ok ⇒ unwrap) = x
Options:
-* [`assert_some!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_some) `// a is Some`
-* [`assert_some_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_some/assert_some_eq_x) `// a is Some(x)`
-* [`assert_none!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_none) `// a is None`
+* [`assert_some!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_some) ≈ a is Some
+* [`assert_none!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_none) ≈ a is None
+* [`assert_some_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_some/assert_some_eq_x) ≈ (a is Some ⇒ unwrap) = x
Polls:
-* [`assert_ready!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_ready) `// a is Ready`
-* [`assert_ready_eq_x!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/assert_ready/assert_ready__eq_x) `// a is Ready(x)`
-* [`assert_pending!(a)`](https://docs.rs/assertables/9.1.0/assertables/assert_pending) `// a is Pending`
+* [`assert_ready!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_ready) ≈ a is Ready
+* [`assert_pending!(a)`](https://docs.rs/assertables/9.2.0/assertables/assert_pending) ≈ a is Pending
+* [`assert_ready_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/assert_ready/assert_ready_eq_x) ≈ (a is Ready ⇒ unwrap) = x
Readers:
-* [`assert_fs_read_to_string_eq!(a_path, b_path)`](https://docs.rs/assertables/9.1.0/assertables/assert_fs_read_to_string_eq) `// read a_path == read b_path`
-* [`assert_io_read_to_string_eq!(a_bytes, b_bytes)`](https://docs.rs/assertables/9.1.0/assertables/assert_io_read_to_string) `// read a_bytes == read b_bytes`
+* [`assert_fs_read_to_string_eq!(a_path, b_path)`](https://docs.rs/assertables/9.2.0/assertables/assert_fs_read_to_string_eq) ≈ (a_path ⇒ string) = (b_path ⇒ string)
+* [`assert_io_read_to_string_eq!(a_bytes, b_bytes)`](https://docs.rs/assertables/9.2.0/assertables/assert_io_read_to_string) ≈ (a_bytes ⇒ string) = (b_bytes ⇒ string)
-Commands:
+Collections:
-* [`assert_command_stdout_eq!(a_command, b_command)`](https://docs.rs/assertables/9.1.0/assertables/assert_command) `// a_command stdout == b_command stdout`
-* [`assert_program_args_stderr_eq!(a_program, a_args, b_program, b_args)`](https://docs.rs/assertables/9.1.0/assertables/assert_program_args) `// a_program a_args stderr == b_program b_args stderr`
+* [`assert_iter_eq!(arr1, arr2)`](https://docs.rs/assertables/9.2.0/assertables/assert_iter) ≈ a into iter = b into iter
+* [`assert_set_eq!(vec1, vec2)`](https://docs.rs/assertables/9.2.0/assertables/assert_set) ≈ a into set = b into set
+* [`assert_bag_eq!(map1, map2)`](https://docs.rs/assertables/9.2.0/assertables/assert_bag) ≈ a into bag = b into bag
-Collections:
+Infix notation:
-* [`assert_iter_eq!(arr1, arr2)`](https://docs.rs/assertables/9.1.0/assertables/assert_iter) `// a into iter == b into iter`
-* [`assert_set_eq!(vec1, vec2)`](https://docs.rs/assertables/9.1.0/assertables/assert_set) `// a into set == b into set`
-* [`assert_bag_eq!(map1, map2)`](https://docs.rs/assertables/9.1.0/assertables/assert_bag) `// a into bag == b into bag`
+* [`assert_infix!(a == b)`](https://docs.rs/assertables/9.2.0/assertables/assert_infix) ≈ order operators == != < <= > >=
+* [`assert_infix!(a && b)`](https://docs.rs/assertables/9.2.0/assertables/assert_infix) ≈ logic operators && || ^ & |
-For a complete list of modules and macros, see the [docs](https://docs.rs/assertables/)
+For a complete list of modules and macros, see the [docs](https://docs.rs/assertables/).
## Forms
All the macros have forms for an optional message:
-* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// default message`
-* [`assert_gt!(a, b, "your text")`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// custom message`
+* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ default message
+* [`assert_gt!(a, b, "your text")`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ custom message
All the macros have forms for different outcomes:
-* [`assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt.html) `// panic`
-* [`assert_gt_as_result!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_gt_as_result.html) `// return Result, no panic`
-* [`debug_assert_gt!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.debug_assert_gt.html) `// special use in debug mode`
+* [`assert_gt!(1, 2)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt.html) ≈ panic
+* [`assert_gt_as_result!(1, 2)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_gt_as_result.html) ≈ Result Err
+* [`debug_assert_gt!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.debug_assert_gt.html) ≈ panic in debug mode
-Many of the macros have a "solo" form for comparing one item to an expression, and a "pair" form for comparing two items to each other:
+Many of the macros have a form "compare left item to right item" that compares
+items of the same kind, and a form "compare left item to right expression" that
+compares one item to any arbitrary expression:
-* [`assert_ok_eq!(a, x)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok_eq.html) `// a.unwrap() == x`
-* [`assert_ok_eq!(a, b)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok_eq.html) `// a.unwrap() == b.unwrap()`
+* [`assert_len_eq!(a, b)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok_eq.html) ≈ a.len() = b.len()
+* [`assert_len_eq_x!(a, x)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok_eq_x.html) ≈ a.len() = x
Many of the macros has a "success return", which means the macro returns data that you can optionally use for more testing.
-* [`let inner = assert_ok!(result)`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_ok.html)
-* [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_fs_read_to_string_ne.html)
-* [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](https://docs.rs/assertables/9.1.0/assertables/macro.assert_command_stdout_gt.html)
+* [`let inner = assert_ok!(result)`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_ok.html)
+* [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_fs_read_to_string_ne.html)
+* [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`](https://docs.rs/assertables/9.2.0/assertables/macro.assert_command_stdout_gt.html)
## Tracking
* Package: assertables-rust-crate
-* Version: 9.1.0
+* Version: 9.2.0
* Created: 2021-03-30T15:47:49Z
-* Updated: 2024-10-29T20:21:37Z
+* Updated: 2024-10-31T11:04:30Z
* License: MIT or Apache-2.0 or GPL-2.0 or GPL-3.0 or contact us for more
* Contact: Joel Parker Henderson (joel@joelparkerhenderson.com)
diff --git a/bin/exit-with-arg b/bin/exit-with-arg
new file mode 100755
index 000000000..33fbb86ee
--- /dev/null
+++ b/bin/exit-with-arg
@@ -0,0 +1,2 @@
+#!/bin/sh
+exit "$1"
diff --git a/doc/lib/all.html b/doc/lib/all.html
index 767a9e207..d466d15bd 100644
--- a/doc/lib/all.html
+++ b/doc/lib/all.html
@@ -1 +1 @@
-List of all items in this crate
\ No newline at end of file
diff --git a/doc/lib/assert_ends_with/assert_ends_with/index.html b/doc/lib/assert_ends_with/assert_ends_with/index.html
index 6bdaacd15..1dc737a53 100644
--- a/doc/lib/assert_ends_with/assert_ends_with/index.html
+++ b/doc/lib/assert_ends_with/assert_ends_with/index.html
@@ -7,12 +7,12 @@
diff --git a/doc/lib/assert_ends_with/index.html b/doc/lib/assert_ends_with/index.html
index 8e4f41c7f..7fb50183e 100644
--- a/doc/lib/assert_ends_with/index.html
+++ b/doc/lib/assert_ends_with/index.html
@@ -3,10 +3,10 @@
and a part (such as a string substring, an array element, a range value).