Thank you for your interest in contributing to Rand!
The following is a list of notes and tips for when you want to contribute to Rand with a pull request.
If you want to make major changes, it is usually best to open an issue to discuss the idea first.
Rand doesn't (yet) use rustfmt. It is best to follow the style of the surrounding code, and try to keep an 80 character line limit.
We especially welcome documentation PRs.
As of Rust 1.25 there are differences in how stable and nightly render documentation links. Make sure it works on stable, then nightly should be good too. One Travis CI build checks for dead links using cargo-deadlinks
. If you want to run the check locally:
cargo install cargo-deadlinks # It is recommended to remove left-over files from previous compilations rm -rf /target/doc cargo doc --no-deps cargo deadlinks --dir target/doc
When making changes to code examples in the documentation, make sure they build with:
cargo test --doc
A helpful command to rebuild documentation automatically on save (only works on Linux):
while inotifywait -r -e close_write src/ rand_core/; do cargo doc; done
Rand already contains a number of unit tests, but could use more. Also the existing ones could use clean-up. Any work on the tests is appreciated.
Not every change or new bit of functionality requires tests, but if you can think of a test that adds value, please add it.
Depending on the code you change, test with one of:
cargo test cargo test --package rand_core # Test log, serde and 128-bit support cargo test --features serde1,log,nightly
We want to be able to not only run the unit tests with std
available, but also without. Because thread_rng()
and FromEntropy
are not available without the std
feature, you may have to disable a new test with #[cfg(feature="std")]
. In other cases using ::test::rng
with a constant seed is a good option:
let mut rng = ::test::rng(528); // just pick some number
Only the unit tests should work in no_std
mode, we don't want to complicate the doc-tests. Run the tests with:
# Test no_std support cargo test --lib --no-default-features cargo test --package rand_core --no-default-features # Test no_std+alloc support; requires nightly cargo test --lib --no-default-features --features alloc
A lot of code in Rand is performance-sensitive, most of it is expected to be used in hot loops in some libraries/applications. If you change code in the rngs
, prngs
or distributions
modules, especially when you see an ‘obvious cleanup’, make sure the benchmarks do not regress. It is nice to report the benchmark results in the PR (or to report nothing's changed).
# Benchmarks (requires nightly) cargo bench # Some benchmarks have a faster path with i128_support cargo bench --features=nightly