Module

linting.registry

Lint rule registry for rule lookup and composition.

Clones the immutable-registry + mutable-builder structure from roles/registry.py verbatim: LintRuleRegistryis immutable (__slots__ + MappingProxyType), built via LintRuleRegistryBuilder (.register() chains, raising ValueError on duplicate rule_idand TypeError on missing metadata). create_default_lint_registry() builds the three starter rules.

Thread Safety:

``LintRuleRegistry`` is immutable after creation (uses ``MappingProxyType``)
and safe to share. Use ``LintRuleRegistryBuilder`` for mutable construction.

Example:

>>> from patitas.linting import LintRuleRegistryBuilder, HeadingIncrementRule
>>> builder = LintRuleRegistryBuilder()
>>> builder.register(HeadingIncrementRule())
LintRuleRegistryBuilder(...)
>>> registry = builder.build()
>>> registry.get("heading-increment") is not None
True

Classes

LintRuleRegistry 8
Immutable registry of lint rules keyed by ``rule_id``. Thread Safety: Truly immutable after cr…

Immutable registry of lint rules keyed byrule_id.

Thread Safety:

Truly immutable after creation (uses ``MappingProxyType``). Safe to
share across threads.

Attributes

Name Type Description
_rules tuple[LintRule, ...]
_by_id Mapping[str, LintRule]

Methods

rules 0 tuple[LintRule, ...]
Get all registered rules in registration order.
property
def rules(self) -> tuple[LintRule, ...]
Returns
tuple[LintRule, ...]
get 1 LintRule | None
Get the rule registered under ``rule_id``, or None.
def get(self, rule_id: str) -> LintRule | None
Parameters
Name Type Description
rule_id

Kebab-case rule id (e.g. "heading-increment").

Returns
LintRule | None The rule if registered, None otherwise.
has 1 bool
Check if ``rule_id`` is registered.
def has(self, rule_id: str) -> bool
Parameters
Name Type Description
rule_id
Returns
bool
Internal Methods 3
__init__ 2
Initialize registry with pre-built mappings. Use `LintRuleRegistryBuilder` to …
def __init__(self, rules: tuple[LintRule, ...], by_id: dict[str, LintRule]) -> None

Initialize registry with pre-built mappings.

Use LintRuleRegistryBuilder to create instances.

Parameters
Name Type Description
rules
by_id
__contains__ 1 bool
Support ``rule_id in registry`` syntax.
def __contains__(self, rule_id: str) -> bool
Parameters
Name Type Description
rule_id
Returns
bool
__len__ 0 int
Number of registered rules.
def __len__(self) -> int
Returns
int
LintRuleRegistryBuilder 5
Mutable builder for `LintRuleRegistry`. Register rules, then call `build`() to create an immutable…

Mutable builder for LintRuleRegistry.

Register rules, then callbuild() to create an immutable registry.

Methods

register 1 LintRuleRegistryBuilder
Register a lint rule.
def register(self, rule: LintRule) -> LintRuleRegistryBuilder
Parameters
Name Type Description
rule

Object implementing the :class:LintRuleprotocol.

Returns
LintRuleRegistryBuilder Self for chaining.
register_all 1 LintRuleRegistryBuilder
Register multiple rules.
def register_all(self, rules: Iterable[LintRule]) -> LintRuleRegistryBuilder
Parameters
Name Type Description
rules

Iterable of rules to register.

Returns
LintRuleRegistryBuilder Self for chaining.
build 0 LintRuleRegistry
Build an immutable registry from the registered rules.
def build(self) -> LintRuleRegistry
Returns
LintRuleRegistry An immutable :class:`LintRuleRegistry`.
Internal Methods 2
__init__ 0
Initialize empty builder.
def __init__(self) -> None
__len__ 0 int
Number of registered rules.
def __len__(self) -> int
Returns
int

Functions

create_default_lint_registry 0 LintRuleRegistry
Create a registry with the three built-in starter rules. Prefixed to avoid the…
def create_default_lint_registry() -> LintRuleRegistry

Create a registry with the three built-in starter rules.

Prefixed to avoid the verified collision with directives' and roles' create_default_registry. Rebuilds on each call (no shared mutable state); rules are stateless frozen singletons.