Skip to content

Or Specification

or_specification

OrSpecification

Bases: ComposableSpecification[T]

Logical OR of two specifications.

Satisfied if and only if at least one of left or right is satisfied.

Inherits composition operators from ComposableSpecification so that the
result of a disjunction is itself composable (e.g. (a | b) & c).

Example
class ExpressionSpecification(ComposableSpecification[object]):
    # Inline stub for the example.
    def __init__(self, func, description: str) -> None:
        self._func = func
        self.description = description

    def is_satisfied_by(self, candidate: object) -> bool:
        return self._func(candidate)


is_admin = ExpressionSpecification(lambda u: u.role == "admin", "is_admin")
is_manager = ExpressionSpecification(lambda u: u.role == "manager", "is_manager")

# Direct construction
admin_or_manager = OrSpecification(is_admin, is_manager)
# Equivalent via operator
same = is_admin | is_manager  # Produces an OrSpecification
Source code in src/forging_blocks/domain/specification/logical_operators/or_specification.py
class OrSpecification[T](ComposableSpecification[T]):
    """Logical OR of two specifications.

    Satisfied if and only if at least one of left or right is satisfied.

    Inherits composition operators from ``ComposableSpecification`` so that the
    result of a disjunction is itself composable (e.g. ``(a | b) & c``).

    Example:
        ```python
        class ExpressionSpecification(ComposableSpecification[object]):
            # Inline stub for the example.
            def __init__(self, func, description: str) -> None:
                self._func = func
                self.description = description

            def is_satisfied_by(self, candidate: object) -> bool:
                return self._func(candidate)


        is_admin = ExpressionSpecification(lambda u: u.role == "admin", "is_admin")
        is_manager = ExpressionSpecification(lambda u: u.role == "manager", "is_manager")

        # Direct construction
        admin_or_manager = OrSpecification(is_admin, is_manager)
        # Equivalent via operator
        same = is_admin | is_manager  # Produces an OrSpecification
        ```
    """

    __slots__ = ("_left_specification", "_right_specification")

    def __init__(self, left: Specification[T], right: Specification[T]) -> None:
        self._left_specification = left
        self._right_specification = right

    def is_satisfied_by(self, candidate: T) -> bool:
        return self._left_specification.is_satisfied_by(
            candidate
        ) or self._right_specification.is_satisfied_by(candidate)

    def __repr__(self) -> str:
        return f"OrSpecification({self._left_specification!r}, {self._right_specification!r})"