thirdparty/google_appengine/google/appengine/api/apiproxy_stub_map.py
changeset 109 620f9b141567
child 828 f5fd65cc3bf3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/google/appengine/api/apiproxy_stub_map.py	Tue Aug 26 21:49:54 2008 +0000
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""Container of APIProxy stubs for more convenient unittesting.
+
+Classes/variables/functions defined here:
+  APIProxyStubMap: container of APIProxy stubs.
+  apiproxy: global instance of an APIProxyStubMap.
+  MakeSyncCall: APIProxy entry point.
+"""
+
+
+
+
+
+import sys
+
+def MakeSyncCall(service, call, request, response):
+  """The APIProxy entry point.
+
+  Args:
+    service: string representing which service to call
+    call: string representing which function to call
+    request: protocol buffer for the request
+    response: protocol buffer for the response
+
+  Raises:
+    apiproxy_errors.Error or a subclass.
+  """
+  stub = apiproxy.GetStub(service)
+  assert stub, 'No api proxy found for service "%s"' % service
+  stub.MakeSyncCall(service, call, request, response)
+
+
+class APIProxyStubMap:
+  """Container of APIProxy stubs for more convenient unittesting.
+
+  Stubs may be either trivial implementations of APIProxy services (e.g.
+  DatastoreFileStub, UserServiceStub) or "real" implementations.
+
+  For unittests, we may want to mix and match real and trivial implementations
+  of services in order to better focus testing on individual service
+  implementations. To achieve this, we allow the client to attach stubs to
+  service names, as well as define a default stub to be used if no specific
+  matching stub is identified.
+  """
+
+
+  def __init__(self, default_stub=None):
+    """Constructor.
+
+    Args:
+      default_stub: optional stub
+
+    'default_stub' will be used whenever no specific matching stub is found.
+    """
+    self.__stub_map = {}
+    self.__default_stub = default_stub
+
+  def RegisterStub(self, service, stub):
+    """Register the provided stub for the specified service.
+
+    Args:
+      service: string
+      stub: stub
+    """
+    assert not self.__stub_map.has_key(service)
+    self.__stub_map[service] = stub
+
+    if service == 'datastore':
+      self.RegisterStub('datastore_v3', stub)
+
+  def GetStub(self, service):
+    """Retrieve the stub registered for the specified service.
+
+    Args:
+      service: string
+
+    Returns:
+      stub
+
+    Returns the stub registered for 'service', and returns the default stub
+    if no such stub is found.
+    """
+    return self.__stub_map.get(service, self.__default_stub)
+
+def GetDefaultAPIProxy():
+  try:
+    runtime = __import__('google.appengine.runtime', globals(), locals(),
+                         ['apiproxy'])
+    return APIProxyStubMap(runtime.apiproxy)
+  except (AttributeError, ImportError):
+    return APIProxyStubMap()
+
+apiproxy = GetDefaultAPIProxy()