shed
canonicalises Python code. Shed your legacy, stop bikeshedding, and move on. Black++
shed
is the maximally opinionated autoformatting tool. It's all about
convention over configuration,
and designed to be a single opinionated tool that fully canonicalises my
code - formatting, imports, updates, and every other fix I can possibly
automate.
There are no configuration options at all, but if the defaults aren't for you that's OK - you can still use the underlying tools directly and get most of the same effect... though you'll have to configure them yourself.
shed
must either be run in a git repo to auto-detect the files to format,
or explicitly passed a list of files to format on the command-line.
shed
...
- Runs
ruff
, to remove unused imports and variables, upgrade code, sort imports, and more. - Runs
black
, with autodetected minimum version >= py38 - Formats code blocks in docstrings, markdown, and restructured text docs
(based on
blacken-docs
). - If
shed --refactor
, also runscom2ann
and custom refactoring logic usinglibcst
. See documentation for the codemods in CODEMODS.md
The version detection logic is provided by black
. Because shed
supports the same
versions of Python as upstream,
it assumes that the minimum version is Python 3.8.
If you run shed
in a Git repository, the name of the root directory is assumed to be a
first-party import. src
layout
packages are also automatically detected, i.e. the foo
in any paths like
.../src/foo/__init__.py
.
We recommend using jupytext
to save your notebooks in .py
or .md
files,
in which case shed
supports them natively. For a quick-and-dirty workflow,
you can use nbqa shed notebook.ipynb
-
nbqa
works for any linter or formatter.
We recommend using black
in your editor
instead of shed
, since it provides our core formatting logic and shed
's extra
smarts can be counterproductive while you're actively editing code - for example,
removing an "unused" import just after you add it!
Then, when you're done editing, you can run shed
from the command-line, pre-commit
hooks, and your CI system.
If you use pre-commit, you can use it with Shed by
adding the following to your .pre-commit-config.yaml
:
minimum_pre_commit_version: '2.9.0'
repos:
- repo: https://github.com/Zac-HD/shed
rev: 2024.10.1
hooks:
- id: shed
# args: [--refactor, --py311-plus]
types_or: [python, pyi, markdown, rst]
This is often considerably faster for large projects, because pre-commit
can avoid running shed
on unchanged files.
shed
inherits pyupgrade
's careful approach to converting string formatting
code. If you want a more aggressive refactoring tool and don't mind checking
for breaking changes, check out flynt
.
For Django upgrades, see django-codemod
or django-upgrade
.
The ssort
project sorts the contents of
python modules so that statements are placed after the things they depend on,
for easier navigation and consistency of design.
Semgrep
supports some autofixes,
with patterns for a wide variety of languages. This includes a variety of both
security and style checks, with manual inspection of results recommended.
Patch notes can be found in CHANGELOG.md
.