Thank you for helping with SNAFU!
This document has some guidelines and tips that can help you make a contribution. Feel free to make a pull request to this file, too, if you learn anything during your contribution that can help others.
This project is governed by the Code of Conduct. Please understand those guidelines, and report violations to @shepmaster.
If you're looking for a way to contribute - first of all, thanks! Here are some ideas:
- Issues that we need help on are tagged help wanted
- Issues good for beginners are tagged good first issue
- Anything that's not clear to you in the documentation, particularly in the user's guide
- Open an issue for discussion before writing any non-trivial changes. Often the author or other contributors can help shape an even better idea. Or maybe someone is already working on it!
- Even if you're making a breaking change, don't worry about updating the version number or changelog. They're done together before a release. Feel free to suggest some wording you like in the pull request, though.
- We value correctness and clarity in the code, API, and docs, and it's worth putting in the time for thorough review in issues and pull requests.
- Don't try to fix the world in a single issue or pull request. Even small issues can sprout many good ideas, and feel free to split those into new issues.
- We maintain compatibility with older versions of Rust, and this is enforced through compatibility testing that runs automatically when you create or update a pull request. You can run these earlier, locally, by running
cargo test
in one of the directories undercompatibility-tests/
. Therust-toolchain
files there will cause the right version of Rust to be used, assuming you use rustup. TheCargo.toml
files there will make sure that compatible dependency versions are used, too. - If you're adding a new compile-time error, add a sample under
compatibility-tests/compile-fail/tests/ui/
to be sure it fails in the way you expect. - If you're adding a feature, please add a test for it. This helps show your intent, and makes sure others don't accidentally break the feature.
- Because the majority of SNAFU code lives in snafu-derive and deals with procedural macros, integration tests are often simpler than unit tests. They live under
tests/
. Add to the file that sounds most relevant, or create a new one if necessary. - Unit tests are still great when you're working on something that doesn't need to parse Rust source. They follow standard unit testing practice in Rust - a
#[test]
function in atests
module at the bottom of the relevant source module.
- Because the majority of SNAFU code lives in snafu-derive and deals with procedural macros, integration tests are often simpler than unit tests. They live under
- Breaking changes (changes in SNAFU's interface) are OK if they're adding value.
- Before 1.0, this may happen relatively frequently, and will result in new minor versions.
- After 1.0, this should be relatively rare, but new major versions are OK with good reasons.
- If you're making a code change, please run the code through rustfmt (
cargo fmt
) and check it with clippy (cargo clippy
). - The user's guide is a valuable resource! It's worth the time to keep up to date when adding or changing the library.