Giter Club home page Giter Club logo

rifleman's Introduction

rifleman

PyPi version Python 3.7|3.8|3.9 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.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, to optimize all images in any subdirectores.

Feel free to PR additional formatters!

Installation

Requires python3.7+

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              list 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)

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

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

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>.

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

rifleman's People

Contributors

seanbreckenridge avatar

Stargazers

 avatar

Watchers

 avatar  avatar

rifleman's Issues

add flag to read from stdin

having some weird issues with word splitting, not sure if its something to do with my shell or this in general.

i.e. rifleman "$(fd)" doesnt work, but I'm starting to feel like all the other commands which accept quotes like that are splitting on the newline, and its not regular shell behavior. bash/zsh arrays declared and then expanded like "${ARRAY_NAME[@]}" work fine, as expected.

to avoid this, would be nice to be able to pipe newline-delimited filepaths to test to this, probably using the - flag.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.