Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py

Issue 1932353002: Initial checkin of gRPC to third_party/ Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py
diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py b/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ebc4e9ae8599934dc334d44486fd12f8074f5a6
--- /dev/null
+++ b/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py
@@ -0,0 +1,364 @@
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Entry points into the Crust layer of RPC Framework."""
+
+from grpc.framework.common import cardinality
+from grpc.framework.common import style
+from grpc.framework.crust import _calls
+from grpc.framework.crust import _service
+from grpc.framework.interfaces.base import base
+from grpc.framework.interfaces.face import face
+
+
+class _BaseServicer(base.Servicer):
+
+ def __init__(self, adapted_methods, adapted_multi_method):
+ self._adapted_methods = adapted_methods
+ self._adapted_multi_method = adapted_multi_method
+
+ def service(self, group, method, context, output_operator):
+ adapted_method = self._adapted_methods.get((group, method), None)
+ if adapted_method is not None:
+ return adapted_method(output_operator, context)
+ elif self._adapted_multi_method is not None:
+ try:
+ return self._adapted_multi_method(
+ group, method, output_operator, context)
+ except face.NoSuchMethodError:
+ raise base.NoSuchMethodError(None, None)
+ else:
+ raise base.NoSuchMethodError(None, None)
+
+
+class _UnaryUnaryMultiCallable(face.UnaryUnaryMultiCallable):
+
+ def __init__(self, end, group, method, pool):
+ self._end = end
+ self._group = group
+ self._method = method
+ self._pool = pool
+
+ def __call__(
+ self, request, timeout, metadata=None, with_call=False,
+ protocol_options=None):
+ return _calls.blocking_unary_unary(
+ self._end, self._group, self._method, timeout, with_call,
+ protocol_options, metadata, request)
+
+ def future(self, request, timeout, metadata=None, protocol_options=None):
+ return _calls.future_unary_unary(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request)
+
+ def event(
+ self, request, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_unary_unary(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request, receiver, abortion_callback, self._pool)
+
+
+class _UnaryStreamMultiCallable(face.UnaryStreamMultiCallable):
+
+ def __init__(self, end, group, method, pool):
+ self._end = end
+ self._group = group
+ self._method = method
+ self._pool = pool
+
+ def __call__(self, request, timeout, metadata=None, protocol_options=None):
+ return _calls.inline_unary_stream(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request)
+
+ def event(
+ self, request, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_unary_stream(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request, receiver, abortion_callback, self._pool)
+
+
+class _StreamUnaryMultiCallable(face.StreamUnaryMultiCallable):
+
+ def __init__(self, end, group, method, pool):
+ self._end = end
+ self._group = group
+ self._method = method
+ self._pool = pool
+
+ def __call__(
+ self, request_iterator, timeout, metadata=None,
+ with_call=False, protocol_options=None):
+ return _calls.blocking_stream_unary(
+ self._end, self._group, self._method, timeout, with_call,
+ protocol_options, metadata, request_iterator, self._pool)
+
+ def future(
+ self, request_iterator, timeout, metadata=None, protocol_options=None):
+ return _calls.future_stream_unary(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request_iterator, self._pool)
+
+ def event(
+ self, receiver, abortion_callback, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.event_stream_unary(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, receiver, abortion_callback, self._pool)
+
+
+class _StreamStreamMultiCallable(face.StreamStreamMultiCallable):
+
+ def __init__(self, end, group, method, pool):
+ self._end = end
+ self._group = group
+ self._method = method
+ self._pool = pool
+
+ def __call__(
+ self, request_iterator, timeout, metadata=None, protocol_options=None):
+ return _calls.inline_stream_stream(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, request_iterator, self._pool)
+
+ def event(
+ self, receiver, abortion_callback, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.event_stream_stream(
+ self._end, self._group, self._method, timeout, protocol_options,
+ metadata, receiver, abortion_callback, self._pool)
+
+
+class _GenericStub(face.GenericStub):
+ """An face.GenericStub implementation."""
+
+ def __init__(self, end, pool):
+ self._end = end
+ self._pool = pool
+
+ def blocking_unary_unary(
+ self, group, method, request, timeout, metadata=None,
+ with_call=None, protocol_options=None):
+ return _calls.blocking_unary_unary(
+ self._end, group, method, timeout, with_call, protocol_options,
+ metadata, request)
+
+ def future_unary_unary(
+ self, group, method, request, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.future_unary_unary(
+ self._end, group, method, timeout, protocol_options, metadata, request)
+
+ def inline_unary_stream(
+ self, group, method, request, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.inline_unary_stream(
+ self._end, group, method, timeout, protocol_options, metadata, request)
+
+ def blocking_stream_unary(
+ self, group, method, request_iterator, timeout, metadata=None,
+ with_call=None, protocol_options=None):
+ return _calls.blocking_stream_unary(
+ self._end, group, method, timeout, with_call, protocol_options,
+ metadata, request_iterator, self._pool)
+
+ def future_stream_unary(
+ self, group, method, request_iterator, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.future_stream_unary(
+ self._end, group, method, timeout, protocol_options, metadata,
+ request_iterator, self._pool)
+
+ def inline_stream_stream(
+ self, group, method, request_iterator, timeout, metadata=None,
+ protocol_options=None):
+ return _calls.inline_stream_stream(
+ self._end, group, method, timeout, protocol_options, metadata,
+ request_iterator, self._pool)
+
+ def event_unary_unary(
+ self, group, method, request, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_unary_unary(
+ self._end, group, method, timeout, protocol_options, metadata, request,
+ receiver, abortion_callback, self._pool)
+
+ def event_unary_stream(
+ self, group, method, request, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_unary_stream(
+ self._end, group, method, timeout, protocol_options, metadata, request,
+ receiver, abortion_callback, self._pool)
+
+ def event_stream_unary(
+ self, group, method, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_stream_unary(
+ self._end, group, method, timeout, protocol_options, metadata, receiver,
+ abortion_callback, self._pool)
+
+ def event_stream_stream(
+ self, group, method, receiver, abortion_callback, timeout,
+ metadata=None, protocol_options=None):
+ return _calls.event_stream_stream(
+ self._end, group, method, timeout, protocol_options, metadata, receiver,
+ abortion_callback, self._pool)
+
+ def unary_unary(self, group, method):
+ return _UnaryUnaryMultiCallable(self._end, group, method, self._pool)
+
+ def unary_stream(self, group, method):
+ return _UnaryStreamMultiCallable(self._end, group, method, self._pool)
+
+ def stream_unary(self, group, method):
+ return _StreamUnaryMultiCallable(self._end, group, method, self._pool)
+
+ def stream_stream(self, group, method):
+ return _StreamStreamMultiCallable(self._end, group, method, self._pool)
+
+
+class _DynamicStub(face.DynamicStub):
+ """An face.DynamicStub implementation."""
+
+ def __init__(self, end, group, cardinalities, pool):
+ self._end = end
+ self._group = group
+ self._cardinalities = cardinalities
+ self._pool = pool
+
+ def __getattr__(self, attr):
+ method_cardinality = self._cardinalities.get(attr)
+ if method_cardinality is cardinality.Cardinality.UNARY_UNARY:
+ return _UnaryUnaryMultiCallable(self._end, self._group, attr, self._pool)
+ elif method_cardinality is cardinality.Cardinality.UNARY_STREAM:
+ return _UnaryStreamMultiCallable(self._end, self._group, attr, self._pool)
+ elif method_cardinality is cardinality.Cardinality.STREAM_UNARY:
+ return _StreamUnaryMultiCallable(self._end, self._group, attr, self._pool)
+ elif method_cardinality is cardinality.Cardinality.STREAM_STREAM:
+ return _StreamStreamMultiCallable(
+ self._end, self._group, attr, self._pool)
+ else:
+ raise AttributeError('_DynamicStub object has no attribute "%s"!' % attr)
+
+
+def _adapt_method_implementations(method_implementations, pool):
+ adapted_implementations = {}
+ for name, method_implementation in method_implementations.iteritems():
+ if method_implementation.style is style.Service.INLINE:
+ if method_implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
+ adapted_implementations[name] = _service.adapt_inline_unary_unary(
+ method_implementation.unary_unary_inline, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
+ adapted_implementations[name] = _service.adapt_inline_unary_stream(
+ method_implementation.unary_stream_inline, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
+ adapted_implementations[name] = _service.adapt_inline_stream_unary(
+ method_implementation.stream_unary_inline, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
+ adapted_implementations[name] = _service.adapt_inline_stream_stream(
+ method_implementation.stream_stream_inline, pool)
+ elif method_implementation.style is style.Service.EVENT:
+ if method_implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
+ adapted_implementations[name] = _service.adapt_event_unary_unary(
+ method_implementation.unary_unary_event, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
+ adapted_implementations[name] = _service.adapt_event_unary_stream(
+ method_implementation.unary_stream_event, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
+ adapted_implementations[name] = _service.adapt_event_stream_unary(
+ method_implementation.stream_unary_event, pool)
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
+ adapted_implementations[name] = _service.adapt_event_stream_stream(
+ method_implementation.stream_stream_event, pool)
+ return adapted_implementations
+
+
+def servicer(method_implementations, multi_method_implementation, pool):
+ """Creates a base.Servicer.
+
+ It is guaranteed that any passed face.MultiMethodImplementation will
+ only be called to service an RPC if there is no
+ face.MethodImplementation for the RPC method in the passed
+ method_implementations dictionary.
+
+ Args:
+ method_implementations: A dictionary from RPC method name to
+ face.MethodImplementation object to be used to service the named
+ RPC method.
+ multi_method_implementation: An face.MultiMethodImplementation to be
+ used to service any RPCs not serviced by the
+ face.MethodImplementations given in the method_implementations
+ dictionary, or None.
+ pool: A thread pool.
+
+ Returns:
+ A base.Servicer that services RPCs via the given implementations.
+ """
+ adapted_implementations = _adapt_method_implementations(
+ method_implementations, pool)
+ if multi_method_implementation is None:
+ adapted_multi_method_implementation = None
+ else:
+ adapted_multi_method_implementation = _service.adapt_multi_method(
+ multi_method_implementation, pool)
+ return _BaseServicer(
+ adapted_implementations, adapted_multi_method_implementation)
+
+
+def generic_stub(end, pool):
+ """Creates an face.GenericStub.
+
+ Args:
+ end: A base.End.
+ pool: A futures.ThreadPoolExecutor.
+
+ Returns:
+ A face.GenericStub that performs RPCs via the given base.End.
+ """
+ return _GenericStub(end, pool)
+
+
+def dynamic_stub(end, group, cardinalities, pool):
+ """Creates an face.DynamicStub.
+
+ Args:
+ end: A base.End.
+ group: The group identifier for all RPCs to be made with the created
+ face.DynamicStub.
+ cardinalities: A dict from method identifier to cardinality.Cardinality
+ value identifying the cardinality of every RPC method to be supported by
+ the created face.DynamicStub.
+ pool: A futures.ThreadPoolExecutor.
+
+ Returns:
+ A face.DynamicStub that performs RPCs via the given base.End.
+ """
+ return _DynamicStub(end, group, cardinalities, pool)

Powered by Google App Engine
This is Rietveld 408576698