rust-cookbook/CONTRIBUTING.md

225 lines
8.8 KiB
Markdown
Raw Normal View History

2017-02-25 22:42:31 +00:00
# Contributing to the Rust Cookbook
2017-05-04 23:43:01 +00:00
The cookbook needs contributors and is intended to be easy to
contribute to. Help is welcome.
2017-02-25 22:42:31 +00:00
2017-05-04 19:13:44 +00:00
* [Building and testing](#building-and-testing)
* [Finding what to contribute](#finding-what-to-contribute)
* [Adding an example](#adding-an-example)
2017-05-04 23:36:28 +00:00
* [Example guidelines](#example-guidelines)
2017-02-25 22:42:31 +00:00
2017-05-04 19:13:44 +00:00
## Building and testing
2017-02-25 22:42:31 +00:00
2017-05-04 19:13:44 +00:00
To start, clone the cookbook from git and navigate to that directory:
2017-04-30 02:51:16 +00:00
2017-05-04 19:13:44 +00:00
```
git clone https://github.com/rust-lang-nursery/rust-cookbook.git
2017-05-04 19:13:44 +00:00
cd rust-cookbook
```
2017-02-25 22:42:31 +00:00
2017-05-17 18:00:48 +00:00
Cookbook is built with [mdBook], so install that first with Cargo:
2017-04-30 02:51:16 +00:00
2017-05-04 19:13:44 +00:00
```
cargo install mdbook
```
2017-04-30 02:51:16 +00:00
2017-05-17 18:00:48 +00:00
To build and view the cookbook locally, run:
2017-02-25 22:42:31 +00:00
2017-05-04 19:13:44 +00:00
```
2017-05-17 18:00:48 +00:00
mdbook serve
2017-05-04 19:13:44 +00:00
```
2017-02-25 22:56:49 +00:00
2017-05-17 18:00:48 +00:00
Then open `http://localhost:3000` in a web browser to browse the cookbook. Any
changes you make to the cookbook source will be automatically rebuilt and
visible in the browser, so it can be helpful to keep this window open while
editing.
2017-02-25 22:42:31 +00:00
2017-05-04 19:13:44 +00:00
All examples in the cookbook are tested with [skeptic], a tool for
testing arbitrary markdown documentation in a style similar to
rustdoc.
2017-04-30 02:51:16 +00:00
2017-05-04 19:13:44 +00:00
To run the cookbook test suite:
2017-04-30 02:51:16 +00:00
2017-05-04 19:13:44 +00:00
```
cargo test
```
2017-04-30 02:51:16 +00:00
2017-05-04 19:13:44 +00:00
[mdbook]: http://azerupi.github.io/mdBook/index.html
[skeptic]: https://github.com/brson/rust-skeptic
## Finding what to contribute
This project is intended to be simple to contribute to, and to always
have obvious next work items available. If at any time there is not
something obvious to contribute, that is a bug. Please ask for
assistance on the [libz blitz] thread, or email Brian Anderson
directly (banderson@mozilla.com).
The development process for the cookbook is presently oriented around
crates: we decide which crates to represent in the cookbook, then come
up with example use cases to write, then write the examples. And those
are the three basic, recurring types of contributions needed.
The development process for the cookbook today is tied to the [libz
blitz], a broader project to improve the Rust crate ecosystem, and the
cookbook presently represents the crates under consideration there.
The easiest way to find the most immediate work needed for the
cookbook is to follow the "What's next" section at the top of that
thread, which should at all times link to something to contribute to
the cookbook.
Otherwise, look for GitHub issues with the [example] tag. The simplest
way to contribute is to claim one of these examples, and submit a PR
adding it. If you do claim one, please leave a comment saying so, so
others don't accidentally duplicate your work.
2017-05-04 19:13:44 +00:00
If you have an idea for an example for a specific crate, please
suggest it on the relevant [tracking issue].
2017-05-04 19:13:44 +00:00
Please do not submit examples for crates not yet represented in the
2017-05-13 09:10:23 +00:00
cookbook, unless it is part of the libz blitz crate schedule.
2017-05-04 19:13:44 +00:00
Contribution will be open to a broader set of crates in the future.
For more about which crates are represented in the cookbook, see ["a
2017-05-13 09:10:23 +00:00
note about crate representation"][which-crates] in the cookbook.
2017-05-04 19:13:44 +00:00
[example]: https://github.com/rust-lang-nursery/rust-cookbook/issues?q=is%3Aissue+is%3Aopen+label%3Aexample
[tracking issue]: https://github.com/rust-lang-nursery/rust-cookbook/issues?q=is%3Aissue+is%3Aopen+label%3A%22tracking+issue%22
[which-crates]: https://rust-lang-nursery.github.io/rust-cookbook/about.html#a-note-about-crate-representation
2017-05-11 08:17:08 +00:00
[libz blitz]: https://internals.rust-lang.org/t/rust-libz-blitz/5184
2017-05-04 19:13:44 +00:00
## Adding an example
Adding an example involves:
- Deciding which _section_ of the book it belongs in
- Deciding which _categories_ apply to it
2017-05-13 09:10:23 +00:00
- Adding the example to the section index in intro.md
2017-05-04 19:13:44 +00:00
- Adding the example to the appropriate section markdown file
2017-05-17 22:00:32 +00:00
- Updating badges and hyperlinks as needed
2017-05-04 19:13:44 +00:00
- Writing a useful description of the example
2017-05-17 22:00:32 +00:00
The finished commit will look something like [this one].
[this one]: https://github.com/rust-lang-nursery/rust-cookbook/commit/e698443f2af08d3106d953c68c1977eba3c3526c
2017-05-17 22:00:32 +00:00
2017-05-04 19:13:44 +00:00
Examples are presently organized in three ways:
- Book sections - the cookbook is a book, and is organized like a book
2017-05-17 18:08:45 +00:00
in logical sections, like "basics", "encoding", "concurrency".
2017-05-04 19:13:44 +00:00
- Category tags - each example is tagged with one or more category
2017-05-17 18:08:45 +00:00
tags, like "filesystem", "debugging".
2017-05-04 19:13:44 +00:00
- Crate tags - each example is tagged with one or more crate tags,
indicating which crates are represented in the example. Those that
use no additional crates are simply tagged 'std'.
For more about the organization of the book see ["how to read this
book"] in the cookbook.
Hopefully your example belongs to an obvious section and categories,
but since the cookbook is so new, quite possibly not. Ask on thread.
For most steps you can simply follow the lead of existing examples.
The art comes in writing effective examples.
["how to read this book"]: https://rust-lang-nursery.github.io/rust-cookbook/about.html#how-to-read-this-book
2017-05-04 23:36:28 +00:00
## Example guidelines
2017-05-04 19:13:44 +00:00
Examples in the cookbook have these goals and qualities:
2017-05-17 18:13:06 +00:00
- They can be described by a single sentence that states their utility.
- They can be read and understood by a complete beginner.
- They are standalone examples that can be copied into a learner's
own workspace and compiled and modified for experimentation.
2017-05-05 21:34:22 +00:00
- They demonstrate real tasks, such that experienced developers
2017-05-17 18:13:06 +00:00
may use it as a reference.
- They follow best practices and do not take shortcuts.
- They use consistent error handling.
2017-05-04 19:13:44 +00:00
#### Title
2017-05-04 19:13:44 +00:00
Examples should have a simple single-sentence title that describes
something a typical Rust user typically wants to do.
> ## Generate random numbers with given distribution
#### Description
Describe traits imported and the methods used. Think about what information
supports the use case and might not be obvious to someone new. Keep the
description to 1-4 sentences, avoiding explanations outside the scope of the
code sample.
Use third person narative of the code execution, taking the opportunity
to link to API documentation. Hyperlink all references to APIs, either
on doc.rust-lang.org/std or docs.rs, and style them as `code`. Use
wildcard version specifiers for crate links.
Any requirements to execute the code that are not apparent, such as
passing environment flags, or configuring `Cargo.toml` should be added
after the code sample.
> By default, random numbers are generated with [uniform distribution].
> To generate numbers with other distributions you instantiate a
> distribution, then sample from that distribution using
> [`IndependentSample::ind_sample`] with help of a random-number
> generator [`rand::Rng`].
>
> The [distributions available are documented here][rand-distributions].
> An example using the [`Normal`] distribution is shown below.
[uniform distribution]: https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
[`IndependentSample::ind_sample`]: https://doc.rust-lang.org/rand/rand/distributions/trait.IndependentSample.html#tymethod.ind_sample
[`rand::Rng`]: https://doc.rust-lang.org/rand/rand/trait.Rng.html
[rand-distributions]: https://doc.rust-lang.org/rand/rand/distributions/index.html
[`Normal`]: https://doc.rust-lang.org/rand/rand/distributions/normal/struct.Normal.html
#### Code
Examples are intended to be read by complete beginners, and copied into
2017-05-04 19:13:44 +00:00
projects for experimentation. They should follow best practices and
not take shortcuts.
The example should have minimal code that doesn't directly support the
description of the example. Keep extra functions and types to a
2017-04-30 02:51:16 +00:00
minimum.
When an example must handle the possibility of errors, follow the error handling
templates in ["A note about error handling"][errors]. Examples always set up
error handling correctly and propagate errors with `?` (not `try!`, `urwrap`, or
`expect`). If there is no need for error handling in the example, prefer `main()`.
2017-04-30 02:51:16 +00:00
Avoid glob imports (`*`), even for preludes, so that users can see what
traits are called. (Some crates might consider using glob imports for preludes
best practice, making this awkward.)
2017-04-30 02:51:16 +00:00
2017-04-30 06:24:42 +00:00
Examples should be simple and obvious enough that an experienced dev
do not need comments.
Examples should compile without warnings, clippy lint warnings, or panics.
The code should be formatted by rustfmt. Hide all error boilerplate and
parts of the sample that do not accomplish the subject of the example.
Mark examples that depend on external systems with `no_run` or remove them
if they are not required for the example. Avoid inline comments, preferring
explanation in the description.
> ```rust
> extern crate rand;
>
> use rand::distributions::{Normal, IndependentSample};
>
> fn main() {
> let mut rng = rand::thread_rng();
> let normal = Normal::new(2.0, 3.0);
> let v = normal.ind_sample(&mut rng);
> println!("{} is from a N(2, 9) distribution", v)
> }
> ```
Finally, this book is intended to demonstrate the integration
of crates that work well together. We are on the lookout for examples
2017-05-04 23:36:28 +00:00
that feature multiple crates sensibly.
[errors]: https://rust-lang-nursery.github.io/rust-cookbook/about.html#a-note-about-error-handling