Skip to main content

Reusable Rattle rules for blank-line and statement cuddling policies.

Project description

rattle-blank-lines

PyPI version Supported versions Downloads license

Rattle rules for blank-line and statement-cuddling policy checks in Python.

Installation

pip install rattle-blank-lines
uv add rattle-blank-lines

Quick Start

Add the rule pack to your project configuration:

[tool.rattle]
root = true
enable = ["rattle_blank_lines.rules"]

This enables the default rule pack. Rattle keeps its built-in rattle.rules enabled by default; add disable = ["rattle.rules"] if you want to run only this rule pack.

Run linting and autofix:

rattle lint <path>
rattle lint --diff <path>
rattle fix --automatic <path>

For in-file suppressions, use Rattle comments:

  • # lint-ignore: RuleName
  • # lint-fixme: RuleName

Configurable Rules

Configure rules under [tool.rattle.options].

[tool.rattle.options]

[tool.rattle.options.BL200]
max_suite_non_empty_lines = 2
compact_tail_max_statements = 2
allow_related_return_tails = true
allow_guard_ladder_final_branch = true

[tool.rattle.options.BL210]
short_control_flow_max_statements = 3
related_use_lookahead = 2
allow_local_helper_capture = true
allow_post_guard_continuation = true

[tool.rattle.options.BL300]
body_usage_lookahead = 4
setup_run_lookback = 3
allow_setup_before_compact_guard_ladder = true

[tool.rattle.options.BL350]
related_use_lookahead = 2
allow_compact_guard_ladders = true
allow_pytest_raises_clusters = true
allow_with_immediate_inspection = true

[tool.rattle.options.BL400]
max_case_non_empty_lines = 2

Rules

NoSuiteLeadingTrailingBlankLines (BL100, BL101)

Removes leading and trailing blank lines at suite boundaries.

Before:

def f() -> int:

    value = 1
    return value

After:

def f() -> int:
    value = 1
    return value

BlankLineBeforeBranchInLargeSuite (BL200)

Requires a blank line before return/raise/break/continue in larger suites.

Before:

def f(value: int) -> int:
    x = value + 1
    y = x + 1
    z = y + 1
    return z

After:

def f(value: int) -> int:
    x = value + 1
    y = x + 1
    z = y + 1

    return z

BlockHeaderCuddleRelaxed (BL300)

Allows cuddling before a block when the preceding setup directly feeds that block. The first statement after a suite docstring is exempt.

Before:

def f(value: int) -> int:
    prepared = value + 1
    if value > 0:
        return value

    return 0

After:

def f(value: int) -> int:
    prepared = value + 1

    if value > 0:
        return value

    return 0

BlockHeaderCuddleStrict (BL301)

Stricter cuddle mode. The first statement after a suite docstring is exempt.

Opt in with rattle_blank_lines.rules.block_header_cuddle_strict, and disable BL300 if you want BL301 instead of BL300.

[tool.rattle]
root = true
enable = [
  "rattle_blank_lines.rules",
  "rattle_blank_lines.rules.block_header_cuddle_strict",
]
disable = [
  "BL300",
]

Before:

def f(value: int) -> int:
    header_value = value + 1
    trailing = value + 2
    if header_value > 0:
        return header_value

    return 0

After:

def f(value: int) -> int:
    header_value = value + 1
    trailing = value + 2

    if header_value > 0:
        return header_value

    return 0

BlankLineAfterControlBlock (BL350)

Requires a blank line after multiline control-flow blocks. Some compact patterns stay together, such as guard ladders, with pytest.raises(...) clusters, and immediate inspection after with.

Before:

def f(value: int) -> int:
    if value > 0:
        value += 1
    return value

After:

def f(value: int) -> int:
    if value > 0:
        value += 1

    return value

BlankLineBeforeAssignment (BL210)

Requires a blank line before an assignment after a non-assignment statement. Docstring-following assignments and some compact follow-up flows stay together.

Before:

def f() -> int:
    log_start()
    value = compute()
    return value

After:

def f() -> int:
    log_start()

    value = compute()
    return value

MatchCaseSeparation (BL400)

Requires a blank line before the next case after a larger case body.

This rule is opt-in and is not included by enable = ["rattle_blank_lines.rules"]. You can enable it with enable = ["rattle_blank_lines.rules.match_case_separation"].

Before:

def f(value: int) -> int:
    match value:
        case 1:
            a = 1
            b = 2
            c = 3
        case _:
            return 0

After:

def f(value: int) -> int:
    match value:
        case 1:
            a = 1
            b = 2
            c = 3

        case _:
            return 0

License

MIT

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

rattle_blank_lines-0.2.0.tar.gz (55.8 kB view details)

Uploaded Source

Built Distribution

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

rattle_blank_lines-0.2.0-py3-none-any.whl (23.7 kB view details)

Uploaded Python 3

File details

Details for the file rattle_blank_lines-0.2.0.tar.gz.

File metadata

  • Download URL: rattle_blank_lines-0.2.0.tar.gz
  • Upload date:
  • Size: 55.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for rattle_blank_lines-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ce3a4fec4827a7b13a044e059fd21411318534bc94e2e3aa0ad50503cf5aaf2a
MD5 3be4b71c45bb1e63938cd036dc496998
BLAKE2b-256 6c670d645352f550b79ee66e22d4f722cf4ac41490f7f07cb8a69e1db6be88a3

See more details on using hashes here.

File details

Details for the file rattle_blank_lines-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for rattle_blank_lines-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 808616e6e73a7e2d81f158d927410ae1921dba92b395db39cfe05c47a1acdb0a
MD5 13e17a0128bda2aec87b425520d75d99
BLAKE2b-256 38046b86521223b9a16e331503a5ad727077c35e601273ab93f6e663bf444ebe

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