# registry

URL: /patitas/api/linting/registry/
Section: linting
Description: Lint rule registry for rule lookup and composition.

Clones the immutable-registry + mutable-builder structure from
``roles/registry.py`` verbatim: `LintRuleRegistry` is immutable
(``__slots__`` + ``MappingProxyType``), built via `LintRuleRegistryBuilder`
(``.register()`` chains, raising ``ValueError`` on duplicate ``rule_id`` and
``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

---

> For a complete page index, fetch /patitas/llms.txt.

Open LLM text
(/patitas/api/linting/registry/index.txt)

Share with AI

Ask Claude
(https://claude.ai/new?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fpatitas%2Fapi%2Flinting%2Fregistry%2Findex.txt)

Ask ChatGPT
(https://chatgpt.com/?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fpatitas%2Fapi%2Flinting%2Fregistry%2Findex.txt)

Ask Gemini
(https://gemini.google.com/app?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fpatitas%2Fapi%2Flinting%2Fregistry%2Findex.txt)

Ask Copilot
(https://copilot.microsoft.com/?q=Please%20help%20me%20understand%20this%20documentation%3A%20%2Fpatitas%2Fapi%2Flinting%2Fregistry%2Findex.txt)

Module

#
`linting.registry`

Lint rule registry for rule lookup and composition.

Clones the immutable-registry + mutable-builder structure from
`roles/registry.py` verbatim: `LintRuleRegistry`is immutable
(`__slots__` + `MappingProxyType`), built via `LintRuleRegistryBuilder`
(`.register()` chains, raising `ValueError` on duplicate `rule_id`and
`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
```

2Classes1Function

## Classes

`LintRuleRegistry`

8

▼

Immutable registry of lint rules keyed by ``rule_id``.

Thread Safety:
Truly immutable after cr…

Immutable registry of lint rules keyed by`rule_id`.

Thread Safety:

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

#### Attributes

Name
Type
Description

`_rules`

`tuple[LintRule (/patitas/api/linting/protocol/#LintRule), ...]`

—

`_by_id`

`Mapping[str, LintRule (/patitas/api/linting/protocol/#LintRule)]`

—

#### Methods

`rules`

0

`tuple[LintRule (/patitas/api/linting/protocol/#LintRule), ...]`

▼

Get all registered rules in registration order.

property

`def rules(self) -> tuple[LintRule, ...]`

##### Returns

`tuple[LintRule (/patitas/api/linting/protocol/#LintRule), ...]`

`get`

1

`LintRule (/patitas/api/linting/protocol/#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 (/patitas/api/linting/protocol/#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` (/patitas/api/linting/registry/#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` (/patitas/api/linting/registry/#LintRuleRegistry).

Register rules, then call`build`() to create an immutable registry.

#### Methods

`register`

1

`LintRuleRegistryBuilder (/patitas/api/linting/registry/#LintRuleRegistryBuilder)`

▼

Register a lint rule.

`def register(self, rule: LintRule) -> LintRuleRegistryBuilder`

##### Parameters

Name
Type
Description

`rule`
`—`

Object implementing the :class:`LintRule`protocol.

##### Returns

`LintRuleRegistryBuilder (/patitas/api/linting/registry/#LintRuleRegistryBuilder)`

Self for chaining.

`register_all`

1

`LintRuleRegistryBuilder (/patitas/api/linting/registry/#LintRuleRegistryBuilder)`

▼

Register multiple rules.

`def register_all(self, rules: Iterable[LintRule]) -> LintRuleRegistryBuilder`

##### Parameters

Name
Type
Description

`rules`
`—`

Iterable of rules to register.

##### Returns

`LintRuleRegistryBuilder (/patitas/api/linting/registry/#LintRuleRegistryBuilder)`

Self for chaining.

`build`

0

`LintRuleRegistry (/patitas/api/linting/registry/#LintRuleRegistry)`

▼

Build an immutable registry from the registered rules.

`def build(self) -> LintRuleRegistry`

##### Returns

`LintRuleRegistry (/patitas/api/linting/registry/#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 (/patitas/api/linting/registry/#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.

##### Returns

`LintRuleRegistry (/patitas/api/linting/registry/#LintRuleRegistry)`
