diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 061026fb..e9bab798 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,8 @@ Change Log Unreleased ~~~~~~~~~~ +* Log error on waffle object creation when name includes a blank space as a prefix or suffix. + [5.3.0] - 2025-02-14 -------------------- diff --git a/edx_toggles/tests/test_waffle.py b/edx_toggles/tests/test_waffle.py index 69f6a14a..91b285e2 100644 --- a/edx_toggles/tests/test_waffle.py +++ b/edx_toggles/tests/test_waffle.py @@ -2,16 +2,25 @@ Unit tests for waffle classes. """ +from unittest.mock import patch + from django.test import TestCase -from edx_toggles.toggles import NonNamespacedWaffleFlag, NonNamespacedWaffleSwitch, WaffleFlag, WaffleSwitch +from edx_toggles.toggles import ( + NonNamespacedWaffleFlag, + NonNamespacedWaffleSwitch, + WaffleFlag, + WaffleSwitch, +) from edx_toggles.toggles.internal.waffle.base import BaseWaffle +from edx_toggles.toggles.internal.waffle.base import logger as base_logger class NaiveWaffle(BaseWaffle): """ Simple waffle class that implements a basic instance-tracking mechanism """ + _class_instances = set() def is_enabled(self): @@ -29,6 +38,18 @@ def test_constructor(self): self.assertEqual("module1", waffle.module_name) self.assertEqual(1, len(NaiveWaffle.get_instances())) + def test_no_blank_space_in_name(self): + with patch.object(base_logger, "error") as mock_logger_error: + NaiveWaffle("namespaced.name ", "module") + mock_logger_error.assert_called_with( + "NaiveWaffle instance name should not include a blank space prefix or suffix: 'namespaced.name '" + ) + with patch.object(base_logger, "error") as mock_logger_error: + NaiveWaffle(" namespaced.name", "module") + mock_logger_error.assert_called_with( + "NaiveWaffle instance name should not include a blank space prefix or suffix: ' namespaced.name'" + ) + class WaffleFlagTests(TestCase): """ diff --git a/edx_toggles/toggles/internal/waffle/base.py b/edx_toggles/toggles/internal/waffle/base.py index ac2fdf77..a2bd38c4 100644 --- a/edx_toggles/toggles/internal/waffle/base.py +++ b/edx_toggles/toggles/internal/waffle/base.py @@ -2,8 +2,12 @@ Base waffle toggle classes. """ +import logging + from ..base import BaseToggle +logger = logging.getLogger(__name__) + class BaseWaffle(BaseToggle): """ @@ -30,7 +34,9 @@ def validate_name(cls, name): """ if "." not in name: raise ValueError( - "Cannot create non-namespaced '{}' {} instance".format( - name, cls.__name__ - ) + f"Cannot create non-namespaced '{name}' {cls.__name__} instance" + ) + if name.startswith(" ") or name.endswith(" "): + logger.error( + f"{cls.__name__} instance name should not include a blank space prefix or suffix: '{name}'" )