From f0ee02a039831301b0e5c98c3e6e98a264bf8326 Mon Sep 17 00:00:00 2001 From: Iuri de Silvio Date: Wed, 30 Jul 2014 16:21:19 -0300 Subject: [PATCH 1/2] Handler raise a NoFeatureFlagFound instead of handle the problem. Trigger the missing feature behaviour only if the feature wasn't found in any handler. --- flask_featureflags/__init__.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/flask_featureflags/__init__.py b/flask_featureflags/__init__.py index 7cde935..854627f 100644 --- a/flask_featureflags/__init__.py +++ b/flask_featureflags/__init__.py @@ -35,6 +35,11 @@ class StopCheckingFeatureFlags(Exception): pass +class NoFeatureFlagFound(Exception): + """ Raise this when the feature flag does not exist. """ + pass + + def AppConfigFlagHandler(feature=None): """ This is the default handler. It checks for feature flags in the current app's configuration. @@ -63,11 +68,7 @@ class DevelopmentConfig(Config): try: return current_app.config[FEATURE_FLAGS_CONFIG][feature] except (AttributeError, KeyError): - if current_app.debug and current_app.config.get(RAISE_ERROR_ON_MISSING_FEATURES, False): - raise KeyError(u"No feature flag defined for {feature}".format(feature=feature)) - else: - log.info(u"No feature flag defined for {feature}".format(feature=feature)) - return False + raise NoFeatureFlagFound() class FeatureFlag(object): @@ -93,7 +94,6 @@ def init_app(self, app): else: app.jinja_env.tests[self.JINJA_TEST_NAME] = self.check - if not hasattr(app, 'extensions'): app.extensions = {} app.extensions[EXTENSION_NAME] = self @@ -119,14 +119,25 @@ def check(self, feature): The order of handlers matters - we will immediately return True if any handler returns true. If you want to a handler to return False and stop the chain, raise the StopCheckingFeatureFlags exception.""" + found = False for handler in self.handlers: try: if handler(feature): return True except StopCheckingFeatureFlags: return False - else: - return False + except NoFeatureFlagFound: + pass + else: + found = True + + if not found: + if current_app.debug and current_app.config.get(RAISE_ERROR_ON_MISSING_FEATURES, False): + raise KeyError(u"No feature flag defined for {feature}".format(feature=feature)) + else: + log.info(u"No feature flag defined for {feature}".format(feature=feature)) + + return False def is_active(feature): From 8a4295876a4e1059f46f8fadaa1562062bfe877e Mon Sep 17 00:00:00 2001 From: Iuri de Silvio Date: Wed, 30 Jul 2014 17:11:35 -0300 Subject: [PATCH 2/2] Fix test to support NoFeatureFlagFound. --- tests/test_edge_cases.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_edge_cases.py b/tests/test_edge_cases.py index 33a18c7..5a0da97 100644 --- a/tests/test_edge_cases.py +++ b/tests/test_edge_cases.py @@ -36,4 +36,5 @@ def test_running_default_handler_on_app_that_was_never_set_up_returns_false(self test_app = Flask(__name__) with test_app.test_request_context("/"): - self.assertFalse(feature_flags.AppConfigFlagHandler("BOGUS_FEATURE_FLAG")) + self.assertRaises(feature_flags.NoFeatureFlagFound, + feature_flags.AppConfigFlagHandler, "BOGUS_FEATURE_FLAG")