Skip to content

Enum Utilities

from fields_metadata import SemanticallyOrderedEnum, DocumentedEnum, Documented

SemanticallyOrderedEnum

Adds comparison operators (<, <=, >, >=) based on a caller-defined semantic ordering.

from enum import StrEnum
from fields_metadata import SemanticallyOrderedEnum

class Priority(SemanticallyOrderedEnum["Priority"], StrEnum):
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"
    CRITICAL = "critical"

    @classmethod
    def semantic_order(cls) -> tuple["Priority", ...]:
        return (cls.LOW, cls.MEDIUM, cls.HIGH, cls.CRITICAL)

assert Priority.LOW < Priority.HIGH
assert sorted([Priority.CRITICAL, Priority.LOW, Priority.MEDIUM]) == [
    Priority.LOW, Priority.MEDIUM, Priority.CRITICAL
]

DocumentedEnum and Documented

DocumentedEnum is a mixin that requires a description property per member. Documented is a runtime_checkable protocol that checks for the same property.

from enum import StrEnum
from fields_metadata import DocumentedEnum, Documented

class Status(DocumentedEnum, StrEnum):
    PENDING = "pending"
    ACTIVE = "active"
    ARCHIVED = "archived"

    @property
    def description(self) -> str:
        return {
            Status.PENDING: "Awaiting activation",
            Status.ACTIVE: "Currently active",
            Status.ARCHIVED: "No longer in use",
        }[self]

assert isinstance(Status.ACTIVE, Documented)
assert Status.ACTIVE.description == "Currently active"