Skip to content

MergeableModel

MergeableModel is a frozen pydantic v2 base class with the same merge interface as MergeableMixin.

Requirements

pydantic v2 must be installed:

pip install "pleroma[pydantic]"

Basic usage

from pleroma.contrib.pydantic import MergeableModel

class AppSettings(MergeableModel):
    debug: bool | None = None
    workers: int | None = None
    log_level: str | None = None

defaults  = AppSettings(debug=False, workers=4, log_level="INFO")
overrides = AppSettings(workers=8)

result = AppSettings.merge([defaults, overrides])
# AppSettings(debug=False, workers=8, log_level='INFO')

Frozen by default

All MergeableModel instances are immutable. Attempting to assign a field after construction raises pydantic.ValidationError:

s = AppSettings(workers=4)
s.workers = 8  # raises ValidationError

merge and merged_with always return a new instance — they never mutate existing ones.

Same interface as MergeableMixin

All methods — merge, merged_with, _iter_instances, and _merge_two — behave identically to their MergeableMixin counterparts.

# class method
AppSettings.merge([defaults, overrides], overwrite_none=True)

# instance shorthand
defaults.merged_with(overrides)

The predefined iteration strategies work with MergeableModel in exactly the same way as with MergeableMixin:

from pleroma import iter_reversed
from pleroma.contrib.pydantic import MergeableModel

class PrioritySettings(MergeableModel):
    priority: int
    value: str | None = None

    @classmethod
    def _iter_instances(cls, instances):
        return iter(sorted(instances, key=lambda s: s.priority))