A comprehensive quality assurance CLI for enforcing strict Python code standards.
Project description
A comprehensive quality assurance CLI for enforcing strict Python code standards.
Python Enforcer is a command-line tool that wraps industry-standard static analysis tools with curated, strict configurations. It ensures code quality, security, and maintainability by providing a unified interface to run these checks.
Features
- Centralized Configuration: Bundles strict configurations for all supported tools, ensuring consistency across projects.
- Unified Interface: Run multiple quality checks using a single command-line tool.
- Tool Suite: Integrates six specialized tools:
- Ruff: Linting and formatting.
- Mypy: Static type checking.
- Pylint: Code analysis.
- Bandit: Security linting.
- Semgrep: Static analysis for security and bugs.
- Vulture: Dead code detection.
Installation
Install pyenforce from PyPI (or from source) with the dependencies you need.
Minimal Install
Installs only the CLI runner. You must install the underlying tools (like ruff or mypy) separately or have them in your environment.
pip install pyenforce
Install with Specific Tools
Install pyenforce along with specific tools you plan to use.
# Install with Ruff
pip install "pyenforce[ruff]"
# Install with Mypy
pip install "pyenforce[mypy]"
# Install with multiple tools
pip install "pyenforce[ruff,mypy]"
Install with All Tools
Install the CLI and the complete suite of supported tools.
pip install "pyenforce[all]"
Usage
Run any of the supported tools using the pye command followed by the tool name:
pye <tool> [args...]
Available Commands
| Tool | Command | Purpose |
|---|---|---|
| Ruff | pye fmt |
Code formatter for consistent code style. |
| Ruff | pye ruff |
Lightning-fast linter covering style, complexity, and imports. |
| Mypy | pye mypy |
Verifies type hints and catches type errors. |
| Pylint | pye pylint |
Analyzes code quality and design patterns. |
| Bandit | pye bandit |
Detects common security vulnerabilities. |
| Semgrep | pye semgrep |
Advanced pattern matching for bugs and security issues. |
| Vulture | pye vulture |
Identifies unused code. |
Examples
Run a specific tool (e.g., Ruff):
pye ruff
Pass additional arguments (e.g., run Mypy on a specific directory):
pye mypy src/
Pre-commit Usage
To use pyenforce with pre-commit, add the following to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/HH-MWB/pyenforce
rev: v0.1.0
hooks:
- id: ruff-format
- id: ruff-check
- id: mypy
- id: pylint
- id: bandit
- id: semgrep
- id: vulture
If you need to add extra dependencies (e.g., plugins) to a hook using additional_dependencies in your .pre-commit-config.yaml, you must re-include the base dependency. pre-commit overwrites the list instead of merging it.
Example: Adding a plugin to pylint:
- repo: https://github.com/HH-MWB/pyenforce
rev: v0.1.0
hooks:
- id: pylint
additional_dependencies:
- ".[pylint]" # Required: Re-adds Pylint
- "pylint-django" # Your extra dependency
License
This repository is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyenforce-0.1.0.tar.gz.
File metadata
- Download URL: pyenforce-0.1.0.tar.gz
- Upload date:
- Size: 162.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8edf115eb11edd6ea0d1de7891d894b4f2e4945f9a383edee4c62b7de173dfac
|
|
| MD5 |
44c11ee33f8fdc0550a39885ad4d1141
|
|
| BLAKE2b-256 |
795c14631bb9c1770f19b8737a9939d12ea19cc6d219227ab7193b5892cfe488
|
Provenance
The following attestation bundles were made for pyenforce-0.1.0.tar.gz:
Publisher:
release.yml on HH-MWB/pyenforce
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyenforce-0.1.0.tar.gz -
Subject digest:
8edf115eb11edd6ea0d1de7891d894b4f2e4945f9a383edee4c62b7de173dfac - Sigstore transparency entry: 780138327
- Sigstore integration time:
-
Permalink:
HH-MWB/pyenforce@aeb26512d8e07c491019c8726699d5fb4bcec698 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/HH-MWB
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@aeb26512d8e07c491019c8726699d5fb4bcec698 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyenforce-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyenforce-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e0dcca7e2067853d0e5e327bfc27ee8b86532617879cfe8beb543115e7378e8
|
|
| MD5 |
935a139a0c65aff7c3afbdfe558a727d
|
|
| BLAKE2b-256 |
6e3507904aa7912e5fdba7e00f33484f766fada9f82dff09809e8f753e043c0e
|
Provenance
The following attestation bundles were made for pyenforce-0.1.0-py3-none-any.whl:
Publisher:
release.yml on HH-MWB/pyenforce
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyenforce-0.1.0-py3-none-any.whl -
Subject digest:
9e0dcca7e2067853d0e5e327bfc27ee8b86532617879cfe8beb543115e7378e8 - Sigstore transparency entry: 780138332
- Sigstore integration time:
-
Permalink:
HH-MWB/pyenforce@aeb26512d8e07c491019c8726699d5fb4bcec698 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/HH-MWB
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@aeb26512d8e07c491019c8726699d5fb4bcec698 -
Trigger Event:
release
-
Statement type: