fortitude 0.3.0

A Fortran linter, written in Rust and installable with Python
Documentation
# Fortitude Development

## Installation from source

To install from source, you must first have a working Rust environment (see
[rustup](https://rustup.rs/)). The project may then be installed either using `pip`:

```bash
python -m venv venv # Or use your preferred virtual environment method...
source venv/bin/activate
pip install .[lint]
```

Or using `cargo`:

```bash
cargo install --path .
```

## Testing

Unit tests can be run by calling:

```bash
cargo test
```

Integration testing is currently being performed manually using the file `test.f90`:

```bash
fortitude check test.f90
```

The test suite is still in need of work, and we hope to include automated integration
tests soon.

## Linting and Formatting

When contributing, please use `cargo clippy` for linting and `cargo fmt` for formatting.
If you edit any Python code, please also use `ruff check` and `ruff format`. To avoid
accidentally pushing unlinted/unformatted code to GitHub, we recommend using the Git
pre-commit hook provided:

```bash
git config --local core.hooksPath .githooks
```

## Adding Rules

Similarly to how [Ruff](https://docs.astral.sh/ruff/) names rules, the rules in
Fortitude should be categorised appropriately and their name should describe the pattern
the rule is intended to fix. Words such as 'forbid' should be omitted. For example, the
name for the rule that warns of overly long lines is `LineTooLong`, and not something
like `AvoidLineTooLong` or `KeepLinesShort`.

## Making New Releases

To make a new release, the following steps must be completed in order:

- Make a new commit that updates the project version in `pyproject.toml` and
  `Cargo.toml`.
  - Remember to run `cargo build` to update the `Cargo.lock` file too!
- Open a new PR to merge this change.
- After merging, make a new release on GitHub.
  - This will automatically upload the new version to PyPI.
- On your machine, pull the main branch, and run `cargo publish`.
  - This will upload the Rust crate to `crates.io`.