Add development guide to readme (#2226)
This commit is contained in:
parent
1242bd64aa
commit
8186992340
101
README.md
101
README.md
@ -3737,6 +3737,107 @@ permissive
|
|||||||
domain dedication and fallback license, so your changes must also be released
|
domain dedication and fallback license, so your changes must also be released
|
||||||
under this license.
|
under this license.
|
||||||
|
|
||||||
|
### Getting Started
|
||||||
|
|
||||||
|
`just` is written in Rust. Use
|
||||||
|
[rustup](https://www.rust-lang.org/tools/install) to install a Rust toolchain.
|
||||||
|
|
||||||
|
`just` is extensively tested. All new features must be covered by unit or
|
||||||
|
integration tests. Unit tests are under
|
||||||
|
[src](https://github.com/casey/just/blob/master/src), live alongside the code
|
||||||
|
being tested, and test code in isolation. Integration tests are in the [tests
|
||||||
|
directory](https://github.com/casey/just/blob/master/tests) and test the `just`
|
||||||
|
binary from the outside by invoking `just` on a given `justfile` and set of
|
||||||
|
command-line arguments, and checking the output.
|
||||||
|
|
||||||
|
You should write whichever type of tests are easiest to write for your feature
|
||||||
|
while still providing test good coverage.
|
||||||
|
|
||||||
|
Unit tests are useful for testing new Rust functions that are used internally,
|
||||||
|
and as an aid for development. A good example are the unit tests which cover
|
||||||
|
the
|
||||||
|
[`unindent()` function](https://github.com/casey/just/blob/master/src/unindent.rs),
|
||||||
|
used to unindent triple-quoted strings and backticks. `unindent()` has a bunch
|
||||||
|
of tricky edge cases which are easy to exercise with unit tests that call
|
||||||
|
`unindent()` directly.
|
||||||
|
|
||||||
|
Integration tests are useful for making sure that the final behavior of the
|
||||||
|
`just` binary is correct. `unindent()` is also covered by integration tests
|
||||||
|
which make sure that evaluating a triple-quoted string produces the correct
|
||||||
|
unindented value. However, there are not integration tests for all possible
|
||||||
|
cases, since these are covered by faster, more concise unit tests that call
|
||||||
|
`unindent()` directly.
|
||||||
|
|
||||||
|
Existing integration tests are in two forms, those that use the `test!` macro
|
||||||
|
and those that use the `Test` struct directly. The `test!` macro, while often
|
||||||
|
concise, is less flexible and harder to understand, so new tests should use the
|
||||||
|
`Test` struct. The `Test` struct is a builder which allows for easily invoking
|
||||||
|
`just` with a given `justfile`, arguments, and environment variables, and
|
||||||
|
checking the program's stdout, stderr, and exit code .
|
||||||
|
|
||||||
|
### Contribution Workflow
|
||||||
|
|
||||||
|
1. Make sure the feature is wanted. There should be an open issue about the
|
||||||
|
feature with a comment from [@casey](https://github.com/casey) saying that
|
||||||
|
it's a good idea or seems reasonable. If there isn't, open a new issue and
|
||||||
|
ask for feedback.
|
||||||
|
|
||||||
|
There are lots of good features which can't be merged, either because they
|
||||||
|
aren't backwards compatible, have an implementation which would
|
||||||
|
overcomplicate the codebase, or go against `just`'s design philosophy.
|
||||||
|
|
||||||
|
2. Settle on the design of the feature. If the feature has multiple possible
|
||||||
|
implementations or syntaxes, make sure to nail down the details in the
|
||||||
|
issue.
|
||||||
|
|
||||||
|
3. Clone `just` and start hacking. The best workflow is to have the code you're
|
||||||
|
working on in an editor alongside a job that re-runs tests whenever a file
|
||||||
|
changes. You can run such a job by installing
|
||||||
|
[cargo-watch](https://github.com/watchexec/cargo-watch) with `cargo install
|
||||||
|
cargo-watch` and running `just watch test`.
|
||||||
|
|
||||||
|
4. Add a failing test for your feature. Most of the time this will be an
|
||||||
|
integration test which exercises the feature end-to-end. Look for an
|
||||||
|
appropriate file to put the test in in
|
||||||
|
[tests](https://github.com/casey/just/blob/master/tests), or add a new file
|
||||||
|
in [tests](https://github.com/casey/just/blob/master/tests) and add a `mod`
|
||||||
|
statement importing that file in
|
||||||
|
[tests/lib.rs](https://github.com/casey/just/blob/master/tests/lib.rs).
|
||||||
|
|
||||||
|
5. Implement the feature.
|
||||||
|
|
||||||
|
6. Run `just ci` to make sure that all tests, lints, and checks pass.
|
||||||
|
|
||||||
|
7. Open a PR with the new code that is editable by maintainers. PRs often
|
||||||
|
require rebasing and minor tweaks. If the PR is not editable by maintainers,
|
||||||
|
each rebase and tweak will require a round trip of code review. Your PR may
|
||||||
|
be summarily closed if it is not editable by maintainers.
|
||||||
|
|
||||||
|
8. Incorporate feedback.
|
||||||
|
|
||||||
|
9. Enjoy the sweet feeling of your PR getting merged!
|
||||||
|
|
||||||
|
Feel free at any time to open a draft PR with your changes for discussion and
|
||||||
|
feedback.
|
||||||
|
|
||||||
|
### Hints
|
||||||
|
|
||||||
|
Here are some hints to get you started with specific kinds of new features,
|
||||||
|
which you can use in addition to the contribution workflow above.
|
||||||
|
|
||||||
|
#### Adding a New Attribute
|
||||||
|
|
||||||
|
1. Write a new integration test in
|
||||||
|
[tests/attributes.rs](https://github.com/casey/just/blob/master/tests/attributes.rs).
|
||||||
|
|
||||||
|
2. Add a new variant to the
|
||||||
|
[`Attribute`](https://github.com/casey/just/blob/master/src/attribute.rs)
|
||||||
|
enum.
|
||||||
|
|
||||||
|
3. Implement the functionality of the new attribute.
|
||||||
|
|
||||||
|
4. Run `just ci` to make sure that all tests pass.
|
||||||
|
|
||||||
### Janus
|
### Janus
|
||||||
|
|
||||||
[Janus](https://github.com/casey/janus) is a tool for checking whether a change
|
[Janus](https://github.com/casey/janus) is a tool for checking whether a change
|
||||||
|
Loading…
Reference in New Issue
Block a user