Skip to main content

🧩 Enum-Deprecation

PyPI Python Versions License Tests

Add deprecation warnings to your Python Enum members — works for all Enum subclasses (Enum, IntEnum, StrEnum, or your own mixins).


✨ Features

  • ✅ Works with Enum, IntEnum, StrEnum, or any custom subclass

  • ⚙️ Emits DeprecationWarning when deprecated members are accessed:

    • by attribute: MyEnum.OLD
    • by name: MyEnum["OLD"]
    • by value: MyEnum(value)
  • 🧾 Fully type-checked (mypy --strict) and tested on Python 3.11 – 3.14

  • 🧱 Compatible with SQLAlchemy enums

  • 🛡 Zero runtime dependencies


📦 Installation

pip install enum-deprecation

Python ≥ 3.11 is required (because of StrEnum support and typing.Self).


🧠 Usage

from enum import Enum, IntEnum, StrEnum, auto
from enum_deprecation import allow_deprecation, deprecated
import warnings

warnings.simplefilter("default")  # enable DeprecationWarnings for demo


# --- Basic Enum --------------------------------------------------------------

class MyEnum(Enum, metaclass=allow_deprecation):
    A = auto()
    OLD = deprecated()        # auto value, but deprecated
    B = auto()
    OLD2 = deprecated(42)     # explicit value
    OLD3 = deprecated("X", msg_tpl="{attr} will go away soon")


print(MyEnum.A)
print(MyEnum.OLD)     # emits a DeprecationWarning
print(MyEnum["OLD"])  # warning again
print(MyEnum(42))     # warning for explicit value

💡 Works with StrEnum, IntEnum, and custom mixins

class MyStrEnum(StrEnum, metaclass=allow_deprecation):
    OK = "ok"
    OLD = deprecated("deprecated")  # string value
class MyIntEnum(IntEnum, metaclass=allow_deprecation):
    NEW = 1
    OLD = deprecated(2)

⚙️ Custom deprecation messages

class Status(Enum, metaclass=allow_deprecation):
    ACTIVE = 1
    LEGACY = deprecated(2, msg_tpl="Status {attr} is legacy")

You can format {attr} anywhere in the message template.


🧩 How it works

The metaclass allow_deprecation wraps EnumMeta and:

  1. Records all members defined as deprecated(...).
  2. Replaces deprecated(auto) with the proper sentinel so auto() still works.
  3. Emits a DeprecationWarning whenever those members are retrieved via attribute, name, or value lookup.

It’s completely transparent to the rest of the enum machinery — the resulting class is still a regular Enum subclass.


🧰 SQLAlchemy compatibility

The resulting enums can be used directly with SQLAlchemy:

from sqlalchemy import Enum as SAEnum, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase): ...

class Thing(Base):
    __tablename__ = "thing"
    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    status: Mapped[MyEnum] = mapped_column(SAEnum(MyEnum, name="status_enum"))

⚠️ Note: accessing deprecated enum values during ORM loading will emit warnings. If you wish to suppress them during DB round-trip, wrap with a small TypeDecorator that uses MyEnum.__members__ directly.


🧪 Testing

tox           # runs tests under Python 3.11–3.13
pytest -v     # run in the current environment
mypy .        # type checking

🧾 License

MIT License © 2025 Marcin Kornat


Metadata

Release files for enum-deprecation 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for enum-deprecation 0.1.1
File Size Uploaded
enum_deprecation-0.1.1.tar.gz 5.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for enum-deprecation 0.1.1
File Interpreter ABI Platform
enum_deprecation-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 15.1 kB

Release files / enum_deprecation-0.1.1.tar.gz

Download URL enum_deprecation-0.1.1.tar.gz
Size 5.7 kB
Tags Source
SHA-256 checksum
How to use checksums
619d559805ef9c8c477d8bf4b057d86896136b312d7e926fdc8822f9a59bf541
BLAKE2b-256 checksum
How to use checksums
f48bf2604a30bda7d0f8ce62698c42c41fc40c058a276e457d33a7bd13219d77
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.7 Linux/6.17.5-lqx1-3-lqx

Release files / enum_deprecation-0.1.1-py3-none-any.whl

Download URL enum_deprecation-0.1.1-py3-none-any.whl
Size 9.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1bd48bccda4436d2da49dd9e9145bfd23994ff88e55ef5d3264eadddc23f3bc2
BLAKE2b-256 checksum
How to use checksums
a06eeb7daea82484725d791c7a22b7fe127b12bdda0c33bd5b247a00f0821c71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.7 Linux/6.17.5-lqx1-3-lqx

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page