Skip to content

andreoliwa/nitpick

Repository files navigation

Nitpick

PyPI Supported Python versions GitHub Actions Python Workflow Documentation Status Coveralls Maintainability Test Coverage pre-commit pre-commit.ci status Project License Code style: black Renovate semantic-release FOSSA Status

Command-line tool and flake8 plugin to enforce the same settings across multiple language-independent projects.

Useful if you maintain multiple projects and are tired of copying/pasting the same INI/TOML/YAML/JSON keys and values over and over, in all of them.

The CLI now has a nitpick fix command that modifies configuration files directly (pretty much like black and isort do with Python files). See the CLI docs for more info.

Many more features are planned for the future, check the roadmap.

The style file

A "Nitpick code style" is a TOML file with the settings that should be present in config files from other tools.

Example of a style:

["pyproject.toml".tool.black]
line-length = 120

["pyproject.toml".tool.poetry.dev-dependencies]
pylint = "*"

["setup.cfg".flake8]
ignore = "D107,D202,D203,D401"
max-line-length = 120
inline-quotes = "double"

["setup.cfg".isort]
line_length = 120
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
combine_as_imports = true

This style will assert that:

Supported file types

These are the file types currently handled by Nitpick.

  • Some files are only being checked and have to be modified manually;
  • Some files can already be fixed automatically (with the nitpick fix command);
  • Others are still under construction; the ticket numbers are shown in the table (upvote the ticket with 👍🏻 if you would like to prioritise development).

Implemented

File type nitpick check nitpick fix
Any INI file âś… âś…
Any JSON file âś… âś…
Any plain text file ✅ ❌
Any TOML file âś… âś…
Any YAML file âś… âś…
.editorconfig âś… âś…
.pylintrc âś… âś…
setup.cfg âś… âś…

Planned

File type nitpick check nitpick fix
Any Markdown file #280 🚧 ❓
Any Terraform file #318 🚧 ❓
Dockerfile #272 🚧 #272 🚧
.dockerignore #8 🚧 #8 🚧
.gitignore #8 🚧 #8 🚧
Jenkinsfile #278 🚧 ❓
Makefile #277 🚧 ❓

Style Library (Presets)

Nitpick has a builtin library of style presets, shipped as Python resources.

This library contains building blocks for your your custom style. Just choose styles from the table below and create your own style, like LEGO.

Read how to:

any

Style URL Description
py://nitpick/resources/any/codeclimate CodeClimate
py://nitpick/resources/any/commitizen Commitizen (Python)
py://nitpick/resources/any/commitlint commitlint
py://nitpick/resources/any/editorconfig EditorConfig
py://nitpick/resources/any/git-legal Git.legal - CodeClimate Community Edition
py://nitpick/resources/any/pre-commit-hooks pre-commit hooks for any project
py://nitpick/resources/any/prettier Prettier

javascript

Style URL Description
py://nitpick/resources/javascript/package-json package.json

kotlin

Style URL Description
py://nitpick/resources/kotlin/ktlint ktlint

markdown

Style URL Description
py://nitpick/resources/markdown/markdownlint Markdown lint

presets

Style URL Description
py://nitpick/resources/presets/nitpick Default style file for Nitpick

proto

Style URL Description
py://nitpick/resources/proto/protolint protolint (Protobuf linter)

python

Style URL Description
py://nitpick/resources/python/310 Python 3.10
py://nitpick/resources/python/311 Python 3.11
py://nitpick/resources/python/312 Python 3.12
py://nitpick/resources/python/38 Python 3.8
py://nitpick/resources/python/39 Python 3.9
py://nitpick/resources/python/absent Files that should not exist
py://nitpick/resources/python/autoflake autoflake
py://nitpick/resources/python/bandit Bandit
py://nitpick/resources/python/black Black
py://nitpick/resources/python/flake8 Flake8
py://nitpick/resources/python/github-workflow GitHub Workflow for Python
py://nitpick/resources/python/ipython IPython
py://nitpick/resources/python/isort isort
py://nitpick/resources/python/mypy Mypy
py://nitpick/resources/python/poetry-editable Poetry (editable projects; PEP 600 support)
py://nitpick/resources/python/poetry-venv Poetry (virtualenv in project)
py://nitpick/resources/python/poetry Poetry
py://nitpick/resources/python/pre-commit-hooks pre-commit hooks for Python projects
py://nitpick/resources/python/pylint Pylint
py://nitpick/resources/python/radon Radon
py://nitpick/resources/python/readthedocs Read the Docs
py://nitpick/resources/python/sonar-python SonarQube Python plugin
py://nitpick/resources/python/tox tox

shell

Style URL Description
py://nitpick/resources/shell/bashate bashate (code style for Bash)
py://nitpick/resources/shell/shellcheck ShellCheck (static analysis for shell scripts)
py://nitpick/resources/shell/shfmt shfmt (shell script formatter)

toml

Style URL Description
py://nitpick/resources/toml/toml-sort TOML sort

Quickstart

Install

Install in an isolated global environment with pipx:

# Latest PyPI release
pipx install nitpick

# Development branch from GitHub
pipx install git+https://github.com/andreoliwa/nitpick

On macOS/Linux, install with Homebrew:

# Latest PyPI release
brew install andreoliwa/formulae/nitpick

# Development branch from GitHub
brew install andreoliwa/formulae/nitpick --HEAD

On Arch Linux, install with yay:

yay -Syu nitpick

Add to your project with Poetry:

poetry add --dev nitpick

Or install it with pip:

pip install -U nitpick

Run

Nitpick will fail if no style is explicitly configured. Run this command to download and use the opinionated default style file:

nitpick init

You can use it as a template to configure-your-own-style.

To fix and modify your files directly:

nitpick fix

To check for errors only:

nitpick check

Nitpick is also a flake8 plugin, so you can run this on a project with at least one Python (.py) file:

flake8 .

Run as a pre-commit hook

If you use pre-commit on your project, add this to the .pre-commit-config.yaml in your repository:

repos:
  - repo: https://github.com/andreoliwa/nitpick
    rev: v0.35.0
    hooks:
      - id: nitpick

There are 3 available hook IDs:

  • nitpick and nitpick-fix both run the nitpick fix command;
  • nitpick-check runs nitpick check.

If you want to run Nitpick as a flake8 plugin instead:

repos:
  - repo: https://github.com/PyCQA/flake8
    rev: 4.0.1
    hooks:
      - id: flake8
        additional_dependencies: [nitpick]

Run as a MegaLinter plugin

If you use MegaLinter you can run Nitpick as a plugin. Add the following two entries to your .mega-linter.yml configuration file:

PLUGINS:
  - https://raw.githubusercontent.com/andreoliwa/nitpick/v0.35.0/mega-linter-plugin-nitpick/nitpick.megalinter-descriptor.yml
ENABLE_LINTERS:
  - NITPICK

More information

Nitpick is being used by projects such as:

For more details on styles and which configuration files are currently supported, see the full documentation.

Contributing

Your help is very much appreciated.

There are many possibilities for new features in this project, and not enough time or hands to work on them.

If you want to contribute with the project, set up your development environment following the steps on the contribution guidelines and send your pull request.