From e41b5d336a943227ab92e7ac7008e14461922105 Mon Sep 17 00:00:00 2001 From: David Grayston Date: Thu, 22 May 2025 20:09:56 +0100 Subject: [PATCH] fix: Prevent lowercase enums --- paddle_billing/PaddleStrEnum.py | 3 +++ .../Unit/PaddleStrEnum/test_PaddleStrEnum.py | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/paddle_billing/PaddleStrEnum.py b/paddle_billing/PaddleStrEnum.py index 58f2476e..83dd6851 100644 --- a/paddle_billing/PaddleStrEnum.py +++ b/paddle_billing/PaddleStrEnum.py @@ -29,6 +29,9 @@ def __getattr__(cls, name): if _is_dunder(name): raise AttributeError(name) + if isinstance(name, str) and name.islower(): + raise AttributeError(name) + return cls(str(name).lower()) diff --git a/tests/Unit/PaddleStrEnum/test_PaddleStrEnum.py b/tests/Unit/PaddleStrEnum/test_PaddleStrEnum.py index 50d884ff..1ec30d5a 100644 --- a/tests/Unit/PaddleStrEnum/test_PaddleStrEnum.py +++ b/tests/Unit/PaddleStrEnum/test_PaddleStrEnum.py @@ -67,3 +67,23 @@ class TestCountryCodesEnum(PaddleStrEnum, metaclass=PaddleStrEnumMeta): assert TestCountryCodesEnum.France.value == "france" assert TestCountryCodesEnum.France.name == "Undefined" assert not TestCountryCodesEnum.France.is_known() + assert hasattr(TestCountryCodesEnum, "France") is True + + +def test_paddle_str_enum_does_not_support_lowercase_attributes(): + class TestCountryCodesEnum(PaddleStrEnum, metaclass=PaddleStrEnumMeta): + CA: "TestCountryCodesEnum" = "canada" + US: "TestCountryCodesEnum" = "usa" + + # Contain uppercase letters. + assert hasattr(TestCountryCodesEnum, "SomeCountry") is True + assert hasattr(TestCountryCodesEnum, "Some Country") is True + assert hasattr(TestCountryCodesEnum, "Some-Country") is True + assert hasattr(TestCountryCodesEnum, "Some_Country") is True + assert hasattr(TestCountryCodesEnum, "SOMECOUNTRY") is True + assert hasattr(TestCountryCodesEnum, "SOME_COUNTRY") is True + + # Lowercase only. + assert hasattr(TestCountryCodesEnum, "somecountry") is False + assert hasattr(TestCountryCodesEnum, "some_country") is False + assert hasattr(TestCountryCodesEnum, "some-country") is False