Skip to main content

an extendible dispatcher to lint/format code, based on rifle

Project description

rifleman

PyPi version Python 3.6|3.7|3.8 PRs Welcome

An extendible dispatcher to lint/format code, based on rifle

This lets you run one command over lots of files/directories which could be in different languages - it classifies them by inspecting the mime type, extension, name or shebang, and then runs a command on those files.

This heavily simplifies and modifies the rifle config file format; including a condition to help check the 'shebang' value for scripts.

See config/format.conf for the default configuration file, I recommend you customize it to include the commands you use.

By default, I've included lots of the formaters/linters I use, an excerpt:

# html
ext x?html?, has prettier = prettier -w "$@"
# web technologies, handled by prettier
ext vue|yaml|json|graphql|tsx?|jsx?|s?css|less|md, has prettier = prettier -w "$@"

# golang
ext go, has go = go fmt "$@"

# python
ext py, has black = black "$@"
mime text/x-script.python, has black = black "$@"
shebang python(2|3)?, has black = black "$@"

# shell script
shebang zsh|bash, has shfmt = shfmt -w "$@"
shebang \/bin\/sh, has shfmt = shfmt -w "$@"
ext sh|(ba|z)sh, has shfmt = shfmt -w "$@"
mime text/x-shellscript, has shfmt = shfmt -w "$@"

Used emacs-format-all-the-code as reference.

Though the example is here is for code, similar to rifle, this could be used to dispatch against any file/mime type. I've included image_optimize.conf, which takes any files as inputs, matches the image/png|jpeg|gif mimetypes, and runs optipng/jpegtran/gifsicle to optimize those files to reduce their file size. That could be run like fd -X rifleman -a image_optimize, to optimize all images in any subdirectores.

Feel free to PR additional formatters!

Installation

Requires python3.6+

To install with pip, run:

pip install rifleman

Usage

Usage: rifleman [-] [-ljpcah] [files]...

Pass '-' to read filenames from STDIN, separated by newlines

Options:
  -h, --help      show this help message and exit
  -l              list actions for files
  -j              list actions for files as JSON
  -m              print computed mime type for each file
  -p              prompt before running each command
  -c CONFIG_FILE  read config from specified file instead of default
  -a ACTION       name of configuration file in config directory to use
                  (lint|format|image_optimize)

This doesn't offer a way to discover/search for files, because so many tools already exist to do that.

With shell globbing:

rifleman *.md ./project/*.py

To run this against all files in a git-tracked directory:

git ls-files | rifleman -

You can find (with the -exec flag), or the friendlier fd, to run against all files in the directory recursively:

fd -X rifleman

The -j and -l flags print what commands which would be used on each file instead of running the command.

The -c and -a files are used to determine which config file to use, completely altering the functionality of this.

By default, it uses the format.conf file in the ${XDG_CONFIG_HOME:-${HOME}/.config}/rifleman directory. -a is a shorthand; specifying -a lint looks for a file in the configuration directory called lint.conf

If you're trying to debug which mimetype to use for a particular file, you can use the -m flag, to dump the mimetype rifleman determines.

$ git ls-files | shuf -n 3 | rifleman - -m
pytest.ini:text/plain
rifleman/py.typed:inode/x-empty
rifleman/__main__.py:text/x-python

For reference, that works by checking the known user-defined mimetypes at ~/.mime.types, using the builtin mimetypes python module. If that fails to find a mimetype, it runs the command: file --mime-type -Lb <file>.

When this is first run, it will try to download the configuration files into the corresponding directories.

Example

$ rifleman *.md $(fd \.py$)
Running: /bin/sh -c set -- 'README.md'; prettier -w "$@"
README.md 88ms
Running: /bin/sh -c set -- 'rifleman/__init__.py' 'rifleman/__main__.py' 'setup.py' 'tests/test_rifleman.py'; black "$@"
All done!  🍰 4 files left unchanged.

Tests

git clone 'https://github.com/seanbreckenridge/rifleman'
cd ./rifleman
pip install '.[testing]'
mypy ./rifleman
pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rifleman-0.1.5.tar.gz (23.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rifleman-0.1.5-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file rifleman-0.1.5.tar.gz.

File metadata

  • Download URL: rifleman-0.1.5.tar.gz
  • Upload date:
  • Size: 23.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.9.0

File hashes

Hashes for rifleman-0.1.5.tar.gz
Algorithm Hash digest
SHA256 992e4a0a10d2609391a658db473d689d7cdf34d0a8db2f1e48ac9675bd92cfe6
MD5 7fba1acb427ded12cd4a1725ef23fbe8
BLAKE2b-256 ffbd9845793c0bfe3dced6597a5be370e3b18901d68aad552d519968f7e37b53

See more details on using hashes here.

File details

Details for the file rifleman-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: rifleman-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.9.0

File hashes

Hashes for rifleman-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 3a5482c5e12a541dfd7aacc7c60492495da6127a62877d91378f4637f285f02f
MD5 c5bc3b437b60906c2def1836efb97fa0
BLAKE2b-256 754f06caef35a9809e79e5ae27c901d569686ed959783e02b59501b621db8c8d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page