Bases: ComposableSpecification[T]
Logical AND of two specifications.
Satisfied if and only if both left and right specifications are satisfied.
Inherits composition operators from ComposableSpecification so that the
result of a conjunction 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_active = ExpressionSpecification(lambda u: u.is_active, "is_active")
is_admin = ExpressionSpecification(lambda u: u.role == "admin", "is_admin")
# Direct construction
active_admin = AndSpecification(is_active, is_admin)
# Equivalent via operator
same = is_active & is_admin # Produces an AndSpecification
Source code in src/forging_blocks/domain/specification/logical_operators/and_specification.py
| class AndSpecification[T](ComposableSpecification[T]):
"""Logical AND of two specifications.
Satisfied if and only if both left and right specifications are satisfied.
Inherits composition operators from ``ComposableSpecification`` so that the
result of a conjunction 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_active = ExpressionSpecification(lambda u: u.is_active, "is_active")
is_admin = ExpressionSpecification(lambda u: u.role == "admin", "is_admin")
# Direct construction
active_admin = AndSpecification(is_active, is_admin)
# Equivalent via operator
same = is_active & is_admin # Produces an AndSpecification
```
"""
__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
) and self._right_specification.is_satisfied_by(candidate)
def __repr__(self) -> str:
return f"AndSpecification({self._left_specification!r}, {self._right_specification!r})"
|