From 5efd77728dd5a1c6a2fb5070b981ad4d028c3fe1 Mon Sep 17 00:00:00 2001 From: Paul Harrison Date: Fri, 18 Nov 2022 12:59:18 +0000 Subject: [PATCH] feat: Implement auto-naming string enum --- poker/utils/__init__.py | 0 poker/utils/enum.py | 27 +++++++++++++++++++++++++++ tests/utils/__init__.py | 0 tests/utils/test_enum.py | 16 ++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 poker/utils/__init__.py create mode 100644 poker/utils/enum.py create mode 100644 tests/utils/__init__.py create mode 100644 tests/utils/test_enum.py diff --git a/poker/utils/__init__.py b/poker/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/poker/utils/enum.py b/poker/utils/enum.py new file mode 100644 index 0000000..91e83a5 --- /dev/null +++ b/poker/utils/enum.py @@ -0,0 +1,27 @@ +from enum import StrEnum +from typing import Any + + +class AutoName(StrEnum): + """Use the lower case name as the value for Python Enum (default would be integers). + + Inherits from str to ensure all types are string and as a bonus it becomes JSON + serializable. + + See here for more information: + https://docs.python.org/3/library/enum.html#using-automatic-values + """ + + def __str__(self) -> str: + """Return string representation.""" + return str(self.value) + + @staticmethod + def _generate_next_value_( + name: str, start: int, count: int, last_values: list[Any] + ) -> str: + """Enum standard structure - the next value. + + See this on @staticmethod: https://github.com/python/mypy/issues/7591 + """ + return name.lower() diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/utils/test_enum.py b/tests/utils/test_enum.py new file mode 100644 index 0000000..9a84ee1 --- /dev/null +++ b/tests/utils/test_enum.py @@ -0,0 +1,16 @@ +from enum import auto + +from poker.utils.enum import AutoName + + +def test_auto_name() -> None: + class Example(AutoName): + """Example Enum.""" + + foo = auto() + BAR = auto() + WeIrD = auto() + + assert Example.foo.value == "foo" + assert Example.BAR.value == "bar" + assert Example.WeIrD.value == "weird"