Skip to content
This repository was archived by the owner on Apr 19, 2026. It is now read-only.

Commit 6acdf1e

Browse files
committed
Remove pointless JSON roundtripping.
We don't need to serialize JSON and then just directly unserialize it. That seems to have existed only to support a v1 feature.
1 parent c742992 commit 6acdf1e

3 files changed

Lines changed: 22 additions & 29 deletions

File tree

endpoints/api_backend_service.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@
3939

4040

4141
class ApiConfigRegistry(object):
42-
"""Registry of active APIs to be registered with Google API Server."""
42+
"""Registry of active APIs"""
4343

4444
def __init__(self):
4545
# Set of API classes that have been registered.
4646
self.__registered_classes = set()
4747
# Set of API config contents served by this App Engine AppId/version
48-
self.__api_configs = set()
48+
self.__api_configs = []
4949
# Map of API method name to ProtoRPC method name.
5050
self.__api_methods = {}
5151

@@ -54,14 +54,13 @@ def register_backend(self, config_contents):
5454
"""Register a single API and its config contents.
5555
5656
Args:
57-
config_contents: String containing API configuration.
57+
config_contents: Dict containing API configuration.
5858
"""
5959
if config_contents is None:
6060
return
61-
parsed_config = json.loads(config_contents)
62-
self.__register_class(parsed_config)
63-
self.__api_configs.add(config_contents)
64-
self.__register_methods(parsed_config)
61+
self.__register_class(config_contents)
62+
self.__api_configs.append(config_contents)
63+
self.__register_methods(config_contents)
6564

6665
def __register_class(self, parsed_config):
6766
"""Register the class implementing this config, so we only add it once.
@@ -120,7 +119,7 @@ def lookup_api_method(self, api_method_name):
120119

121120
def all_api_configs(self):
122121
"""Return a list of all API configration specs as registered above."""
123-
return list(self.__api_configs)
122+
return self.__api_configs
124123

125124

126125
class BackendServiceImpl(api_backend.BackendService):
@@ -159,7 +158,7 @@ def getApiConfigs(self, request=None):
159158
message='API backend app revision %s not the same as expected %s' % (
160159
self.__app_revision, request.appRevision))
161160

162-
configs = self.__api_config_registry.all_api_configs()
161+
configs = [json.dumps(d) for d in self.__api_config_registry.all_api_configs()]
163162
return api_backend.ApiConfigList(items=configs)
164163

165164
def logMessages(self, request):

endpoints/apiserving.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,8 @@ def __register_services(api_name_version_map, api_config_registry):
333333
for service_factories in api_name_version_map.itervalues():
334334
service_classes = [service_factory.service_class
335335
for service_factory in service_factories]
336-
config_file = generator.pretty_print_config_to_json(service_classes)
337-
api_config_registry.register_backend(config_file)
336+
config_dict = generator.get_config_dict(service_classes)
337+
api_config_registry.register_backend(config_dict)
338338

339339
for service_factory in service_factories:
340340
protorpc_class_name = service_factory.service_class.__name__
@@ -412,8 +412,7 @@ def protorpc_to_endpoints_error(self, status, body):
412412

413413
def get_api_configs(self):
414414
return {
415-
'items': [json.loads(c) for c in
416-
self.api_config_registry.all_api_configs()]}
415+
'items': self.api_config_registry.all_api_configs()}
417416

418417
def __call__(self, environ, start_response):
419418
"""Wrapper for the Endpoints server app.

endpoints/test/api_backend_service_test.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ def setUp(self):
3939

4040
def testApiMethodsMapped(self):
4141
self.registry.register_backend(
42-
'{"methods": {"method1": {"rosyMethod": "foo"}}}')
42+
{"methods": {"method1": {"rosyMethod": "foo"}}})
4343
self.assertEquals('foo', self.registry.lookup_api_method('method1'))
4444

4545
def testAllApiConfigsWithTwoConfigs(self):
46-
config1 = '{"methods": {"method1": {"rosyMethod": "c1.foo"}}}'
47-
config2 = '{"methods": {"method2": {"rosyMethod": "c2.bar"}}}'
46+
config1 = {"methods": {"method1": {"rosyMethod": "c1.foo"}}}
47+
config2 = {"methods": {"method2": {"rosyMethod": "c2.bar"}}}
4848
self.registry.register_backend(config1)
4949
self.registry.register_backend(config2)
5050
self.assertEquals('c1.foo', self.registry.lookup_api_method('method1'))
@@ -55,29 +55,24 @@ def testNoneApiConfigContent(self):
5555
self.registry.register_backend(None)
5656
self.assertIsNone(self.registry.lookup_api_method('method'))
5757

58-
def testUnparseableApiConfigContent(self):
59-
config = '{"methods": {"method": {"rosyMethod": "foo"' # Unclosed {s
60-
self.assertRaises(ValueError, self.registry.register_backend, config)
61-
self.assertIsNone(self.registry.lookup_api_method('method'))
62-
6358
def testEmptyApiConfig(self):
64-
config = '{}'
59+
config = {}
6560
self.registry.register_backend(config)
6661
self.assertIsNone(self.registry.lookup_api_method('method'))
6762

6863
def testApiConfigContentWithNoMethods(self):
69-
config = '{"methods": {}}'
64+
config = {"methods": {}}
7065
self.registry.register_backend(config)
7166
self.assertIsNone(self.registry.lookup_api_method('method'))
7267

7368
def testApiConfigContentWithNoRosyMethod(self):
74-
config = '{"methods": {"method": {}}}'
69+
config = {"methods": {"method": {}}}
7570
self.registry.register_backend(config)
7671
self.assertIsNone(self.registry.lookup_api_method('method'))
7772

7873
def testRegisterSpiRootRepeatedError(self):
79-
config1 = '{"methods": {"method1": {"rosyMethod": "MyClass.Func1"}}}'
80-
config2 = '{"methods": {"method2": {"rosyMethod": "MyClass.Func2"}}}'
74+
config1 = {"methods": {"method1": {"rosyMethod": "MyClass.Func1"}}}
75+
config2 = {"methods": {"method2": {"rosyMethod": "MyClass.Func2"}}}
8176
self.registry.register_backend(config1)
8277
self.assertRaises(api_exceptions.ApiConfigurationError,
8378
self.registry.register_backend, config2)
@@ -88,9 +83,9 @@ def testRegisterSpiRootRepeatedError(self):
8883

8984
def testRegisterSpiDifferentClasses(self):
9085
"""This can happen when multiple classes implement an API."""
91-
config1 = ('{"methods": {'
92-
' "method1": {"rosyMethod": "MyClass.Func1"},'
93-
' "method2": {"rosyMethod": "OtherClass.Func2"}}}')
86+
config1 = {"methods": {
87+
"method1": {"rosyMethod": "MyClass.Func1"},
88+
"method2": {"rosyMethod": "OtherClass.Func2"}}}
9489
self.registry.register_backend(config1)
9590
self.assertEquals('MyClass.Func1',
9691
self.registry.lookup_api_method('method1'))

0 commit comments

Comments
 (0)