diff --git a/language/google/cloud/language.py b/language/google/cloud/language.py index 3e508f6b4e2a..f66b7d1f94d8 100644 --- a/language/google/cloud/language.py +++ b/language/google/cloud/language.py @@ -21,4 +21,5 @@ __all__ = ( 'enums', 'types', - 'LanguageServiceClient', ) + 'LanguageServiceClient', +) diff --git a/language/google/cloud/language_v1/gapic/language_service_client.py b/language/google/cloud/language_v1/gapic/language_service_client.py index 72a883dd7b4d..494e968a60eb 100644 --- a/language/google/cloud/language_v1/gapic/language_service_client.py +++ b/language/google/cloud/language_v1/gapic/language_service_client.py @@ -22,21 +22,20 @@ # merge preserves those additions if the generated source changes. """Accesses the google.cloud.language.v1 LanguageService API.""" -import collections -import json -import os import pkg_resources -import platform -from google.gax import api_callable -from google.gax import config -from google.gax import path_template -import google.gax +import google.api_core.gapic_v1.client_info +import google.api_core.gapic_v1.config +import google.api_core.gapic_v1.method +import google.api_core.grpc_helpers from google.cloud.language_v1.gapic import enums from google.cloud.language_v1.gapic import language_service_client_config from google.cloud.language_v1.proto import language_service_pb2 +_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( + 'google-cloud-language', ).version + class LanguageServiceClient(object): """ @@ -44,111 +43,104 @@ class LanguageServiceClient(object): recognition. """ - SERVICE_ADDRESS = 'language.googleapis.com' + SERVICE_ADDRESS = 'language.googleapis.com:443' """The default address of the service.""" - DEFAULT_SERVICE_PORT = 443 - """The default port of the service.""" - # The scopes needed to make gRPC calls to all of the methods defined in # this service - _ALL_SCOPES = ('https://www.googleapis.com/auth/cloud-platform', ) + _DEFAULT_SCOPES = ('https://www.googleapis.com/auth/cloud-platform', ) + + # The name of the interface for this client. This is the key used to find + # method configuration in the client_config dictionary + _INTERFACE_NAME = ('google.cloud.language.v1.LanguageService') def __init__(self, channel=None, credentials=None, - ssl_credentials=None, - scopes=None, - client_config=None, - lib_name=None, - lib_version='', - metrics_headers=()): + client_config=language_service_client_config.config, + client_info=None): """Constructor. Args: - channel (~grpc.Channel): A ``Channel`` instance through - which to make calls. - credentials (~google.auth.credentials.Credentials): The authorization - credentials to attach to requests. These credentials identify this - application to the service. - ssl_credentials (~grpc.ChannelCredentials): A - ``ChannelCredentials`` instance for use with an SSL-enabled - channel. - scopes (Sequence[str]): A list of OAuth2 scopes to attach to requests. + channel (grpc.Channel): A ``Channel`` instance through + which to make calls. If specified, then the ``credentials`` + argument is ignored. + credentials (google.auth.credentials.Credentials): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If none + are specified, the client will attempt to ascertain the + credentials from the environment. client_config (dict): - A dictionary for call options for each method. See - :func:`google.gax.construct_settings` for the structure of - this data. Falls back to the default config if not specified - or the specified config is missing data points. - lib_name (str): The API library software used for calling - the service. (Unless you are writing an API client itself, - leave this as default.) - lib_version (str): The API library software version used - for calling the service. (Unless you are writing an API client - itself, leave this as default.) - metrics_headers (dict): A dictionary of values for tracking - client library metrics. Ultimately serializes to a string - (e.g. 'foo/1.2.3 bar/3.14.1'). This argument should be - considered private. + A dictionary of call options for each method. If not specified + the default configuration is used. Generally, you only need + to set this if you're developing your own client library. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. """ - # Unless the calling application specifically requested - # OAuth scopes, request everything. - if scopes is None: - scopes = self._ALL_SCOPES - - # Initialize an empty client config, if none is set. - if client_config is None: - client_config = {} - - # Initialize metrics_headers as an ordered dictionary - # (cuts down on cardinality of the resulting string slightly). - metrics_headers = collections.OrderedDict(metrics_headers) - metrics_headers['gl-python'] = platform.python_version() - - # The library may or may not be set, depending on what is - # calling this client. Newer client libraries set the library name - # and version. - if lib_name: - metrics_headers[lib_name] = lib_version - - # Finally, track the GAPIC package version. - metrics_headers['gapic'] = pkg_resources.get_distribution( - 'google-cloud-language', ).version - - # Load the configuration defaults. - defaults = api_callable.construct_settings( - 'google.cloud.language.v1.LanguageService', - language_service_client_config.config, - client_config, - config.STATUS_CODE_NAMES, - metrics_headers=metrics_headers, ) - self.language_service_stub = config.create_stub( - language_service_pb2.LanguageServiceStub, - channel=channel, - service_path=self.SERVICE_ADDRESS, - service_port=self.DEFAULT_SERVICE_PORT, - credentials=credentials, - scopes=scopes, - ssl_credentials=ssl_credentials) - - self._analyze_sentiment = api_callable.create_api_call( + if channel is not None and credentials is not None: + raise ValueError( + 'channel and credentials arguments to {} are mutually ' + 'exclusive.'.format(self.__class__.__name__)) + + if channel is None: + channel = google.api_core.grpc_helpers.create_channel( + self.SERVICE_ADDRESS, + credentials=credentials, + scopes=self._DEFAULT_SCOPES) + + self.language_service_stub = ( + language_service_pb2.LanguageServiceStub(channel)) + + if client_info is None: + client_info = ( + google.api_core.gapic_v1.client_info.DEFAULT_CLIENT_INFO) + + client_info.gapic_version = _GAPIC_LIBRARY_VERSION + + interface_config = client_config['interfaces'][self._INTERFACE_NAME] + method_configs = google.api_core.gapic_v1.config.parse_method_configs( + interface_config) + + self._analyze_sentiment = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeSentiment, - settings=defaults['analyze_sentiment']) - self._analyze_entities = api_callable.create_api_call( + default_retry=method_configs['AnalyzeSentiment'].retry, + default_timeout=method_configs['AnalyzeSentiment'].timeout, + client_info=client_info) + self._analyze_entities = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeEntities, - settings=defaults['analyze_entities']) - self._analyze_entity_sentiment = api_callable.create_api_call( + default_retry=method_configs['AnalyzeEntities'].retry, + default_timeout=method_configs['AnalyzeEntities'].timeout, + client_info=client_info) + self._analyze_entity_sentiment = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeEntitySentiment, - settings=defaults['analyze_entity_sentiment']) - self._analyze_syntax = api_callable.create_api_call( + default_retry=method_configs['AnalyzeEntitySentiment'].retry, + default_timeout=method_configs['AnalyzeEntitySentiment'].timeout, + client_info=client_info) + self._analyze_syntax = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeSyntax, - settings=defaults['analyze_syntax']) - self._annotate_text = api_callable.create_api_call( + default_retry=method_configs['AnalyzeSyntax'].retry, + default_timeout=method_configs['AnalyzeSyntax'].timeout, + client_info=client_info) + self._classify_text = google.api_core.gapic_v1.method.wrap_method( + self.language_service_stub.ClassifyText, + default_retry=method_configs['ClassifyText'].retry, + default_timeout=method_configs['ClassifyText'].timeout, + client_info=client_info) + self._annotate_text = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnnotateText, - settings=defaults['annotate_text']) + default_retry=method_configs['AnnotateText'].retry, + default_timeout=method_configs['AnnotateText'].timeout, + client_info=client_info) # Service calls - def analyze_sentiment(self, document, encoding_type=None, options=None): + def analyze_sentiment(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Analyzes the sentiment of the provided text. @@ -166,21 +158,32 @@ def analyze_sentiment(self, document, encoding_type=None, options=None): If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1.types.Document` encoding_type (~google.cloud.language_v1.types.EncodingType): The encoding type used by the API to calculate sentence offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1.types.AnalyzeSentimentResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeSentimentRequest( document=document, encoding_type=encoding_type) - return self._analyze_sentiment(request, options) + return self._analyze_sentiment(request, retry=retry, timeout=timeout) - def analyze_entities(self, document, encoding_type=None, options=None): + def analyze_entities(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Finds named entities (currently proper names and common nouns) in the text along with entity types, salience, mentions for each entity, and @@ -200,24 +203,33 @@ def analyze_entities(self, document, encoding_type=None, options=None): If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1.types.Document` encoding_type (~google.cloud.language_v1.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1.types.AnalyzeEntitiesResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeEntitiesRequest( document=document, encoding_type=encoding_type) - return self._analyze_entities(request, options) - - def analyze_entity_sentiment(self, - document, - encoding_type=None, - options=None): + return self._analyze_entities(request, retry=retry, timeout=timeout) + + def analyze_entity_sentiment( + self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Finds entities, similar to ``AnalyzeEntities`` in the text and analyzes sentiment associated with each entity and its mentions. @@ -236,21 +248,33 @@ def analyze_entity_sentiment(self, If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1.types.Document` encoding_type (~google.cloud.language_v1.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1.types.AnalyzeEntitySentimentResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeEntitySentimentRequest( document=document, encoding_type=encoding_type) - return self._analyze_entity_sentiment(request, options) - - def analyze_syntax(self, document, encoding_type=None, options=None): + return self._analyze_entity_sentiment( + request, retry=retry, timeout=timeout) + + def analyze_syntax(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Analyzes the syntax of the text and provides sentence boundaries and tokenization along with part of speech tags, dependency trees, and other @@ -270,25 +294,73 @@ def analyze_syntax(self, document, encoding_type=None, options=None): If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1.types.Document` encoding_type (~google.cloud.language_v1.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1.types.AnalyzeSyntaxResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeSyntaxRequest( document=document, encoding_type=encoding_type) - return self._analyze_syntax(request, options) + return self._analyze_syntax(request, retry=retry, timeout=timeout) + + def classify_text(self, + document, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): + """ + Classifies a document into categories. + + Example: + >>> from google.cloud import language_v1 + >>> + >>> client = language_v1.LanguageServiceClient() + >>> + >>> document = {} + >>> + >>> response = client.classify_text(document) + + Args: + document (Union[dict, ~google.cloud.language_v1.types.Document]): Input document. + If a dict is provided, it must be of the same form as the protobuf + message :class:`~google.cloud.language_v1.types.Document` + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. + + Returns: + A :class:`~google.cloud.language_v1.types.ClassifyTextResponse` instance. + + Raises: + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. + """ + request = language_service_pb2.ClassifyTextRequest(document=document) + return self._classify_text(request, retry=retry, timeout=timeout) def annotate_text(self, document, features, encoding_type=None, - options=None): + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ A convenience method that provides all the features that analyzeSentiment, analyzeEntities, and analyzeSyntax provide in one call. @@ -311,16 +383,23 @@ def annotate_text(self, If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1.types.Features` encoding_type (~google.cloud.language_v1.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1.types.AnnotateTextResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnnotateTextRequest( document=document, features=features, encoding_type=encoding_type) - return self._annotate_text(request, options) + return self._annotate_text(request, retry=retry, timeout=timeout) diff --git a/language/google/cloud/language_v1/gapic/language_service_client_config.py b/language/google/cloud/language_v1/gapic/language_service_client_config.py index 570056c9f581..789883153df0 100644 --- a/language/google/cloud/language_v1/gapic/language_service_client_config.py +++ b/language/google/cloud/language_v1/gapic/language_service_client_config.py @@ -37,6 +37,11 @@ "retry_codes_name": "idempotent", "retry_params_name": "default" }, + "ClassifyText": { + "timeout_millis": 30000, + "retry_codes_name": "idempotent", + "retry_params_name": "default" + }, "AnnotateText": { "timeout_millis": 30000, "retry_codes_name": "idempotent", diff --git a/language/google/cloud/language_v1/proto/language_service_pb2.py b/language/google/cloud/language_v1/proto/language_service_pb2.py index 1ccec7d474d7..0b8bc97d054d 100644 --- a/language/google/cloud/language_v1/proto/language_service_pb2.py +++ b/language/google/cloud/language_v1/proto/language_service_pb2.py @@ -21,7 +21,7 @@ name='google/cloud/language_v1/proto/language_service.proto', package='google.cloud.language.v1', syntax='proto3', - serialized_pb=_b('\n5google/cloud/language_v1/proto/language_service.proto\x12\x18google.cloud.language.v1\x1a\x1cgoogle/api/annotations.proto\"\xc3\x01\n\x08\x44ocument\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.google.cloud.language.v1.Document.Type\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x19\n\x0fgcs_content_uri\x18\x03 \x01(\tH\x00\x12\x10\n\x08language\x18\x04 \x01(\t\"6\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x0e\n\nPLAIN_TEXT\x10\x01\x12\x08\n\x04HTML\x10\x02\x42\x08\n\x06source\"t\n\x08Sentence\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12\x36\n\tsentiment\x18\x02 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\"\xbe\x03\n\x06\x45ntity\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x33\n\x04type\x18\x02 \x01(\x0e\x32%.google.cloud.language.v1.Entity.Type\x12@\n\x08metadata\x18\x03 \x03(\x0b\x32..google.cloud.language.v1.Entity.MetadataEntry\x12\x10\n\x08salience\x18\x04 \x01(\x02\x12\x39\n\x08mentions\x18\x05 \x03(\x0b\x32\'.google.cloud.language.v1.EntityMention\x12\x36\n\tsentiment\x18\x06 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"y\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06PERSON\x10\x01\x12\x0c\n\x08LOCATION\x10\x02\x12\x10\n\x0cORGANIZATION\x10\x03\x12\t\n\x05\x45VENT\x10\x04\x12\x0f\n\x0bWORK_OF_ART\x10\x05\x12\x11\n\rCONSUMER_GOOD\x10\x06\x12\t\n\x05OTHER\x10\x07\"\xcb\x01\n\x05Token\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12>\n\x0epart_of_speech\x18\x02 \x01(\x0b\x32&.google.cloud.language.v1.PartOfSpeech\x12\x41\n\x0f\x64\x65pendency_edge\x18\x03 \x01(\x0b\x32(.google.cloud.language.v1.DependencyEdge\x12\r\n\x05lemma\x18\x04 \x01(\t\"-\n\tSentiment\x12\x11\n\tmagnitude\x18\x02 \x01(\x02\x12\r\n\x05score\x18\x03 \x01(\x02\"\xa3\x10\n\x0cPartOfSpeech\x12\x37\n\x03tag\x18\x01 \x01(\x0e\x32*.google.cloud.language.v1.PartOfSpeech.Tag\x12=\n\x06\x61spect\x18\x02 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Aspect\x12\x39\n\x04\x63\x61se\x18\x03 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Case\x12\x39\n\x04\x66orm\x18\x04 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Form\x12=\n\x06gender\x18\x05 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Gender\x12\x39\n\x04mood\x18\x06 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Mood\x12=\n\x06number\x18\x07 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Number\x12=\n\x06person\x18\x08 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Person\x12=\n\x06proper\x18\t \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Proper\x12G\n\x0breciprocity\x18\n \x01(\x0e\x32\x32.google.cloud.language.v1.PartOfSpeech.Reciprocity\x12;\n\x05tense\x18\x0b \x01(\x0e\x32,.google.cloud.language.v1.PartOfSpeech.Tense\x12;\n\x05voice\x18\x0c \x01(\x0e\x32,.google.cloud.language.v1.PartOfSpeech.Voice\"\x8d\x01\n\x03Tag\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03\x41\x44J\x10\x01\x12\x07\n\x03\x41\x44P\x10\x02\x12\x07\n\x03\x41\x44V\x10\x03\x12\x08\n\x04\x43ONJ\x10\x04\x12\x07\n\x03\x44\x45T\x10\x05\x12\x08\n\x04NOUN\x10\x06\x12\x07\n\x03NUM\x10\x07\x12\x08\n\x04PRON\x10\x08\x12\x07\n\x03PRT\x10\t\x12\t\n\x05PUNCT\x10\n\x12\x08\n\x04VERB\x10\x0b\x12\x05\n\x01X\x10\x0c\x12\t\n\x05\x41\x46\x46IX\x10\r\"O\n\x06\x41spect\x12\x12\n\x0e\x41SPECT_UNKNOWN\x10\x00\x12\x0e\n\nPERFECTIVE\x10\x01\x12\x10\n\x0cIMPERFECTIVE\x10\x02\x12\x0f\n\x0bPROGRESSIVE\x10\x03\"\xf8\x01\n\x04\x43\x61se\x12\x10\n\x0c\x43\x41SE_UNKNOWN\x10\x00\x12\x0e\n\nACCUSATIVE\x10\x01\x12\r\n\tADVERBIAL\x10\x02\x12\x11\n\rCOMPLEMENTIVE\x10\x03\x12\n\n\x06\x44\x41TIVE\x10\x04\x12\x0c\n\x08GENITIVE\x10\x05\x12\x10\n\x0cINSTRUMENTAL\x10\x06\x12\x0c\n\x08LOCATIVE\x10\x07\x12\x0e\n\nNOMINATIVE\x10\x08\x12\x0b\n\x07OBLIQUE\x10\t\x12\r\n\tPARTITIVE\x10\n\x12\x11\n\rPREPOSITIONAL\x10\x0b\x12\x12\n\x0eREFLEXIVE_CASE\x10\x0c\x12\x11\n\rRELATIVE_CASE\x10\r\x12\x0c\n\x08VOCATIVE\x10\x0e\"\xaf\x01\n\x04\x46orm\x12\x10\n\x0c\x46ORM_UNKNOWN\x10\x00\x12\x0c\n\x08\x41\x44NOMIAL\x10\x01\x12\r\n\tAUXILIARY\x10\x02\x12\x12\n\x0e\x43OMPLEMENTIZER\x10\x03\x12\x10\n\x0c\x46INAL_ENDING\x10\x04\x12\n\n\x06GERUND\x10\x05\x12\n\n\x06REALIS\x10\x06\x12\x0c\n\x08IRREALIS\x10\x07\x12\t\n\x05SHORT\x10\x08\x12\x08\n\x04LONG\x10\t\x12\t\n\x05ORDER\x10\n\x12\x0c\n\x08SPECIFIC\x10\x0b\"E\n\x06Gender\x12\x12\n\x0eGENDER_UNKNOWN\x10\x00\x12\x0c\n\x08\x46\x45MININE\x10\x01\x12\r\n\tMASCULINE\x10\x02\x12\n\n\x06NEUTER\x10\x03\"\x7f\n\x04Mood\x12\x10\n\x0cMOOD_UNKNOWN\x10\x00\x12\x14\n\x10\x43ONDITIONAL_MOOD\x10\x01\x12\x0e\n\nIMPERATIVE\x10\x02\x12\x0e\n\nINDICATIVE\x10\x03\x12\x11\n\rINTERROGATIVE\x10\x04\x12\x0b\n\x07JUSSIVE\x10\x05\x12\x0f\n\x0bSUBJUNCTIVE\x10\x06\"@\n\x06Number\x12\x12\n\x0eNUMBER_UNKNOWN\x10\x00\x12\x0c\n\x08SINGULAR\x10\x01\x12\n\n\x06PLURAL\x10\x02\x12\x08\n\x04\x44UAL\x10\x03\"T\n\x06Person\x12\x12\n\x0ePERSON_UNKNOWN\x10\x00\x12\t\n\x05\x46IRST\x10\x01\x12\n\n\x06SECOND\x10\x02\x12\t\n\x05THIRD\x10\x03\x12\x14\n\x10REFLEXIVE_PERSON\x10\x04\"8\n\x06Proper\x12\x12\n\x0ePROPER_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\x0e\n\nNOT_PROPER\x10\x02\"J\n\x0bReciprocity\x12\x17\n\x13RECIPROCITY_UNKNOWN\x10\x00\x12\x0e\n\nRECIPROCAL\x10\x01\x12\x12\n\x0eNON_RECIPROCAL\x10\x02\"s\n\x05Tense\x12\x11\n\rTENSE_UNKNOWN\x10\x00\x12\x15\n\x11\x43ONDITIONAL_TENSE\x10\x01\x12\n\n\x06\x46UTURE\x10\x02\x12\x08\n\x04PAST\x10\x03\x12\x0b\n\x07PRESENT\x10\x04\x12\r\n\tIMPERFECT\x10\x05\x12\x0e\n\nPLUPERFECT\x10\x06\"B\n\x05Voice\x12\x11\n\rVOICE_UNKNOWN\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\r\n\tCAUSATIVE\x10\x02\x12\x0b\n\x07PASSIVE\x10\x03\"\x95\x08\n\x0e\x44\x65pendencyEdge\x12\x18\n\x10head_token_index\x18\x01 \x01(\x05\x12=\n\x05label\x18\x02 \x01(\x0e\x32..google.cloud.language.v1.DependencyEdge.Label\"\xa9\x07\n\x05Label\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x41\x42\x42REV\x10\x01\x12\t\n\x05\x41\x43OMP\x10\x02\x12\t\n\x05\x41\x44VCL\x10\x03\x12\n\n\x06\x41\x44VMOD\x10\x04\x12\x08\n\x04\x41MOD\x10\x05\x12\t\n\x05\x41PPOS\x10\x06\x12\x08\n\x04\x41TTR\x10\x07\x12\x07\n\x03\x41UX\x10\x08\x12\x0b\n\x07\x41UXPASS\x10\t\x12\x06\n\x02\x43\x43\x10\n\x12\t\n\x05\x43\x43OMP\x10\x0b\x12\x08\n\x04\x43ONJ\x10\x0c\x12\t\n\x05\x43SUBJ\x10\r\x12\r\n\tCSUBJPASS\x10\x0e\x12\x07\n\x03\x44\x45P\x10\x0f\x12\x07\n\x03\x44\x45T\x10\x10\x12\r\n\tDISCOURSE\x10\x11\x12\x08\n\x04\x44OBJ\x10\x12\x12\x08\n\x04\x45XPL\x10\x13\x12\x0c\n\x08GOESWITH\x10\x14\x12\x08\n\x04IOBJ\x10\x15\x12\x08\n\x04MARK\x10\x16\x12\x07\n\x03MWE\x10\x17\x12\x07\n\x03MWV\x10\x18\x12\x07\n\x03NEG\x10\x19\x12\x06\n\x02NN\x10\x1a\x12\x0c\n\x08NPADVMOD\x10\x1b\x12\t\n\x05NSUBJ\x10\x1c\x12\r\n\tNSUBJPASS\x10\x1d\x12\x07\n\x03NUM\x10\x1e\x12\n\n\x06NUMBER\x10\x1f\x12\x05\n\x01P\x10 \x12\r\n\tPARATAXIS\x10!\x12\x0b\n\x07PARTMOD\x10\"\x12\t\n\x05PCOMP\x10#\x12\x08\n\x04POBJ\x10$\x12\x08\n\x04POSS\x10%\x12\x0b\n\x07POSTNEG\x10&\x12\x0b\n\x07PRECOMP\x10\'\x12\x0b\n\x07PRECONJ\x10(\x12\n\n\x06PREDET\x10)\x12\x08\n\x04PREF\x10*\x12\x08\n\x04PREP\x10+\x12\t\n\x05PRONL\x10,\x12\x07\n\x03PRT\x10-\x12\x06\n\x02PS\x10.\x12\x0c\n\x08QUANTMOD\x10/\x12\t\n\x05RCMOD\x10\x30\x12\x0c\n\x08RCMODREL\x10\x31\x12\t\n\x05RDROP\x10\x32\x12\x07\n\x03REF\x10\x33\x12\x0b\n\x07REMNANT\x10\x34\x12\x0e\n\nREPARANDUM\x10\x35\x12\x08\n\x04ROOT\x10\x36\x12\x08\n\x04SNUM\x10\x37\x12\x08\n\x04SUFF\x10\x38\x12\x08\n\x04TMOD\x10\x39\x12\t\n\x05TOPIC\x10:\x12\x08\n\x04VMOD\x10;\x12\x0c\n\x08VOCATIVE\x10<\x12\t\n\x05XCOMP\x10=\x12\n\n\x06SUFFIX\x10>\x12\t\n\x05TITLE\x10?\x12\x0c\n\x08\x41\x44VPHMOD\x10@\x12\x0b\n\x07\x41UXCAUS\x10\x41\x12\t\n\x05\x41UXVV\x10\x42\x12\t\n\x05\x44TMOD\x10\x43\x12\x0b\n\x07\x46OREIGN\x10\x44\x12\x06\n\x02KW\x10\x45\x12\x08\n\x04LIST\x10\x46\x12\x08\n\x04NOMC\x10G\x12\x0c\n\x08NOMCSUBJ\x10H\x12\x10\n\x0cNOMCSUBJPASS\x10I\x12\x08\n\x04NUMC\x10J\x12\x07\n\x03\x43OP\x10K\x12\x0e\n\nDISLOCATED\x10L\x12\x07\n\x03\x41SP\x10M\x12\x08\n\x04GMOD\x10N\x12\x08\n\x04GOBJ\x10O\x12\n\n\x06INFMOD\x10P\x12\x07\n\x03MES\x10Q\x12\t\n\x05NCOMP\x10R\"\xe7\x01\n\rEntityMention\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.google.cloud.language.v1.EntityMention.Type\x12\x36\n\tsentiment\x18\x03 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\"0\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\n\n\x06\x43OMMON\x10\x02\"1\n\x08TextSpan\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x14\n\x0c\x62\x65gin_offset\x18\x02 \x01(\x05\"\x8e\x01\n\x17\x41nalyzeSentimentRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"\xa4\x01\n\x18\x41nalyzeSentimentResponse\x12?\n\x12\x64ocument_sentiment\x18\x01 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x12\x10\n\x08language\x18\x02 \x01(\t\x12\x35\n\tsentences\x18\x03 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\"\x94\x01\n\x1d\x41nalyzeEntitySentimentRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"f\n\x1e\x41nalyzeEntitySentimentResponse\x12\x32\n\x08\x65ntities\x18\x01 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x8d\x01\n\x16\x41nalyzeEntitiesRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"_\n\x17\x41nalyzeEntitiesResponse\x12\x32\n\x08\x65ntities\x18\x01 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x8b\x01\n\x14\x41nalyzeSyntaxRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"\x91\x01\n\x15\x41nalyzeSyntaxResponse\x12\x35\n\tsentences\x18\x01 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\x12/\n\x06tokens\x18\x02 \x03(\x0b\x32\x1f.google.cloud.language.v1.Token\x12\x10\n\x08language\x18\x03 \x01(\t\"\xd9\x02\n\x13\x41nnotateTextRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12H\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x36.google.cloud.language.v1.AnnotateTextRequest.Features\x12=\n\rencoding_type\x18\x03 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\x1a\x82\x01\n\x08\x46\x65\x61tures\x12\x16\n\x0e\x65xtract_syntax\x18\x01 \x01(\x08\x12\x18\n\x10\x65xtract_entities\x18\x02 \x01(\x08\x12\"\n\x1a\x65xtract_document_sentiment\x18\x03 \x01(\x08\x12 \n\x18\x65xtract_entity_sentiment\x18\x04 \x01(\x08\"\x85\x02\n\x14\x41nnotateTextResponse\x12\x35\n\tsentences\x18\x01 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\x12/\n\x06tokens\x18\x02 \x03(\x0b\x32\x1f.google.cloud.language.v1.Token\x12\x32\n\x08\x65ntities\x18\x03 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12?\n\x12\x64ocument_sentiment\x18\x04 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x12\x10\n\x08language\x18\x05 \x01(\t*8\n\x0c\x45ncodingType\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04UTF8\x10\x01\x12\t\n\x05UTF16\x10\x02\x12\t\n\x05UTF32\x10\x03\x32\xcc\x06\n\x0fLanguageService\x12\xa4\x01\n\x10\x41nalyzeSentiment\x12\x31.google.cloud.language.v1.AnalyzeSentimentRequest\x1a\x32.google.cloud.language.v1.AnalyzeSentimentResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/documents:analyzeSentiment:\x01*\x12\xa0\x01\n\x0f\x41nalyzeEntities\x12\x30.google.cloud.language.v1.AnalyzeEntitiesRequest\x1a\x31.google.cloud.language.v1.AnalyzeEntitiesResponse\"(\x82\xd3\xe4\x93\x02\"\"\x1d/v1/documents:analyzeEntities:\x01*\x12\xbc\x01\n\x16\x41nalyzeEntitySentiment\x12\x37.google.cloud.language.v1.AnalyzeEntitySentimentRequest\x1a\x38.google.cloud.language.v1.AnalyzeEntitySentimentResponse\"/\x82\xd3\xe4\x93\x02)\"$/v1/documents:analyzeEntitySentiment:\x01*\x12\x98\x01\n\rAnalyzeSyntax\x12..google.cloud.language.v1.AnalyzeSyntaxRequest\x1a/.google.cloud.language.v1.AnalyzeSyntaxResponse\"&\x82\xd3\xe4\x93\x02 \"\x1b/v1/documents:analyzeSyntax:\x01*\x12\x94\x01\n\x0c\x41nnotateText\x12-.google.cloud.language.v1.AnnotateTextRequest\x1a..google.cloud.language.v1.AnnotateTextResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/documents:annotateText:\x01*Bx\n\x1c\x63om.google.cloud.language.v1B\x14LanguageServiceProtoP\x01Z@google.golang.org/genproto/googleapis/cloud/language/v1;languageb\x06proto3') + serialized_pb=_b('\n5google/cloud/language_v1/proto/language_service.proto\x12\x18google.cloud.language.v1\x1a\x1cgoogle/api/annotations.proto\"\xc3\x01\n\x08\x44ocument\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.google.cloud.language.v1.Document.Type\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x19\n\x0fgcs_content_uri\x18\x03 \x01(\tH\x00\x12\x10\n\x08language\x18\x04 \x01(\t\"6\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x0e\n\nPLAIN_TEXT\x10\x01\x12\x08\n\x04HTML\x10\x02\x42\x08\n\x06source\"t\n\x08Sentence\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12\x36\n\tsentiment\x18\x02 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\"\xbe\x03\n\x06\x45ntity\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x33\n\x04type\x18\x02 \x01(\x0e\x32%.google.cloud.language.v1.Entity.Type\x12@\n\x08metadata\x18\x03 \x03(\x0b\x32..google.cloud.language.v1.Entity.MetadataEntry\x12\x10\n\x08salience\x18\x04 \x01(\x02\x12\x39\n\x08mentions\x18\x05 \x03(\x0b\x32\'.google.cloud.language.v1.EntityMention\x12\x36\n\tsentiment\x18\x06 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"y\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06PERSON\x10\x01\x12\x0c\n\x08LOCATION\x10\x02\x12\x10\n\x0cORGANIZATION\x10\x03\x12\t\n\x05\x45VENT\x10\x04\x12\x0f\n\x0bWORK_OF_ART\x10\x05\x12\x11\n\rCONSUMER_GOOD\x10\x06\x12\t\n\x05OTHER\x10\x07\"\xcb\x01\n\x05Token\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12>\n\x0epart_of_speech\x18\x02 \x01(\x0b\x32&.google.cloud.language.v1.PartOfSpeech\x12\x41\n\x0f\x64\x65pendency_edge\x18\x03 \x01(\x0b\x32(.google.cloud.language.v1.DependencyEdge\x12\r\n\x05lemma\x18\x04 \x01(\t\"-\n\tSentiment\x12\x11\n\tmagnitude\x18\x02 \x01(\x02\x12\r\n\x05score\x18\x03 \x01(\x02\"\xa3\x10\n\x0cPartOfSpeech\x12\x37\n\x03tag\x18\x01 \x01(\x0e\x32*.google.cloud.language.v1.PartOfSpeech.Tag\x12=\n\x06\x61spect\x18\x02 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Aspect\x12\x39\n\x04\x63\x61se\x18\x03 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Case\x12\x39\n\x04\x66orm\x18\x04 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Form\x12=\n\x06gender\x18\x05 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Gender\x12\x39\n\x04mood\x18\x06 \x01(\x0e\x32+.google.cloud.language.v1.PartOfSpeech.Mood\x12=\n\x06number\x18\x07 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Number\x12=\n\x06person\x18\x08 \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Person\x12=\n\x06proper\x18\t \x01(\x0e\x32-.google.cloud.language.v1.PartOfSpeech.Proper\x12G\n\x0breciprocity\x18\n \x01(\x0e\x32\x32.google.cloud.language.v1.PartOfSpeech.Reciprocity\x12;\n\x05tense\x18\x0b \x01(\x0e\x32,.google.cloud.language.v1.PartOfSpeech.Tense\x12;\n\x05voice\x18\x0c \x01(\x0e\x32,.google.cloud.language.v1.PartOfSpeech.Voice\"\x8d\x01\n\x03Tag\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03\x41\x44J\x10\x01\x12\x07\n\x03\x41\x44P\x10\x02\x12\x07\n\x03\x41\x44V\x10\x03\x12\x08\n\x04\x43ONJ\x10\x04\x12\x07\n\x03\x44\x45T\x10\x05\x12\x08\n\x04NOUN\x10\x06\x12\x07\n\x03NUM\x10\x07\x12\x08\n\x04PRON\x10\x08\x12\x07\n\x03PRT\x10\t\x12\t\n\x05PUNCT\x10\n\x12\x08\n\x04VERB\x10\x0b\x12\x05\n\x01X\x10\x0c\x12\t\n\x05\x41\x46\x46IX\x10\r\"O\n\x06\x41spect\x12\x12\n\x0e\x41SPECT_UNKNOWN\x10\x00\x12\x0e\n\nPERFECTIVE\x10\x01\x12\x10\n\x0cIMPERFECTIVE\x10\x02\x12\x0f\n\x0bPROGRESSIVE\x10\x03\"\xf8\x01\n\x04\x43\x61se\x12\x10\n\x0c\x43\x41SE_UNKNOWN\x10\x00\x12\x0e\n\nACCUSATIVE\x10\x01\x12\r\n\tADVERBIAL\x10\x02\x12\x11\n\rCOMPLEMENTIVE\x10\x03\x12\n\n\x06\x44\x41TIVE\x10\x04\x12\x0c\n\x08GENITIVE\x10\x05\x12\x10\n\x0cINSTRUMENTAL\x10\x06\x12\x0c\n\x08LOCATIVE\x10\x07\x12\x0e\n\nNOMINATIVE\x10\x08\x12\x0b\n\x07OBLIQUE\x10\t\x12\r\n\tPARTITIVE\x10\n\x12\x11\n\rPREPOSITIONAL\x10\x0b\x12\x12\n\x0eREFLEXIVE_CASE\x10\x0c\x12\x11\n\rRELATIVE_CASE\x10\r\x12\x0c\n\x08VOCATIVE\x10\x0e\"\xaf\x01\n\x04\x46orm\x12\x10\n\x0c\x46ORM_UNKNOWN\x10\x00\x12\x0c\n\x08\x41\x44NOMIAL\x10\x01\x12\r\n\tAUXILIARY\x10\x02\x12\x12\n\x0e\x43OMPLEMENTIZER\x10\x03\x12\x10\n\x0c\x46INAL_ENDING\x10\x04\x12\n\n\x06GERUND\x10\x05\x12\n\n\x06REALIS\x10\x06\x12\x0c\n\x08IRREALIS\x10\x07\x12\t\n\x05SHORT\x10\x08\x12\x08\n\x04LONG\x10\t\x12\t\n\x05ORDER\x10\n\x12\x0c\n\x08SPECIFIC\x10\x0b\"E\n\x06Gender\x12\x12\n\x0eGENDER_UNKNOWN\x10\x00\x12\x0c\n\x08\x46\x45MININE\x10\x01\x12\r\n\tMASCULINE\x10\x02\x12\n\n\x06NEUTER\x10\x03\"\x7f\n\x04Mood\x12\x10\n\x0cMOOD_UNKNOWN\x10\x00\x12\x14\n\x10\x43ONDITIONAL_MOOD\x10\x01\x12\x0e\n\nIMPERATIVE\x10\x02\x12\x0e\n\nINDICATIVE\x10\x03\x12\x11\n\rINTERROGATIVE\x10\x04\x12\x0b\n\x07JUSSIVE\x10\x05\x12\x0f\n\x0bSUBJUNCTIVE\x10\x06\"@\n\x06Number\x12\x12\n\x0eNUMBER_UNKNOWN\x10\x00\x12\x0c\n\x08SINGULAR\x10\x01\x12\n\n\x06PLURAL\x10\x02\x12\x08\n\x04\x44UAL\x10\x03\"T\n\x06Person\x12\x12\n\x0ePERSON_UNKNOWN\x10\x00\x12\t\n\x05\x46IRST\x10\x01\x12\n\n\x06SECOND\x10\x02\x12\t\n\x05THIRD\x10\x03\x12\x14\n\x10REFLEXIVE_PERSON\x10\x04\"8\n\x06Proper\x12\x12\n\x0ePROPER_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\x0e\n\nNOT_PROPER\x10\x02\"J\n\x0bReciprocity\x12\x17\n\x13RECIPROCITY_UNKNOWN\x10\x00\x12\x0e\n\nRECIPROCAL\x10\x01\x12\x12\n\x0eNON_RECIPROCAL\x10\x02\"s\n\x05Tense\x12\x11\n\rTENSE_UNKNOWN\x10\x00\x12\x15\n\x11\x43ONDITIONAL_TENSE\x10\x01\x12\n\n\x06\x46UTURE\x10\x02\x12\x08\n\x04PAST\x10\x03\x12\x0b\n\x07PRESENT\x10\x04\x12\r\n\tIMPERFECT\x10\x05\x12\x0e\n\nPLUPERFECT\x10\x06\"B\n\x05Voice\x12\x11\n\rVOICE_UNKNOWN\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\r\n\tCAUSATIVE\x10\x02\x12\x0b\n\x07PASSIVE\x10\x03\"\x95\x08\n\x0e\x44\x65pendencyEdge\x12\x18\n\x10head_token_index\x18\x01 \x01(\x05\x12=\n\x05label\x18\x02 \x01(\x0e\x32..google.cloud.language.v1.DependencyEdge.Label\"\xa9\x07\n\x05Label\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x41\x42\x42REV\x10\x01\x12\t\n\x05\x41\x43OMP\x10\x02\x12\t\n\x05\x41\x44VCL\x10\x03\x12\n\n\x06\x41\x44VMOD\x10\x04\x12\x08\n\x04\x41MOD\x10\x05\x12\t\n\x05\x41PPOS\x10\x06\x12\x08\n\x04\x41TTR\x10\x07\x12\x07\n\x03\x41UX\x10\x08\x12\x0b\n\x07\x41UXPASS\x10\t\x12\x06\n\x02\x43\x43\x10\n\x12\t\n\x05\x43\x43OMP\x10\x0b\x12\x08\n\x04\x43ONJ\x10\x0c\x12\t\n\x05\x43SUBJ\x10\r\x12\r\n\tCSUBJPASS\x10\x0e\x12\x07\n\x03\x44\x45P\x10\x0f\x12\x07\n\x03\x44\x45T\x10\x10\x12\r\n\tDISCOURSE\x10\x11\x12\x08\n\x04\x44OBJ\x10\x12\x12\x08\n\x04\x45XPL\x10\x13\x12\x0c\n\x08GOESWITH\x10\x14\x12\x08\n\x04IOBJ\x10\x15\x12\x08\n\x04MARK\x10\x16\x12\x07\n\x03MWE\x10\x17\x12\x07\n\x03MWV\x10\x18\x12\x07\n\x03NEG\x10\x19\x12\x06\n\x02NN\x10\x1a\x12\x0c\n\x08NPADVMOD\x10\x1b\x12\t\n\x05NSUBJ\x10\x1c\x12\r\n\tNSUBJPASS\x10\x1d\x12\x07\n\x03NUM\x10\x1e\x12\n\n\x06NUMBER\x10\x1f\x12\x05\n\x01P\x10 \x12\r\n\tPARATAXIS\x10!\x12\x0b\n\x07PARTMOD\x10\"\x12\t\n\x05PCOMP\x10#\x12\x08\n\x04POBJ\x10$\x12\x08\n\x04POSS\x10%\x12\x0b\n\x07POSTNEG\x10&\x12\x0b\n\x07PRECOMP\x10\'\x12\x0b\n\x07PRECONJ\x10(\x12\n\n\x06PREDET\x10)\x12\x08\n\x04PREF\x10*\x12\x08\n\x04PREP\x10+\x12\t\n\x05PRONL\x10,\x12\x07\n\x03PRT\x10-\x12\x06\n\x02PS\x10.\x12\x0c\n\x08QUANTMOD\x10/\x12\t\n\x05RCMOD\x10\x30\x12\x0c\n\x08RCMODREL\x10\x31\x12\t\n\x05RDROP\x10\x32\x12\x07\n\x03REF\x10\x33\x12\x0b\n\x07REMNANT\x10\x34\x12\x0e\n\nREPARANDUM\x10\x35\x12\x08\n\x04ROOT\x10\x36\x12\x08\n\x04SNUM\x10\x37\x12\x08\n\x04SUFF\x10\x38\x12\x08\n\x04TMOD\x10\x39\x12\t\n\x05TOPIC\x10:\x12\x08\n\x04VMOD\x10;\x12\x0c\n\x08VOCATIVE\x10<\x12\t\n\x05XCOMP\x10=\x12\n\n\x06SUFFIX\x10>\x12\t\n\x05TITLE\x10?\x12\x0c\n\x08\x41\x44VPHMOD\x10@\x12\x0b\n\x07\x41UXCAUS\x10\x41\x12\t\n\x05\x41UXVV\x10\x42\x12\t\n\x05\x44TMOD\x10\x43\x12\x0b\n\x07\x46OREIGN\x10\x44\x12\x06\n\x02KW\x10\x45\x12\x08\n\x04LIST\x10\x46\x12\x08\n\x04NOMC\x10G\x12\x0c\n\x08NOMCSUBJ\x10H\x12\x10\n\x0cNOMCSUBJPASS\x10I\x12\x08\n\x04NUMC\x10J\x12\x07\n\x03\x43OP\x10K\x12\x0e\n\nDISLOCATED\x10L\x12\x07\n\x03\x41SP\x10M\x12\x08\n\x04GMOD\x10N\x12\x08\n\x04GOBJ\x10O\x12\n\n\x06INFMOD\x10P\x12\x07\n\x03MES\x10Q\x12\t\n\x05NCOMP\x10R\"\xe7\x01\n\rEntityMention\x12\x30\n\x04text\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.TextSpan\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.google.cloud.language.v1.EntityMention.Type\x12\x36\n\tsentiment\x18\x03 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\"0\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\n\n\x06\x43OMMON\x10\x02\"1\n\x08TextSpan\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x14\n\x0c\x62\x65gin_offset\x18\x02 \x01(\x05\":\n\x16\x43lassificationCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nconfidence\x18\x02 \x01(\x02\"\x8e\x01\n\x17\x41nalyzeSentimentRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"\xa4\x01\n\x18\x41nalyzeSentimentResponse\x12?\n\x12\x64ocument_sentiment\x18\x01 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x12\x10\n\x08language\x18\x02 \x01(\t\x12\x35\n\tsentences\x18\x03 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\"\x94\x01\n\x1d\x41nalyzeEntitySentimentRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"f\n\x1e\x41nalyzeEntitySentimentResponse\x12\x32\n\x08\x65ntities\x18\x01 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x8d\x01\n\x16\x41nalyzeEntitiesRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"_\n\x17\x41nalyzeEntitiesResponse\x12\x32\n\x08\x65ntities\x18\x01 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x8b\x01\n\x14\x41nalyzeSyntaxRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12=\n\rencoding_type\x18\x02 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\"\x91\x01\n\x15\x41nalyzeSyntaxResponse\x12\x35\n\tsentences\x18\x01 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\x12/\n\x06tokens\x18\x02 \x03(\x0b\x32\x1f.google.cloud.language.v1.Token\x12\x10\n\x08language\x18\x03 \x01(\t\"K\n\x13\x43lassifyTextRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\"\\\n\x14\x43lassifyTextResponse\x12\x44\n\ncategories\x18\x01 \x03(\x0b\x32\x30.google.cloud.language.v1.ClassificationCategory\"\xf0\x02\n\x13\x41nnotateTextRequest\x12\x34\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\".google.cloud.language.v1.Document\x12H\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x36.google.cloud.language.v1.AnnotateTextRequest.Features\x12=\n\rencoding_type\x18\x03 \x01(\x0e\x32&.google.cloud.language.v1.EncodingType\x1a\x99\x01\n\x08\x46\x65\x61tures\x12\x16\n\x0e\x65xtract_syntax\x18\x01 \x01(\x08\x12\x18\n\x10\x65xtract_entities\x18\x02 \x01(\x08\x12\"\n\x1a\x65xtract_document_sentiment\x18\x03 \x01(\x08\x12 \n\x18\x65xtract_entity_sentiment\x18\x04 \x01(\x08\x12\x15\n\rclassify_text\x18\x06 \x01(\x08\"\xcb\x02\n\x14\x41nnotateTextResponse\x12\x35\n\tsentences\x18\x01 \x03(\x0b\x32\".google.cloud.language.v1.Sentence\x12/\n\x06tokens\x18\x02 \x03(\x0b\x32\x1f.google.cloud.language.v1.Token\x12\x32\n\x08\x65ntities\x18\x03 \x03(\x0b\x32 .google.cloud.language.v1.Entity\x12?\n\x12\x64ocument_sentiment\x18\x04 \x01(\x0b\x32#.google.cloud.language.v1.Sentiment\x12\x10\n\x08language\x18\x05 \x01(\t\x12\x44\n\ncategories\x18\x06 \x03(\x0b\x32\x30.google.cloud.language.v1.ClassificationCategory*8\n\x0c\x45ncodingType\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04UTF8\x10\x01\x12\t\n\x05UTF16\x10\x02\x12\t\n\x05UTF32\x10\x03\x32\xe3\x07\n\x0fLanguageService\x12\xa4\x01\n\x10\x41nalyzeSentiment\x12\x31.google.cloud.language.v1.AnalyzeSentimentRequest\x1a\x32.google.cloud.language.v1.AnalyzeSentimentResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/documents:analyzeSentiment:\x01*\x12\xa0\x01\n\x0f\x41nalyzeEntities\x12\x30.google.cloud.language.v1.AnalyzeEntitiesRequest\x1a\x31.google.cloud.language.v1.AnalyzeEntitiesResponse\"(\x82\xd3\xe4\x93\x02\"\"\x1d/v1/documents:analyzeEntities:\x01*\x12\xbc\x01\n\x16\x41nalyzeEntitySentiment\x12\x37.google.cloud.language.v1.AnalyzeEntitySentimentRequest\x1a\x38.google.cloud.language.v1.AnalyzeEntitySentimentResponse\"/\x82\xd3\xe4\x93\x02)\"$/v1/documents:analyzeEntitySentiment:\x01*\x12\x98\x01\n\rAnalyzeSyntax\x12..google.cloud.language.v1.AnalyzeSyntaxRequest\x1a/.google.cloud.language.v1.AnalyzeSyntaxResponse\"&\x82\xd3\xe4\x93\x02 \"\x1b/v1/documents:analyzeSyntax:\x01*\x12\x94\x01\n\x0c\x43lassifyText\x12-.google.cloud.language.v1.ClassifyTextRequest\x1a..google.cloud.language.v1.ClassifyTextResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/documents:classifyText:\x01*\x12\x94\x01\n\x0c\x41nnotateText\x12-.google.cloud.language.v1.AnnotateTextRequest\x1a..google.cloud.language.v1.AnnotateTextResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/documents:annotateText:\x01*Bx\n\x1c\x63om.google.cloud.language.v1B\x14LanguageServiceProtoP\x01Z@google.golang.org/genproto/googleapis/cloud/language/v1;languageb\x06proto3') , dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) @@ -50,8 +50,8 @@ ], containing_type=None, options=None, - serialized_start=6260, - serialized_end=6316, + serialized_start=6584, + serialized_end=6640, ) _sym_db.RegisterEnumDescriptor(_ENCODINGTYPE) @@ -1534,6 +1534,44 @@ ) +_CLASSIFICATIONCATEGORY = _descriptor.Descriptor( + name='ClassificationCategory', + full_name='google.cloud.language.v1.ClassificationCategory', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.cloud.language.v1.ClassificationCategory.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='confidence', full_name='google.cloud.language.v1.ClassificationCategory.confidence', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4550, + serialized_end=4608, +) + + _ANALYZESENTIMENTREQUEST = _descriptor.Descriptor( name='AnalyzeSentimentRequest', full_name='google.cloud.language.v1.AnalyzeSentimentRequest', @@ -1567,8 +1605,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4551, - serialized_end=4693, + serialized_start=4611, + serialized_end=4753, ) @@ -1612,8 +1650,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4696, - serialized_end=4860, + serialized_start=4756, + serialized_end=4920, ) @@ -1650,8 +1688,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4863, - serialized_end=5011, + serialized_start=4923, + serialized_end=5071, ) @@ -1688,8 +1726,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5013, - serialized_end=5115, + serialized_start=5073, + serialized_end=5175, ) @@ -1726,8 +1764,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5118, - serialized_end=5259, + serialized_start=5178, + serialized_end=5319, ) @@ -1764,8 +1802,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5261, - serialized_end=5356, + serialized_start=5321, + serialized_end=5416, ) @@ -1802,8 +1840,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5359, - serialized_end=5498, + serialized_start=5419, + serialized_end=5558, ) @@ -1847,8 +1885,70 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5501, - serialized_end=5646, + serialized_start=5561, + serialized_end=5706, +) + + +_CLASSIFYTEXTREQUEST = _descriptor.Descriptor( + name='ClassifyTextRequest', + full_name='google.cloud.language.v1.ClassifyTextRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='document', full_name='google.cloud.language.v1.ClassifyTextRequest.document', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5708, + serialized_end=5783, +) + + +_CLASSIFYTEXTRESPONSE = _descriptor.Descriptor( + name='ClassifyTextResponse', + full_name='google.cloud.language.v1.ClassifyTextResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='categories', full_name='google.cloud.language.v1.ClassifyTextResponse.categories', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5785, + serialized_end=5877, ) @@ -1887,6 +1987,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='classify_text', full_name='google.cloud.language.v1.AnnotateTextRequest.Features.classify_text', index=4, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1899,8 +2006,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5864, - serialized_end=5994, + serialized_start=6095, + serialized_end=6248, ) _ANNOTATETEXTREQUEST = _descriptor.Descriptor( @@ -1943,8 +2050,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5649, - serialized_end=5994, + serialized_start=5880, + serialized_end=6248, ) @@ -1990,6 +2097,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='categories', full_name='google.cloud.language.v1.AnnotateTextResponse.categories', index=5, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -2002,8 +2116,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5997, - serialized_end=6258, + serialized_start=6251, + serialized_end=6582, ) _DOCUMENT.fields_by_name['type'].enum_type = _DOCUMENT_TYPE @@ -2069,6 +2183,8 @@ _ANALYZESYNTAXREQUEST.fields_by_name['encoding_type'].enum_type = _ENCODINGTYPE _ANALYZESYNTAXRESPONSE.fields_by_name['sentences'].message_type = _SENTENCE _ANALYZESYNTAXRESPONSE.fields_by_name['tokens'].message_type = _TOKEN +_CLASSIFYTEXTREQUEST.fields_by_name['document'].message_type = _DOCUMENT +_CLASSIFYTEXTRESPONSE.fields_by_name['categories'].message_type = _CLASSIFICATIONCATEGORY _ANNOTATETEXTREQUEST_FEATURES.containing_type = _ANNOTATETEXTREQUEST _ANNOTATETEXTREQUEST.fields_by_name['document'].message_type = _DOCUMENT _ANNOTATETEXTREQUEST.fields_by_name['features'].message_type = _ANNOTATETEXTREQUEST_FEATURES @@ -2077,6 +2193,7 @@ _ANNOTATETEXTRESPONSE.fields_by_name['tokens'].message_type = _TOKEN _ANNOTATETEXTRESPONSE.fields_by_name['entities'].message_type = _ENTITY _ANNOTATETEXTRESPONSE.fields_by_name['document_sentiment'].message_type = _SENTIMENT +_ANNOTATETEXTRESPONSE.fields_by_name['categories'].message_type = _CLASSIFICATIONCATEGORY DESCRIPTOR.message_types_by_name['Document'] = _DOCUMENT DESCRIPTOR.message_types_by_name['Sentence'] = _SENTENCE DESCRIPTOR.message_types_by_name['Entity'] = _ENTITY @@ -2086,6 +2203,7 @@ DESCRIPTOR.message_types_by_name['DependencyEdge'] = _DEPENDENCYEDGE DESCRIPTOR.message_types_by_name['EntityMention'] = _ENTITYMENTION DESCRIPTOR.message_types_by_name['TextSpan'] = _TEXTSPAN +DESCRIPTOR.message_types_by_name['ClassificationCategory'] = _CLASSIFICATIONCATEGORY DESCRIPTOR.message_types_by_name['AnalyzeSentimentRequest'] = _ANALYZESENTIMENTREQUEST DESCRIPTOR.message_types_by_name['AnalyzeSentimentResponse'] = _ANALYZESENTIMENTRESPONSE DESCRIPTOR.message_types_by_name['AnalyzeEntitySentimentRequest'] = _ANALYZEENTITYSENTIMENTREQUEST @@ -2094,6 +2212,8 @@ DESCRIPTOR.message_types_by_name['AnalyzeEntitiesResponse'] = _ANALYZEENTITIESRESPONSE DESCRIPTOR.message_types_by_name['AnalyzeSyntaxRequest'] = _ANALYZESYNTAXREQUEST DESCRIPTOR.message_types_by_name['AnalyzeSyntaxResponse'] = _ANALYZESYNTAXRESPONSE +DESCRIPTOR.message_types_by_name['ClassifyTextRequest'] = _CLASSIFYTEXTREQUEST +DESCRIPTOR.message_types_by_name['ClassifyTextResponse'] = _CLASSIFYTEXTRESPONSE DESCRIPTOR.message_types_by_name['AnnotateTextRequest'] = _ANNOTATETEXTREQUEST DESCRIPTOR.message_types_by_name['AnnotateTextResponse'] = _ANNOTATETEXTRESPONSE DESCRIPTOR.enum_types_by_name['EncodingType'] = _ENCODINGTYPE @@ -2353,6 +2473,25 @@ )) _sym_db.RegisterMessage(TextSpan) +ClassificationCategory = _reflection.GeneratedProtocolMessageType('ClassificationCategory', (_message.Message,), dict( + DESCRIPTOR = _CLASSIFICATIONCATEGORY, + __module__ = 'google.cloud.language_v1.proto.language_service_pb2' + , + __doc__ = """Represents a category returned from the text classifier. + + + Attributes: + name: + The name of the category representing the document. + confidence: + The classifier's confidence of the category. Number represents + how certain the classifier is that this category represents + the given text. + """, + # @@protoc_insertion_point(class_scope:google.cloud.language.v1.ClassificationCategory) + )) +_sym_db.RegisterMessage(ClassificationCategory) + AnalyzeSentimentRequest = _reflection.GeneratedProtocolMessageType('AnalyzeSentimentRequest', (_message.Message,), dict( DESCRIPTOR = _ANALYZESENTIMENTREQUEST, __module__ = 'google.cloud.language_v1.proto.language_service_pb2' @@ -2508,6 +2647,36 @@ )) _sym_db.RegisterMessage(AnalyzeSyntaxResponse) +ClassifyTextRequest = _reflection.GeneratedProtocolMessageType('ClassifyTextRequest', (_message.Message,), dict( + DESCRIPTOR = _CLASSIFYTEXTREQUEST, + __module__ = 'google.cloud.language_v1.proto.language_service_pb2' + , + __doc__ = """The document classification request message. + + + Attributes: + document: + Input document. + """, + # @@protoc_insertion_point(class_scope:google.cloud.language.v1.ClassifyTextRequest) + )) +_sym_db.RegisterMessage(ClassifyTextRequest) + +ClassifyTextResponse = _reflection.GeneratedProtocolMessageType('ClassifyTextResponse', (_message.Message,), dict( + DESCRIPTOR = _CLASSIFYTEXTRESPONSE, + __module__ = 'google.cloud.language_v1.proto.language_service_pb2' + , + __doc__ = """The document classification response message. + + + Attributes: + categories: + Categories representing the input document. + """, + # @@protoc_insertion_point(class_scope:google.cloud.language.v1.ClassifyTextResponse) + )) +_sym_db.RegisterMessage(ClassifyTextResponse) + AnnotateTextRequest = _reflection.GeneratedProtocolMessageType('AnnotateTextRequest', (_message.Message,), dict( Features = _reflection.GeneratedProtocolMessageType('Features', (_message.Message,), dict( @@ -2517,6 +2686,19 @@ __doc__ = """All available features for sentiment, syntax, and semantic analysis. Setting each one to true will enable that specific analysis for the input. + + + Attributes: + extract_syntax: + Extract syntax information. + extract_entities: + Extract entities. + extract_document_sentiment: + Extract document-level sentiment. + extract_entity_sentiment: + Extract entities and their associated sentiment. + classify_text: + Classify the full document into categories. """, # @@protoc_insertion_point(class_scope:google.cloud.language.v1.AnnotateTextRequest.Features) )) @@ -2529,14 +2711,6 @@ Attributes: - extract_syntax: - Extract syntax information. - extract_entities: - Extract entities. - extract_document_sentiment: - Extract document-level sentiment. - extract_entity_sentiment: - Extract entities and their associated sentiment. document: Input document. features: @@ -2581,6 +2755,8 @@ language specified in the request or, if not specified, the automatically-detected language. See [Document.language][googl e.cloud.language.v1.Document.language] field for more details. + categories: + Categories identified in the input document. """, # @@protoc_insertion_point(class_scope:google.cloud.language.v1.AnnotateTextResponse) )) @@ -2591,66 +2767,6 @@ DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\034com.google.cloud.language.v1B\024LanguageServiceProtoP\001Z@google.golang.org/genproto/googleapis/cloud/language/v1;language')) _ENTITY_METADATAENTRY.has_options = True _ENTITY_METADATAENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) - -_LANGUAGESERVICE = _descriptor.ServiceDescriptor( - name='LanguageService', - full_name='google.cloud.language.v1.LanguageService', - file=DESCRIPTOR, - index=0, - options=None, - serialized_start=6319, - serialized_end=7163, - methods=[ - _descriptor.MethodDescriptor( - name='AnalyzeSentiment', - full_name='google.cloud.language.v1.LanguageService.AnalyzeSentiment', - index=0, - containing_service=None, - input_type=_ANALYZESENTIMENTREQUEST, - output_type=_ANALYZESENTIMENTRESPONSE, - options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002#\"\036/v1/documents:analyzeSentiment:\001*')), - ), - _descriptor.MethodDescriptor( - name='AnalyzeEntities', - full_name='google.cloud.language.v1.LanguageService.AnalyzeEntities', - index=1, - containing_service=None, - input_type=_ANALYZEENTITIESREQUEST, - output_type=_ANALYZEENTITIESRESPONSE, - options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002\"\"\035/v1/documents:analyzeEntities:\001*')), - ), - _descriptor.MethodDescriptor( - name='AnalyzeEntitySentiment', - full_name='google.cloud.language.v1.LanguageService.AnalyzeEntitySentiment', - index=2, - containing_service=None, - input_type=_ANALYZEENTITYSENTIMENTREQUEST, - output_type=_ANALYZEENTITYSENTIMENTRESPONSE, - options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002)\"$/v1/documents:analyzeEntitySentiment:\001*')), - ), - _descriptor.MethodDescriptor( - name='AnalyzeSyntax', - full_name='google.cloud.language.v1.LanguageService.AnalyzeSyntax', - index=3, - containing_service=None, - input_type=_ANALYZESYNTAXREQUEST, - output_type=_ANALYZESYNTAXRESPONSE, - options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002 \"\033/v1/documents:analyzeSyntax:\001*')), - ), - _descriptor.MethodDescriptor( - name='AnnotateText', - full_name='google.cloud.language.v1.LanguageService.AnnotateText', - index=4, - containing_service=None, - input_type=_ANNOTATETEXTREQUEST, - output_type=_ANNOTATETEXTRESPONSE, - options=_descriptor._ParseOptions(descriptor_pb2.MethodOptions(), _b('\202\323\344\223\002\037\"\032/v1/documents:annotateText:\001*')), - ), -]) -_sym_db.RegisterServiceDescriptor(_LANGUAGESERVICE) - -DESCRIPTOR.services_by_name['LanguageService'] = _LANGUAGESERVICE - try: # THESE ELEMENTS WILL BE DEPRECATED. # Please use the generated *_pb2_grpc.py files instead. @@ -2692,6 +2808,11 @@ def __init__(self, channel): request_serializer=AnalyzeSyntaxRequest.SerializeToString, response_deserializer=AnalyzeSyntaxResponse.FromString, ) + self.ClassifyText = channel.unary_unary( + '/google.cloud.language.v1.LanguageService/ClassifyText', + request_serializer=ClassifyTextRequest.SerializeToString, + response_deserializer=ClassifyTextResponse.FromString, + ) self.AnnotateText = channel.unary_unary( '/google.cloud.language.v1.LanguageService/AnnotateText', request_serializer=AnnotateTextRequest.SerializeToString, @@ -2737,6 +2858,13 @@ def AnalyzeSyntax(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def ClassifyText(self, request, context): + """Classifies a document into categories. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def AnnotateText(self, request, context): """A convenience method that provides all the features that analyzeSentiment, analyzeEntities, and analyzeSyntax provide in one call. @@ -2768,6 +2896,11 @@ def add_LanguageServiceServicer_to_server(servicer, server): request_deserializer=AnalyzeSyntaxRequest.FromString, response_serializer=AnalyzeSyntaxResponse.SerializeToString, ), + 'ClassifyText': grpc.unary_unary_rpc_method_handler( + servicer.ClassifyText, + request_deserializer=ClassifyTextRequest.FromString, + response_serializer=ClassifyTextResponse.SerializeToString, + ), 'AnnotateText': grpc.unary_unary_rpc_method_handler( servicer.AnnotateText, request_deserializer=AnnotateTextRequest.FromString, @@ -2809,6 +2942,10 @@ def AnalyzeSyntax(self, request, context): properties. """ context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def ClassifyText(self, request, context): + """Classifies a document into categories. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) def AnnotateText(self, request, context): """A convenience method that provides all the features that analyzeSentiment, analyzeEntities, and analyzeSyntax provide in one call. @@ -2850,6 +2987,11 @@ def AnalyzeSyntax(self, request, timeout, metadata=None, with_call=False, protoc """ raise NotImplementedError() AnalyzeSyntax.future = None + def ClassifyText(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Classifies a document into categories. + """ + raise NotImplementedError() + ClassifyText.future = None def AnnotateText(self, request, timeout, metadata=None, with_call=False, protocol_options=None): """A convenience method that provides all the features that analyzeSentiment, analyzeEntities, and analyzeSyntax provide in one call. @@ -2870,6 +3012,7 @@ def beta_create_LanguageService_server(servicer, pool=None, pool_size=None, defa ('google.cloud.language.v1.LanguageService', 'AnalyzeSentiment'): AnalyzeSentimentRequest.FromString, ('google.cloud.language.v1.LanguageService', 'AnalyzeSyntax'): AnalyzeSyntaxRequest.FromString, ('google.cloud.language.v1.LanguageService', 'AnnotateText'): AnnotateTextRequest.FromString, + ('google.cloud.language.v1.LanguageService', 'ClassifyText'): ClassifyTextRequest.FromString, } response_serializers = { ('google.cloud.language.v1.LanguageService', 'AnalyzeEntities'): AnalyzeEntitiesResponse.SerializeToString, @@ -2877,6 +3020,7 @@ def beta_create_LanguageService_server(servicer, pool=None, pool_size=None, defa ('google.cloud.language.v1.LanguageService', 'AnalyzeSentiment'): AnalyzeSentimentResponse.SerializeToString, ('google.cloud.language.v1.LanguageService', 'AnalyzeSyntax'): AnalyzeSyntaxResponse.SerializeToString, ('google.cloud.language.v1.LanguageService', 'AnnotateText'): AnnotateTextResponse.SerializeToString, + ('google.cloud.language.v1.LanguageService', 'ClassifyText'): ClassifyTextResponse.SerializeToString, } method_implementations = { ('google.cloud.language.v1.LanguageService', 'AnalyzeEntities'): face_utilities.unary_unary_inline(servicer.AnalyzeEntities), @@ -2884,6 +3028,7 @@ def beta_create_LanguageService_server(servicer, pool=None, pool_size=None, defa ('google.cloud.language.v1.LanguageService', 'AnalyzeSentiment'): face_utilities.unary_unary_inline(servicer.AnalyzeSentiment), ('google.cloud.language.v1.LanguageService', 'AnalyzeSyntax'): face_utilities.unary_unary_inline(servicer.AnalyzeSyntax), ('google.cloud.language.v1.LanguageService', 'AnnotateText'): face_utilities.unary_unary_inline(servicer.AnnotateText), + ('google.cloud.language.v1.LanguageService', 'ClassifyText'): face_utilities.unary_unary_inline(servicer.ClassifyText), } server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) return beta_implementations.server(method_implementations, options=server_options) @@ -2901,6 +3046,7 @@ def beta_create_LanguageService_stub(channel, host=None, metadata_transformer=No ('google.cloud.language.v1.LanguageService', 'AnalyzeSentiment'): AnalyzeSentimentRequest.SerializeToString, ('google.cloud.language.v1.LanguageService', 'AnalyzeSyntax'): AnalyzeSyntaxRequest.SerializeToString, ('google.cloud.language.v1.LanguageService', 'AnnotateText'): AnnotateTextRequest.SerializeToString, + ('google.cloud.language.v1.LanguageService', 'ClassifyText'): ClassifyTextRequest.SerializeToString, } response_deserializers = { ('google.cloud.language.v1.LanguageService', 'AnalyzeEntities'): AnalyzeEntitiesResponse.FromString, @@ -2908,6 +3054,7 @@ def beta_create_LanguageService_stub(channel, host=None, metadata_transformer=No ('google.cloud.language.v1.LanguageService', 'AnalyzeSentiment'): AnalyzeSentimentResponse.FromString, ('google.cloud.language.v1.LanguageService', 'AnalyzeSyntax'): AnalyzeSyntaxResponse.FromString, ('google.cloud.language.v1.LanguageService', 'AnnotateText'): AnnotateTextResponse.FromString, + ('google.cloud.language.v1.LanguageService', 'ClassifyText'): ClassifyTextResponse.FromString, } cardinalities = { 'AnalyzeEntities': cardinality.Cardinality.UNARY_UNARY, @@ -2915,6 +3062,7 @@ def beta_create_LanguageService_stub(channel, host=None, metadata_transformer=No 'AnalyzeSentiment': cardinality.Cardinality.UNARY_UNARY, 'AnalyzeSyntax': cardinality.Cardinality.UNARY_UNARY, 'AnnotateText': cardinality.Cardinality.UNARY_UNARY, + 'ClassifyText': cardinality.Cardinality.UNARY_UNARY, } stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) return beta_implementations.dynamic_stub(channel, 'google.cloud.language.v1.LanguageService', cardinalities, options=stub_options) diff --git a/language/google/cloud/language_v1/proto/language_service_pb2_grpc.py b/language/google/cloud/language_v1/proto/language_service_pb2_grpc.py index 193f396f15cc..01f535c2dbcd 100644 --- a/language/google/cloud/language_v1/proto/language_service_pb2_grpc.py +++ b/language/google/cloud/language_v1/proto/language_service_pb2_grpc.py @@ -35,6 +35,11 @@ def __init__(self, channel): request_serializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnalyzeSyntaxRequest.SerializeToString, response_deserializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnalyzeSyntaxResponse.FromString, ) + self.ClassifyText = channel.unary_unary( + '/google.cloud.language.v1.LanguageService/ClassifyText', + request_serializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.ClassifyTextRequest.SerializeToString, + response_deserializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.ClassifyTextResponse.FromString, + ) self.AnnotateText = channel.unary_unary( '/google.cloud.language.v1.LanguageService/AnnotateText', request_serializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnnotateTextRequest.SerializeToString, @@ -80,6 +85,13 @@ def AnalyzeSyntax(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def ClassifyText(self, request, context): + """Classifies a document into categories. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def AnnotateText(self, request, context): """A convenience method that provides all the features that analyzeSentiment, analyzeEntities, and analyzeSyntax provide in one call. @@ -111,6 +123,11 @@ def add_LanguageServiceServicer_to_server(servicer, server): request_deserializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnalyzeSyntaxRequest.FromString, response_serializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnalyzeSyntaxResponse.SerializeToString, ), + 'ClassifyText': grpc.unary_unary_rpc_method_handler( + servicer.ClassifyText, + request_deserializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.ClassifyTextRequest.FromString, + response_serializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.ClassifyTextResponse.SerializeToString, + ), 'AnnotateText': grpc.unary_unary_rpc_method_handler( servicer.AnnotateText, request_deserializer=google_dot_cloud_dot_language__v1_dot_proto_dot_language__service__pb2.AnnotateTextRequest.FromString, diff --git a/language/google/cloud/language_v1/types.py b/language/google/cloud/language_v1/types.py index 599abe3332fe..0ac5ec174b21 100644 --- a/language/google/cloud/language_v1/types.py +++ b/language/google/cloud/language_v1/types.py @@ -15,7 +15,7 @@ from __future__ import absolute_import import sys -from google.gax.utils.messages import get_messages +from google.api_core.protobuf_helpers import get_messages from google.api import http_pb2 from google.cloud.language_v1.proto import language_service_pb2 diff --git a/language/google/cloud/language_v1beta2/gapic/language_service_client.py b/language/google/cloud/language_v1beta2/gapic/language_service_client.py index 66d5d2c94402..d2c7c143147f 100644 --- a/language/google/cloud/language_v1beta2/gapic/language_service_client.py +++ b/language/google/cloud/language_v1beta2/gapic/language_service_client.py @@ -22,21 +22,20 @@ # merge preserves those additions if the generated source changes. """Accesses the google.cloud.language.v1beta2 LanguageService API.""" -import collections -import json -import os import pkg_resources -import platform -from google.gax import api_callable -from google.gax import config -from google.gax import path_template -import google.gax +import google.api_core.gapic_v1.client_info +import google.api_core.gapic_v1.config +import google.api_core.gapic_v1.method +import google.api_core.grpc_helpers from google.cloud.language_v1beta2.gapic import enums from google.cloud.language_v1beta2.gapic import language_service_client_config from google.cloud.language_v1beta2.proto import language_service_pb2 +_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution( + 'google-cloud-language', ).version + class LanguageServiceClient(object): """ @@ -44,116 +43,104 @@ class LanguageServiceClient(object): recognition. """ - SERVICE_ADDRESS = 'language.googleapis.com' + SERVICE_ADDRESS = 'language.googleapis.com:443' """The default address of the service.""" - DEFAULT_SERVICE_PORT = 443 - """The default port of the service.""" - # The scopes needed to make gRPC calls to all of the methods defined in # this service - _ALL_SCOPES = ('https://www.googleapis.com/auth/cloud-platform', ) + _DEFAULT_SCOPES = ('https://www.googleapis.com/auth/cloud-platform', ) + + # The name of the interface for this client. This is the key used to find + # method configuration in the client_config dictionary + _INTERFACE_NAME = ('google.cloud.language.v1beta2.LanguageService') def __init__(self, channel=None, credentials=None, - ssl_credentials=None, - scopes=None, - client_config=None, - lib_name=None, - lib_version='', - metrics_headers=()): + client_config=language_service_client_config.config, + client_info=None): """Constructor. Args: - channel (~grpc.Channel): A ``Channel`` instance through - which to make calls. - credentials (~google.auth.credentials.Credentials): The authorization - credentials to attach to requests. These credentials identify this - application to the service. - ssl_credentials (~grpc.ChannelCredentials): A - ``ChannelCredentials`` instance for use with an SSL-enabled - channel. - scopes (Sequence[str]): A list of OAuth2 scopes to attach to requests. + channel (grpc.Channel): A ``Channel`` instance through + which to make calls. If specified, then the ``credentials`` + argument is ignored. + credentials (google.auth.credentials.Credentials): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If none + are specified, the client will attempt to ascertain the + credentials from the environment. client_config (dict): - A dictionary for call options for each method. See - :func:`google.gax.construct_settings` for the structure of - this data. Falls back to the default config if not specified - or the specified config is missing data points. - lib_name (str): The API library software used for calling - the service. (Unless you are writing an API client itself, - leave this as default.) - lib_version (str): The API library software version used - for calling the service. (Unless you are writing an API client - itself, leave this as default.) - metrics_headers (dict): A dictionary of values for tracking - client library metrics. Ultimately serializes to a string - (e.g. 'foo/1.2.3 bar/3.14.1'). This argument should be - considered private. - - Returns: LanguageServiceClient + A dictionary of call options for each method. If not specified + the default configuration is used. Generally, you only need + to set this if you're developing your own client library. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. """ - # Unless the calling application specifically requested - # OAuth scopes, request everything. - if scopes is None: - scopes = self._ALL_SCOPES - - # Initialize an empty client config, if none is set. - if client_config is None: - client_config = {} - - # Initialize metrics_headers as an ordered dictionary - # (cuts down on cardinality of the resulting string slightly). - metrics_headers = collections.OrderedDict(metrics_headers) - metrics_headers['gl-python'] = platform.python_version() - - # The library may or may not be set, depending on what is - # calling this client. Newer client libraries set the library name - # and version. - if lib_name: - metrics_headers[lib_name] = lib_version - - # Finally, track the GAPIC package version. - metrics_headers['gapic'] = pkg_resources.get_distribution( - 'google-cloud-language', ).version - - # Load the configuration defaults. - defaults = api_callable.construct_settings( - 'google.cloud.language.v1beta2.LanguageService', - language_service_client_config.config, - client_config, - config.STATUS_CODE_NAMES, - metrics_headers=metrics_headers, ) - self.language_service_stub = config.create_stub( - language_service_pb2.LanguageServiceStub, - channel=channel, - service_path=self.SERVICE_ADDRESS, - service_port=self.DEFAULT_SERVICE_PORT, - credentials=credentials, - scopes=scopes, - ssl_credentials=ssl_credentials) - - self._analyze_sentiment = api_callable.create_api_call( + if channel is not None and credentials is not None: + raise ValueError( + 'channel and credentials arguments to {} are mutually ' + 'exclusive.'.format(self.__class__.__name__)) + + if channel is None: + channel = google.api_core.grpc_helpers.create_channel( + self.SERVICE_ADDRESS, + credentials=credentials, + scopes=self._DEFAULT_SCOPES) + + self.language_service_stub = ( + language_service_pb2.LanguageServiceStub(channel)) + + if client_info is None: + client_info = ( + google.api_core.gapic_v1.client_info.DEFAULT_CLIENT_INFO) + + client_info.gapic_version = _GAPIC_LIBRARY_VERSION + + interface_config = client_config['interfaces'][self._INTERFACE_NAME] + method_configs = google.api_core.gapic_v1.config.parse_method_configs( + interface_config) + + self._analyze_sentiment = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeSentiment, - settings=defaults['analyze_sentiment']) - self._analyze_entities = api_callable.create_api_call( + default_retry=method_configs['AnalyzeSentiment'].retry, + default_timeout=method_configs['AnalyzeSentiment'].timeout, + client_info=client_info) + self._analyze_entities = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeEntities, - settings=defaults['analyze_entities']) - self._analyze_entity_sentiment = api_callable.create_api_call( + default_retry=method_configs['AnalyzeEntities'].retry, + default_timeout=method_configs['AnalyzeEntities'].timeout, + client_info=client_info) + self._analyze_entity_sentiment = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeEntitySentiment, - settings=defaults['analyze_entity_sentiment']) - self._analyze_syntax = api_callable.create_api_call( + default_retry=method_configs['AnalyzeEntitySentiment'].retry, + default_timeout=method_configs['AnalyzeEntitySentiment'].timeout, + client_info=client_info) + self._analyze_syntax = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnalyzeSyntax, - settings=defaults['analyze_syntax']) - self._classify_text = api_callable.create_api_call( + default_retry=method_configs['AnalyzeSyntax'].retry, + default_timeout=method_configs['AnalyzeSyntax'].timeout, + client_info=client_info) + self._classify_text = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.ClassifyText, - settings=defaults['classify_text']) - self._annotate_text = api_callable.create_api_call( + default_retry=method_configs['ClassifyText'].retry, + default_timeout=method_configs['ClassifyText'].timeout, + client_info=client_info) + self._annotate_text = google.api_core.gapic_v1.method.wrap_method( self.language_service_stub.AnnotateText, - settings=defaults['annotate_text']) + default_retry=method_configs['AnnotateText'].retry, + default_timeout=method_configs['AnnotateText'].timeout, + client_info=client_info) # Service calls - def analyze_sentiment(self, document, encoding_type=None, options=None): + def analyze_sentiment(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Analyzes the sentiment of the provided text. @@ -172,21 +159,32 @@ def analyze_sentiment(self, document, encoding_type=None, options=None): message :class:`~google.cloud.language_v1beta2.types.Document` encoding_type (~google.cloud.language_v1beta2.types.EncodingType): The encoding type used by the API to calculate sentence offsets for the sentence sentiment. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.AnalyzeSentimentResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeSentimentRequest( document=document, encoding_type=encoding_type) - return self._analyze_sentiment(request, options) + return self._analyze_sentiment(request, retry=retry, timeout=timeout) - def analyze_entities(self, document, encoding_type=None, options=None): + def analyze_entities(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Finds named entities (currently proper names and common nouns) in the text along with entity types, salience, mentions for each entity, and @@ -206,24 +204,33 @@ def analyze_entities(self, document, encoding_type=None, options=None): If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1beta2.types.Document` encoding_type (~google.cloud.language_v1beta2.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.AnalyzeEntitiesResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeEntitiesRequest( document=document, encoding_type=encoding_type) - return self._analyze_entities(request, options) - - def analyze_entity_sentiment(self, - document, - encoding_type=None, - options=None): + return self._analyze_entities(request, retry=retry, timeout=timeout) + + def analyze_entity_sentiment( + self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Finds entities, similar to ``AnalyzeEntities`` in the text and analyzes sentiment associated with each entity and its mentions. @@ -242,21 +249,33 @@ def analyze_entity_sentiment(self, If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1beta2.types.Document` encoding_type (~google.cloud.language_v1beta2.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.AnalyzeEntitySentimentResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeEntitySentimentRequest( document=document, encoding_type=encoding_type) - return self._analyze_entity_sentiment(request, options) - - def analyze_syntax(self, document, encoding_type=None, options=None): + return self._analyze_entity_sentiment( + request, retry=retry, timeout=timeout) + + def analyze_syntax(self, + document, + encoding_type=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Analyzes the syntax of the text and provides sentence boundaries and tokenization along with part of speech tags, dependency trees, and other @@ -276,21 +295,31 @@ def analyze_syntax(self, document, encoding_type=None, options=None): If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1beta2.types.Document` encoding_type (~google.cloud.language_v1beta2.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.AnalyzeSyntaxResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnalyzeSyntaxRequest( document=document, encoding_type=encoding_type) - return self._analyze_syntax(request, options) + return self._analyze_syntax(request, retry=retry, timeout=timeout) - def classify_text(self, document, options=None): + def classify_text(self, + document, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ Classifies a document into categories. @@ -307,24 +336,32 @@ def classify_text(self, document, options=None): document (Union[dict, ~google.cloud.language_v1beta2.types.Document]): Input document. If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1beta2.types.Document` - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.ClassifyTextResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.ClassifyTextRequest(document=document) - return self._classify_text(request, options) + return self._classify_text(request, retry=retry, timeout=timeout) def annotate_text(self, document, features, encoding_type=None, - options=None): + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT): """ A convenience method that provides all syntax, sentiment, entity, and classification features in one call. @@ -347,16 +384,23 @@ def annotate_text(self, If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.language_v1beta2.types.Features` encoding_type (~google.cloud.language_v1beta2.types.EncodingType): The encoding type used by the API to calculate offsets. - options (~google.gax.CallOptions): Overrides the default - settings for this call, e.g, timeout, retries etc. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will not + be retried. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. Returns: A :class:`~google.cloud.language_v1beta2.types.AnnotateTextResponse` instance. Raises: - :exc:`google.gax.errors.GaxError` if the RPC is aborted. - :exc:`ValueError` if the parameters are invalid. + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. """ request = language_service_pb2.AnnotateTextRequest( document=document, features=features, encoding_type=encoding_type) - return self._annotate_text(request, options) + return self._annotate_text(request, retry=retry, timeout=timeout) diff --git a/language/google/cloud/language_v1beta2/proto/language_service_pb2.py b/language/google/cloud/language_v1beta2/proto/language_service_pb2.py index 92caa1bc235f..7dc8d2202190 100644 --- a/language/google/cloud/language_v1beta2/proto/language_service_pb2.py +++ b/language/google/cloud/language_v1beta2/proto/language_service_pb2.py @@ -27,7 +27,6 @@ serialized_pb=_b('\n:google/cloud/language_v1beta2/proto/language_service.proto\x12\x1dgoogle.cloud.language.v1beta2\x1a\x1cgoogle/api/annotations.proto\x1a#google/longrunning/operations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"\xc8\x01\n\x08\x44ocument\x12:\n\x04type\x18\x01 \x01(\x0e\x32,.google.cloud.language.v1beta2.Document.Type\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x19\n\x0fgcs_content_uri\x18\x03 \x01(\tH\x00\x12\x10\n\x08language\x18\x04 \x01(\t\"6\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x0e\n\nPLAIN_TEXT\x10\x01\x12\x08\n\x04HTML\x10\x02\x42\x08\n\x06source\"~\n\x08Sentence\x12\x35\n\x04text\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.TextSpan\x12;\n\tsentiment\x18\x02 \x01(\x0b\x32(.google.cloud.language.v1beta2.Sentiment\"\xd2\x03\n\x06\x45ntity\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x04type\x18\x02 \x01(\x0e\x32*.google.cloud.language.v1beta2.Entity.Type\x12\x45\n\x08metadata\x18\x03 \x03(\x0b\x32\x33.google.cloud.language.v1beta2.Entity.MetadataEntry\x12\x10\n\x08salience\x18\x04 \x01(\x02\x12>\n\x08mentions\x18\x05 \x03(\x0b\x32,.google.cloud.language.v1beta2.EntityMention\x12;\n\tsentiment\x18\x06 \x01(\x0b\x32(.google.cloud.language.v1beta2.Sentiment\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"y\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06PERSON\x10\x01\x12\x0c\n\x08LOCATION\x10\x02\x12\x10\n\x0cORGANIZATION\x10\x03\x12\t\n\x05\x45VENT\x10\x04\x12\x0f\n\x0bWORK_OF_ART\x10\x05\x12\x11\n\rCONSUMER_GOOD\x10\x06\x12\t\n\x05OTHER\x10\x07\"\xda\x01\n\x05Token\x12\x35\n\x04text\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.TextSpan\x12\x43\n\x0epart_of_speech\x18\x02 \x01(\x0b\x32+.google.cloud.language.v1beta2.PartOfSpeech\x12\x46\n\x0f\x64\x65pendency_edge\x18\x03 \x01(\x0b\x32-.google.cloud.language.v1beta2.DependencyEdge\x12\r\n\x05lemma\x18\x04 \x01(\t\"-\n\tSentiment\x12\x11\n\tmagnitude\x18\x02 \x01(\x02\x12\r\n\x05score\x18\x03 \x01(\x02\"\xdf\x10\n\x0cPartOfSpeech\x12<\n\x03tag\x18\x01 \x01(\x0e\x32/.google.cloud.language.v1beta2.PartOfSpeech.Tag\x12\x42\n\x06\x61spect\x18\x02 \x01(\x0e\x32\x32.google.cloud.language.v1beta2.PartOfSpeech.Aspect\x12>\n\x04\x63\x61se\x18\x03 \x01(\x0e\x32\x30.google.cloud.language.v1beta2.PartOfSpeech.Case\x12>\n\x04\x66orm\x18\x04 \x01(\x0e\x32\x30.google.cloud.language.v1beta2.PartOfSpeech.Form\x12\x42\n\x06gender\x18\x05 \x01(\x0e\x32\x32.google.cloud.language.v1beta2.PartOfSpeech.Gender\x12>\n\x04mood\x18\x06 \x01(\x0e\x32\x30.google.cloud.language.v1beta2.PartOfSpeech.Mood\x12\x42\n\x06number\x18\x07 \x01(\x0e\x32\x32.google.cloud.language.v1beta2.PartOfSpeech.Number\x12\x42\n\x06person\x18\x08 \x01(\x0e\x32\x32.google.cloud.language.v1beta2.PartOfSpeech.Person\x12\x42\n\x06proper\x18\t \x01(\x0e\x32\x32.google.cloud.language.v1beta2.PartOfSpeech.Proper\x12L\n\x0breciprocity\x18\n \x01(\x0e\x32\x37.google.cloud.language.v1beta2.PartOfSpeech.Reciprocity\x12@\n\x05tense\x18\x0b \x01(\x0e\x32\x31.google.cloud.language.v1beta2.PartOfSpeech.Tense\x12@\n\x05voice\x18\x0c \x01(\x0e\x32\x31.google.cloud.language.v1beta2.PartOfSpeech.Voice\"\x8d\x01\n\x03Tag\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03\x41\x44J\x10\x01\x12\x07\n\x03\x41\x44P\x10\x02\x12\x07\n\x03\x41\x44V\x10\x03\x12\x08\n\x04\x43ONJ\x10\x04\x12\x07\n\x03\x44\x45T\x10\x05\x12\x08\n\x04NOUN\x10\x06\x12\x07\n\x03NUM\x10\x07\x12\x08\n\x04PRON\x10\x08\x12\x07\n\x03PRT\x10\t\x12\t\n\x05PUNCT\x10\n\x12\x08\n\x04VERB\x10\x0b\x12\x05\n\x01X\x10\x0c\x12\t\n\x05\x41\x46\x46IX\x10\r\"O\n\x06\x41spect\x12\x12\n\x0e\x41SPECT_UNKNOWN\x10\x00\x12\x0e\n\nPERFECTIVE\x10\x01\x12\x10\n\x0cIMPERFECTIVE\x10\x02\x12\x0f\n\x0bPROGRESSIVE\x10\x03\"\xf8\x01\n\x04\x43\x61se\x12\x10\n\x0c\x43\x41SE_UNKNOWN\x10\x00\x12\x0e\n\nACCUSATIVE\x10\x01\x12\r\n\tADVERBIAL\x10\x02\x12\x11\n\rCOMPLEMENTIVE\x10\x03\x12\n\n\x06\x44\x41TIVE\x10\x04\x12\x0c\n\x08GENITIVE\x10\x05\x12\x10\n\x0cINSTRUMENTAL\x10\x06\x12\x0c\n\x08LOCATIVE\x10\x07\x12\x0e\n\nNOMINATIVE\x10\x08\x12\x0b\n\x07OBLIQUE\x10\t\x12\r\n\tPARTITIVE\x10\n\x12\x11\n\rPREPOSITIONAL\x10\x0b\x12\x12\n\x0eREFLEXIVE_CASE\x10\x0c\x12\x11\n\rRELATIVE_CASE\x10\r\x12\x0c\n\x08VOCATIVE\x10\x0e\"\xaf\x01\n\x04\x46orm\x12\x10\n\x0c\x46ORM_UNKNOWN\x10\x00\x12\x0c\n\x08\x41\x44NOMIAL\x10\x01\x12\r\n\tAUXILIARY\x10\x02\x12\x12\n\x0e\x43OMPLEMENTIZER\x10\x03\x12\x10\n\x0c\x46INAL_ENDING\x10\x04\x12\n\n\x06GERUND\x10\x05\x12\n\n\x06REALIS\x10\x06\x12\x0c\n\x08IRREALIS\x10\x07\x12\t\n\x05SHORT\x10\x08\x12\x08\n\x04LONG\x10\t\x12\t\n\x05ORDER\x10\n\x12\x0c\n\x08SPECIFIC\x10\x0b\"E\n\x06Gender\x12\x12\n\x0eGENDER_UNKNOWN\x10\x00\x12\x0c\n\x08\x46\x45MININE\x10\x01\x12\r\n\tMASCULINE\x10\x02\x12\n\n\x06NEUTER\x10\x03\"\x7f\n\x04Mood\x12\x10\n\x0cMOOD_UNKNOWN\x10\x00\x12\x14\n\x10\x43ONDITIONAL_MOOD\x10\x01\x12\x0e\n\nIMPERATIVE\x10\x02\x12\x0e\n\nINDICATIVE\x10\x03\x12\x11\n\rINTERROGATIVE\x10\x04\x12\x0b\n\x07JUSSIVE\x10\x05\x12\x0f\n\x0bSUBJUNCTIVE\x10\x06\"@\n\x06Number\x12\x12\n\x0eNUMBER_UNKNOWN\x10\x00\x12\x0c\n\x08SINGULAR\x10\x01\x12\n\n\x06PLURAL\x10\x02\x12\x08\n\x04\x44UAL\x10\x03\"T\n\x06Person\x12\x12\n\x0ePERSON_UNKNOWN\x10\x00\x12\t\n\x05\x46IRST\x10\x01\x12\n\n\x06SECOND\x10\x02\x12\t\n\x05THIRD\x10\x03\x12\x14\n\x10REFLEXIVE_PERSON\x10\x04\"8\n\x06Proper\x12\x12\n\x0ePROPER_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\x0e\n\nNOT_PROPER\x10\x02\"J\n\x0bReciprocity\x12\x17\n\x13RECIPROCITY_UNKNOWN\x10\x00\x12\x0e\n\nRECIPROCAL\x10\x01\x12\x12\n\x0eNON_RECIPROCAL\x10\x02\"s\n\x05Tense\x12\x11\n\rTENSE_UNKNOWN\x10\x00\x12\x15\n\x11\x43ONDITIONAL_TENSE\x10\x01\x12\n\n\x06\x46UTURE\x10\x02\x12\x08\n\x04PAST\x10\x03\x12\x0b\n\x07PRESENT\x10\x04\x12\r\n\tIMPERFECT\x10\x05\x12\x0e\n\nPLUPERFECT\x10\x06\"B\n\x05Voice\x12\x11\n\rVOICE_UNKNOWN\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\r\n\tCAUSATIVE\x10\x02\x12\x0b\n\x07PASSIVE\x10\x03\"\x9a\x08\n\x0e\x44\x65pendencyEdge\x12\x18\n\x10head_token_index\x18\x01 \x01(\x05\x12\x42\n\x05label\x18\x02 \x01(\x0e\x32\x33.google.cloud.language.v1beta2.DependencyEdge.Label\"\xa9\x07\n\x05Label\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x41\x42\x42REV\x10\x01\x12\t\n\x05\x41\x43OMP\x10\x02\x12\t\n\x05\x41\x44VCL\x10\x03\x12\n\n\x06\x41\x44VMOD\x10\x04\x12\x08\n\x04\x41MOD\x10\x05\x12\t\n\x05\x41PPOS\x10\x06\x12\x08\n\x04\x41TTR\x10\x07\x12\x07\n\x03\x41UX\x10\x08\x12\x0b\n\x07\x41UXPASS\x10\t\x12\x06\n\x02\x43\x43\x10\n\x12\t\n\x05\x43\x43OMP\x10\x0b\x12\x08\n\x04\x43ONJ\x10\x0c\x12\t\n\x05\x43SUBJ\x10\r\x12\r\n\tCSUBJPASS\x10\x0e\x12\x07\n\x03\x44\x45P\x10\x0f\x12\x07\n\x03\x44\x45T\x10\x10\x12\r\n\tDISCOURSE\x10\x11\x12\x08\n\x04\x44OBJ\x10\x12\x12\x08\n\x04\x45XPL\x10\x13\x12\x0c\n\x08GOESWITH\x10\x14\x12\x08\n\x04IOBJ\x10\x15\x12\x08\n\x04MARK\x10\x16\x12\x07\n\x03MWE\x10\x17\x12\x07\n\x03MWV\x10\x18\x12\x07\n\x03NEG\x10\x19\x12\x06\n\x02NN\x10\x1a\x12\x0c\n\x08NPADVMOD\x10\x1b\x12\t\n\x05NSUBJ\x10\x1c\x12\r\n\tNSUBJPASS\x10\x1d\x12\x07\n\x03NUM\x10\x1e\x12\n\n\x06NUMBER\x10\x1f\x12\x05\n\x01P\x10 \x12\r\n\tPARATAXIS\x10!\x12\x0b\n\x07PARTMOD\x10\"\x12\t\n\x05PCOMP\x10#\x12\x08\n\x04POBJ\x10$\x12\x08\n\x04POSS\x10%\x12\x0b\n\x07POSTNEG\x10&\x12\x0b\n\x07PRECOMP\x10\'\x12\x0b\n\x07PRECONJ\x10(\x12\n\n\x06PREDET\x10)\x12\x08\n\x04PREF\x10*\x12\x08\n\x04PREP\x10+\x12\t\n\x05PRONL\x10,\x12\x07\n\x03PRT\x10-\x12\x06\n\x02PS\x10.\x12\x0c\n\x08QUANTMOD\x10/\x12\t\n\x05RCMOD\x10\x30\x12\x0c\n\x08RCMODREL\x10\x31\x12\t\n\x05RDROP\x10\x32\x12\x07\n\x03REF\x10\x33\x12\x0b\n\x07REMNANT\x10\x34\x12\x0e\n\nREPARANDUM\x10\x35\x12\x08\n\x04ROOT\x10\x36\x12\x08\n\x04SNUM\x10\x37\x12\x08\n\x04SUFF\x10\x38\x12\x08\n\x04TMOD\x10\x39\x12\t\n\x05TOPIC\x10:\x12\x08\n\x04VMOD\x10;\x12\x0c\n\x08VOCATIVE\x10<\x12\t\n\x05XCOMP\x10=\x12\n\n\x06SUFFIX\x10>\x12\t\n\x05TITLE\x10?\x12\x0c\n\x08\x41\x44VPHMOD\x10@\x12\x0b\n\x07\x41UXCAUS\x10\x41\x12\t\n\x05\x41UXVV\x10\x42\x12\t\n\x05\x44TMOD\x10\x43\x12\x0b\n\x07\x46OREIGN\x10\x44\x12\x06\n\x02KW\x10\x45\x12\x08\n\x04LIST\x10\x46\x12\x08\n\x04NOMC\x10G\x12\x0c\n\x08NOMCSUBJ\x10H\x12\x10\n\x0cNOMCSUBJPASS\x10I\x12\x08\n\x04NUMC\x10J\x12\x07\n\x03\x43OP\x10K\x12\x0e\n\nDISLOCATED\x10L\x12\x07\n\x03\x41SP\x10M\x12\x08\n\x04GMOD\x10N\x12\x08\n\x04GOBJ\x10O\x12\n\n\x06INFMOD\x10P\x12\x07\n\x03MES\x10Q\x12\t\n\x05NCOMP\x10R\"\xf6\x01\n\rEntityMention\x12\x35\n\x04text\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.TextSpan\x12?\n\x04type\x18\x02 \x01(\x0e\x32\x31.google.cloud.language.v1beta2.EntityMention.Type\x12;\n\tsentiment\x18\x03 \x01(\x0b\x32(.google.cloud.language.v1beta2.Sentiment\"0\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\n\n\x06PROPER\x10\x01\x12\n\n\x06\x43OMMON\x10\x02\"1\n\x08TextSpan\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x14\n\x0c\x62\x65gin_offset\x18\x02 \x01(\x05\":\n\x16\x43lassificationCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nconfidence\x18\x02 \x01(\x02\"\x98\x01\n\x17\x41nalyzeSentimentRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\x12\x42\n\rencoding_type\x18\x02 \x01(\x0e\x32+.google.cloud.language.v1beta2.EncodingType\"\xae\x01\n\x18\x41nalyzeSentimentResponse\x12\x44\n\x12\x64ocument_sentiment\x18\x01 \x01(\x0b\x32(.google.cloud.language.v1beta2.Sentiment\x12\x10\n\x08language\x18\x02 \x01(\t\x12:\n\tsentences\x18\x03 \x03(\x0b\x32\'.google.cloud.language.v1beta2.Sentence\"\x9e\x01\n\x1d\x41nalyzeEntitySentimentRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\x12\x42\n\rencoding_type\x18\x02 \x01(\x0e\x32+.google.cloud.language.v1beta2.EncodingType\"k\n\x1e\x41nalyzeEntitySentimentResponse\x12\x37\n\x08\x65ntities\x18\x01 \x03(\x0b\x32%.google.cloud.language.v1beta2.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x97\x01\n\x16\x41nalyzeEntitiesRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\x12\x42\n\rencoding_type\x18\x02 \x01(\x0e\x32+.google.cloud.language.v1beta2.EncodingType\"d\n\x17\x41nalyzeEntitiesResponse\x12\x37\n\x08\x65ntities\x18\x01 \x03(\x0b\x32%.google.cloud.language.v1beta2.Entity\x12\x10\n\x08language\x18\x02 \x01(\t\"\x95\x01\n\x14\x41nalyzeSyntaxRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\x12\x42\n\rencoding_type\x18\x02 \x01(\x0e\x32+.google.cloud.language.v1beta2.EncodingType\"\x9b\x01\n\x15\x41nalyzeSyntaxResponse\x12:\n\tsentences\x18\x01 \x03(\x0b\x32\'.google.cloud.language.v1beta2.Sentence\x12\x34\n\x06tokens\x18\x02 \x03(\x0b\x32$.google.cloud.language.v1beta2.Token\x12\x10\n\x08language\x18\x03 \x01(\t\"P\n\x13\x43lassifyTextRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\"a\n\x14\x43lassifyTextResponse\x12I\n\ncategories\x18\x01 \x03(\x0b\x32\x35.google.cloud.language.v1beta2.ClassificationCategory\"\xff\x02\n\x13\x41nnotateTextRequest\x12\x39\n\x08\x64ocument\x18\x01 \x01(\x0b\x32\'.google.cloud.language.v1beta2.Document\x12M\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32;.google.cloud.language.v1beta2.AnnotateTextRequest.Features\x12\x42\n\rencoding_type\x18\x03 \x01(\x0e\x32+.google.cloud.language.v1beta2.EncodingType\x1a\x99\x01\n\x08\x46\x65\x61tures\x12\x16\n\x0e\x65xtract_syntax\x18\x01 \x01(\x08\x12\x18\n\x10\x65xtract_entities\x18\x02 \x01(\x08\x12\"\n\x1a\x65xtract_document_sentiment\x18\x03 \x01(\x08\x12 \n\x18\x65xtract_entity_sentiment\x18\x04 \x01(\x08\x12\x15\n\rclassify_text\x18\x06 \x01(\x08\"\xe4\x02\n\x14\x41nnotateTextResponse\x12:\n\tsentences\x18\x01 \x03(\x0b\x32\'.google.cloud.language.v1beta2.Sentence\x12\x34\n\x06tokens\x18\x02 \x03(\x0b\x32$.google.cloud.language.v1beta2.Token\x12\x37\n\x08\x65ntities\x18\x03 \x03(\x0b\x32%.google.cloud.language.v1beta2.Entity\x12\x44\n\x12\x64ocument_sentiment\x18\x04 \x01(\x0b\x32(.google.cloud.language.v1beta2.Sentiment\x12\x10\n\x08language\x18\x05 \x01(\t\x12I\n\ncategories\x18\x06 \x03(\x0b\x32\x35.google.cloud.language.v1beta2.ClassificationCategory*8\n\x0c\x45ncodingType\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04UTF8\x10\x01\x12\t\n\x05UTF16\x10\x02\x12\t\n\x05UTF32\x10\x03\x32\xbd\x08\n\x0fLanguageService\x12\xb3\x01\n\x10\x41nalyzeSentiment\x12\x36.google.cloud.language.v1beta2.AnalyzeSentimentRequest\x1a\x37.google.cloud.language.v1beta2.AnalyzeSentimentResponse\".\x82\xd3\xe4\x93\x02(\"#/v1beta2/documents:analyzeSentiment:\x01*\x12\xaf\x01\n\x0f\x41nalyzeEntities\x12\x35.google.cloud.language.v1beta2.AnalyzeEntitiesRequest\x1a\x36.google.cloud.language.v1beta2.AnalyzeEntitiesResponse\"-\x82\xd3\xe4\x93\x02\'\"\"/v1beta2/documents:analyzeEntities:\x01*\x12\xcb\x01\n\x16\x41nalyzeEntitySentiment\x12<.google.cloud.language.v1beta2.AnalyzeEntitySentimentRequest\x1a=.google.cloud.language.v1beta2.AnalyzeEntitySentimentResponse\"4\x82\xd3\xe4\x93\x02.\")/v1beta2/documents:analyzeEntitySentiment:\x01*\x12\xa7\x01\n\rAnalyzeSyntax\x12\x33.google.cloud.language.v1beta2.AnalyzeSyntaxRequest\x1a\x34.google.cloud.language.v1beta2.AnalyzeSyntaxResponse\"+\x82\xd3\xe4\x93\x02%\" /v1beta2/documents:analyzeSyntax:\x01*\x12\xa3\x01\n\x0c\x43lassifyText\x12\x32.google.cloud.language.v1beta2.ClassifyTextRequest\x1a\x33.google.cloud.language.v1beta2.ClassifyTextResponse\"*\x82\xd3\xe4\x93\x02$\"\x1f/v1beta2/documents:classifyText:\x01*\x12\xa3\x01\n\x0c\x41nnotateText\x12\x32.google.cloud.language.v1beta2.AnnotateTextRequest\x1a\x33.google.cloud.language.v1beta2.AnnotateTextResponse\"*\x82\xd3\xe4\x93\x02$\"\x1f/v1beta2/documents:annotateText:\x01*B\x82\x01\n!com.google.cloud.language.v1beta2B\x14LanguageServiceProtoP\x01ZEgoogle.golang.org/genproto/googleapis/cloud/language/v1beta2;languageb\x06proto3') , dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_longrunning_dot_operations__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,]) -_sym_db.RegisterFileDescriptor(DESCRIPTOR) _ENCODINGTYPE = _descriptor.EnumDescriptor( name='EncodingType', @@ -2221,6 +2220,7 @@ DESCRIPTOR.message_types_by_name['AnnotateTextRequest'] = _ANNOTATETEXTREQUEST DESCRIPTOR.message_types_by_name['AnnotateTextResponse'] = _ANNOTATETEXTRESPONSE DESCRIPTOR.enum_types_by_name['EncodingType'] = _ENCODINGTYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) Document = _reflection.GeneratedProtocolMessageType('Document', (_message.Message,), dict( DESCRIPTOR = _DOCUMENT, @@ -2689,6 +2689,19 @@ __doc__ = """All available features for sentiment, syntax, and semantic analysis. Setting each one to true will enable that specific analysis for the input. + + + Attributes: + extract_syntax: + Extract syntax information. + extract_entities: + Extract entities. + extract_document_sentiment: + Extract document-level sentiment. + extract_entity_sentiment: + Extract entities and their associated sentiment. + classify_text: + Classify the full document into categories. """, # @@protoc_insertion_point(class_scope:google.cloud.language.v1beta2.AnnotateTextRequest.Features) )) @@ -2701,16 +2714,6 @@ Attributes: - extract_syntax: - Extract syntax information. - extract_entities: - Extract entities. - extract_document_sentiment: - Extract document-level sentiment. - extract_entity_sentiment: - Extract entities and their associated sentiment. - classify_text: - Classify the full document into categories. document: Input document. features: diff --git a/language/google/cloud/language_v1beta2/proto/language_service_pb2_grpc.py b/language/google/cloud/language_v1beta2/proto/language_service_pb2_grpc.py index 37fffd5bfba9..73bfcadda28e 100644 --- a/language/google/cloud/language_v1beta2/proto/language_service_pb2_grpc.py +++ b/language/google/cloud/language_v1beta2/proto/language_service_pb2_grpc.py @@ -1,7 +1,7 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! import grpc -import google.cloud.language_v1beta2.proto.language_service_pb2 as google_dot_cloud_dot_language__v1beta2_dot_proto_dot_language__service__pb2 +from google.cloud.language_v1beta2.proto import language_service_pb2 as google_dot_cloud_dot_language__v1beta2_dot_proto_dot_language__service__pb2 class LanguageServiceStub(object): diff --git a/language/google/cloud/language_v1beta2/types.py b/language/google/cloud/language_v1beta2/types.py index 5dc5dac56262..4439570ac5e5 100644 --- a/language/google/cloud/language_v1beta2/types.py +++ b/language/google/cloud/language_v1beta2/types.py @@ -15,7 +15,7 @@ from __future__ import absolute_import import sys -from google.gax.utils.messages import get_messages +from google.api_core.protobuf_helpers import get_messages from google.api import http_pb2 from google.cloud.language_v1beta2.proto import language_service_pb2 diff --git a/language/setup.py b/language/setup.py index 28994387bb28..79635822240e 100644 --- a/language/setup.py +++ b/language/setup.py @@ -51,9 +51,8 @@ REQUIREMENTS = [ - 'google-cloud-core[grpc] >= 0.28.0, < 0.29dev', - 'google-api-core >= 0.1.1, < 0.2.0dev', - 'google-gax >= 0.15.14, < 0.16dev', + 'google-api-core[grpc] >= 0.1.1, < 0.2.0dev', + 'google-auth >= 1.0.2, < 2.0dev', ] EXTRAS_REQUIRE = { ':python_version<"3.4"': ['enum34'], diff --git a/language/tests/unit/gapic/v1/test_language_service_client_v1.py b/language/tests/unit/gapic/v1/test_language_service_client_v1.py index 8fef274fac2d..1ba0632b26b6 100644 --- a/language/tests/unit/gapic/v1/test_language_service_client_v1.py +++ b/language/tests/unit/gapic/v1/test_language_service_client_v1.py @@ -13,265 +13,253 @@ # limitations under the License. """Unit tests.""" -import mock -import unittest - -from google.gax import errors +import pytest from google.cloud import language_v1 from google.cloud.language_v1.proto import language_service_pb2 -class CustomException(Exception): - pass +class MultiCallableStub(object): + """Stub for the grpc.UnaryUnaryMultiCallable interface.""" + def __init__(self, method, channel_stub): + self.method = method + self.channel_stub = channel_stub -class TestLanguageServiceClient(unittest.TestCase): - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_sentiment(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def __call__(self, request, timeout=None, metadata=None, credentials=None): + self.channel_stub.requests.append((self.method, request)) - client = language_v1.LanguageServiceClient() + response = None + if self.channel_stub.responses: + response = self.channel_stub.responses.pop() - # Mock request - document = {} + if isinstance(response, Exception): + raise response + + if response: + return response + + +class ChannelStub(object): + """Stub for the grpc.Channel interface.""" + + def __init__(self, responses=[]): + self.responses = responses + self.requests = [] - # Mock response + def unary_unary(self, + method, + request_serializer=None, + response_deserializer=None): + return MultiCallableStub(method, self) + + +class CustomException(Exception): + pass + + +class TestLanguageServiceClient(object): + def test_analyze_sentiment(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeSentimentResponse( **expected_response) - grpc_stub.AnalyzeSentiment.return_value = expected_response - response = client.analyze_sentiment(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeSentiment.assert_called_once() - args, kwargs = grpc_stub.AnalyzeSentiment.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_sentiment(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeSentimentRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_sentiment_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_sentiment_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - client = language_v1.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeSentiment.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_sentiment, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entities(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1.LanguageServiceClient() - - # Mock request - document = {} + with pytest.raises(CustomException): + client.analyze_sentiment(document) - # Mock response + def test_analyze_entities(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeEntitiesResponse( **expected_response) - grpc_stub.AnalyzeEntities.return_value = expected_response - response = client.analyze_entities(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeEntities.assert_called_once() - args, kwargs = grpc_stub.AnalyzeEntities.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_entities(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeEntitiesRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entities_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_entities_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - client = language_v1.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeEntities.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_entities, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entity_sentiment(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1.LanguageServiceClient() + with pytest.raises(CustomException): + client.analyze_entities(document) - # Mock request - document = {} - - # Mock response + def test_analyze_entity_sentiment(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeEntitySentimentResponse( **expected_response) - grpc_stub.AnalyzeEntitySentiment.return_value = expected_response - response = client.analyze_entity_sentiment(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeEntitySentiment.assert_called_once() - args, kwargs = grpc_stub.AnalyzeEntitySentiment.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_entity_sentiment(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeEntitySentimentRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entity_sentiment_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_entity_sentiment_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - client = language_v1.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeEntitySentiment.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_entity_sentiment, - document) + with pytest.raises(CustomException): + client.analyze_entity_sentiment(document) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_syntax(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1.LanguageServiceClient() - - # Mock request - document = {} - - # Mock response + def test_analyze_syntax(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeSyntaxResponse( **expected_response) - grpc_stub.AnalyzeSyntax.return_value = expected_response - response = client.analyze_syntax(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeSyntax.assert_called_once() - args, kwargs = grpc_stub.AnalyzeSyntax.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_syntax(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeSyntaxRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_syntax_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_syntax_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - client = language_v1.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeSyntax.side_effect = CustomException() + with pytest.raises(CustomException): + client.analyze_syntax(document) + + def test_classify_text(self): + # Setup Expected Response + expected_response = {} + expected_response = language_service_pb2.ClassifyTextResponse( + **expected_response) + + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) - self.assertRaises(errors.GaxError, client.analyze_syntax, document) + # Setup Request + document = {} + + response = client.classify_text(document) + assert expected_response == response - @mock.patch('google.gax.config.create_stub', spec=True) - def test_annotate_text(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + assert len(channel.requests) == 1 + expected_request = language_service_pb2.ClassifyTextRequest( + document=document) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - client = language_v1.LanguageServiceClient() + def test_classify_text_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - # Mock request + # Setup request document = {} - features = {} - # Mock response + with pytest.raises(CustomException): + client.classify_text(document) + + def test_annotate_text(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnnotateTextResponse( **expected_response) - grpc_stub.AnnotateText.return_value = expected_response - response = client.annotate_text(document, features) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} + features = {} - grpc_stub.AnnotateText.assert_called_once() - args, kwargs = grpc_stub.AnnotateText.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.annotate_text(document, features) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnnotateTextRequest( document=document, features=features) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_annotate_text_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_annotate_text_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1.LanguageServiceClient(channel=channel) - client = language_v1.LanguageServiceClient() - - # Mock request + # Setup request document = {} features = {} - # Mock exception response - grpc_stub.AnnotateText.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.annotate_text, document, - features) + with pytest.raises(CustomException): + client.annotate_text(document, features) diff --git a/language/tests/unit/gapic/v1beta2/test_language_service_client_v1beta2.py b/language/tests/unit/gapic/v1beta2/test_language_service_client_v1beta2.py index 30a80823ce47..f8350319b62e 100644 --- a/language/tests/unit/gapic/v1beta2/test_language_service_client_v1beta2.py +++ b/language/tests/unit/gapic/v1beta2/test_language_service_client_v1beta2.py @@ -13,313 +13,253 @@ # limitations under the License. """Unit tests.""" -import mock -import unittest - -from google.gax import errors +import pytest from google.cloud import language_v1beta2 from google.cloud.language_v1beta2.proto import language_service_pb2 -class CustomException(Exception): - pass +class MultiCallableStub(object): + """Stub for the grpc.UnaryUnaryMultiCallable interface.""" + def __init__(self, method, channel_stub): + self.method = method + self.channel_stub = channel_stub -class TestLanguageServiceClient(unittest.TestCase): - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_sentiment(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def __call__(self, request, timeout=None, metadata=None, credentials=None): + self.channel_stub.requests.append((self.method, request)) - client = language_v1beta2.LanguageServiceClient() + response = None + if self.channel_stub.responses: + response = self.channel_stub.responses.pop() - # Mock request - document = {} + if isinstance(response, Exception): + raise response + + if response: + return response + + +class ChannelStub(object): + """Stub for the grpc.Channel interface.""" + + def __init__(self, responses=[]): + self.responses = responses + self.requests = [] + + def unary_unary(self, + method, + request_serializer=None, + response_deserializer=None): + return MultiCallableStub(method, self) - # Mock response + +class CustomException(Exception): + pass + + +class TestLanguageServiceClient(object): + def test_analyze_sentiment(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeSentimentResponse( **expected_response) - grpc_stub.AnalyzeSentiment.return_value = expected_response - response = client.analyze_sentiment(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeSentiment.assert_called_once() - args, kwargs = grpc_stub.AnalyzeSentiment.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_sentiment(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeSentimentRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_sentiment_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_sentiment_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - client = language_v1beta2.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeSentiment.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_sentiment, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entities(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + with pytest.raises(CustomException): + client.analyze_sentiment(document) - client = language_v1beta2.LanguageServiceClient() - - # Mock request - document = {} - - # Mock response + def test_analyze_entities(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeEntitiesResponse( **expected_response) - grpc_stub.AnalyzeEntities.return_value = expected_response - response = client.analyze_entities(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeEntities.assert_called_once() - args, kwargs = grpc_stub.AnalyzeEntities.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_entities(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeEntitiesRequest( document=document) - self.assertEqual(expected_request, actual_request) - - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entities_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + actual_request = channel.requests[0][1] + assert expected_request == actual_request - client = language_v1beta2.LanguageServiceClient() + def test_analyze_entities_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeEntities.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_entities, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entity_sentiment(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1beta2.LanguageServiceClient() + with pytest.raises(CustomException): + client.analyze_entities(document) - # Mock request - document = {} - - # Mock response + def test_analyze_entity_sentiment(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeEntitySentimentResponse( **expected_response) - grpc_stub.AnalyzeEntitySentiment.return_value = expected_response - response = client.analyze_entity_sentiment(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) + + # Setup Request + document = {} - grpc_stub.AnalyzeEntitySentiment.assert_called_once() - args, kwargs = grpc_stub.AnalyzeEntitySentiment.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + response = client.analyze_entity_sentiment(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeEntitySentimentRequest( document=document) - self.assertEqual(expected_request, actual_request) - - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_entity_sentiment_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + actual_request = channel.requests[0][1] + assert expected_request == actual_request - client = language_v1beta2.LanguageServiceClient() + def test_analyze_entity_sentiment_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeEntitySentiment.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_entity_sentiment, - document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_syntax(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + with pytest.raises(CustomException): + client.analyze_entity_sentiment(document) - client = language_v1beta2.LanguageServiceClient() - - # Mock request - document = {} - - # Mock response + def test_analyze_syntax(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnalyzeSyntaxResponse( **expected_response) - grpc_stub.AnalyzeSyntax.return_value = expected_response - response = client.analyze_syntax(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - grpc_stub.AnalyzeSyntax.assert_called_once() - args, kwargs = grpc_stub.AnalyzeSyntax.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + # Setup Request + document = {} + + response = client.analyze_syntax(document) + assert expected_response == response + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnalyzeSyntaxRequest( document=document) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_analyze_syntax_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_analyze_syntax_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - client = language_v1beta2.LanguageServiceClient() - - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.AnalyzeSyntax.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.analyze_syntax, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_classify_text(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1beta2.LanguageServiceClient() - - # Mock request - document = {} + with pytest.raises(CustomException): + client.analyze_syntax(document) - # Mock response + def test_classify_text(self): + # Setup Expected Response expected_response = {} expected_response = language_service_pb2.ClassifyTextResponse( **expected_response) - grpc_stub.ClassifyText.return_value = expected_response - response = client.classify_text(document) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - grpc_stub.ClassifyText.assert_called_once() - args, kwargs = grpc_stub.ClassifyText.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + # Setup Request + document = {} + response = client.classify_text(document) + assert expected_response == response + + assert len(channel.requests) == 1 expected_request = language_service_pb2.ClassifyTextRequest( document=document) - self.assertEqual(expected_request, actual_request) - - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_classify_text_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + actual_request = channel.requests[0][1] + assert expected_request == actual_request - client = language_v1beta2.LanguageServiceClient() + def test_classify_text_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - # Mock request + # Setup request document = {} - # Mock exception response - grpc_stub.ClassifyText.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.classify_text, document) - - @mock.patch('google.gax.config.create_stub', spec=True) - def test_annotate_text(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub - - client = language_v1beta2.LanguageServiceClient() - - # Mock request - document = {} - features = {} + with pytest.raises(CustomException): + client.classify_text(document) - # Mock response + def test_annotate_text(self): + # Setup Expected Response language = 'language-1613589672' expected_response = {'language': language} expected_response = language_service_pb2.AnnotateTextResponse( **expected_response) - grpc_stub.AnnotateText.return_value = expected_response - response = client.annotate_text(document, features) - self.assertEqual(expected_response, response) + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - grpc_stub.AnnotateText.assert_called_once() - args, kwargs = grpc_stub.AnnotateText.call_args - self.assertEqual(len(args), 2) - self.assertEqual(len(kwargs), 1) - self.assertIn('metadata', kwargs) - actual_request = args[0] + # Setup Request + document = {} + features = {} + response = client.annotate_text(document, features) + assert expected_response == response + + assert len(channel.requests) == 1 expected_request = language_service_pb2.AnnotateTextRequest( document=document, features=features) - self.assertEqual(expected_request, actual_request) + actual_request = channel.requests[0][1] + assert expected_request == actual_request - @mock.patch('google.gax.config.API_ERRORS', (CustomException, )) - @mock.patch('google.gax.config.create_stub', spec=True) - def test_annotate_text_exception(self, mock_create_stub): - # Mock gRPC layer - grpc_stub = mock.Mock() - mock_create_stub.return_value = grpc_stub + def test_annotate_text_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + client = language_v1beta2.LanguageServiceClient(channel=channel) - client = language_v1beta2.LanguageServiceClient() - - # Mock request + # Setup request document = {} features = {} - # Mock exception response - grpc_stub.AnnotateText.side_effect = CustomException() - - self.assertRaises(errors.GaxError, client.annotate_text, document, - features) + with pytest.raises(CustomException): + client.annotate_text(document, features)