Further simplify microversion utils

Following on from [1]:
- Since we're only ever calling _fully_qualified_name with module-level
  functions, remove the ability to call it with a class (forcing such
  usages to either use functions or modify this util).
- Consolidate a redundant invocation of _fully_qualified_name from
  version_handler.

[1] Id8f96801116818dda6c68c301619aee185e8fbff

Change-Id: I205a7fd338a0db420b891341c3c40b10f3199fd3
This commit is contained in:
Eric Fried 2019-07-23 08:57:58 -05:00
parent d2b452d7f5
commit 7efcb2e7f1
2 changed files with 16 additions and 12 deletions

View File

@ -102,25 +102,24 @@ def min_version_string():
# Based on code in twisted # Based on code in twisted
# https://github.com/twisted/twisted/blob/trunk/twisted/python/deprecate.py # https://github.com/twisted/twisted/blob/trunk/twisted/python/deprecate.py
def _fully_qualified_name(handler): def _fully_qualified_name(handler):
"""Return the name of a function or class used as an HTTP API handler, """Return the name of a function used as an HTTP API handler, qualified by
qualified by module name. module name.
""" """
if inspect.isfunction(handler) or inspect.isclass(handler): if inspect.isfunction(handler):
module_name = handler.__module__ module_name = handler.__module__
return "%s.%s" % (module_name, handler.__name__) return "%s.%s" % (module_name, handler.__name__)
# We got an object method or module. This is a coding error. # We got a class, object method, or module. This is a coding error.
raise TypeError("_fully_qualified_name received bad handler type. " raise TypeError("_fully_qualified_name received bad handler type. "
"Module-level class or function required.") "Module-level function required.")
def _find_method(f, version, status_code): def _find_method(qualified_name, version, status_code):
"""Look in VERSIONED_METHODS for method with right name matching version. """Look in VERSIONED_METHODS for method with right name matching version.
If no match is found a HTTPError corresponding to status_code will If no match is found a HTTPError corresponding to status_code will
be returned. be returned.
""" """
qualified_name = _fully_qualified_name(f)
# A KeyError shouldn't be possible here, but let's be robust # A KeyError shouldn't be possible here, but let's be robust
# just in case. # just in case.
method_list = VERSIONED_METHODS.get(qualified_name, []) method_list = VERSIONED_METHODS.get(qualified_name, [])
@ -160,7 +159,8 @@ def version_handler(min_ver, max_ver=None, status_code=404):
def decorated_func(req, *args, **kwargs): def decorated_func(req, *args, **kwargs):
version = req.environ[MICROVERSION_ENVIRON] version = req.environ[MICROVERSION_ENVIRON]
return _find_method(f, version, status_code)(req, *args, **kwargs) return _find_method(
qualified_name, version, status_code)(req, *args, **kwargs)
# Sort highest min version to beginning of list. # Sort highest min version to beginning of list.
VERSIONED_METHODS[qualified_name].sort(key=lambda x: x[0], VERSIONED_METHODS[qualified_name].sort(key=lambda x: x[0],

View File

@ -31,12 +31,16 @@ def handler():
class TestMicroversionFindMethod(testtools.TestCase): class TestMicroversionFindMethod(testtools.TestCase):
def test_method_405(self): def test_method_405(self):
self.assertRaises(webob.exc.HTTPMethodNotAllowed, self.assertRaises(
microversion._find_method, handler, '1.1', 405) webob.exc.HTTPMethodNotAllowed,
microversion._find_method,
microversion._fully_qualified_name(handler), '1.1', 405)
def test_method_404(self): def test_method_404(self):
self.assertRaises(webob.exc.HTTPNotFound, self.assertRaises(
microversion._find_method, handler, '1.1', 404) webob.exc.HTTPNotFound,
microversion._find_method,
microversion._fully_qualified_name(handler), '1.1', 404)
class TestMicroversionDecoration(testtools.TestCase): class TestMicroversionDecoration(testtools.TestCase):