|  | @@ -33,6 +33,8 @@ import abc
 | 
	
		
			
				|  |  |  import collections
 | 
	
		
			
				|  |  |  import enum
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import six
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # cardinality, style, abandonment, future, and stream are
 | 
	
		
			
				|  |  |  # referenced from specification in this module.
 | 
	
		
			
				|  |  |  from grpc.framework.common import cardinality  # pylint: disable=unused-import
 | 
	
	
		
			
				|  | @@ -96,7 +98,7 @@ class Abortion(
 | 
	
		
			
				|  |  |      REMOTE_FAILURE = 'remote failure'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class AbortionError(Exception):
 | 
	
		
			
				|  |  | +class AbortionError(six.with_metaclass(abc.ABCMeta, Exception)):
 | 
	
		
			
				|  |  |    """Common super type for exceptions indicating RPC abortion.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      initial_metadata: The initial metadata from the other side of the RPC or
 | 
	
	
		
			
				|  | @@ -108,7 +110,6 @@ class AbortionError(Exception):
 | 
	
		
			
				|  |  |      details: The details value from the other side of the RPC or None if no
 | 
	
		
			
				|  |  |        details value was received.
 | 
	
		
			
				|  |  |    """
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def __init__(self, initial_metadata, terminal_metadata, code, details):
 | 
	
		
			
				|  |  |      super(AbortionError, self).__init__()
 | 
	
	
		
			
				|  | @@ -150,9 +151,8 @@ class RemoteError(AbortionError):
 | 
	
		
			
				|  |  |    """Indicates that an RPC has terminated due to a remote defect."""
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class RpcContext(object):
 | 
	
		
			
				|  |  | +class RpcContext(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Provides RPC-related information and action."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def is_active(self):
 | 
	
	
		
			
				|  | @@ -199,9 +199,8 @@ class RpcContext(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class Call(RpcContext):
 | 
	
		
			
				|  |  | +class Call(six.with_metaclass(abc.ABCMeta, RpcContext)):
 | 
	
		
			
				|  |  |    """Invocation-side utility object for an RPC."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def initial_metadata(self):
 | 
	
	
		
			
				|  | @@ -256,9 +255,8 @@ class Call(RpcContext):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class ServicerContext(RpcContext):
 | 
	
		
			
				|  |  | +class ServicerContext(six.with_metaclass(abc.ABCMeta, RpcContext)):
 | 
	
		
			
				|  |  |    """A context object passed to method implementations."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def invocation_metadata(self):
 | 
	
	
		
			
				|  | @@ -326,9 +324,8 @@ class ServicerContext(RpcContext):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class ResponseReceiver(object):
 | 
	
		
			
				|  |  | +class ResponseReceiver(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Invocation-side object used to accept the output of an RPC."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def initial_metadata(self, initial_metadata):
 | 
	
	
		
			
				|  | @@ -362,9 +359,8 @@ class ResponseReceiver(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class UnaryUnaryMultiCallable(object):
 | 
	
		
			
				|  |  | +class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords invoking a unary-unary RPC in any call style."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def __call__(
 | 
	
	
		
			
				|  | @@ -434,9 +430,8 @@ class UnaryUnaryMultiCallable(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class UnaryStreamMultiCallable(object):
 | 
	
		
			
				|  |  | +class UnaryStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords invoking a unary-stream RPC in any call style."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def __call__(self, request, timeout, metadata=None, protocol_options=None):
 | 
	
	
		
			
				|  | @@ -480,9 +475,8 @@ class UnaryStreamMultiCallable(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class StreamUnaryMultiCallable(object):
 | 
	
		
			
				|  |  | +class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords invoking a stream-unary RPC in any call style."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def __call__(
 | 
	
	
		
			
				|  | @@ -553,9 +547,8 @@ class StreamUnaryMultiCallable(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class StreamStreamMultiCallable(object):
 | 
	
		
			
				|  |  | +class StreamStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords invoking a stream-stream RPC in any call style."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def __call__(
 | 
	
	
		
			
				|  | @@ -600,7 +593,7 @@ class StreamStreamMultiCallable(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class MethodImplementation(object):
 | 
	
		
			
				|  |  | +class MethodImplementation(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """A sum type that describes a method implementation.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    Attributes:
 | 
	
	
		
			
				|  | @@ -643,12 +636,10 @@ class MethodImplementation(object):
 | 
	
		
			
				|  |  |        is cardinality.Cardinality.STREAM_STREAM and style is
 | 
	
		
			
				|  |  |        style.Service.EVENT.
 | 
	
		
			
				|  |  |    """
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class MultiMethodImplementation(object):
 | 
	
		
			
				|  |  | +class MultiMethodImplementation(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """A general type able to service many methods."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def service(self, group, method, response_consumer, context):
 | 
	
	
		
			
				|  | @@ -678,9 +669,8 @@ class MultiMethodImplementation(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class GenericStub(object):
 | 
	
		
			
				|  |  | +class GenericStub(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords RPC invocation via generic methods."""
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @abc.abstractmethod
 | 
	
		
			
				|  |  |    def blocking_unary_unary(
 | 
	
	
		
			
				|  | @@ -977,7 +967,7 @@ class GenericStub(object):
 | 
	
		
			
				|  |  |      raise NotImplementedError()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class DynamicStub(object):
 | 
	
		
			
				|  |  | +class DynamicStub(six.with_metaclass(abc.ABCMeta)):
 | 
	
		
			
				|  |  |    """Affords RPC invocation via attributes corresponding to afforded methods.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    Instances of this type may be scoped to a single group so that attribute
 | 
	
	
		
			
				|  | @@ -993,4 +983,3 @@ class DynamicStub(object):
 | 
	
		
			
				|  |  |    if the requested attribute is the name of a stream-stream method, the value of
 | 
	
		
			
				|  |  |    the attribute will be a StreamStreamMultiCallable with which to invoke an RPC.
 | 
	
		
			
				|  |  |    """
 | 
	
		
			
				|  |  | -  __metaclass__ = abc.ABCMeta
 |