Skip to main content

A Python code formatter with custom formatting rules

Project description

Pyhone

CI

A Python code formatter with custom formatting rules that complement Ruff. Pyhone focuses on stylistic rules that go beyond what typical formatters handle.

Features

  • Multiline Spacing Rule: Automatically ensures multi-line statements (3+ lines by default) have blank lines before and after them for better readability
  • Format Mode: Automatically fix formatting issues
  • Check Mode: Report violations without modifying files (useful for CI/CD)
  • GitHub Actions Integration: Output violations in GitHub Actions annotation format
  • Configurable: Customize rules via pyhone.toml
  • Fast: Built in Rust for maximum performance

Installation

cargo build --release

The binary will be available at target/release/pyhone.

Usage

Format Files

Apply fixes to Python files:

pyhone file.py

Check Mode

Report violations without fixing:

pyhone --check file.py

Multiple Files

pyhone file1.py file2.py file3.py

Output Formats

Human-readable (default):

pyhone --format human --check file.py

GitHub Actions:

pyhone --format github --check file.py

Custom Configuration

Specify a custom config file:

pyhone --config my-config.toml file.py

Configuration

Create a pyhone.toml file in your project root:

[rules.multiline-spacing]
# Enable/disable the multiline-spacing rule
enabled = true

# Minimum number of lines for a statement to be considered "multi-line"
# Default: 2
min_lines = 2

Rules

Multiline Spacing

Ensures multi-line statements have blank lines before and after them for improved readability.

Example:

Before:

x = 1
def foo():
    a = 1
    b = 2
    c = 3
    d = 4
y = 2

After:

x = 1

def foo():
    a = 1
    b = 2
    c = 3
    d = 4

y = 2

GitHub Actions Integration

Use Pyhone in your GitHub Actions workflow:

name: Code Quality

on: [push, pull_request]

jobs:
  formatting:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable

      - name: Build Pyhone
        run: cargo build --release

      - name: Check Python formatting
        run: |
          find . -name "*.py" -exec ./target/release/pyhone --check --format github {} +

This will automatically annotate your PRs with formatting issues.

Working with Ruff

Pyhone is designed to complement Ruff, not replace it. Use Ruff for:

  • Import sorting
  • Code linting
  • Standard formatting rules

Use Pyhone for:

  • Custom spacing rules
  • Project-specific style enforcement

Example workflow:

# Run Ruff first
ruff check --fix .
ruff format .

# Then run Pyhone
pyhone **/*.py

Development

Running Tests

cargo test

Project Structure

pyhone/
├── src/
│   ├── main.rs              # CLI with clap
│   ├── parser.rs            # Python AST parsing
│   ├── config.rs            # TOML config loading
│   ├── formatter.rs         # Orchestrate rules on source code
│   ├── output.rs            # Output formatters (human, github)
│   └── rules/
│       ├── mod.rs           # Rule trait + registry
│       └── multiline_spacing.rs
└── pyhone.toml             # Example config file

Adding New Rules

  1. Create a new file in src/rules/ (e.g., my_rule.rs)
  2. Implement the FormattingRule trait:
use crate::rules::{FormattingRule, Violation};
use anyhow::Result;
use rustpython_parser::ast::Mod;

pub struct MyRule;

impl FormattingRule for MyRule {
    fn name(&self) -> &str {
        "my-rule"
    }

    fn description(&self) -> &str {
        "Description of my rule"
    }

    fn apply(&self, source: &str, ast: &Mod) -> Result<Vec<Violation>> {
        // Your rule logic here
        Ok(Vec::new())
    }
}
  1. Register the rule in src/rules/mod.rs
  2. Add configuration in src/config.rs
  3. Update the formatter in src/formatter.rs to use your rule

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

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

pyhone-0.1.2.tar.gz (28.0 kB view details)

Uploaded Source

Built Distributions

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

pyhone-0.1.2-py3-none-win_amd64.whl (1.7 MB view details)

Uploaded Python 3Windows x86-64

pyhone-0.1.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

pyhone-0.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

pyhone-0.1.2-py3-none-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

pyhone-0.1.2-py3-none-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file pyhone-0.1.2.tar.gz.

File metadata

  • Download URL: pyhone-0.1.2.tar.gz
  • Upload date:
  • Size: 28.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for pyhone-0.1.2.tar.gz
Algorithm Hash digest
SHA256 547e8c851fb4c928592ef230c55701267b5ad9348478f2d0b06c203529f83915
MD5 aad9956934035d26773378e03d947b7f
BLAKE2b-256 646d8d7fd61df3902a75049cf65be79f9cc31ad7224a3e535d947041efee3ae1

See more details on using hashes here.

File details

Details for the file pyhone-0.1.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: pyhone-0.1.2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for pyhone-0.1.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f65c428490b37a259d8a9af169a324d800372d28577361b7a7ee94fa384b2139
MD5 351a7ca9726c1b06ce0527da973c42c3
BLAKE2b-256 f8db37028f596088de9bf02f7f48eafe4bbb5927b7dde3e037d36304c376df9b

See more details on using hashes here.

File details

Details for the file pyhone-0.1.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyhone-0.1.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5c896cd4ed1579749203c958a053a3876ff62b8727d728ef144384a57e151e54
MD5 c31cda9852c010f9d32118265ccecf91
BLAKE2b-256 9a87aab7d3379430345ce8cf87136f5e66444b66016e6260e7b87bbf0b6a1833

See more details on using hashes here.

File details

Details for the file pyhone-0.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyhone-0.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dd684dfbe569ed715e8607661bad745770b83cdb2027bd7ecd96a867af862703
MD5 7e93a0ca2a91e43871311673f18e1855
BLAKE2b-256 dd0f40a804c674f544ea2c03d58eb60c76df5e65095d15001762ecdb2906d85a

See more details on using hashes here.

File details

Details for the file pyhone-0.1.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyhone-0.1.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9b4ec9c4c904f1e0645009784022f0c43fe24d272eac57d597a1b258c5ae6752
MD5 ae476556bfa19db82f1d3cd82b0c1b68
BLAKE2b-256 b7437f19682978715fc8c979d5713d6ea2bff309463f03f0de81b9bfa6b04433

See more details on using hashes here.

File details

Details for the file pyhone-0.1.2-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyhone-0.1.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9c78128012c2c118f8d2b0b3f67fc6e82e4a0988caec3d913988fe63466d473b
MD5 3846f893c839039fa9a97ecec24998bd
BLAKE2b-256 9ee607efaebb92c2b80355681e388d418e25654edcb2ae865144c63614cda289

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