import enum
from ._version import get_versions
from ._name_mangler import _NameMangler
__version__ = get_versions()["version"]
__version_info__ = tuple(int(n) for n in __version__.partition("+")[0].split("."))
del get_versions
_name_mangler = _NameMangler()
# The first argument to the `_generate_next_value_` function of the `enum.Enum`
# class is documented to be the name of the enum member, not the enum class:
#
# https://docs.python.org/3.6/library/enum.html#using-automatic-values
#
# Pylint, though, doesn't know about this so we need to disable it's check for
# `self` arguments.
# pylint: disable=no-self-argument
[docs]
class StrEnum(str, enum.Enum):
"""
StrEnum is a Python ``enum.Enum`` that inherits from ``str``. The default
``auto()`` behavior uses the member name as its value.
Example usage::
class Example(StrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "UPPER_CASE"
assert Example.lower_case == "lower_case"
assert Example.MixedCase == "MixedCase"
"""
def __new__(cls, value, *args, **kwargs):
if not isinstance(value, (str, enum.auto)):
raise TypeError(
f"Values of StrEnums must be strings: {value!r} is a {type(value)}"
)
return super().__new__(cls, value, *args, **kwargs)
def __str__(self):
return str(self.value)
def _generate_next_value_(name, *_):
return name
class LowercaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `lowercase` to
produce each member's value.
Example usage::
class Example(LowercaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "upper_case"
assert Example.lower_case == "lower_case"
assert Example.MixedCase == "mixedcase"
.. versionadded:: 0.4.3
"""
def _generate_next_value_(name, *_):
return name.lower()
class UppercaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `UPPERCASE` to
produce each member's value.
Example usage::
class Example(UppercaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "UPPER_CASE"
assert Example.lower_case == "LOWER_CASE"
assert Example.MixedCase == "MIXEDCASE"
.. versionadded:: 0.4.3
"""
def _generate_next_value_(name, *_):
return name.upper()
class CamelCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `camelCase` to
produce each member's value.
Example usage::
class Example(CamelCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "upperCase"
assert Example.lower_case == "lowerCase"
assert Example.MixedCase == "mixedCase"
.. versionadded:: 0.4.5
"""
def _generate_next_value_(name, *_):
return _name_mangler.camel(name)
class PascalCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `PascalCase` to
produce each member's value.
Example usage::
class Example(PascalCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "UpperCase"
assert Example.lower_case == "LowerCase"
assert Example.MixedCase == "MixedCase"
.. versionadded:: 0.4.5
"""
def _generate_next_value_(name, *_):
return _name_mangler.pascal(name)
class KebabCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `kebab-case` to
produce each member's value.
Example usage::
class Example(KebabCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "upper-case"
assert Example.lower_case == "lower-case"
assert Example.MixedCase == "mixed-case"
.. versionadded:: 0.4.5
"""
def _generate_next_value_(name, *_):
return _name_mangler.kebab(name)
class SnakeCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `snake_case` to
produce each member's value.
Example usage::
class Example(SnakeCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "upper_case"
assert Example.lower_case == "lower_case"
assert Example.MixedCase == "mixed_case"
.. versionadded:: 0.4.5
"""
def _generate_next_value_(name, *_):
return _name_mangler.snake(name)
class MacroCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `MACRO_CASE` to
produce each member's value.
Example usage::
class Example(MacroCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "UPPER_CASE"
assert Example.lower_case == "LOWER_CASE"
assert Example.MixedCase == "MIXED_CASE"
.. versionadded:: 0.4.6
"""
def _generate_next_value_(name, *_):
return _name_mangler.macro(name)
class CamelSnakeCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `camel_Snake_Case` to
produce each member's value.
Example usage::
class Example(CamelSnakeCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "upper_Case"
assert Example.lower_case == "lower_Case"
assert Example.MixedCase == "mixed_Case"
.. versionadded:: 0.4.8
"""
def _generate_next_value_(name, *_):
return _name_mangler.camel_snake(name)
class PascalSnakeCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `Pascal_Snake_Case` to
produce each member's value.
Example usage::
class Example(PascalSnakeCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "Upper_Case"
assert Example.lower_case == "Lower_Case"
assert Example.MixedCase == "Mixed_Case"
.. versionadded:: 0.4.8
"""
def _generate_next_value_(name, *_):
return _name_mangler.pascal_snake(name)
class SpongebobCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `SpONGEBob_CAse` to
produce each member's value.
Example usage::
class Example(SpongebobCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "uPpER_cAsE"
assert Example.lower_case == "lowER_CASe"
assert Example.MixedCase == "MixeD_CAse"
.. versionadded:: 0.4.8
"""
def _generate_next_value_(name, *_):
return _name_mangler.spongebob(name)
class CobolCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `COBOL-CASE` to
produce each member's value.
Example usage::
class Example(CobolCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "UPPER-CASE"
assert Example.lower_case == "LOWER-CASE"
assert Example.MixedCase == "MIXED-CASE"
.. versionadded:: 0.4.8
"""
def _generate_next_value_(name, *_):
return _name_mangler.cobol(name)
class HttpHeaderCaseStrEnum(StrEnum):
"""
A ``StrEnum`` where ``auto()`` will convert the name to `Http-Header-Case` to
produce each member's value.
Example usage::
class Example(HttpHeaderCaseStrEnum):
UPPER_CASE = auto()
lower_case = auto()
MixedCase = auto()
assert Example.UPPER_CASE == "Upper-Case"
assert Example.lower_case == "Lower-Case"
assert Example.MixedCase == "Mixed-Case"
.. versionadded:: 0.4.8
"""
def _generate_next_value_(name, *_):
return _name_mangler.http_header(name)