Skip to content

PlasmaFAIR/fortitude

Repository files navigation

PyPI License Tests Clippy Docs

Fortitude

A Fortran linter, inspired by (and built upon) Ruff. Written in Rust 🦀 and installable with Python 🐍.

  • ⚡ Blazingly fast, up to hundreds of times faster than other open-source Fortran linters.
  • 🔧 Automatically fixes linter warnings.
  • 📈 30+ rules, with many more planned.
  • 📃 Multiple output formats, including SARIF and GitHub/GitLab CI.
  • 🤝 Follows community best practices.
  • 💪 Built on a robust tree-sitter parser -- even syntax errors won't stop it!

Table of Contents

Installation

Fortitude can be installed directly into your Python environment:

pip install fortitude-lint

It can also be installed as a pure Rust project:

git clone https://github.com/PlasmaFAIR/fortitude
cargo install --path fortitude

Usage

Fortitude can lint your whole project under the working directory using the check command:

fortitude check

You can also call check on individual files, globs, and directories. You can configure what extensions Fortitude searches for in directories with --file-extensions:

fortitude check --file-extensions=f90,fpp

You can select or ignore individual rules or whole groups with --select and --ignore:

# Just check for missing `implicit none`
fortitude check --select=T001
# Also check for missing `implicit none` in interfaces
fortitude check --select=T001,T002
# Ignore all styling rules
fortitude check --ignore=S
# Only check for typing rules, but ignore superfluous implicit none
fortitude check --select=T --ignore=T003
# Rules and categories can also be referred to by name
fortitude check --select=typing --ignore=superfluous-implicit-none

Use --output-format=concise to get shorter output:

$ fortitude check --output-format=concise
test.f90:2:1: M001 function not contained within (sub)module or program
test.f90:5:1: S061 end statement should read 'end function double'
test.f90:7:1: M001 subroutine not contained within (sub)module or program
test.f90:8:3: P021 real has implicit kind

The explain command can be used to get extra information about any rules:

# Print extra information for all rules
fortitude explain
# Only get information for selected rules
fortitude explain T001 T011
# Print information on all style rules
fortitude explain S
# Rules and categories can also be referred to by name
fortitude explain style superfluous-implicit-none

To see further commands and optional arguments, try using --help:

fortitude --help
fortitude check --help

Fixes

Note

Added in v0.6.0

Fortitude can automatically fix some lint warnings, such as unnecessary implicit none statements, missing double-colons in variable declarations, and more. Just pass the --fix flag to check:

$ fortitude check --fix
fortitude: 1 files scanned.
Number of errors: 2 (2 fixed, 0 remaining)

Run fortitude explain to see which rules have fixes available.

Preview

Note

Added in v0.6.0

Some fortitude rules are only available through an opt-in preview mode to give the community some time to evaluate them and provide feedback. To enable preview rules, pass the --preview flag to check,

$ fortitude check --preview

or to enable more permanently, set it in your fpm.toml:

[extra.fortitude.check]
preview = true

or fortitude.toml:

[check]
preview = true

Run fortitude explain to see which rules are in preview mode.

Configuration

Fortitude will look for either a fortitude.toml or fpm.toml file in the current directory, or one of its parents. If using fortitude.toml, settings should be under the command name:

[check]
select = ["S", "T"]
ignore = ["S001", "S051"]
line-length = 132

For fpm.toml files, this has to be additionally nested under the extra.fortitude table:

[extra.fortitude.check]
select = ["S", "T"]
ignore = ["S001", "S051"]
line-length = 132

You can use --extend-select from the command line to select additional rules on top of those in the configuration file.

# Selects S, T, and M categories
fortitude check --extend-select=M

Documentation

See table of rules for a list of all rules.

Contributing

Please feel free to add or suggest new rules or comment on the layout of the project while it's still at this early stage of development. See CONTRIBUTING.md for a guide on contributing to the project, and README.dev.md for details on building the project from source, running tests, and linting/formatting the code. Please consult our code of conduct before contributing.

License

This work is distributed under the MIT License. See LICENSE for more information.

Fortitude is inspired by, and uses parts from ruff, used under the MIT licence. See LICENSE for more information.