From 61284020f9e10b2af9db81e5d0f56882a00a8ea8 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Tue, 29 Nov 2022 22:17:34 -0800 Subject: [PATCH 01/11] feat: add snippetgen config language and golden files --- gapic/configurable_snippetgen/__init__.py | 13 + .../snippet_config_language.proto | 1110 +++++++++++++++++ .../snippet_config_language_pb2.py | 157 +++ ...ptation_create_custom_class_basic_async.py | 68 + .../speech_createCustomClass.json | 179 +++ 5 files changed, 1527 insertions(+) create mode 100644 gapic/configurable_snippetgen/__init__.py create mode 100644 gapic/configurable_snippetgen/snippet_config_language.proto create mode 100644 gapic/configurable_snippetgen/snippet_config_language_pb2.py create mode 100644 tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py create mode 100644 tests/configurable_snippetgen/speech_createCustomClass.json diff --git a/gapic/configurable_snippetgen/__init__.py b/gapic/configurable_snippetgen/__init__.py new file mode 100644 index 0000000000..63f1632862 --- /dev/null +++ b/gapic/configurable_snippetgen/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/gapic/configurable_snippetgen/snippet_config_language.proto b/gapic/configurable_snippetgen/snippet_config_language.proto new file mode 100644 index 0000000000..d1aecb9b98 --- /dev/null +++ b/gapic/configurable_snippetgen/snippet_config_language.proto @@ -0,0 +1,1110 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.cloud.tools.snippetgen.configlanguage.v1; + +import "google/protobuf/descriptor.proto"; + +option csharp_namespace = "Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1"; +option php_namespace = "Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1"; +option ruby_package = "Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1"; +option java_multiple_files = true; +option java_outer_classname = "SnippetConfigLanguageProto"; +option java_package = "com.google.cloud.tools.snippetgen.configlanguage.v1"; + +// The snippet configuration for a single snippet that will be generated across +// all languages. +message SnippetConfig { + // Metadata for the snippet configuration. Some information contained here + // will be included in the generated snippet own metadata. + SnippetConfigMetadata metadata = 1; + + // The RPC this snippet is for. + Rpc rpc = 2; + + // The generated snippet method signature. + SnippetSignature signature = 3; + + // The actual snippet (code). + Snippet snippet = 4; +} + +// Metadata for the snippet configuration. Some information contained here will +// be included in the generated snippet's own metadata. +message SnippetConfigMetadata { + // Whether this snippet config should be skipped for/ generation. + // This is useful when snippets are developed before features are released. + // Defaults to false. + bool skipped = 1; + + // List of languages to skip snippet generation for. + // Config producers should specify here languages for which some of the + // capabilities required by the snippet are not supported. For instance, if a + // specific client option is required by the snippet, and that option is not + // supported by .NET client libraries, then C_SHARP should be specified here. + repeated GeneratorOutputLanguage skipped_languages = 2; + + // The config id. This will be used to generate the region tag of the snippet. + // Required. + // The region tag format will be: + // [{START|END} + // ${apishortname}_${apiVersion}_config_${ServiceName}_${RpcName}_${config_id}_{sync|async}] + // - config_id must be unique for a given Service/RPC pair. + // - config_id must not contain the API, Service or RPC identifiers as that + // will be automatically included in the region tag. + // - config_id may only contain letters and numbers + // - config_id should be PascalCased + // - Preferable, config_id should not exceed 50 characters, although this is + // not a hard requirement. + // - config_id may be somewhat descriptive of the snippet or just a random + // identifier. If it's descriptive, do not make it overly verbose, there are + // the human readable snippet_name and snippet_description fields for properly + // describing the snippet. For instance, prefer DefaultDatasetCreation to + // DatasetCreationUsingDefaultValuesExceptForDatasetNameWhichIsRequired. + string config_id = 3; + + // The human readable name of the snippet. + // To be included in metadata and in the sample itself in the top-level + // description. + string snippet_name = 4; + + // The description of the snippet. + // To be included in metadata and in the sample itself in the top-level + // description. + string snippet_description = 5; +} + +// A programming language in which snippets are generated. +// Note that this is different from +// google.cloud.tools.snippetgen.snippetindex.v1.Language, i.e. language +// specified in snippet metadata, as metadata can be written for both generated +// and handwritten snippets. In turn, we'll always know which generators we are +// writing snippet configs for and which are the output languages of those +// generators. +enum GeneratorOutputLanguage { + // The language has not been specified. Consumers should not see this value. + GENERATOR_OUTPUT_LANGUAGE_UNSPECIFIED = 0; + C_PLUS_PLUS = 1; + C_SHARP = 2; + GO = 3; + JAVA = 4; + JAVASCRIPT = 5; + PHP = 6; + PYTHON = 7; + RUBY = 8; +} + +// An RPC for which a Snippet may be defined. +message Rpc { + // This is identical to the protobuf package ending with a version number, + // after removing said version number. For instance, where the api ID is + // "google.cloud.translate.v3" the API name is "google.cloud.translate". + string proto_package = 1; + + // The list of API versions for which one snippet is defined. + // The same RPC may exist in different versions (v1, v1beta, v2) of the API + // and may be covered by the same snippet config. + repeated string api_version = 2; + + // The protobuf service name relative to the api name + version where the RPC + // is defined. Example: "TransalationService". + string service_name = 3; + + // The RPC name relative to the service name. + string rpc_name = 4; +} + +message SnippetSignature { + // The name for the snippet method specified in snake_case. Required. + string snippet_method_name = 1; + + // The return type for the snippet method. Unset for methods that do not + // return a value or if the sample is to be generated for non statically-typed + // languages only. + Type return_type = 2; + + // Synchronous preference indicator for the generated snippet. + SyncPreference sync_preference = 3; + + // The list of parameters that the snippet will receive. May be empty if the + // snippet method does not receive parameters. If any, parameters should + // appear in generated code in the same order as they appear in this field. + // Note also that if parameters have assignments, some languages + // will represent these as default parameter values which are + // usually scalars. + repeated Statement.Declaration parameters = 4; + + // Synchronous preference indicator for the generated snippet. + // Note that some languages only support one-off sync or async methods so this + // is just a preference indicator. + enum SyncPreference { + // Generate an async, sync or both snippets as per language + // (style, guidelines, community) preference. + LANGUAGE_PREFERRED = 0; + + // Languages supporting async methods should generate an async snippet. + // Languages that do not support async methods will generate a sync snippet + // instead. + PREFER_ASYNC = 1; + + // Languages supporting sync methods should generate a sync snippet. + // Languages that do not support sync methods will generate an async snippet + // instead. + PREFER_SYNC = 2; + + // Languages that support both async and sync methods should generate both a + // sync and an async snippets. Note that different samples should be in + // differnt files. + // Languages that support only one of async and sync methods should + // generate the supported snippet. + BOTH = 3; + } +} + +// The actual snippet (code), including client and request initialization, +// client call and response handling. +message Snippet { + // Service client initialization. Optional. If unset language-specific + // defaults will be applied. + ClientInitialization service_client_initialization = 1; + + // Call configuration including request initialization and response handling. + // Required. + oneof call { + // A standard RPC operation. + Standard standard = 2; + + // A paginated RPC operation. + Paginated paginated = 3; + + // A long-running RPC operation. + Lro lro = 4; + + // A client streaming RPC operation. + ClientStreaming client_streaming = 5; + + // A server streaming RPC operation. + ServerStreaming server_streaming = 6; + + // A bidirectional streaming RPC operation. + BidiStreaming bidi_streaming = 7; + } + // Statements to be executed before the snippet ends. For instance, some + // Statement.StandardOutput statements and the Statement.Return statement. + // May be empty. If any, statements should appear on generated code in the + // same order as they appear on this field. + repeated Statement final_statements = 8; + + // Options to initialize the client with. + message ClientInitialization { + // Statements to be executed before the service client is initialized. For + // instance, some Statement.Declaration statements of variables to be used + // in service client initialization. May be empty. If any, statements will + // be executed in the same order as they appear on + // pre_request_initialization. + repeated Statement pre_client_initialization = 1; + + // Custom endpoint to use in client initialization. Optional. + ServiceEndpoint custom_service_endpoint = 2; + + // Different languages have different requirements for how a service + // endpoint should be specified, so in sample configuration the endpoint + // needs to be specified in parts that each language generator can then use + // to compose the string literal to include in the sample according to their + // own requirements. None of this manipulation should be included in the + // sample itself, where only a string literal is expected as the value for + // the custom endpoint. + message ServiceEndpoint { + // The schema for the service endpoint. + ServiceEndpointSchema schema = 1; + + // The unregionalized host for the service endpoint. + // For instance "pubsub.googleapis.com". Required. + string host = 2; + + // The region if this is a regional endpoint. + // For instance "us-east1". Optional. + // If present the regional host should be constructed as follows: + // {region}-{host}. + string region = 3; + + // The port for the service endpoint. Optional. + // Languages that require a port to be specified should use the same + // default value as they do in library generation. + int32 port = 4; + + // Schemas for the service endpoint. + enum ServiceEndpointSchema { + // Each language to use their own default. + // Languages that do not require the schema to be specified, + // may omit it when building the custom endpoint. + // Languages that require the schema to be specified should use the + // same default value as they do in library generation. + LANGUAGE_DEFAULT = 0; + + // Use HTTPS for service endpoint schema. + HTTPS = 1; + + // Use HTTP for service endpoint schema. + HTTP = 2; + } + } + } + + // A standard RPC operation. + message Standard { + // Describes how to initialize the request object. Required. + SimpleRequestInitialization request_initialization = 1; + + // Client call configuration. Optional. + ClientCall call = 2; + + // Describes how to handle simple responses. Optional. + SimpleResponseHandling response_handling = 3; + } + + // A paginated RPC operation. + message Paginated { + // Describes how to initialize the request object. This is the request + // object used for the initial paginated RPC call. Depending on how the + // response should be handled subsequent requests will be initialized either + // implicitly by the library or explicitly by the snippet. + SimpleRequestInitialization request_initialization = 1; + + // Client call configuration. Optional. + // This configures the client call, which in turn may result in several RPC + // calls. How this configuration is applied to RPC calls may be language + // specific. + ClientCall paginated_call = 2; + + // Describes how to handle paginated responses. + PaginatedResponseHandling paginated_handling = 3; + } + + // A long-running RPC operation. + message Lro { + // Describes how to initialize the request object. Required. + // This describes the request to the LRO operation itself and not to polling + // operations. + SimpleRequestInitialization request_initialization = 1; + + // Client call configuration. Optional. + // This configures the call to the LRO operation itself and not to polling + // operations. + ClientCall call = 2; + + // Describes how to handle the LRO response. Required. + LroResponseHandling lro_handling = 3; + } + + // A client streaming RPC operation. + message ClientStreaming { + // Client call configuration. Optional. + // This configures the call that initializes the stream. + ClientCall initialization_call = 1; + + // The name of the variable to capture the client stream in, i.e. the object + // in which streaming requests are written. Required. + string client_stream_name = 2; + + // Describes how to initialize the streaming request objects. Required. + StreamingRequestInitialization request_initialization = 3; + + // Describes how to handle the response. Optional. + // Note that the response will be available after all the streaming requests + // have been written, each language should generate code accordingly. + SimpleResponseHandling response_handling = 4; + } + + // A server streaming RPC operation. + message ServerStreaming { + // Describes how to initialize the request object. Required. + SimpleRequestInitialization request_initialization = 1; + + // Client call configuration. Optional. + ClientCall initialization_call = 2; + + // The name of the variable to capture the server stream in, i.e. the object + // from which streaming responses will be read. Optional if the stream is + // not to be read. + string server_stream_name = 3; + + // Describes how to handle the streaming responses. Optional if the stream + // is not to be read. + StreamingResponseHandling response_handling = 4; + } + + // A bidirectional streaming RPC operation. + message BidiStreaming { + // Client call configuration. Optional. + // This configures the call that initializes de stream. + ClientCall initialization_call = 1; + + // The name of the variable to capture the client stream in, i.e. the object + // in which streaming requests are written. Required. + string client_stream_name = 2; + + // Describes how to initialize the streaming request objects. Required. + StreamingRequestInitialization request_initialization = 3; + + // The name of the variable to capture the server stream in, i.e. the object + // from which streaming responses will be read. Optional if the stream is + // not to be read. + string server_stream_name = 4; + + // Describes how to handle the streaming responses. Optional if the stream + // is not to be read. + StreamingResponseHandling response_handling = 5; + } + + // An actual client service call. + // Note: Just pre_call statements for now, but this message is included so + // that adding per call options later on is not a breaking change. + message ClientCall { + // Statements to be executed before the initial call to the service client + // method is made. Whether that results in an RPC call or not is operation + // type and language dependent. May be empty. + // If any, statements should appear in generated code in the same order as + // they appear on this field. + repeated Statement pre_call = 2; + + // TODO: Add per call options, including retries, etc. + } + + // Describes how to initialize a simple request object. + message SimpleRequestInitialization { + // Statements to be executed before the request object is initialized. For + // instance, some Statement.Declaration statements of variables to be used + // in request initialization. May be empty. If any, statements will be + // executed in the same order as they appear on pre_request_initialization. + repeated Statement pre_request_initialization = 1; + + // The request value. Required. + // Should resolve to a type that is assignable to the request type of the + // RPC. + Expression request_value = 2; + + // The name for the variable that will hold the request object. + // For example "request". Required. + string request_name = 3; + } + + // Describes how to make requests to client streaming RPCs. + // An iteration is defined which makes some per-iteration + // Expression.NameValue availables that may be used to define + // streaming_request. + message StreamingRequestInitialization { + // Describes how to initialize the first streaming request. Optional for + // operations that do not require a specific first request. + SimpleRequestInitialization first_streaming_request = 1; + + // The iteration to use for defining the streaming requests. Required. + Statement.Iteration iteration = 3; + + // The streaming request that may be defined with iteration-specific + // variables, and will result in a sequence of requests. Required. + // Initialization of streaming_request should be placed, in generated code, + // on the inner-most iteration defined by the iteration field as iterations + // may be nested. + SimpleRequestInitialization streaming_request = 4; + } + + // Describes how to handle a simple response object. + message SimpleResponseHandling { + // The name of the variable to capture the response in. May be unset if + // the RPC does not return anything or the response is not to be captured. + string response_name = 1; + } + + // Describes how to handle paginated responses. + message PaginatedResponseHandling { + // The name of the variable to capture the initial client call response in. + // Required. Note that this will capture the object representing the lazy + // item sequence. + string response_name = 1; + + // How to iterate over the items. Optional. If unset, no iterations will be + // performed over the paginated response. + oneof pagination_kind { + // Iterate item by item, lazily and automatically fetching pages as + // needed. + ByItem by_item = 2; + + // Iterate page by page, lazily and automatically fetching pages as + // needed. + ByPage by_page = 3; + + // Iterate page by page, explicitly using the next page token. + // This pagination mode will modify the original request by subsequently + // setting the next page token obtained from the previous response. + NextPageToken next_page_token = 4; + } + + // Iterate item by item, lazily and automatically fetching pages as needed. + message ByItem { + // The name of the variable to capture the current item in. Required. + string item_name = 1; + + // Statements to execute for each item. Optional. + repeated Statement per_item_statements = 2; + } + + // Iterate page by page, lazily and automatically fetching pages as needed. + message ByPage { + // The name of the variable to capture the current page in. Required. + string page_name = 1; + + // Statements to execute for each page. Optional. + repeated Statement per_page_statements = 2; + + // By item iteration configuration within the current page. Optional. + ByItem by_item = 3; + } + + // Iterate page by page, explicitly using the next page token. + // This pagination mode will modify the original request by subsequently + // setting the next page token obtained from the previous response. + message NextPageToken { + // The name of the variable to capture the next page token in. Required. + string next_page_token_name = 1; + + // The explicit and guaranteed page size for fetched pages. Required. + // TODO: Double check that all languages have this modality. + // Otherwise, they may fallback to by page iteration. + Expression explicit_page_size = 2; + + // Configures how to iterate over the explicitly fetched page. + ByPage by_page = 3; + } + } + + // Describes how to handle LRO responses. + message LroResponseHandling { + // The name of the variable to capture the LRO response in. Required. + // This will capture the response to the LRO operaion call and not to + // polling operations. + string response_name = 1; + + // How to perform polling. Required. + PollingType polling_type = 2; + + // The name of the variable to capture the polling response in. Optional if + // the polling result should not be captured. Should be unset if + // PollingType.NONE is specified. + string polling_response_name = 3; + + // Configures the polling call. Optional. Should be unset if + // PollingType.NONE is specified. + ClientCall polling_call = 4; + + enum PollingType { + // Poll until completion. Default value. + UNTIL_COMPLETION = 0; + + // Poll just once. + ONCE = 1; + + // Do not poll. + NONE = 2; + } + } + + // Describes how to handle streaming responses. + message StreamingResponseHandling { + // The name of the variable to capture the current response in the stream. + // Required. + string current_response_name = 1; + + // Statements to execute for each stream response. Optional. + repeated Statement per_stream_response_statements = 2; + } +} + +// A stament that will translate into equivalent language-specific statements. +message Statement { + oneof statement_type { + // A declaration which may be used for parameters or variables. Note that + // the only form of assignment supported is on declaration. + // Note that a declaration has scope depending on whether it's included as + // a top level statement in any of the snippet sections or is a nested + // statement. + Declaration declaration = 1; + + // A statement to write information to sdtout. + StandardOutput standard_output = 2; + + // A return statement. + Return return = 3; + + // A conditional statement. One of two given sets of statements will be + // executed depending on the result of evaluating a given condition. + Conditional conditional = 4; + + // An iteration statement. A given Statement set will be executed + // repeatedly according to the iteration definition. + // Each iteration type will make a per-step Expression.NameValue set + // available that may be used withing the given Statement set. + Iteration iteration = 5; + } + + // A declaration which may be used for parameters or variables. + // Note that the only form of assignment supported is on declaration. + message Declaration { + // The type of this declaration. Required unless the snippet is to be + // generated in non-statically typed languages only. + Type type = 1; + + // The name of the variable or parameter. Required. + string name = 2; + + // The value to assign to the variable or parameter. + // Optional for parameters. + // Required for variables as assignment outside of a declaration is not + // supported. + // Should resolve to a type that is assignable to this Declaration type. + Expression value = 3; + + // An optional description that will be included alongside the declaration + // likely as a code comment. + string description = 4; + } + + // A statement to write information to sdtout. + message StandardOutput { + // The value to write to sdtout. + // Should evaluate to a string value or resolve to a type that all languages + // are able to convert to string without specific code, for instance numeric + // values, and possibly protobuf messages as they may be converted to their + // JSON representation. + Expression value = 2; + } + + // A return statement. + message Return { + // The value to return. Should resolve to a type that is assignable to + // SnippetSignature.return_type. + Expression result = 1; + } + + // A conditional statement. One of two given sets of statements will be + // executed depending on the result of evaluating a given condition. + message Conditional { + // The condition to evaluate. Should evaluate to a bolean value. + Expression condition = 1; + + // The set of statements to execute if condition evaluates to true. + // The statements should be executed in the order that they appear. + repeated Statement on_true = 2; + + // The set of statements to execute if condition evaluates to false. + // The statements should be executed in the order that they appear. + repeated Statement on_false = 3; + } + + // An iteration statement. A given Statement set will be executed + // repeatedly according to the iteration definition. + // Each iteration type will make a per-step Expression.NameValue set + // available that may be used withing the given Statement set. + message Iteration { + oneof iteration_type { + // A numeric sequence iteration. + NumericSequenceIteration numeric_sequence_iteration = 1; + + // An iteration over repeated elements, i.e. an iteration over a list. + RepeatedIteration repeated_iteration = 2; + + // A map iteration. + MapIteration map_iteration = 3; + + // A bytes sequence iteration. + BytesIteration bytes_iteration = 4; + } + + // The set of statements to execute on each step of the iteration. + // The statements should be executed in the order that they appear. + // May be empty as iterations will also be used for streaming request + // initialization or streaming response handling. + repeated Statement statements = 5; + + // Represents a numeric sequence iteration. + // A numeric sequence is defined over which to iterate making the current + // element of the sequence available in a variable. + // It's ultimately the responsability of the user to define a finite + // sequence, although tooling may be provided to help. + message NumericSequenceIteration { + // Where to start the sequence at, ie. the first element of the iteration. + // Required. + // The Statement.Declaration.type should be a numeric type. + // The Statement.Declaration.value is required. + // The Statement.Declaration.name will be the name used to make the + // current element of the iteration available. + Statement.Declaration start_at = 1; + + // The step to advance the sequence with. Required. + oneof step { + // An increment, which may be a positive or negative value. + // Should resolve to a numeric type. + Expression increment = 3; + + // A multiplier, which may be less than or greater than 1. + // Should resolve to a numeric type. + Expression multiplier = 4; + } + + // When to end the sequence. Required. + oneof end { + // When the current value is less than or equal to this value. + // Should resolve to a numeric type. + Expression less_than_or_equal = 7; + + // When the current value is less than this value. + // Should resolve to a numeric type. + Expression less_than = 8; + + // When the current value is greater than or equal to this value. + // Should resolve to a numeric type. + Expression greater_than_or_equal = 9; + + // When the current value is greater than this value. + // Should resolve to a numeric type. + Expression greater_than = 10; + + // After a set number of steps. Must be non-negative. + // Should resolve to an integer type. + Expression total_steps = 11; + } + } + + // Represents an iteration over repeated elements. + // A repeated value is provided over which the iteration will occur making + // the current element of the sequence available in a variable. + message RepeatedIteration { + // The repeated elements to iterate over. Required. + // The Statement.Declaration.type should be Type.RepeatedType. + // The Statement.Declaration.value is required. + // TODO: Consider this to be a oneof Declaration or Expression.NameValue. + Statement.Declaration repeated_elements = 1; + + // The name of the variable that will hold the value of the current + // element on each iteration. For example "item". Required. The type of + // this variable will be the same as that of the elements in + // repeated_elements. + string current_name = 2; + + // TODO: Do we expose the element index as well? Optionally? + } + + // Represents an iteration over a map. + // A map value is provided over which the iteration will occur making + // the current key and element of the map availables in variables. + message MapIteration { + // The map to iterate over. Required. + // The Statement.Declaration.type should be Type.MapType. + // The Statement.Declaration.value is required. + // TODO: Consider this to be a oneof Declaration or Expression.NameValue. + Statement.Declaration map = 1; + + // The name of the variable that will hold the value of the current key + // on each iteration. For example "key". Required. + // The type of this variable will be the same as that of the keys in map. + string current_key_name = 2; + + // The name of the variable that will hold the value associated to the + // current key on each iteration. For example "value". Required. + // The type of this variable will be the same as that of the values in + // map. + string current_value_name = 3; + } + + // Represents an iteration over a byte sequence. + // A byte sequence is provided over which the iteration will occur making + // the current chunk of bytes available in a variable. + message BytesIteration { + // The byte sequence to iterate over. Required. + // The Statement.Declaration.type should be Type.BytesType. + // The Statement.Declaration.value is required. + Statement.Declaration byte_sequence = 1; + + // How to split the byte sequence in chunks to iterate over. + oneof chunk { + // The size of the chuncks to split the byte sequence in. The last chunk + // will be at most chunk_size. Must be positive. + // Should resolve to an integer type. + Expression chunk_size = 2; + + // The total amount of chunks to split the byte sequence into. Note that + // this is only possible when the byte sequence has a known length so it + // might not be possible with certain streams, for instance, with + // network streams. Must be positive. + // Should resolve to an integer type. + Expression total_chunks = 3; + } + // The type in which the chunk will be made available. + Type.BytesType chunk_type = 4; + + // The name of the variable that will hold the value of the current chunk + // on each iteration. For example "chunk". Required. + // Will be of type chunk_type. + string current_name = 5; + } + } +} + +// Represents type of values. To be used, for instance, for +// Statement.Declaration or for specifying the return type of the snippet. +message Type { + oneof type_kind { + // Protobuf scalar types. + ScalarType scalar_type = 1; + + // Protobuf enum types. + EnumType enum_type = 2; + + // The bytes type + BytesType bytes_type = 3; + + // Protobuf message types. + MessageType message_type = 4; + + // The repeated type. + RepeatedType repeated_type = 5; + + // The map type. + MapType map_type = 6; + } + + // Represents protobuf scalar types that should be translated to the usual + // language-specific types. + // https://developers.google.com/protocol-buffers/docs/proto3#scalar + // This could have been FieldDescriptorProto.Type except that proto2 enums + // cannot be used in proto3. Also, a few of the types in + // FieldDescriptorsProto.Type are individually supported in SnippetGen Config. + // Values allowed for this type are: + // - Expression.default_value, + // - Expression.name_value as long as the identifier resolves to a type that + // is assignable to this one. + // - Expression.number_value for the numeric FieldDescriptorProto.Type(s). + // - Expression.boolean_value for FieldDescriptorProto.Type.TYPE_BOOL. + // - Expression.string_value for FieldDescriptorProto.Type.TYPE_STRING. + // - Any other value that resolves to a type that is assignable to this one. + enum ScalarType { + // The scalar type has not been specified. Consumers should not see this + // value. + SCALAR_TYPE_UNDEFINED = 0; + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_UINT32 = 13; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; + TYPE_SINT64 = 18; + } + + // Represents protobuf enum types. These should be known by the + // microgenerators on generation time, so they'll probably be enums defined + // within the API being generated or one of its mixins. + message EnumType { + // The protobuf full enum name, including the protobuf package. + string enum_full_name = 1; + } + + // Represents a bytes type. + message BytesType { + // The language-specific type that this bytes type should be generated as. + LanguageEquivalent language_equivalent = 1; + + // Possible language-specific equivalents to a bytes type. + enum LanguageEquivalent { + // The same type used for representing protobuf bytes fields. + PROTOBUF_BYTES = 0; + + // Language-specific string type, whose value will be understood as a + // base64 string representation of the bytes. + BASE64 = 1; + + // Language-specific byte array type. + BYTE_ARRAY = 2; + + // Language-specific stream type. + STREAM = 3; + } + } + + // Represents protobuf message types. These should be known by the + // microgenerators at generation time, so they'll usually be well known types, + // messaged defined within the API being generated or one of its mixins. + message MessageType { + // The protobuf full message name, including the protobuf package. + string message_full_name = 1; + } + + // Represents a repeated type. + message RepeatedType { + // The type of the elements. + Type element_type = 1; + + // The language-specific type that this repeated type should be generated + // as. + LanguageEquivalent language_equivalent = 2; + + // Possible language-specific equivalents to a repeated type. + enum LanguageEquivalent { + // The same type used for representing protobuf repeated fields. + PROTOBUF_REPEATED = 0; + + // Language-specific array type. + ARRAY = 1; + + // Language-specific list type. + LIST = 2; + } + } + + // Represents a map type. + message MapType { + // The type of the keys. + Type key_type = 1; + + // The type of the values. + Type value_type = 2; + + // The language-specific type that this map type should be generated as. + LanguageEquivalent language_equivalent = 3; + + // Possible language-specific equivalents to a map type. + enum LanguageEquivalent { + // The same type used for representing protobuf map fields. + PROTOBUF_MAP = 0; + + // Language-specific dictionary or map type. + DICTIONARY = 1; + } + } +} + +// An expression to be used, for instance, for parameter, variable and request +// initialization. +// On type inference: +// - When used for parameter or variable initialization, that is, when used in a +// Statement.Declaration, we have Statement.Declaration.Type. +// - When used for request initialization, we know the request type. +// - When used to initialize other elements, like client options, etc. we will +// know which types may be infer on a case by case basis as specified by each +// of these elements documentation. +message Expression { + // The literal or calculated value. + oneof value { + // The null value. Might not be accepted by all types. + NullValue null_value = 1; + + // The default value. + // Note that when a value is used, type is always known/inferred. Supported + // types are currently protobuf scalar types and protobuf message types so + // all types should have a default value. + DefaultValue default_value = 2; + + // A variable or parameter name, and possibly a path within. + NameValue name_value = 3; + + // A number literal. + double number_value = 4; + + // A Boolean literal. + bool boolean_value = 5; + + // A string literal. + string string_value = 6; + + // An enum value. The text is to be the enum value name as defined in + // protobuf. For instance, for a protobuf enum + // `enum SampleEnum { VALUE_0 = 0; VALUE_1 = 1; }` + // the accepted values here would be VALUE_0 and VALUE_1. + string enum_value = 7; + + // A bytes value. This represents initialization of objects from which + // arbitrary byte sequences may be obtained. + BytesValue bytes_value = 8; + + // A complex value. This represents initialization of complex objects, most + // likely of protobuf messages. + ComplexValue complex_value = 9; + + // A list value. This represents initialization of collections, list, arrays + // and similar values. + RepeatedValue list_value = 10; + + // A map value. This represents initialization of maps, dictionaries and + // similar values. + MapValue map_value = 11; + + // A conditional value. This expression has one of two given values + // depending on the result of evaluating a given condition. + ConditionalOperator conditional_value = 12; + + // TODO: We will need a resource name operator, languages that have resource + // name support can translate this operator to their language-specific + // resource name helpers and languages that don't can simply build the + // resource name string. + } + + // An optional description that will be included in the snippet alongside the + // value, likely as a code comment. + string description = 13; + + // The null value. Might not be accepted by all types. + enum NullValue { + // Null value. + NULL_VALUE = 0; + } + + // The default value. + // Note that when a value is used, the type is always known/inferred. + // Supported types are currently protobuf scalar types and protobuf message + // types so all types should have a default value. + // For protobuf message types, the default value should be the empty message. + enum DefaultValue { + // Default value. + DEFAULT_VALUE = 0; + } + + // A variable or parameter name. + message NameValue { + // The name of the variable or parameter name. Required. + string name = 1; + + // A path within name that refers to a nested value. Optional. + // Note that this path must be valid across all languages, so, the following + // rules apply. + // - A path in a NameValue is only allowed if name refers to a value of + // google.cloud.tools.snippetgen.configlanguage.v1.Type.MessageType, i.e. + // a protobuf message. + // - The path segments should be named as they appear on the proto + // definition and not as they are on any specific language. + // For instance, if the following message is defined: + // ``` + // message SampleMessage { + // int one_field = 0; + // SampleMessage nested_field = 1; + // } + // ``` + // and a Declaration of + // - Declaration.type => SampleMessage and + // - Declaration.name => sample_value + // then posible NameValues that refer to the variable declared are: + // - NameValue.name => sample_value and NameValue.path => unset to reference + // the value of the sample_value variable, i.e. using the variable + // sample_value + // - NameValue.name => sample_value and NameValue.path => one_field to + // reference the value of the one_field value of the message instance + // stored in the sample_value variable, i.e. using the variable + // sample_value.one_field. + // - NameValue.sample_value and NameValue.path => nested_field, one_field to + // reference the one_field value of the nested_field value of the message + // instance stored in the sample_value variable, i.e. using the variable + // sample_value.nested_field.one_field. + repeated string path = 2; + } + + // A bytes value. This represents initialization of objects from which + // arbitrary byte sequences may be ontained. + message BytesValue { + oneof value { + // A Base64 encoded string. + // This expression should resolve to a string value. + Expression base64_string = 1; + + // A file stream. + FileStream file_stream = 2; + } + + // A language-specific file stream. + message FileStream { + // The path of the file to build the stream from. + // This expression should evaluate to a string value. + Expression file_path = 1; + } + } + + // A complex value. This represents initialization of complex objects, most + // likely of protobuf messages. + message ComplexValue { + // This is a simple map from message property name to Expression. + // - All keys in the map should correspond to top level properties of the + // protobuf message. + // - Nested properties may be initialized thanks to the recursive nature of + // ComplexValue. + // - Each Expression in the map should resolve to the type of the property + // whose name is the associated key. + map properties = 1; + } + + // A list value. This represens initialization of collections, list, arrays + // and similar values. + message RepeatedValue { + // The values that should be used to initialize a language-specific + // collection, list, array or similar. + // - The values should be used in the same order as they appear in values, + // regardless of whether the target collection type represents an ordered + // collection or not. + // - Each Expression should resolve to a type that is assignable to the type + // of the elements in the target collection. + repeated Expression values = 1; + } + + // A map value. This represents initialization of maps, dictionaries and + // similar values. + // Note that we cannot use a protobuf map for the definition of MapValue + // because protobuf map do not accept message types as the key type. + message MapValue { + // The keys to use for initializing a language-specific map, dictionary or + // similar. + // - Each key Expression should resolve to a type that is assignable to + // the key type of the target map. + repeated Expression keys = 1; + + // The values to use for initializing a language-specific map, dictionary or + // similar. + // - Each value Expression should resolve to a type that is assignable to + // the value type of the target map. + // - Each value should be present in the same order as the corresponding key + // is in keys. + repeated Expression values = 2; + } + + // A conditional value. This expression has one of two given values + // depending on the result of evaluating a given condition. + message ConditionalOperator { + // The condition to evaluate. Should resolve to a Boolean value. + Expression condition = 1; + + // The value of this expression if condition evaluates to true. on_true + // should resolve to a type that is assignable to the target type of this + // expression. + Expression on_true = 2; + + // The value of this expression if condition evaluates to false. on_false + // should resolve to a type that is assignable to the target type of this + // expression. + Expression on_false = 3; + } +} diff --git a/gapic/configurable_snippetgen/snippet_config_language_pb2.py b/gapic/configurable_snippetgen/snippet_config_language_pb2.py new file mode 100644 index 0000000000..a122c2a0de --- /dev/null +++ b/gapic/configurable_snippetgen/snippet_config_language_pb2.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: snippet_config_language.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dsnippet_config_language.proto\x12/google.cloud.tools.snippetgen.configlanguage.v1\x1a google/protobuf/descriptor.proto\"\xcd\x02\n\rSnippetConfig\x12X\n\x08metadata\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.SnippetConfigMetadata\x12\x41\n\x03rpc\x18\x02 \x01(\x0b\x32\x34.google.cloud.tools.snippetgen.configlanguage.v1.Rpc\x12T\n\tsignature\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature\x12I\n\x07snippet\x18\x04 \x01(\x0b\x32\x38.google.cloud.tools.snippetgen.configlanguage.v1.Snippet\"\xd3\x01\n\x15SnippetConfigMetadata\x12\x0f\n\x07skipped\x18\x01 \x01(\x08\x12\x63\n\x11skipped_languages\x18\x02 \x03(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.GeneratorOutputLanguage\x12\x11\n\tconfig_id\x18\x03 \x01(\t\x12\x14\n\x0csnippet_name\x18\x04 \x01(\t\x12\x1b\n\x13snippet_description\x18\x05 \x01(\t\"Y\n\x03Rpc\x12\x15\n\rproto_package\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x03(\t\x12\x14\n\x0cservice_name\x18\x03 \x01(\t\x12\x10\n\x08rpc_name\x18\x04 \x01(\t\"\x99\x03\n\x10SnippetSignature\x12\x1b\n\x13snippet_method_name\x18\x01 \x01(\t\x12J\n\x0breturn_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12i\n\x0fsync_preference\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature.SyncPreference\x12Z\n\nparameters\x18\x04 \x03(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\"U\n\x0eSyncPreference\x12\x16\n\x12LANGUAGE_PREFERRED\x10\x00\x12\x10\n\x0cPREFER_ASYNC\x10\x01\x12\x0f\n\x0bPREFER_SYNC\x10\x02\x12\x08\n\x04\x42OTH\x10\x03\"\x91,\n\x07Snippet\x12t\n\x1dservice_client_initialization\x18\x01 \x01(\x0b\x32M.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization\x12U\n\x08standard\x18\x02 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StandardH\x00\x12W\n\tpaginated\x18\x03 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedH\x00\x12K\n\x03lro\x18\x04 \x01(\x0b\x32<.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroH\x00\x12\x64\n\x10\x63lient_streaming\x18\x05 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientStreamingH\x00\x12\x64\n\x10server_streaming\x18\x06 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ServerStreamingH\x00\x12`\n\x0e\x62idi_streaming\x18\x07 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.BidiStreamingH\x00\x12T\n\x10\x66inal_statements\x18\x08 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xff\x03\n\x14\x43lientInitialization\x12]\n\x19pre_client_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12~\n\x17\x63ustom_service_endpoint\x18\x02 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint\x1a\x87\x02\n\x0fServiceEndpoint\x12\x83\x01\n\x06schema\x18\x01 \x01(\x0e\x32s.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint.ServiceEndpointSchema\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0e\n\x06region\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\x05\"B\n\x15ServiceEndpointSchema\x12\x14\n\x10LANGUAGE_DEFAULT\x10\x00\x12\t\n\x05HTTPS\x10\x01\x12\x08\n\x04HTTP\x10\x02\x1a\xbf\x02\n\x08Standard\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12j\n\x11response_handling\x18\x03 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xce\x02\n\tPaginated\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12[\n\x0epaginated_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12n\n\x12paginated_handling\x18\x03 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling\x1a\xb2\x02\n\x03Lro\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x62\n\x0clro_handling\x18\x03 \x01(\x0b\x32L.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling\x1a\xf4\x02\n\x0f\x43lientStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12j\n\x11response_handling\x18\x04 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xf4\x02\n\x0fServerStreaming\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12`\n\x13initialization_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12server_stream_name\x18\x03 \x01(\t\x12m\n\x11response_handling\x18\x04 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1a\x91\x03\n\rBidiStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12\x1a\n\x12server_stream_name\x18\x04 \x01(\t\x12m\n\x11response_handling\x18\x05 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1aZ\n\nClientCall\x12L\n\x08pre_call\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe7\x01\n\x1bSimpleRequestInitialization\x12^\n\x1apre_request_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12R\n\rrequest_value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x14\n\x0crequest_name\x18\x03 \x01(\t\x1a\xe1\x02\n\x1eStreamingRequestInitialization\x12u\n\x17\x66irst_streaming_request\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12W\n\titeration\x18\x03 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration\x12o\n\x11streaming_request\x18\x04 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x1a/\n\x16SimpleResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x1a\xec\x07\n\x19PaginatedResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12l\n\x07\x62y_item\x18\x02 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItemH\x00\x12l\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageH\x00\x12{\n\x0fnext_page_token\x18\x04 \x01(\x0b\x32`.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.NextPageTokenH\x00\x1at\n\x06\x42yItem\x12\x11\n\titem_name\x18\x01 \x01(\t\x12W\n\x13per_item_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe0\x01\n\x06\x42yPage\x12\x11\n\tpage_name\x18\x01 \x01(\t\x12W\n\x13per_page_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12j\n\x07\x62y_item\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItem\x1a\xf2\x01\n\rNextPageToken\x12\x1c\n\x14next_page_token_name\x18\x01 \x01(\t\x12W\n\x12\x65xplicit_page_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12j\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageB\x11\n\x0fpagination_kind\x1a\xcf\x02\n\x13LroResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12n\n\x0cpolling_type\x18\x02 \x01(\x0e\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling.PollingType\x12\x1d\n\x15polling_response_name\x18\x03 \x01(\t\x12Y\n\x0cpolling_call\x18\x04 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\"7\n\x0bPollingType\x12\x14\n\x10UNTIL_COMPLETION\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04NONE\x10\x02\x1a\x9e\x01\n\x19StreamingResponseHandling\x12\x1d\n\x15\x63urrent_response_name\x18\x01 \x01(\t\x12\x62\n\x1eper_stream_response_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.StatementB\x06\n\x04\x63\x61ll\"\xc5\x18\n\tStatement\x12]\n\x0b\x64\x65\x63laration\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.DeclarationH\x00\x12\x64\n\x0fstandard_output\x18\x02 \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Statement.StandardOutputH\x00\x12S\n\x06return\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ReturnH\x00\x12]\n\x0b\x63onditional\x18\x04 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ConditionalH\x00\x12Y\n\titeration\x18\x05 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.IterationH\x00\x1a\xc1\x01\n\x0b\x44\x65\x63laration\x12\x43\n\x04type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12\x0c\n\x04name\x18\x02 \x01(\t\x12J\n\x05value\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x1a\\\n\x0eStandardOutput\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1aU\n\x06Return\x12K\n\x06result\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xf8\x01\n\x0b\x43onditional\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x07on_true\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12L\n\x08on_false\x18\x03 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdd\x0f\n\tIteration\x12\x83\x01\n\x1anumeric_sequence_iteration\x18\x01 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.NumericSequenceIterationH\x00\x12t\n\x12repeated_iteration\x18\x02 \x01(\x0b\x32V.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.RepeatedIterationH\x00\x12j\n\rmap_iteration\x18\x03 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.MapIterationH\x00\x12n\n\x0f\x62ytes_iteration\x18\x04 \x01(\x0b\x32S.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.BytesIterationH\x00\x12N\n\nstatements\x18\x05 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdc\x05\n\x18NumericSequenceIteration\x12X\n\x08start_at\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12P\n\tincrement\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Q\n\nmultiplier\x18\x04 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Y\n\x12less_than_or_equal\x18\x07 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12P\n\tless_than\x18\x08 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12\\\n\x15greater_than_or_equal\x18\t \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12S\n\x0cgreater_than\x18\n \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12R\n\x0btotal_steps\x18\x0b \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x42\x06\n\x04stepB\x05\n\x03\x65nd\x1a\x8c\x01\n\x11RepeatedIteration\x12\x61\n\x11repeated_elements\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x14\n\x0c\x63urrent_name\x18\x02 \x01(\t\x1a\x99\x01\n\x0cMapIteration\x12S\n\x03map\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x18\n\x10\x63urrent_key_name\x18\x02 \x01(\t\x12\x1a\n\x12\x63urrent_value_name\x18\x03 \x01(\t\x1a\x8b\x03\n\x0e\x42ytesIteration\x12]\n\rbyte_sequence\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12Q\n\nchunk_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\x0ctotal_chunks\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\nchunk_type\x18\x04 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType\x12\x14\n\x0c\x63urrent_name\x18\x05 \x01(\tB\x07\n\x05\x63hunkB\x10\n\x0eiteration_typeB\x10\n\x0estatement_type\"\xb6\r\n\x04Type\x12W\n\x0bscalar_type\x18\x01 \x01(\x0e\x32@.google.cloud.tools.snippetgen.configlanguage.v1.Type.ScalarTypeH\x00\x12S\n\tenum_type\x18\x02 \x01(\x0b\x32>.google.cloud.tools.snippetgen.configlanguage.v1.Type.EnumTypeH\x00\x12U\n\nbytes_type\x18\x03 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesTypeH\x00\x12Y\n\x0cmessage_type\x18\x04 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Type.MessageTypeH\x00\x12[\n\rrepeated_type\x18\x05 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedTypeH\x00\x12Q\n\x08map_type\x18\x06 \x01(\x0b\x32=.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapTypeH\x00\x1a\"\n\x08\x45numType\x12\x16\n\x0e\x65num_full_name\x18\x01 \x01(\t\x1a\xce\x01\n\tBytesType\x12o\n\x13language_equivalent\x18\x01 \x01(\x0e\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType.LanguageEquivalent\"P\n\x12LanguageEquivalent\x12\x12\n\x0ePROTOBUF_BYTES\x10\x00\x12\n\n\x06\x42\x41SE64\x10\x01\x12\x0e\n\nBYTE_ARRAY\x10\x02\x12\n\n\x06STREAM\x10\x03\x1a(\n\x0bMessageType\x12\x19\n\x11message_full_name\x18\x01 \x01(\t\x1a\x91\x02\n\x0cRepeatedType\x12K\n\x0c\x65lement_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12r\n\x13language_equivalent\x18\x02 \x01(\x0e\x32U.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedType.LanguageEquivalent\"@\n\x12LanguageEquivalent\x12\x15\n\x11PROTOBUF_REPEATED\x10\x00\x12\t\n\x05\x41RRAY\x10\x01\x12\x08\n\x04LIST\x10\x02\x1a\xc4\x02\n\x07MapType\x12G\n\x08key_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12I\n\nvalue_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12m\n\x13language_equivalent\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapType.LanguageEquivalent\"6\n\x12LanguageEquivalent\x12\x10\n\x0cPROTOBUF_MAP\x10\x00\x12\x0e\n\nDICTIONARY\x10\x01\"\x96\x02\n\nScalarType\x12\x19\n\x15SCALAR_TYPE_UNDEFINED\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\x42\x0b\n\ttype_kind\"\xa8\x10\n\nExpression\x12[\n\nnull_value\x18\x01 \x01(\x0e\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NullValueH\x00\x12\x61\n\rdefault_value\x18\x02 \x01(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.DefaultValueH\x00\x12[\n\nname_value\x18\x03 \x01(\x0b\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NameValueH\x00\x12\x16\n\x0cnumber_value\x18\x04 \x01(\x01H\x00\x12\x17\n\rboolean_value\x18\x05 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x00\x12\x14\n\nenum_value\x18\x07 \x01(\tH\x00\x12]\n\x0b\x62ytes_value\x18\x08 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValueH\x00\x12\x61\n\rcomplex_value\x18\t \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValueH\x00\x12_\n\nlist_value\x18\n \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Expression.RepeatedValueH\x00\x12Y\n\tmap_value\x18\x0b \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Expression.MapValueH\x00\x12l\n\x11\x63onditional_value\x18\x0c \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ConditionalOperatorH\x00\x12\x13\n\x0b\x64\x65scription\x18\r \x01(\t\x1a\'\n\tNameValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x1a\xb3\x02\n\nBytesValue\x12T\n\rbase64_string\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12h\n\x0b\x66ile_stream\x18\x02 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValue.FileStreamH\x00\x1a\\\n\nFileStream\x12N\n\tfile_path\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionB\x07\n\x05value\x1a\xec\x01\n\x0c\x43omplexValue\x12l\n\nproperties\x18\x01 \x03(\x0b\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValue.PropertiesEntry\x1an\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression:\x02\x38\x01\x1a\\\n\rRepeatedValue\x12K\n\x06values\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xa2\x01\n\x08MapValue\x12I\n\x04keys\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x06values\x18\x02 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\x82\x02\n\x13\x43onditionalOperator\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12L\n\x07on_true\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12M\n\x08on_false\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\"\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\"!\n\x0c\x44\x65\x66\x61ultValue\x12\x11\n\rDEFAULT_VALUE\x10\x00\x42\x07\n\x05value*\xa3\x01\n\x17GeneratorOutputLanguage\x12)\n%GENERATOR_OUTPUT_LANGUAGE_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x43_PLUS_PLUS\x10\x01\x12\x0b\n\x07\x43_SHARP\x10\x02\x12\x06\n\x02GO\x10\x03\x12\x08\n\x04JAVA\x10\x04\x12\x0e\n\nJAVASCRIPT\x10\x05\x12\x07\n\x03PHP\x10\x06\x12\n\n\x06PYTHON\x10\x07\x12\x08\n\x04RUBY\x10\x08\x42\xee\x01\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\x1aSnippetConfigLanguageProtoP\x01\xaa\x02/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\xca\x02/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\xea\x02\x34Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1b\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'snippet_config_language_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\032SnippetConfigLanguageProtoP\001\252\002/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\312\002/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\352\0024Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1' + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._options = None + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_options = b'8\001' + _GENERATOROUTPUTLANGUAGE._serialized_start=13778 + _GENERATOROUTPUTLANGUAGE._serialized_end=13941 + _SNIPPETCONFIG._serialized_start=117 + _SNIPPETCONFIG._serialized_end=450 + _SNIPPETCONFIGMETADATA._serialized_start=453 + _SNIPPETCONFIGMETADATA._serialized_end=664 + _RPC._serialized_start=666 + _RPC._serialized_end=755 + _SNIPPETSIGNATURE._serialized_start=758 + _SNIPPETSIGNATURE._serialized_end=1167 + _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_start=1082 + _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_end=1167 + _SNIPPET._serialized_start=1170 + _SNIPPET._serialized_end=6819 + _SNIPPET_CLIENTINITIALIZATION._serialized_start=1941 + _SNIPPET_CLIENTINITIALIZATION._serialized_end=2452 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_start=2189 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_end=2452 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_start=2386 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_end=2452 + _SNIPPET_STANDARD._serialized_start=2455 + _SNIPPET_STANDARD._serialized_end=2774 + _SNIPPET_PAGINATED._serialized_start=2777 + _SNIPPET_PAGINATED._serialized_end=3111 + _SNIPPET_LRO._serialized_start=3114 + _SNIPPET_LRO._serialized_end=3420 + _SNIPPET_CLIENTSTREAMING._serialized_start=3423 + _SNIPPET_CLIENTSTREAMING._serialized_end=3795 + _SNIPPET_SERVERSTREAMING._serialized_start=3798 + _SNIPPET_SERVERSTREAMING._serialized_end=4170 + _SNIPPET_BIDISTREAMING._serialized_start=4173 + _SNIPPET_BIDISTREAMING._serialized_end=4574 + _SNIPPET_CLIENTCALL._serialized_start=4576 + _SNIPPET_CLIENTCALL._serialized_end=4666 + _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_start=4669 + _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_end=4900 + _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_start=4903 + _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_end=5256 + _SNIPPET_SIMPLERESPONSEHANDLING._serialized_start=5258 + _SNIPPET_SIMPLERESPONSEHANDLING._serialized_end=5305 + _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_start=5308 + _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_end=6312 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_start=5705 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_end=5821 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_start=5824 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_end=6048 + _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_start=6051 + _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_end=6293 + _SNIPPET_LRORESPONSEHANDLING._serialized_start=6315 + _SNIPPET_LRORESPONSEHANDLING._serialized_end=6650 + _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_start=6595 + _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_end=6650 + _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_start=6653 + _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_end=6811 + _STATEMENT._serialized_start=6822 + _STATEMENT._serialized_end=9963 + _STATEMENT_DECLARATION._serialized_start=7304 + _STATEMENT_DECLARATION._serialized_end=7497 + _STATEMENT_STANDARDOUTPUT._serialized_start=7499 + _STATEMENT_STANDARDOUTPUT._serialized_end=7591 + _STATEMENT_RETURN._serialized_start=7593 + _STATEMENT_RETURN._serialized_end=7678 + _STATEMENT_CONDITIONAL._serialized_start=7681 + _STATEMENT_CONDITIONAL._serialized_end=7929 + _STATEMENT_ITERATION._serialized_start=7932 + _STATEMENT_ITERATION._serialized_end=9945 + _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_start=8498 + _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_end=9230 + _STATEMENT_ITERATION_REPEATEDITERATION._serialized_start=9233 + _STATEMENT_ITERATION_REPEATEDITERATION._serialized_end=9373 + _STATEMENT_ITERATION_MAPITERATION._serialized_start=9376 + _STATEMENT_ITERATION_MAPITERATION._serialized_end=9529 + _STATEMENT_ITERATION_BYTESITERATION._serialized_start=9532 + _STATEMENT_ITERATION_BYTESITERATION._serialized_end=9927 + _TYPE._serialized_start=9966 + _TYPE._serialized_end=11684 + _TYPE_ENUMTYPE._serialized_start=10502 + _TYPE_ENUMTYPE._serialized_end=10536 + _TYPE_BYTESTYPE._serialized_start=10539 + _TYPE_BYTESTYPE._serialized_end=10745 + _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_start=10665 + _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_end=10745 + _TYPE_MESSAGETYPE._serialized_start=10747 + _TYPE_MESSAGETYPE._serialized_end=10787 + _TYPE_REPEATEDTYPE._serialized_start=10790 + _TYPE_REPEATEDTYPE._serialized_end=11063 + _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_start=10999 + _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_end=11063 + _TYPE_MAPTYPE._serialized_start=11066 + _TYPE_MAPTYPE._serialized_end=11390 + _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_start=11336 + _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_end=11390 + _TYPE_SCALARTYPE._serialized_start=11393 + _TYPE_SCALARTYPE._serialized_end=11671 + _EXPRESSION._serialized_start=11687 + _EXPRESSION._serialized_end=13775 + _EXPRESSION_NAMEVALUE._serialized_start=12594 + _EXPRESSION_NAMEVALUE._serialized_end=12633 + _EXPRESSION_BYTESVALUE._serialized_start=12636 + _EXPRESSION_BYTESVALUE._serialized_end=12943 + _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_start=12842 + _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_end=12934 + _EXPRESSION_COMPLEXVALUE._serialized_start=12946 + _EXPRESSION_COMPLEXVALUE._serialized_end=13182 + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_start=13072 + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_end=13182 + _EXPRESSION_REPEATEDVALUE._serialized_start=13184 + _EXPRESSION_REPEATEDVALUE._serialized_end=13276 + _EXPRESSION_MAPVALUE._serialized_start=13279 + _EXPRESSION_MAPVALUE._serialized_end=13441 + _EXPRESSION_CONDITIONALOPERATOR._serialized_start=13444 + _EXPRESSION_CONDITIONALOPERATOR._serialized_end=13702 + _EXPRESSION_NULLVALUE._serialized_start=13704 + _EXPRESSION_NULLVALUE._serialized_end=13731 + _EXPRESSION_DEFAULTVALUE._serialized_start=13733 + _EXPRESSION_DEFAULTVALUE._serialized_end=13766 +# @@protoc_insertion_point(module_scope) diff --git a/tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py b/tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py new file mode 100644 index 0000000000..6992678308 --- /dev/null +++ b/tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-speech + +# [START speech_v1_generated_Adaptation_CreateCustomClass_Basic_async] +from google.cloud import speech_v1 + + +async def sample_create_custom_class_basic( + parent: str = "projects/[PROJECT]/locations/us", + custom_class_id: str = "passengerships") -> speech_v1.CustomClass: + """Custom Class Creation. + + Shows how to create a custom class. + + Args: + parent: The custom class parent element + custom_class_id: The id for the custom class + + Returns: + a CustomClass + """ + client = speech_v1.AdaptationAsyncClient( + client_options={"api_endpoint": "https://us-speech.googleapis.com"}) + + request = speech_v1.CreateCustomClassRequest( + parent=parent, + custom_class_id=custom_class_id, + custom_class=speech_v1.CustomClass(items=[ + speech_v1.CustomClass.ClassItem(value="Titanic"), + speech_v1.CustomClass.ClassItem(value="RMS Queen Mary") + ]), + ) + + print("Calling the CreateCustomClass operation.") + response = await client.create_custom_class(request=request) + created_custom_class = response.result() + + print("A Custom Class with the following name has been created.") + print(created_custom_class.name) + + print("The Custom class contains the following items.") + items_list = created_custom_class.items + for item in items_list: + print(item) + + return created_custom_class + + +# [END speech_v1_generated_Adaptation_CreateCustomClass_Basic_async] diff --git a/tests/configurable_snippetgen/speech_createCustomClass.json b/tests/configurable_snippetgen/speech_createCustomClass.json new file mode 100644 index 0000000000..b10fbcab3e --- /dev/null +++ b/tests/configurable_snippetgen/speech_createCustomClass.json @@ -0,0 +1,179 @@ +{ + "metadata": { + "configId": "Basic", + "snippetName": "Custom Class Creation", + "snippetDescription": "Shows how to create a custom class" + }, + "rpc": { + "protoPackage": "google.cloud.speech", + "apiVersion": [ + "v1" + ], + "serviceName": "Adaptation", + "rpcName": "CreateCustomClass" + }, + "signature": { + "snippetMethodName": "create_custom_class", + "returnType": { + "messageType": { + "messageFullName": "google.cloud.speech.v1.CustomClass" + } + }, + "syncPreference": "PREFER_ASYNC", + "parameters": [ + { + "type": { + "scalarType": "TYPE_STRING" + }, + "name": "parent", + "value": { + "stringValue": "projects/[PROJECT]/locations/us" + }, + "description": "The custom class parent element" + }, + { + "type": { + "scalarType": "TYPE_STRING" + }, + "name": "custom_class_id", + "value": { + "stringValue": "passengerships" + }, + "description": "The id for the custom class" + } + ] + }, + "snippet": { + "serviceClientInitialization": { + "customServiceEndpoint": { + "schema": "HTTPS", + "host": "speech.googleapis.com", + "region": "us" + } + }, + "standard": { + "requestInitialization": { + "requestValue": { + "complexValue": { + "properties": { + "parent": { + "nameValue": { + "name": "parent" + } + }, + "custom_class_id": { + "nameValue": { + "name": "custom_class_id" + } + }, + "custom_class": { + "complexValue": { + "properties": { + "items": { + "listValue": { + "values": [ + { + "stringValue": "Titanic" + }, + { + "stringValue": "RMS Queen Mary" + } + ] + } + } + } + } + } + } + } + }, + "requestName": "create_custom_class_request" + }, + "call": { + "preCall": [ + { + "standardOutput": { + "value": { + "stringValue": "Calling the CreateCustomClass operation." + } + } + } + ] + }, + "responseHandling": { + "responseName": "created_custom_class" + } + }, + "finalStatements": [ + { + "standardOutput": { + "value": { + "stringValue": "A Custom Class with the following name has been created." + } + } + }, + { + "standardOutput": { + "value": { + "nameValue": { + "name": "created_custom_class", + "path": "name" + } + } + } + }, + { + "standardOutput": { + "value": { + "stringValue": "The Custom class contains the following items." + } + } + }, + { + "iteration": { + "repeatedIteration": { + "repeatedElements": { + "type": { + "repeatedType": { + "elementType": { + "messageType": { + "messageFullName": "google.cloud.speech.v1.CustomClass.ClassItem" + } + } + } + }, + "name": "items_list", + "value": { + "nameValue": { + "name": "created_custom_class", + "path": "items" + } + } + }, + "currentName": "item" + }, + "statements": [ + { + "standardOutput": { + "value": { + "nameValue": { + "name": "item" + } + } + } + } + ] + } + }, + { + "return": { + "result": { + "nameValue": { + "name": "created_custom_class" + } + } + } + } + ] + } + } From 11541dd30d3a89a2be160329d5545255d4f20b66 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Thu, 1 Dec 2022 13:21:08 -0500 Subject: [PATCH 02/11] ignore mypy failures for pb2 file --- gapic/configurable_snippetgen/snippet_config_language_pb2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gapic/configurable_snippetgen/snippet_config_language_pb2.py b/gapic/configurable_snippetgen/snippet_config_language_pb2.py index a122c2a0de..da4ec6368e 100644 --- a/gapic/configurable_snippetgen/snippet_config_language_pb2.py +++ b/gapic/configurable_snippetgen/snippet_config_language_pb2.py @@ -15,6 +15,7 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: snippet_config_language.proto +# type: ignore """Generated protocol buffer code.""" from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor From d86e27c9b6329a437c9023132c81d05fbb8c4387 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Thu, 1 Dec 2022 10:48:12 -0800 Subject: [PATCH 03/11] run autopep8 on generated pb2 file --- .../snippet_config_language_pb2.py | 250 +++++++++--------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/gapic/configurable_snippetgen/snippet_config_language_pb2.py b/gapic/configurable_snippetgen/snippet_config_language_pb2.py index da4ec6368e..938060d5ea 100644 --- a/gapic/configurable_snippetgen/snippet_config_language_pb2.py +++ b/gapic/configurable_snippetgen/snippet_config_language_pb2.py @@ -17,6 +17,7 @@ # source: snippet_config_language.proto # type: ignore """Generated protocol buffer code.""" +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -26,133 +27,132 @@ _sym_db = _symbol_database.Default() -from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dsnippet_config_language.proto\x12/google.cloud.tools.snippetgen.configlanguage.v1\x1a google/protobuf/descriptor.proto\"\xcd\x02\n\rSnippetConfig\x12X\n\x08metadata\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.SnippetConfigMetadata\x12\x41\n\x03rpc\x18\x02 \x01(\x0b\x32\x34.google.cloud.tools.snippetgen.configlanguage.v1.Rpc\x12T\n\tsignature\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature\x12I\n\x07snippet\x18\x04 \x01(\x0b\x32\x38.google.cloud.tools.snippetgen.configlanguage.v1.Snippet\"\xd3\x01\n\x15SnippetConfigMetadata\x12\x0f\n\x07skipped\x18\x01 \x01(\x08\x12\x63\n\x11skipped_languages\x18\x02 \x03(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.GeneratorOutputLanguage\x12\x11\n\tconfig_id\x18\x03 \x01(\t\x12\x14\n\x0csnippet_name\x18\x04 \x01(\t\x12\x1b\n\x13snippet_description\x18\x05 \x01(\t\"Y\n\x03Rpc\x12\x15\n\rproto_package\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x03(\t\x12\x14\n\x0cservice_name\x18\x03 \x01(\t\x12\x10\n\x08rpc_name\x18\x04 \x01(\t\"\x99\x03\n\x10SnippetSignature\x12\x1b\n\x13snippet_method_name\x18\x01 \x01(\t\x12J\n\x0breturn_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12i\n\x0fsync_preference\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature.SyncPreference\x12Z\n\nparameters\x18\x04 \x03(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\"U\n\x0eSyncPreference\x12\x16\n\x12LANGUAGE_PREFERRED\x10\x00\x12\x10\n\x0cPREFER_ASYNC\x10\x01\x12\x0f\n\x0bPREFER_SYNC\x10\x02\x12\x08\n\x04\x42OTH\x10\x03\"\x91,\n\x07Snippet\x12t\n\x1dservice_client_initialization\x18\x01 \x01(\x0b\x32M.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization\x12U\n\x08standard\x18\x02 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StandardH\x00\x12W\n\tpaginated\x18\x03 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedH\x00\x12K\n\x03lro\x18\x04 \x01(\x0b\x32<.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroH\x00\x12\x64\n\x10\x63lient_streaming\x18\x05 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientStreamingH\x00\x12\x64\n\x10server_streaming\x18\x06 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ServerStreamingH\x00\x12`\n\x0e\x62idi_streaming\x18\x07 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.BidiStreamingH\x00\x12T\n\x10\x66inal_statements\x18\x08 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xff\x03\n\x14\x43lientInitialization\x12]\n\x19pre_client_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12~\n\x17\x63ustom_service_endpoint\x18\x02 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint\x1a\x87\x02\n\x0fServiceEndpoint\x12\x83\x01\n\x06schema\x18\x01 \x01(\x0e\x32s.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint.ServiceEndpointSchema\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0e\n\x06region\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\x05\"B\n\x15ServiceEndpointSchema\x12\x14\n\x10LANGUAGE_DEFAULT\x10\x00\x12\t\n\x05HTTPS\x10\x01\x12\x08\n\x04HTTP\x10\x02\x1a\xbf\x02\n\x08Standard\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12j\n\x11response_handling\x18\x03 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xce\x02\n\tPaginated\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12[\n\x0epaginated_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12n\n\x12paginated_handling\x18\x03 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling\x1a\xb2\x02\n\x03Lro\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x62\n\x0clro_handling\x18\x03 \x01(\x0b\x32L.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling\x1a\xf4\x02\n\x0f\x43lientStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12j\n\x11response_handling\x18\x04 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xf4\x02\n\x0fServerStreaming\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12`\n\x13initialization_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12server_stream_name\x18\x03 \x01(\t\x12m\n\x11response_handling\x18\x04 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1a\x91\x03\n\rBidiStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12\x1a\n\x12server_stream_name\x18\x04 \x01(\t\x12m\n\x11response_handling\x18\x05 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1aZ\n\nClientCall\x12L\n\x08pre_call\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe7\x01\n\x1bSimpleRequestInitialization\x12^\n\x1apre_request_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12R\n\rrequest_value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x14\n\x0crequest_name\x18\x03 \x01(\t\x1a\xe1\x02\n\x1eStreamingRequestInitialization\x12u\n\x17\x66irst_streaming_request\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12W\n\titeration\x18\x03 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration\x12o\n\x11streaming_request\x18\x04 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x1a/\n\x16SimpleResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x1a\xec\x07\n\x19PaginatedResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12l\n\x07\x62y_item\x18\x02 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItemH\x00\x12l\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageH\x00\x12{\n\x0fnext_page_token\x18\x04 \x01(\x0b\x32`.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.NextPageTokenH\x00\x1at\n\x06\x42yItem\x12\x11\n\titem_name\x18\x01 \x01(\t\x12W\n\x13per_item_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe0\x01\n\x06\x42yPage\x12\x11\n\tpage_name\x18\x01 \x01(\t\x12W\n\x13per_page_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12j\n\x07\x62y_item\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItem\x1a\xf2\x01\n\rNextPageToken\x12\x1c\n\x14next_page_token_name\x18\x01 \x01(\t\x12W\n\x12\x65xplicit_page_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12j\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageB\x11\n\x0fpagination_kind\x1a\xcf\x02\n\x13LroResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12n\n\x0cpolling_type\x18\x02 \x01(\x0e\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling.PollingType\x12\x1d\n\x15polling_response_name\x18\x03 \x01(\t\x12Y\n\x0cpolling_call\x18\x04 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\"7\n\x0bPollingType\x12\x14\n\x10UNTIL_COMPLETION\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04NONE\x10\x02\x1a\x9e\x01\n\x19StreamingResponseHandling\x12\x1d\n\x15\x63urrent_response_name\x18\x01 \x01(\t\x12\x62\n\x1eper_stream_response_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.StatementB\x06\n\x04\x63\x61ll\"\xc5\x18\n\tStatement\x12]\n\x0b\x64\x65\x63laration\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.DeclarationH\x00\x12\x64\n\x0fstandard_output\x18\x02 \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Statement.StandardOutputH\x00\x12S\n\x06return\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ReturnH\x00\x12]\n\x0b\x63onditional\x18\x04 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ConditionalH\x00\x12Y\n\titeration\x18\x05 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.IterationH\x00\x1a\xc1\x01\n\x0b\x44\x65\x63laration\x12\x43\n\x04type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12\x0c\n\x04name\x18\x02 \x01(\t\x12J\n\x05value\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x1a\\\n\x0eStandardOutput\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1aU\n\x06Return\x12K\n\x06result\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xf8\x01\n\x0b\x43onditional\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x07on_true\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12L\n\x08on_false\x18\x03 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdd\x0f\n\tIteration\x12\x83\x01\n\x1anumeric_sequence_iteration\x18\x01 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.NumericSequenceIterationH\x00\x12t\n\x12repeated_iteration\x18\x02 \x01(\x0b\x32V.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.RepeatedIterationH\x00\x12j\n\rmap_iteration\x18\x03 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.MapIterationH\x00\x12n\n\x0f\x62ytes_iteration\x18\x04 \x01(\x0b\x32S.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.BytesIterationH\x00\x12N\n\nstatements\x18\x05 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdc\x05\n\x18NumericSequenceIteration\x12X\n\x08start_at\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12P\n\tincrement\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Q\n\nmultiplier\x18\x04 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Y\n\x12less_than_or_equal\x18\x07 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12P\n\tless_than\x18\x08 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12\\\n\x15greater_than_or_equal\x18\t \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12S\n\x0cgreater_than\x18\n \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12R\n\x0btotal_steps\x18\x0b \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x42\x06\n\x04stepB\x05\n\x03\x65nd\x1a\x8c\x01\n\x11RepeatedIteration\x12\x61\n\x11repeated_elements\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x14\n\x0c\x63urrent_name\x18\x02 \x01(\t\x1a\x99\x01\n\x0cMapIteration\x12S\n\x03map\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x18\n\x10\x63urrent_key_name\x18\x02 \x01(\t\x12\x1a\n\x12\x63urrent_value_name\x18\x03 \x01(\t\x1a\x8b\x03\n\x0e\x42ytesIteration\x12]\n\rbyte_sequence\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12Q\n\nchunk_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\x0ctotal_chunks\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\nchunk_type\x18\x04 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType\x12\x14\n\x0c\x63urrent_name\x18\x05 \x01(\tB\x07\n\x05\x63hunkB\x10\n\x0eiteration_typeB\x10\n\x0estatement_type\"\xb6\r\n\x04Type\x12W\n\x0bscalar_type\x18\x01 \x01(\x0e\x32@.google.cloud.tools.snippetgen.configlanguage.v1.Type.ScalarTypeH\x00\x12S\n\tenum_type\x18\x02 \x01(\x0b\x32>.google.cloud.tools.snippetgen.configlanguage.v1.Type.EnumTypeH\x00\x12U\n\nbytes_type\x18\x03 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesTypeH\x00\x12Y\n\x0cmessage_type\x18\x04 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Type.MessageTypeH\x00\x12[\n\rrepeated_type\x18\x05 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedTypeH\x00\x12Q\n\x08map_type\x18\x06 \x01(\x0b\x32=.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapTypeH\x00\x1a\"\n\x08\x45numType\x12\x16\n\x0e\x65num_full_name\x18\x01 \x01(\t\x1a\xce\x01\n\tBytesType\x12o\n\x13language_equivalent\x18\x01 \x01(\x0e\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType.LanguageEquivalent\"P\n\x12LanguageEquivalent\x12\x12\n\x0ePROTOBUF_BYTES\x10\x00\x12\n\n\x06\x42\x41SE64\x10\x01\x12\x0e\n\nBYTE_ARRAY\x10\x02\x12\n\n\x06STREAM\x10\x03\x1a(\n\x0bMessageType\x12\x19\n\x11message_full_name\x18\x01 \x01(\t\x1a\x91\x02\n\x0cRepeatedType\x12K\n\x0c\x65lement_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12r\n\x13language_equivalent\x18\x02 \x01(\x0e\x32U.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedType.LanguageEquivalent\"@\n\x12LanguageEquivalent\x12\x15\n\x11PROTOBUF_REPEATED\x10\x00\x12\t\n\x05\x41RRAY\x10\x01\x12\x08\n\x04LIST\x10\x02\x1a\xc4\x02\n\x07MapType\x12G\n\x08key_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12I\n\nvalue_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12m\n\x13language_equivalent\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapType.LanguageEquivalent\"6\n\x12LanguageEquivalent\x12\x10\n\x0cPROTOBUF_MAP\x10\x00\x12\x0e\n\nDICTIONARY\x10\x01\"\x96\x02\n\nScalarType\x12\x19\n\x15SCALAR_TYPE_UNDEFINED\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\x42\x0b\n\ttype_kind\"\xa8\x10\n\nExpression\x12[\n\nnull_value\x18\x01 \x01(\x0e\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NullValueH\x00\x12\x61\n\rdefault_value\x18\x02 \x01(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.DefaultValueH\x00\x12[\n\nname_value\x18\x03 \x01(\x0b\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NameValueH\x00\x12\x16\n\x0cnumber_value\x18\x04 \x01(\x01H\x00\x12\x17\n\rboolean_value\x18\x05 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x00\x12\x14\n\nenum_value\x18\x07 \x01(\tH\x00\x12]\n\x0b\x62ytes_value\x18\x08 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValueH\x00\x12\x61\n\rcomplex_value\x18\t \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValueH\x00\x12_\n\nlist_value\x18\n \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Expression.RepeatedValueH\x00\x12Y\n\tmap_value\x18\x0b \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Expression.MapValueH\x00\x12l\n\x11\x63onditional_value\x18\x0c \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ConditionalOperatorH\x00\x12\x13\n\x0b\x64\x65scription\x18\r \x01(\t\x1a\'\n\tNameValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x1a\xb3\x02\n\nBytesValue\x12T\n\rbase64_string\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12h\n\x0b\x66ile_stream\x18\x02 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValue.FileStreamH\x00\x1a\\\n\nFileStream\x12N\n\tfile_path\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionB\x07\n\x05value\x1a\xec\x01\n\x0c\x43omplexValue\x12l\n\nproperties\x18\x01 \x03(\x0b\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValue.PropertiesEntry\x1an\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression:\x02\x38\x01\x1a\\\n\rRepeatedValue\x12K\n\x06values\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xa2\x01\n\x08MapValue\x12I\n\x04keys\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x06values\x18\x02 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\x82\x02\n\x13\x43onditionalOperator\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12L\n\x07on_true\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12M\n\x08on_false\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\"\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\"!\n\x0c\x44\x65\x66\x61ultValue\x12\x11\n\rDEFAULT_VALUE\x10\x00\x42\x07\n\x05value*\xa3\x01\n\x17GeneratorOutputLanguage\x12)\n%GENERATOR_OUTPUT_LANGUAGE_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x43_PLUS_PLUS\x10\x01\x12\x0b\n\x07\x43_SHARP\x10\x02\x12\x06\n\x02GO\x10\x03\x12\x08\n\x04JAVA\x10\x04\x12\x0e\n\nJAVASCRIPT\x10\x05\x12\x07\n\x03PHP\x10\x06\x12\n\n\x06PYTHON\x10\x07\x12\x08\n\x04RUBY\x10\x08\x42\xee\x01\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\x1aSnippetConfigLanguageProtoP\x01\xaa\x02/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\xca\x02/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\xea\x02\x34Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x1dsnippet_config_language.proto\x12/google.cloud.tools.snippetgen.configlanguage.v1\x1a google/protobuf/descriptor.proto\"\xcd\x02\n\rSnippetConfig\x12X\n\x08metadata\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.SnippetConfigMetadata\x12\x41\n\x03rpc\x18\x02 \x01(\x0b\x32\x34.google.cloud.tools.snippetgen.configlanguage.v1.Rpc\x12T\n\tsignature\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature\x12I\n\x07snippet\x18\x04 \x01(\x0b\x32\x38.google.cloud.tools.snippetgen.configlanguage.v1.Snippet\"\xd3\x01\n\x15SnippetConfigMetadata\x12\x0f\n\x07skipped\x18\x01 \x01(\x08\x12\x63\n\x11skipped_languages\x18\x02 \x03(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.GeneratorOutputLanguage\x12\x11\n\tconfig_id\x18\x03 \x01(\t\x12\x14\n\x0csnippet_name\x18\x04 \x01(\t\x12\x1b\n\x13snippet_description\x18\x05 \x01(\t\"Y\n\x03Rpc\x12\x15\n\rproto_package\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x03(\t\x12\x14\n\x0cservice_name\x18\x03 \x01(\t\x12\x10\n\x08rpc_name\x18\x04 \x01(\t\"\x99\x03\n\x10SnippetSignature\x12\x1b\n\x13snippet_method_name\x18\x01 \x01(\t\x12J\n\x0breturn_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12i\n\x0fsync_preference\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.SnippetSignature.SyncPreference\x12Z\n\nparameters\x18\x04 \x03(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\"U\n\x0eSyncPreference\x12\x16\n\x12LANGUAGE_PREFERRED\x10\x00\x12\x10\n\x0cPREFER_ASYNC\x10\x01\x12\x0f\n\x0bPREFER_SYNC\x10\x02\x12\x08\n\x04\x42OTH\x10\x03\"\x91,\n\x07Snippet\x12t\n\x1dservice_client_initialization\x18\x01 \x01(\x0b\x32M.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization\x12U\n\x08standard\x18\x02 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StandardH\x00\x12W\n\tpaginated\x18\x03 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedH\x00\x12K\n\x03lro\x18\x04 \x01(\x0b\x32<.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroH\x00\x12\x64\n\x10\x63lient_streaming\x18\x05 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientStreamingH\x00\x12\x64\n\x10server_streaming\x18\x06 \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ServerStreamingH\x00\x12`\n\x0e\x62idi_streaming\x18\x07 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.BidiStreamingH\x00\x12T\n\x10\x66inal_statements\x18\x08 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xff\x03\n\x14\x43lientInitialization\x12]\n\x19pre_client_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12~\n\x17\x63ustom_service_endpoint\x18\x02 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint\x1a\x87\x02\n\x0fServiceEndpoint\x12\x83\x01\n\x06schema\x18\x01 \x01(\x0e\x32s.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientInitialization.ServiceEndpoint.ServiceEndpointSchema\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0e\n\x06region\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\x05\"B\n\x15ServiceEndpointSchema\x12\x14\n\x10LANGUAGE_DEFAULT\x10\x00\x12\t\n\x05HTTPS\x10\x01\x12\x08\n\x04HTTP\x10\x02\x1a\xbf\x02\n\x08Standard\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12j\n\x11response_handling\x18\x03 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xce\x02\n\tPaginated\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12[\n\x0epaginated_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12n\n\x12paginated_handling\x18\x03 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling\x1a\xb2\x02\n\x03Lro\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12Q\n\x04\x63\x61ll\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x62\n\x0clro_handling\x18\x03 \x01(\x0b\x32L.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling\x1a\xf4\x02\n\x0f\x43lientStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12j\n\x11response_handling\x18\x04 \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleResponseHandling\x1a\xf4\x02\n\x0fServerStreaming\x12t\n\x16request_initialization\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12`\n\x13initialization_call\x18\x02 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12server_stream_name\x18\x03 \x01(\t\x12m\n\x11response_handling\x18\x04 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1a\x91\x03\n\rBidiStreaming\x12`\n\x13initialization_call\x18\x01 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\x12\x1a\n\x12\x63lient_stream_name\x18\x02 \x01(\t\x12w\n\x16request_initialization\x18\x03 \x01(\x0b\x32W.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingRequestInitialization\x12\x1a\n\x12server_stream_name\x18\x04 \x01(\t\x12m\n\x11response_handling\x18\x05 \x01(\x0b\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.StreamingResponseHandling\x1aZ\n\nClientCall\x12L\n\x08pre_call\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe7\x01\n\x1bSimpleRequestInitialization\x12^\n\x1apre_request_initialization\x18\x01 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12R\n\rrequest_value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x14\n\x0crequest_name\x18\x03 \x01(\t\x1a\xe1\x02\n\x1eStreamingRequestInitialization\x12u\n\x17\x66irst_streaming_request\x18\x01 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x12W\n\titeration\x18\x03 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration\x12o\n\x11streaming_request\x18\x04 \x01(\x0b\x32T.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.SimpleRequestInitialization\x1a/\n\x16SimpleResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x1a\xec\x07\n\x19PaginatedResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12l\n\x07\x62y_item\x18\x02 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItemH\x00\x12l\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageH\x00\x12{\n\x0fnext_page_token\x18\x04 \x01(\x0b\x32`.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.NextPageTokenH\x00\x1at\n\x06\x42yItem\x12\x11\n\titem_name\x18\x01 \x01(\t\x12W\n\x13per_item_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xe0\x01\n\x06\x42yPage\x12\x11\n\tpage_name\x18\x01 \x01(\t\x12W\n\x13per_page_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12j\n\x07\x62y_item\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByItem\x1a\xf2\x01\n\rNextPageToken\x12\x1c\n\x14next_page_token_name\x18\x01 \x01(\t\x12W\n\x12\x65xplicit_page_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12j\n\x07\x62y_page\x18\x03 \x01(\x0b\x32Y.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.PaginatedResponseHandling.ByPageB\x11\n\x0fpagination_kind\x1a\xcf\x02\n\x13LroResponseHandling\x12\x15\n\rresponse_name\x18\x01 \x01(\t\x12n\n\x0cpolling_type\x18\x02 \x01(\x0e\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.LroResponseHandling.PollingType\x12\x1d\n\x15polling_response_name\x18\x03 \x01(\t\x12Y\n\x0cpolling_call\x18\x04 \x01(\x0b\x32\x43.google.cloud.tools.snippetgen.configlanguage.v1.Snippet.ClientCall\"7\n\x0bPollingType\x12\x14\n\x10UNTIL_COMPLETION\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04NONE\x10\x02\x1a\x9e\x01\n\x19StreamingResponseHandling\x12\x1d\n\x15\x63urrent_response_name\x18\x01 \x01(\t\x12\x62\n\x1eper_stream_response_statements\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.StatementB\x06\n\x04\x63\x61ll\"\xc5\x18\n\tStatement\x12]\n\x0b\x64\x65\x63laration\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.DeclarationH\x00\x12\x64\n\x0fstandard_output\x18\x02 \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Statement.StandardOutputH\x00\x12S\n\x06return\x18\x03 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ReturnH\x00\x12]\n\x0b\x63onditional\x18\x04 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.ConditionalH\x00\x12Y\n\titeration\x18\x05 \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Statement.IterationH\x00\x1a\xc1\x01\n\x0b\x44\x65\x63laration\x12\x43\n\x04type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12\x0c\n\x04name\x18\x02 \x01(\t\x12J\n\x05value\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x1a\\\n\x0eStandardOutput\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1aU\n\x06Return\x12K\n\x06result\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xf8\x01\n\x0b\x43onditional\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x07on_true\x18\x02 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x12L\n\x08on_false\x18\x03 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdd\x0f\n\tIteration\x12\x83\x01\n\x1anumeric_sequence_iteration\x18\x01 \x01(\x0b\x32].google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.NumericSequenceIterationH\x00\x12t\n\x12repeated_iteration\x18\x02 \x01(\x0b\x32V.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.RepeatedIterationH\x00\x12j\n\rmap_iteration\x18\x03 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.MapIterationH\x00\x12n\n\x0f\x62ytes_iteration\x18\x04 \x01(\x0b\x32S.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Iteration.BytesIterationH\x00\x12N\n\nstatements\x18\x05 \x03(\x0b\x32:.google.cloud.tools.snippetgen.configlanguage.v1.Statement\x1a\xdc\x05\n\x18NumericSequenceIteration\x12X\n\x08start_at\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12P\n\tincrement\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Q\n\nmultiplier\x18\x04 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12Y\n\x12less_than_or_equal\x18\x07 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12P\n\tless_than\x18\x08 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12\\\n\x15greater_than_or_equal\x18\t \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12S\n\x0cgreater_than\x18\n \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x12R\n\x0btotal_steps\x18\x0b \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x01\x42\x06\n\x04stepB\x05\n\x03\x65nd\x1a\x8c\x01\n\x11RepeatedIteration\x12\x61\n\x11repeated_elements\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x14\n\x0c\x63urrent_name\x18\x02 \x01(\t\x1a\x99\x01\n\x0cMapIteration\x12S\n\x03map\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12\x18\n\x10\x63urrent_key_name\x18\x02 \x01(\t\x12\x1a\n\x12\x63urrent_value_name\x18\x03 \x01(\t\x1a\x8b\x03\n\x0e\x42ytesIteration\x12]\n\rbyte_sequence\x18\x01 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Statement.Declaration\x12Q\n\nchunk_size\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\x0ctotal_chunks\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12S\n\nchunk_type\x18\x04 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType\x12\x14\n\x0c\x63urrent_name\x18\x05 \x01(\tB\x07\n\x05\x63hunkB\x10\n\x0eiteration_typeB\x10\n\x0estatement_type\"\xb6\r\n\x04Type\x12W\n\x0bscalar_type\x18\x01 \x01(\x0e\x32@.google.cloud.tools.snippetgen.configlanguage.v1.Type.ScalarTypeH\x00\x12S\n\tenum_type\x18\x02 \x01(\x0b\x32>.google.cloud.tools.snippetgen.configlanguage.v1.Type.EnumTypeH\x00\x12U\n\nbytes_type\x18\x03 \x01(\x0b\x32?.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesTypeH\x00\x12Y\n\x0cmessage_type\x18\x04 \x01(\x0b\x32\x41.google.cloud.tools.snippetgen.configlanguage.v1.Type.MessageTypeH\x00\x12[\n\rrepeated_type\x18\x05 \x01(\x0b\x32\x42.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedTypeH\x00\x12Q\n\x08map_type\x18\x06 \x01(\x0b\x32=.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapTypeH\x00\x1a\"\n\x08\x45numType\x12\x16\n\x0e\x65num_full_name\x18\x01 \x01(\t\x1a\xce\x01\n\tBytesType\x12o\n\x13language_equivalent\x18\x01 \x01(\x0e\x32R.google.cloud.tools.snippetgen.configlanguage.v1.Type.BytesType.LanguageEquivalent\"P\n\x12LanguageEquivalent\x12\x12\n\x0ePROTOBUF_BYTES\x10\x00\x12\n\n\x06\x42\x41SE64\x10\x01\x12\x0e\n\nBYTE_ARRAY\x10\x02\x12\n\n\x06STREAM\x10\x03\x1a(\n\x0bMessageType\x12\x19\n\x11message_full_name\x18\x01 \x01(\t\x1a\x91\x02\n\x0cRepeatedType\x12K\n\x0c\x65lement_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12r\n\x13language_equivalent\x18\x02 \x01(\x0e\x32U.google.cloud.tools.snippetgen.configlanguage.v1.Type.RepeatedType.LanguageEquivalent\"@\n\x12LanguageEquivalent\x12\x15\n\x11PROTOBUF_REPEATED\x10\x00\x12\t\n\x05\x41RRAY\x10\x01\x12\x08\n\x04LIST\x10\x02\x1a\xc4\x02\n\x07MapType\x12G\n\x08key_type\x18\x01 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12I\n\nvalue_type\x18\x02 \x01(\x0b\x32\x35.google.cloud.tools.snippetgen.configlanguage.v1.Type\x12m\n\x13language_equivalent\x18\x03 \x01(\x0e\x32P.google.cloud.tools.snippetgen.configlanguage.v1.Type.MapType.LanguageEquivalent\"6\n\x12LanguageEquivalent\x12\x10\n\x0cPROTOBUF_MAP\x10\x00\x12\x0e\n\nDICTIONARY\x10\x01\"\x96\x02\n\nScalarType\x12\x19\n\x15SCALAR_TYPE_UNDEFINED\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\x42\x0b\n\ttype_kind\"\xa8\x10\n\nExpression\x12[\n\nnull_value\x18\x01 \x01(\x0e\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NullValueH\x00\x12\x61\n\rdefault_value\x18\x02 \x01(\x0e\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.DefaultValueH\x00\x12[\n\nname_value\x18\x03 \x01(\x0b\x32\x45.google.cloud.tools.snippetgen.configlanguage.v1.Expression.NameValueH\x00\x12\x16\n\x0cnumber_value\x18\x04 \x01(\x01H\x00\x12\x17\n\rboolean_value\x18\x05 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x00\x12\x14\n\nenum_value\x18\x07 \x01(\tH\x00\x12]\n\x0b\x62ytes_value\x18\x08 \x01(\x0b\x32\x46.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValueH\x00\x12\x61\n\rcomplex_value\x18\t \x01(\x0b\x32H.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValueH\x00\x12_\n\nlist_value\x18\n \x01(\x0b\x32I.google.cloud.tools.snippetgen.configlanguage.v1.Expression.RepeatedValueH\x00\x12Y\n\tmap_value\x18\x0b \x01(\x0b\x32\x44.google.cloud.tools.snippetgen.configlanguage.v1.Expression.MapValueH\x00\x12l\n\x11\x63onditional_value\x18\x0c \x01(\x0b\x32O.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ConditionalOperatorH\x00\x12\x13\n\x0b\x64\x65scription\x18\r \x01(\t\x1a\'\n\tNameValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x1a\xb3\x02\n\nBytesValue\x12T\n\rbase64_string\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionH\x00\x12h\n\x0b\x66ile_stream\x18\x02 \x01(\x0b\x32Q.google.cloud.tools.snippetgen.configlanguage.v1.Expression.BytesValue.FileStreamH\x00\x1a\\\n\nFileStream\x12N\n\tfile_path\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.ExpressionB\x07\n\x05value\x1a\xec\x01\n\x0c\x43omplexValue\x12l\n\nproperties\x18\x01 \x03(\x0b\x32X.google.cloud.tools.snippetgen.configlanguage.v1.Expression.ComplexValue.PropertiesEntry\x1an\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12J\n\x05value\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression:\x02\x38\x01\x1a\\\n\rRepeatedValue\x12K\n\x06values\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\xa2\x01\n\x08MapValue\x12I\n\x04keys\x18\x01 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12K\n\x06values\x18\x02 \x03(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x1a\x82\x02\n\x13\x43onditionalOperator\x12N\n\tcondition\x18\x01 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12L\n\x07on_true\x18\x02 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\x12M\n\x08on_false\x18\x03 \x01(\x0b\x32;.google.cloud.tools.snippetgen.configlanguage.v1.Expression\"\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\"!\n\x0c\x44\x65\x66\x61ultValue\x12\x11\n\rDEFAULT_VALUE\x10\x00\x42\x07\n\x05value*\xa3\x01\n\x17GeneratorOutputLanguage\x12)\n%GENERATOR_OUTPUT_LANGUAGE_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x43_PLUS_PLUS\x10\x01\x12\x0b\n\x07\x43_SHARP\x10\x02\x12\x06\n\x02GO\x10\x03\x12\x08\n\x04JAVA\x10\x04\x12\x0e\n\nJAVASCRIPT\x10\x05\x12\x07\n\x03PHP\x10\x06\x12\n\n\x06PYTHON\x10\x07\x12\x08\n\x04RUBY\x10\x08\x42\xee\x01\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\x1aSnippetConfigLanguageProtoP\x01\xaa\x02/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\xca\x02/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\xea\x02\x34Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1b\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'snippet_config_language_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages( + DESCRIPTOR, 'snippet_config_language_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\032SnippetConfigLanguageProtoP\001\252\002/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\312\002/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\352\0024Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1' - _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._options = None - _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_options = b'8\001' - _GENERATOROUTPUTLANGUAGE._serialized_start=13778 - _GENERATOROUTPUTLANGUAGE._serialized_end=13941 - _SNIPPETCONFIG._serialized_start=117 - _SNIPPETCONFIG._serialized_end=450 - _SNIPPETCONFIGMETADATA._serialized_start=453 - _SNIPPETCONFIGMETADATA._serialized_end=664 - _RPC._serialized_start=666 - _RPC._serialized_end=755 - _SNIPPETSIGNATURE._serialized_start=758 - _SNIPPETSIGNATURE._serialized_end=1167 - _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_start=1082 - _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_end=1167 - _SNIPPET._serialized_start=1170 - _SNIPPET._serialized_end=6819 - _SNIPPET_CLIENTINITIALIZATION._serialized_start=1941 - _SNIPPET_CLIENTINITIALIZATION._serialized_end=2452 - _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_start=2189 - _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_end=2452 - _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_start=2386 - _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_end=2452 - _SNIPPET_STANDARD._serialized_start=2455 - _SNIPPET_STANDARD._serialized_end=2774 - _SNIPPET_PAGINATED._serialized_start=2777 - _SNIPPET_PAGINATED._serialized_end=3111 - _SNIPPET_LRO._serialized_start=3114 - _SNIPPET_LRO._serialized_end=3420 - _SNIPPET_CLIENTSTREAMING._serialized_start=3423 - _SNIPPET_CLIENTSTREAMING._serialized_end=3795 - _SNIPPET_SERVERSTREAMING._serialized_start=3798 - _SNIPPET_SERVERSTREAMING._serialized_end=4170 - _SNIPPET_BIDISTREAMING._serialized_start=4173 - _SNIPPET_BIDISTREAMING._serialized_end=4574 - _SNIPPET_CLIENTCALL._serialized_start=4576 - _SNIPPET_CLIENTCALL._serialized_end=4666 - _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_start=4669 - _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_end=4900 - _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_start=4903 - _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_end=5256 - _SNIPPET_SIMPLERESPONSEHANDLING._serialized_start=5258 - _SNIPPET_SIMPLERESPONSEHANDLING._serialized_end=5305 - _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_start=5308 - _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_end=6312 - _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_start=5705 - _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_end=5821 - _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_start=5824 - _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_end=6048 - _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_start=6051 - _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_end=6293 - _SNIPPET_LRORESPONSEHANDLING._serialized_start=6315 - _SNIPPET_LRORESPONSEHANDLING._serialized_end=6650 - _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_start=6595 - _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_end=6650 - _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_start=6653 - _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_end=6811 - _STATEMENT._serialized_start=6822 - _STATEMENT._serialized_end=9963 - _STATEMENT_DECLARATION._serialized_start=7304 - _STATEMENT_DECLARATION._serialized_end=7497 - _STATEMENT_STANDARDOUTPUT._serialized_start=7499 - _STATEMENT_STANDARDOUTPUT._serialized_end=7591 - _STATEMENT_RETURN._serialized_start=7593 - _STATEMENT_RETURN._serialized_end=7678 - _STATEMENT_CONDITIONAL._serialized_start=7681 - _STATEMENT_CONDITIONAL._serialized_end=7929 - _STATEMENT_ITERATION._serialized_start=7932 - _STATEMENT_ITERATION._serialized_end=9945 - _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_start=8498 - _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_end=9230 - _STATEMENT_ITERATION_REPEATEDITERATION._serialized_start=9233 - _STATEMENT_ITERATION_REPEATEDITERATION._serialized_end=9373 - _STATEMENT_ITERATION_MAPITERATION._serialized_start=9376 - _STATEMENT_ITERATION_MAPITERATION._serialized_end=9529 - _STATEMENT_ITERATION_BYTESITERATION._serialized_start=9532 - _STATEMENT_ITERATION_BYTESITERATION._serialized_end=9927 - _TYPE._serialized_start=9966 - _TYPE._serialized_end=11684 - _TYPE_ENUMTYPE._serialized_start=10502 - _TYPE_ENUMTYPE._serialized_end=10536 - _TYPE_BYTESTYPE._serialized_start=10539 - _TYPE_BYTESTYPE._serialized_end=10745 - _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_start=10665 - _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_end=10745 - _TYPE_MESSAGETYPE._serialized_start=10747 - _TYPE_MESSAGETYPE._serialized_end=10787 - _TYPE_REPEATEDTYPE._serialized_start=10790 - _TYPE_REPEATEDTYPE._serialized_end=11063 - _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_start=10999 - _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_end=11063 - _TYPE_MAPTYPE._serialized_start=11066 - _TYPE_MAPTYPE._serialized_end=11390 - _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_start=11336 - _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_end=11390 - _TYPE_SCALARTYPE._serialized_start=11393 - _TYPE_SCALARTYPE._serialized_end=11671 - _EXPRESSION._serialized_start=11687 - _EXPRESSION._serialized_end=13775 - _EXPRESSION_NAMEVALUE._serialized_start=12594 - _EXPRESSION_NAMEVALUE._serialized_end=12633 - _EXPRESSION_BYTESVALUE._serialized_start=12636 - _EXPRESSION_BYTESVALUE._serialized_end=12943 - _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_start=12842 - _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_end=12934 - _EXPRESSION_COMPLEXVALUE._serialized_start=12946 - _EXPRESSION_COMPLEXVALUE._serialized_end=13182 - _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_start=13072 - _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_end=13182 - _EXPRESSION_REPEATEDVALUE._serialized_start=13184 - _EXPRESSION_REPEATEDVALUE._serialized_end=13276 - _EXPRESSION_MAPVALUE._serialized_start=13279 - _EXPRESSION_MAPVALUE._serialized_end=13441 - _EXPRESSION_CONDITIONALOPERATOR._serialized_start=13444 - _EXPRESSION_CONDITIONALOPERATOR._serialized_end=13702 - _EXPRESSION_NULLVALUE._serialized_start=13704 - _EXPRESSION_NULLVALUE._serialized_end=13731 - _EXPRESSION_DEFAULTVALUE._serialized_start=13733 - _EXPRESSION_DEFAULTVALUE._serialized_end=13766 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n3com.google.cloud.tools.snippetgen.configlanguage.v1B\032SnippetConfigLanguageProtoP\001\252\002/Google.Cloud.Tools.SnippetGen.ConfigLanguage.V1\312\002/Google\\Cloud\\Tools\\SnippetGen\\ConfigLanguage\\V1\352\0024Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1' + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._options = None + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_options = b'8\001' + _GENERATOROUTPUTLANGUAGE._serialized_start = 13778 + _GENERATOROUTPUTLANGUAGE._serialized_end = 13941 + _SNIPPETCONFIG._serialized_start = 117 + _SNIPPETCONFIG._serialized_end = 450 + _SNIPPETCONFIGMETADATA._serialized_start = 453 + _SNIPPETCONFIGMETADATA._serialized_end = 664 + _RPC._serialized_start = 666 + _RPC._serialized_end = 755 + _SNIPPETSIGNATURE._serialized_start = 758 + _SNIPPETSIGNATURE._serialized_end = 1167 + _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_start = 1082 + _SNIPPETSIGNATURE_SYNCPREFERENCE._serialized_end = 1167 + _SNIPPET._serialized_start = 1170 + _SNIPPET._serialized_end = 6819 + _SNIPPET_CLIENTINITIALIZATION._serialized_start = 1941 + _SNIPPET_CLIENTINITIALIZATION._serialized_end = 2452 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_start = 2189 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT._serialized_end = 2452 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_start = 2386 + _SNIPPET_CLIENTINITIALIZATION_SERVICEENDPOINT_SERVICEENDPOINTSCHEMA._serialized_end = 2452 + _SNIPPET_STANDARD._serialized_start = 2455 + _SNIPPET_STANDARD._serialized_end = 2774 + _SNIPPET_PAGINATED._serialized_start = 2777 + _SNIPPET_PAGINATED._serialized_end = 3111 + _SNIPPET_LRO._serialized_start = 3114 + _SNIPPET_LRO._serialized_end = 3420 + _SNIPPET_CLIENTSTREAMING._serialized_start = 3423 + _SNIPPET_CLIENTSTREAMING._serialized_end = 3795 + _SNIPPET_SERVERSTREAMING._serialized_start = 3798 + _SNIPPET_SERVERSTREAMING._serialized_end = 4170 + _SNIPPET_BIDISTREAMING._serialized_start = 4173 + _SNIPPET_BIDISTREAMING._serialized_end = 4574 + _SNIPPET_CLIENTCALL._serialized_start = 4576 + _SNIPPET_CLIENTCALL._serialized_end = 4666 + _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_start = 4669 + _SNIPPET_SIMPLEREQUESTINITIALIZATION._serialized_end = 4900 + _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_start = 4903 + _SNIPPET_STREAMINGREQUESTINITIALIZATION._serialized_end = 5256 + _SNIPPET_SIMPLERESPONSEHANDLING._serialized_start = 5258 + _SNIPPET_SIMPLERESPONSEHANDLING._serialized_end = 5305 + _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_start = 5308 + _SNIPPET_PAGINATEDRESPONSEHANDLING._serialized_end = 6312 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_start = 5705 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYITEM._serialized_end = 5821 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_start = 5824 + _SNIPPET_PAGINATEDRESPONSEHANDLING_BYPAGE._serialized_end = 6048 + _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_start = 6051 + _SNIPPET_PAGINATEDRESPONSEHANDLING_NEXTPAGETOKEN._serialized_end = 6293 + _SNIPPET_LRORESPONSEHANDLING._serialized_start = 6315 + _SNIPPET_LRORESPONSEHANDLING._serialized_end = 6650 + _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_start = 6595 + _SNIPPET_LRORESPONSEHANDLING_POLLINGTYPE._serialized_end = 6650 + _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_start = 6653 + _SNIPPET_STREAMINGRESPONSEHANDLING._serialized_end = 6811 + _STATEMENT._serialized_start = 6822 + _STATEMENT._serialized_end = 9963 + _STATEMENT_DECLARATION._serialized_start = 7304 + _STATEMENT_DECLARATION._serialized_end = 7497 + _STATEMENT_STANDARDOUTPUT._serialized_start = 7499 + _STATEMENT_STANDARDOUTPUT._serialized_end = 7591 + _STATEMENT_RETURN._serialized_start = 7593 + _STATEMENT_RETURN._serialized_end = 7678 + _STATEMENT_CONDITIONAL._serialized_start = 7681 + _STATEMENT_CONDITIONAL._serialized_end = 7929 + _STATEMENT_ITERATION._serialized_start = 7932 + _STATEMENT_ITERATION._serialized_end = 9945 + _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_start = 8498 + _STATEMENT_ITERATION_NUMERICSEQUENCEITERATION._serialized_end = 9230 + _STATEMENT_ITERATION_REPEATEDITERATION._serialized_start = 9233 + _STATEMENT_ITERATION_REPEATEDITERATION._serialized_end = 9373 + _STATEMENT_ITERATION_MAPITERATION._serialized_start = 9376 + _STATEMENT_ITERATION_MAPITERATION._serialized_end = 9529 + _STATEMENT_ITERATION_BYTESITERATION._serialized_start = 9532 + _STATEMENT_ITERATION_BYTESITERATION._serialized_end = 9927 + _TYPE._serialized_start = 9966 + _TYPE._serialized_end = 11684 + _TYPE_ENUMTYPE._serialized_start = 10502 + _TYPE_ENUMTYPE._serialized_end = 10536 + _TYPE_BYTESTYPE._serialized_start = 10539 + _TYPE_BYTESTYPE._serialized_end = 10745 + _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_start = 10665 + _TYPE_BYTESTYPE_LANGUAGEEQUIVALENT._serialized_end = 10745 + _TYPE_MESSAGETYPE._serialized_start = 10747 + _TYPE_MESSAGETYPE._serialized_end = 10787 + _TYPE_REPEATEDTYPE._serialized_start = 10790 + _TYPE_REPEATEDTYPE._serialized_end = 11063 + _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_start = 10999 + _TYPE_REPEATEDTYPE_LANGUAGEEQUIVALENT._serialized_end = 11063 + _TYPE_MAPTYPE._serialized_start = 11066 + _TYPE_MAPTYPE._serialized_end = 11390 + _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_start = 11336 + _TYPE_MAPTYPE_LANGUAGEEQUIVALENT._serialized_end = 11390 + _TYPE_SCALARTYPE._serialized_start = 11393 + _TYPE_SCALARTYPE._serialized_end = 11671 + _EXPRESSION._serialized_start = 11687 + _EXPRESSION._serialized_end = 13775 + _EXPRESSION_NAMEVALUE._serialized_start = 12594 + _EXPRESSION_NAMEVALUE._serialized_end = 12633 + _EXPRESSION_BYTESVALUE._serialized_start = 12636 + _EXPRESSION_BYTESVALUE._serialized_end = 12943 + _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_start = 12842 + _EXPRESSION_BYTESVALUE_FILESTREAM._serialized_end = 12934 + _EXPRESSION_COMPLEXVALUE._serialized_start = 12946 + _EXPRESSION_COMPLEXVALUE._serialized_end = 13182 + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_start = 13072 + _EXPRESSION_COMPLEXVALUE_PROPERTIESENTRY._serialized_end = 13182 + _EXPRESSION_REPEATEDVALUE._serialized_start = 13184 + _EXPRESSION_REPEATEDVALUE._serialized_end = 13276 + _EXPRESSION_MAPVALUE._serialized_start = 13279 + _EXPRESSION_MAPVALUE._serialized_end = 13441 + _EXPRESSION_CONDITIONALOPERATOR._serialized_start = 13444 + _EXPRESSION_CONDITIONALOPERATOR._serialized_end = 13702 + _EXPRESSION_NULLVALUE._serialized_start = 13704 + _EXPRESSION_NULLVALUE._serialized_end = 13731 + _EXPRESSION_DEFAULTVALUE._serialized_start = 13733 + _EXPRESSION_DEFAULTVALUE._serialized_end = 13766 # @@protoc_insertion_point(module_scope) From e7e153c06fa7fbb443123f4416534662495331fe Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Fri, 2 Dec 2022 23:21:12 -0800 Subject: [PATCH 04/11] fix test data, NameValue.path is repeated str --- tests/configurable_snippetgen/speech_createCustomClass.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/configurable_snippetgen/speech_createCustomClass.json b/tests/configurable_snippetgen/speech_createCustomClass.json index b10fbcab3e..a86d14c521 100644 --- a/tests/configurable_snippetgen/speech_createCustomClass.json +++ b/tests/configurable_snippetgen/speech_createCustomClass.json @@ -117,7 +117,7 @@ "value": { "nameValue": { "name": "created_custom_class", - "path": "name" + "path": ["name"] } } } @@ -146,7 +146,7 @@ "value": { "nameValue": { "name": "created_custom_class", - "path": "items" + "path": ["items"] } } }, From a30d85d144930d06e740d0f19968cf1b272bfbda Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Sat, 3 Dec 2022 18:59:23 -0800 Subject: [PATCH 05/11] include a local copy of speech v1 proto --- .../goldens/speech/cloud_speech.proto | 899 ++++++++++++++++++ .../speech/cloud_speech_adaptation.proto | 370 +++++++ .../goldens/speech/resource.proto | 138 +++ .../speech}/speech_createCustomClass.json | 0 ...ptation_create_custom_class_basic_async.py | 0 5 files changed, 1407 insertions(+) create mode 100644 tests/configurable_snippetgen/goldens/speech/cloud_speech.proto create mode 100644 tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto create mode 100644 tests/configurable_snippetgen/goldens/speech/resource.proto rename tests/configurable_snippetgen/{ => goldens/speech}/speech_createCustomClass.json (100%) rename tests/configurable_snippetgen/goldens/{ => speech}/speech_v1_generated_adaptation_create_custom_class_basic_async.py (100%) diff --git a/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto b/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto new file mode 100644 index 0000000000..65aed9837e --- /dev/null +++ b/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto @@ -0,0 +1,899 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.cloud.speech.v1; + +import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/cloud/speech/v1/resource.proto"; +import "google/longrunning/operations.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; +import "google/rpc/status.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/cloud/speech/v1;speech"; +option java_multiple_files = true; +option java_outer_classname = "SpeechProto"; +option java_package = "com.google.cloud.speech.v1"; +option objc_class_prefix = "GCS"; + +// Service that implements Google Cloud Speech API. +service Speech { + option (google.api.default_host) = "speech.googleapis.com"; + option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; + + // Performs synchronous speech recognition: receive results after all audio + // has been sent and processed. + rpc Recognize(RecognizeRequest) returns (RecognizeResponse) { + option (google.api.http) = { + post: "/v1/speech:recognize" + body: "*" + }; + option (google.api.method_signature) = "config,audio"; + } + + // Performs asynchronous speech recognition: receive results via the + // google.longrunning.Operations interface. Returns either an + // `Operation.error` or an `Operation.response` which contains + // a `LongRunningRecognizeResponse` message. + // For more information on asynchronous speech recognition, see the + // [how-to](https://cloud.google.com/speech-to-text/docs/async-recognize). + rpc LongRunningRecognize(LongRunningRecognizeRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/speech:longrunningrecognize" + body: "*" + }; + option (google.api.method_signature) = "config,audio"; + option (google.longrunning.operation_info) = { + response_type: "LongRunningRecognizeResponse" + metadata_type: "LongRunningRecognizeMetadata" + }; + } + + // Performs bidirectional streaming speech recognition: receive results while + // sending audio. This method is only available via the gRPC API (not REST). + rpc StreamingRecognize(stream StreamingRecognizeRequest) returns (stream StreamingRecognizeResponse) { + } +} + +// The top-level message sent by the client for the `Recognize` method. +message RecognizeRequest { + // Required. Provides information to the recognizer that specifies how to + // process the request. + RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. The audio data to be recognized. + RecognitionAudio audio = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// The top-level message sent by the client for the `LongRunningRecognize` +// method. +message LongRunningRecognizeRequest { + // Required. Provides information to the recognizer that specifies how to + // process the request. + RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. The audio data to be recognized. + RecognitionAudio audio = 2 [(google.api.field_behavior) = REQUIRED]; + + // Optional. Specifies an optional destination for the recognition results. + TranscriptOutputConfig output_config = 4 [(google.api.field_behavior) = OPTIONAL]; +} + +// Specifies an optional destination for the recognition results. +message TranscriptOutputConfig { + oneof output_type { + // Specifies a Cloud Storage URI for the recognition results. Must be + // specified in the format: `gs://bucket_name/object_name`, and the bucket + // must already exist. + string gcs_uri = 1; + } +} + +// The top-level message sent by the client for the `StreamingRecognize` method. +// Multiple `StreamingRecognizeRequest` messages are sent. The first message +// must contain a `streaming_config` message and must not contain +// `audio_content`. All subsequent messages must contain `audio_content` and +// must not contain a `streaming_config` message. +message StreamingRecognizeRequest { + // The streaming request, which is either a streaming config or audio content. + oneof streaming_request { + // Provides information to the recognizer that specifies how to process the + // request. The first `StreamingRecognizeRequest` message must contain a + // `streaming_config` message. + StreamingRecognitionConfig streaming_config = 1; + + // The audio data to be recognized. Sequential chunks of audio data are sent + // in sequential `StreamingRecognizeRequest` messages. The first + // `StreamingRecognizeRequest` message must not contain `audio_content` data + // and all subsequent `StreamingRecognizeRequest` messages must contain + // `audio_content` data. The audio bytes must be encoded as specified in + // `RecognitionConfig`. Note: as with all bytes fields, proto buffers use a + // pure binary representation (not base64). See + // [content limits](https://cloud.google.com/speech-to-text/quotas#content). + bytes audio_content = 2; + } +} + +// Provides information to the recognizer that specifies how to process the +// request. +message StreamingRecognitionConfig { + // Required. Provides information to the recognizer that specifies how to + // process the request. + RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; + + // If `false` or omitted, the recognizer will perform continuous + // recognition (continuing to wait for and process audio even if the user + // pauses speaking) until the client closes the input stream (gRPC API) or + // until the maximum time limit has been reached. May return multiple + // `StreamingRecognitionResult`s with the `is_final` flag set to `true`. + // + // If `true`, the recognizer will detect a single spoken utterance. When it + // detects that the user has paused or stopped speaking, it will return an + // `END_OF_SINGLE_UTTERANCE` event and cease recognition. It will return no + // more than one `StreamingRecognitionResult` with the `is_final` flag set to + // `true`. + // + // The `single_utterance` field can only be used with specified models, + // otherwise an error is thrown. The `model` field in [`RecognitionConfig`][] + // must be set to: + // + // * `command_and_search` + // * `phone_call` AND additional field `useEnhanced`=`true` + // * The `model` field is left undefined. In this case the API auto-selects + // a model based on any other parameters that you set in + // `RecognitionConfig`. + bool single_utterance = 2; + + // If `true`, interim results (tentative hypotheses) may be + // returned as they become available (these interim results are indicated with + // the `is_final=false` flag). + // If `false` or omitted, only `is_final=true` result(s) are returned. + bool interim_results = 3; +} + +// Provides information to the recognizer that specifies how to process the +// request. +message RecognitionConfig { + // The encoding of the audio data sent in the request. + // + // All encodings support only 1 channel (mono) audio, unless the + // `audio_channel_count` and `enable_separate_recognition_per_channel` fields + // are set. + // + // For best results, the audio source should be captured and transmitted using + // a lossless encoding (`FLAC` or `LINEAR16`). The accuracy of the speech + // recognition can be reduced if lossy codecs are used to capture or transmit + // audio, particularly if background noise is present. Lossy codecs include + // `MULAW`, `AMR`, `AMR_WB`, `OGG_OPUS`, `SPEEX_WITH_HEADER_BYTE`, `MP3`, + // and `WEBM_OPUS`. + // + // The `FLAC` and `WAV` audio file formats include a header that describes the + // included audio content. You can request recognition for `WAV` files that + // contain either `LINEAR16` or `MULAW` encoded audio. + // If you send `FLAC` or `WAV` audio file format in + // your request, you do not need to specify an `AudioEncoding`; the audio + // encoding format is determined from the file header. If you specify + // an `AudioEncoding` when you send send `FLAC` or `WAV` audio, the + // encoding configuration must match the encoding described in the audio + // header; otherwise the request returns an + // [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] error code. + enum AudioEncoding { + // Not specified. + ENCODING_UNSPECIFIED = 0; + + // Uncompressed 16-bit signed little-endian samples (Linear PCM). + LINEAR16 = 1; + + // `FLAC` (Free Lossless Audio + // Codec) is the recommended encoding because it is + // lossless--therefore recognition is not compromised--and + // requires only about half the bandwidth of `LINEAR16`. `FLAC` stream + // encoding supports 16-bit and 24-bit samples, however, not all fields in + // `STREAMINFO` are supported. + FLAC = 2; + + // 8-bit samples that compand 14-bit audio samples using G.711 PCMU/mu-law. + MULAW = 3; + + // Adaptive Multi-Rate Narrowband codec. `sample_rate_hertz` must be 8000. + AMR = 4; + + // Adaptive Multi-Rate Wideband codec. `sample_rate_hertz` must be 16000. + AMR_WB = 5; + + // Opus encoded audio frames in Ogg container + // ([OggOpus](https://wiki.xiph.org/OggOpus)). + // `sample_rate_hertz` must be one of 8000, 12000, 16000, 24000, or 48000. + OGG_OPUS = 6; + + // Although the use of lossy encodings is not recommended, if a very low + // bitrate encoding is required, `OGG_OPUS` is highly preferred over + // Speex encoding. The [Speex](https://speex.org/) encoding supported by + // Cloud Speech API has a header byte in each block, as in MIME type + // `audio/x-speex-with-header-byte`. + // It is a variant of the RTP Speex encoding defined in + // [RFC 5574](https://tools.ietf.org/html/rfc5574). + // The stream is a sequence of blocks, one block per RTP packet. Each block + // starts with a byte containing the length of the block, in bytes, followed + // by one or more frames of Speex data, padded to an integral number of + // bytes (octets) as specified in RFC 5574. In other words, each RTP header + // is replaced with a single byte containing the block length. Only Speex + // wideband is supported. `sample_rate_hertz` must be 16000. + SPEEX_WITH_HEADER_BYTE = 7; + + // Opus encoded audio frames in WebM container + // ([OggOpus](https://wiki.xiph.org/OggOpus)). `sample_rate_hertz` must be + // one of 8000, 12000, 16000, 24000, or 48000. + WEBM_OPUS = 9; + } + + // Encoding of audio data sent in all `RecognitionAudio` messages. + // This field is optional for `FLAC` and `WAV` audio files and required + // for all other audio formats. For details, see [AudioEncoding][google.cloud.speech.v1.RecognitionConfig.AudioEncoding]. + AudioEncoding encoding = 1; + + // Sample rate in Hertz of the audio data sent in all + // `RecognitionAudio` messages. Valid values are: 8000-48000. + // 16000 is optimal. For best results, set the sampling rate of the audio + // source to 16000 Hz. If that's not possible, use the native sample rate of + // the audio source (instead of re-sampling). + // This field is optional for FLAC and WAV audio files, but is + // required for all other audio formats. For details, see [AudioEncoding][google.cloud.speech.v1.RecognitionConfig.AudioEncoding]. + int32 sample_rate_hertz = 2; + + // The number of channels in the input audio data. + // ONLY set this for MULTI-CHANNEL recognition. + // Valid values for LINEAR16 and FLAC are `1`-`8`. + // Valid values for OGG_OPUS are '1'-'254'. + // Valid value for MULAW, AMR, AMR_WB and SPEEX_WITH_HEADER_BYTE is only `1`. + // If `0` or omitted, defaults to one channel (mono). + // Note: We only recognize the first channel by default. + // To perform independent recognition on each channel set + // `enable_separate_recognition_per_channel` to 'true'. + int32 audio_channel_count = 7; + + // This needs to be set to `true` explicitly and `audio_channel_count` > 1 + // to get each channel recognized separately. The recognition result will + // contain a `channel_tag` field to state which channel that result belongs + // to. If this is not true, we will only recognize the first channel. The + // request is billed cumulatively for all channels recognized: + // `audio_channel_count` multiplied by the length of the audio. + bool enable_separate_recognition_per_channel = 12; + + // Required. The language of the supplied audio as a + // [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag. + // Example: "en-US". + // See [Language + // Support](https://cloud.google.com/speech-to-text/docs/languages) for a list + // of the currently supported language codes. + string language_code = 3 [(google.api.field_behavior) = REQUIRED]; + + // A list of up to 3 additional + // [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tags, + // listing possible alternative languages of the supplied audio. + // See [Language + // Support](https://cloud.google.com/speech-to-text/docs/languages) for a list + // of the currently supported language codes. If alternative languages are + // listed, recognition result will contain recognition in the most likely + // language detected including the main language_code. The recognition result + // will include the language tag of the language detected in the audio. Note: + // This feature is only supported for Voice Command and Voice Search use cases + // and performance may vary for other use cases (e.g., phone call + // transcription). + repeated string alternative_language_codes = 18; + + // Maximum number of recognition hypotheses to be returned. + // Specifically, the maximum number of `SpeechRecognitionAlternative` messages + // within each `SpeechRecognitionResult`. + // The server may return fewer than `max_alternatives`. + // Valid values are `0`-`30`. A value of `0` or `1` will return a maximum of + // one. If omitted, will return a maximum of one. + int32 max_alternatives = 4; + + // If set to `true`, the server will attempt to filter out + // profanities, replacing all but the initial character in each filtered word + // with asterisks, e.g. "f***". If set to `false` or omitted, profanities + // won't be filtered out. + bool profanity_filter = 5; + + // Speech adaptation configuration improves the accuracy of speech + // recognition. For more information, see the [speech + // adaptation](https://cloud.google.com/speech-to-text/docs/adaptation) + // documentation. + // When speech adaptation is set it supersedes the `speech_contexts` field. + SpeechAdaptation adaptation = 20; + + // Array of [SpeechContext][google.cloud.speech.v1.SpeechContext]. + // A means to provide context to assist the speech recognition. For more + // information, see + // [speech + // adaptation](https://cloud.google.com/speech-to-text/docs/adaptation). + repeated SpeechContext speech_contexts = 6; + + // If `true`, the top result includes a list of words and + // the start and end time offsets (timestamps) for those words. If + // `false`, no word-level time offset information is returned. The default is + // `false`. + bool enable_word_time_offsets = 8; + + // If `true`, the top result includes a list of words and the + // confidence for those words. If `false`, no word-level confidence + // information is returned. The default is `false`. + bool enable_word_confidence = 15; + + // If 'true', adds punctuation to recognition result hypotheses. + // This feature is only available in select languages. Setting this for + // requests in other languages has no effect at all. + // The default 'false' value does not add punctuation to result hypotheses. + bool enable_automatic_punctuation = 11; + + // The spoken punctuation behavior for the call + // If not set, uses default behavior based on model of choice + // e.g. command_and_search will enable spoken punctuation by default + // If 'true', replaces spoken punctuation with the corresponding symbols in + // the request. For example, "how are you question mark" becomes "how are + // you?". See https://cloud.google.com/speech-to-text/docs/spoken-punctuation + // for support. If 'false', spoken punctuation is not replaced. + google.protobuf.BoolValue enable_spoken_punctuation = 22; + + // The spoken emoji behavior for the call + // If not set, uses default behavior based on model of choice + // If 'true', adds spoken emoji formatting for the request. This will replace + // spoken emojis with the corresponding Unicode symbols in the final + // transcript. If 'false', spoken emojis are not replaced. + google.protobuf.BoolValue enable_spoken_emojis = 23; + + // Config to enable speaker diarization and set additional + // parameters to make diarization better suited for your application. + // Note: When this is enabled, we send all the words from the beginning of the + // audio for the top alternative in every consecutive STREAMING responses. + // This is done in order to improve our speaker tags as our models learn to + // identify the speakers in the conversation over time. + // For non-streaming requests, the diarization results will be provided only + // in the top alternative of the FINAL SpeechRecognitionResult. + SpeakerDiarizationConfig diarization_config = 19; + + // Metadata regarding this request. + RecognitionMetadata metadata = 9; + + // Which model to select for the given request. Select the model + // best suited to your domain to get best results. If a model is not + // explicitly specified, then we auto-select a model based on the parameters + // in the RecognitionConfig. + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + //
ModelDescription
latest_longBest for long form content like media or conversation.
latest_shortBest for short form content like commands or single shot directed + // speech.
command_and_searchBest for short queries such as voice commands or voice search.
phone_callBest for audio that originated from a phone call (typically + // recorded at an 8khz sampling rate).
videoBest for audio that originated from video or includes multiple + // speakers. Ideally the audio is recorded at a 16khz or greater + // sampling rate. This is a premium model that costs more than the + // standard rate.
defaultBest for audio that is not one of the specific audio models. + // For example, long-form audio. Ideally the audio is high-fidelity, + // recorded at a 16khz or greater sampling rate.
medical_conversationBest for audio that originated from a conversation between a + // medical provider and patient.
medical_dictationBest for audio that originated from dictation notes by a medical + // provider.
+ string model = 13; + + // Set to true to use an enhanced model for speech recognition. + // If `use_enhanced` is set to true and the `model` field is not set, then + // an appropriate enhanced model is chosen if an enhanced model exists for + // the audio. + // + // If `use_enhanced` is true and an enhanced version of the specified model + // does not exist, then the speech is recognized using the standard version + // of the specified model. + bool use_enhanced = 14; +} + +// Config to enable speaker diarization. +message SpeakerDiarizationConfig { + // If 'true', enables speaker detection for each recognized word in + // the top alternative of the recognition result using a speaker_tag provided + // in the WordInfo. + bool enable_speaker_diarization = 1; + + // Minimum number of speakers in the conversation. This range gives you more + // flexibility by allowing the system to automatically determine the correct + // number of speakers. If not set, the default value is 2. + int32 min_speaker_count = 2; + + // Maximum number of speakers in the conversation. This range gives you more + // flexibility by allowing the system to automatically determine the correct + // number of speakers. If not set, the default value is 6. + int32 max_speaker_count = 3; + + // Output only. Unused. + int32 speaker_tag = 5 [ + deprecated = true, + (google.api.field_behavior) = OUTPUT_ONLY + ]; +} + +// Description of audio data to be recognized. +message RecognitionMetadata { + option deprecated = true; + + // Use case categories that the audio recognition request can be described + // by. + enum InteractionType { + // Use case is either unknown or is something other than one of the other + // values below. + INTERACTION_TYPE_UNSPECIFIED = 0; + + // Multiple people in a conversation or discussion. For example in a + // meeting with two or more people actively participating. Typically + // all the primary people speaking would be in the same room (if not, + // see PHONE_CALL) + DISCUSSION = 1; + + // One or more persons lecturing or presenting to others, mostly + // uninterrupted. + PRESENTATION = 2; + + // A phone-call or video-conference in which two or more people, who are + // not in the same room, are actively participating. + PHONE_CALL = 3; + + // A recorded message intended for another person to listen to. + VOICEMAIL = 4; + + // Professionally produced audio (eg. TV Show, Podcast). + PROFESSIONALLY_PRODUCED = 5; + + // Transcribe spoken questions and queries into text. + VOICE_SEARCH = 6; + + // Transcribe voice commands, such as for controlling a device. + VOICE_COMMAND = 7; + + // Transcribe speech to text to create a written document, such as a + // text-message, email or report. + DICTATION = 8; + } + + // Enumerates the types of capture settings describing an audio file. + enum MicrophoneDistance { + // Audio type is not known. + MICROPHONE_DISTANCE_UNSPECIFIED = 0; + + // The audio was captured from a closely placed microphone. Eg. phone, + // dictaphone, or handheld microphone. Generally if there speaker is within + // 1 meter of the microphone. + NEARFIELD = 1; + + // The speaker if within 3 meters of the microphone. + MIDFIELD = 2; + + // The speaker is more than 3 meters away from the microphone. + FARFIELD = 3; + } + + // The original media the speech was recorded on. + enum OriginalMediaType { + // Unknown original media type. + ORIGINAL_MEDIA_TYPE_UNSPECIFIED = 0; + + // The speech data is an audio recording. + AUDIO = 1; + + // The speech data originally recorded on a video. + VIDEO = 2; + } + + // The type of device the speech was recorded with. + enum RecordingDeviceType { + // The recording device is unknown. + RECORDING_DEVICE_TYPE_UNSPECIFIED = 0; + + // Speech was recorded on a smartphone. + SMARTPHONE = 1; + + // Speech was recorded using a personal computer or tablet. + PC = 2; + + // Speech was recorded over a phone line. + PHONE_LINE = 3; + + // Speech was recorded in a vehicle. + VEHICLE = 4; + + // Speech was recorded outdoors. + OTHER_OUTDOOR_DEVICE = 5; + + // Speech was recorded indoors. + OTHER_INDOOR_DEVICE = 6; + } + + // The use case most closely describing the audio content to be recognized. + InteractionType interaction_type = 1; + + // The industry vertical to which this speech recognition request most + // closely applies. This is most indicative of the topics contained + // in the audio. Use the 6-digit NAICS code to identify the industry + // vertical - see https://www.naics.com/search/. + uint32 industry_naics_code_of_audio = 3; + + // The audio type that most closely describes the audio being recognized. + MicrophoneDistance microphone_distance = 4; + + // The original media the speech was recorded on. + OriginalMediaType original_media_type = 5; + + // The type of device the speech was recorded with. + RecordingDeviceType recording_device_type = 6; + + // The device used to make the recording. Examples 'Nexus 5X' or + // 'Polycom SoundStation IP 6000' or 'POTS' or 'VoIP' or + // 'Cardioid Microphone'. + string recording_device_name = 7; + + // Mime type of the original audio file. For example `audio/m4a`, + // `audio/x-alaw-basic`, `audio/mp3`, `audio/3gpp`. + // A list of possible audio mime types is maintained at + // http://www.iana.org/assignments/media-types/media-types.xhtml#audio + string original_mime_type = 8; + + // Description of the content. Eg. "Recordings of federal supreme court + // hearings from 2012". + string audio_topic = 10; +} + +// Provides "hints" to the speech recognizer to favor specific words and phrases +// in the results. +message SpeechContext { + // A list of strings containing words and phrases "hints" so that + // the speech recognition is more likely to recognize them. This can be used + // to improve the accuracy for specific words and phrases, for example, if + // specific commands are typically spoken by the user. This can also be used + // to add additional words to the vocabulary of the recognizer. See + // [usage limits](https://cloud.google.com/speech-to-text/quotas#content). + // + // List items can also be set to classes for groups of words that represent + // common concepts that occur in natural language. For example, rather than + // providing phrase hints for every month of the year, using the $MONTH class + // improves the likelihood of correctly transcribing audio that includes + // months. + repeated string phrases = 1; + + // Hint Boost. Positive value will increase the probability that a specific + // phrase will be recognized over other similar sounding phrases. The higher + // the boost, the higher the chance of false positive recognition as well. + // Negative boost values would correspond to anti-biasing. Anti-biasing is not + // enabled, so negative boost will simply be ignored. Though `boost` can + // accept a wide range of positive values, most use cases are best served with + // values between 0 and 20. We recommend using a binary search approach to + // finding the optimal value for your use case. + float boost = 4; +} + +// Contains audio data in the encoding specified in the `RecognitionConfig`. +// Either `content` or `uri` must be supplied. Supplying both or neither +// returns [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. See +// [content limits](https://cloud.google.com/speech-to-text/quotas#content). +message RecognitionAudio { + // The audio source, which is either inline content or a Google Cloud + // Storage uri. + oneof audio_source { + // The audio data bytes encoded as specified in + // `RecognitionConfig`. Note: as with all bytes fields, proto buffers use a + // pure binary representation, whereas JSON representations use base64. + bytes content = 1; + + // URI that points to a file that contains audio data bytes as specified in + // `RecognitionConfig`. The file must not be compressed (for example, gzip). + // Currently, only Google Cloud Storage URIs are + // supported, which must be specified in the following format: + // `gs://bucket_name/object_name` (other URI formats return + // [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For more information, see + // [Request URIs](https://cloud.google.com/storage/docs/reference-uris). + string uri = 2; + } +} + +// The only message returned to the client by the `Recognize` method. It +// contains the result as zero or more sequential `SpeechRecognitionResult` +// messages. +message RecognizeResponse { + // Sequential list of transcription results corresponding to + // sequential portions of audio. + repeated SpeechRecognitionResult results = 2; + + // When available, billed audio seconds for the corresponding request. + google.protobuf.Duration total_billed_time = 3; +} + +// The only message returned to the client by the `LongRunningRecognize` method. +// It contains the result as zero or more sequential `SpeechRecognitionResult` +// messages. It is included in the `result.response` field of the `Operation` +// returned by the `GetOperation` call of the `google::longrunning::Operations` +// service. +message LongRunningRecognizeResponse { + // Sequential list of transcription results corresponding to + // sequential portions of audio. + repeated SpeechRecognitionResult results = 2; + + // When available, billed audio seconds for the corresponding request. + google.protobuf.Duration total_billed_time = 3; + + // Original output config if present in the request. + TranscriptOutputConfig output_config = 6; + + // If the transcript output fails this field contains the relevant error. + google.rpc.Status output_error = 7; +} + +// Describes the progress of a long-running `LongRunningRecognize` call. It is +// included in the `metadata` field of the `Operation` returned by the +// `GetOperation` call of the `google::longrunning::Operations` service. +message LongRunningRecognizeMetadata { + // Approximate percentage of audio processed thus far. Guaranteed to be 100 + // when the audio is fully processed and the results are available. + int32 progress_percent = 1; + + // Time when the request was received. + google.protobuf.Timestamp start_time = 2; + + // Time of the most recent processing update. + google.protobuf.Timestamp last_update_time = 3; + + // Output only. The URI of the audio file being transcribed. Empty if the audio was sent + // as byte content. + string uri = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// `StreamingRecognizeResponse` is the only message returned to the client by +// `StreamingRecognize`. A series of zero or more `StreamingRecognizeResponse` +// messages are streamed back to the client. If there is no recognizable +// audio, and `single_utterance` is set to false, then no messages are streamed +// back to the client. +// +// Here's an example of a series of `StreamingRecognizeResponse`s that might be +// returned while processing audio: +// +// 1. results { alternatives { transcript: "tube" } stability: 0.01 } +// +// 2. results { alternatives { transcript: "to be a" } stability: 0.01 } +// +// 3. results { alternatives { transcript: "to be" } stability: 0.9 } +// results { alternatives { transcript: " or not to be" } stability: 0.01 } +// +// 4. results { alternatives { transcript: "to be or not to be" +// confidence: 0.92 } +// alternatives { transcript: "to bee or not to bee" } +// is_final: true } +// +// 5. results { alternatives { transcript: " that's" } stability: 0.01 } +// +// 6. results { alternatives { transcript: " that is" } stability: 0.9 } +// results { alternatives { transcript: " the question" } stability: 0.01 } +// +// 7. results { alternatives { transcript: " that is the question" +// confidence: 0.98 } +// alternatives { transcript: " that was the question" } +// is_final: true } +// +// Notes: +// +// - Only two of the above responses #4 and #7 contain final results; they are +// indicated by `is_final: true`. Concatenating these together generates the +// full transcript: "to be or not to be that is the question". +// +// - The others contain interim `results`. #3 and #6 contain two interim +// `results`: the first portion has a high stability and is less likely to +// change; the second portion has a low stability and is very likely to +// change. A UI designer might choose to show only high stability `results`. +// +// - The specific `stability` and `confidence` values shown above are only for +// illustrative purposes. Actual values may vary. +// +// - In each response, only one of these fields will be set: +// `error`, +// `speech_event_type`, or +// one or more (repeated) `results`. +message StreamingRecognizeResponse { + // Indicates the type of speech event. + enum SpeechEventType { + // No speech event specified. + SPEECH_EVENT_UNSPECIFIED = 0; + + // This event indicates that the server has detected the end of the user's + // speech utterance and expects no additional speech. Therefore, the server + // will not process additional audio (although it may subsequently return + // additional results). The client should stop sending additional audio + // data, half-close the gRPC connection, and wait for any additional results + // until the server closes the gRPC connection. This event is only sent if + // `single_utterance` was set to `true`, and is not used otherwise. + END_OF_SINGLE_UTTERANCE = 1; + } + + // If set, returns a [google.rpc.Status][google.rpc.Status] message that + // specifies the error for the operation. + google.rpc.Status error = 1; + + // This repeated list contains zero or more results that + // correspond to consecutive portions of the audio currently being processed. + // It contains zero or one `is_final=true` result (the newly settled portion), + // followed by zero or more `is_final=false` results (the interim results). + repeated StreamingRecognitionResult results = 2; + + // Indicates the type of speech event. + SpeechEventType speech_event_type = 4; + + // When available, billed audio seconds for the stream. + // Set only if this is the last response in the stream. + google.protobuf.Duration total_billed_time = 5; +} + +// A streaming speech recognition result corresponding to a portion of the audio +// that is currently being processed. +message StreamingRecognitionResult { + // May contain one or more recognition hypotheses (up to the + // maximum specified in `max_alternatives`). + // These alternatives are ordered in terms of accuracy, with the top (first) + // alternative being the most probable, as ranked by the recognizer. + repeated SpeechRecognitionAlternative alternatives = 1; + + // If `false`, this `StreamingRecognitionResult` represents an + // interim result that may change. If `true`, this is the final time the + // speech service will return this particular `StreamingRecognitionResult`, + // the recognizer will not return any further hypotheses for this portion of + // the transcript and corresponding audio. + bool is_final = 2; + + // An estimate of the likelihood that the recognizer will not + // change its guess about this interim result. Values range from 0.0 + // (completely unstable) to 1.0 (completely stable). + // This field is only provided for interim results (`is_final=false`). + // The default of 0.0 is a sentinel value indicating `stability` was not set. + float stability = 3; + + // Time offset of the end of this result relative to the + // beginning of the audio. + google.protobuf.Duration result_end_time = 4; + + // For multi-channel audio, this is the channel number corresponding to the + // recognized result for the audio from that channel. + // For audio_channel_count = N, its output values can range from '1' to 'N'. + int32 channel_tag = 5; + + // Output only. The [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag + // of the language in this result. This language code was detected to have + // the most likelihood of being spoken in the audio. + string language_code = 6 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// A speech recognition result corresponding to a portion of the audio. +message SpeechRecognitionResult { + // May contain one or more recognition hypotheses (up to the + // maximum specified in `max_alternatives`). + // These alternatives are ordered in terms of accuracy, with the top (first) + // alternative being the most probable, as ranked by the recognizer. + repeated SpeechRecognitionAlternative alternatives = 1; + + // For multi-channel audio, this is the channel number corresponding to the + // recognized result for the audio from that channel. + // For audio_channel_count = N, its output values can range from '1' to 'N'. + int32 channel_tag = 2; + + // Time offset of the end of this result relative to the + // beginning of the audio. + google.protobuf.Duration result_end_time = 4; + + // Output only. The [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag + // of the language in this result. This language code was detected to have + // the most likelihood of being spoken in the audio. + string language_code = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// Alternative hypotheses (a.k.a. n-best list). +message SpeechRecognitionAlternative { + // Transcript text representing the words that the user spoke. + // In languages that use spaces to separate words, the transcript might have a + // leading space if it isn't the first result. You can concatenate each result + // to obtain the full transcript without using a separator. + string transcript = 1; + + // The confidence estimate between 0.0 and 1.0. A higher number + // indicates an estimated greater likelihood that the recognized words are + // correct. This field is set only for the top alternative of a non-streaming + // result or, of a streaming result where `is_final=true`. + // This field is not guaranteed to be accurate and users should not rely on it + // to be always provided. + // The default of 0.0 is a sentinel value indicating `confidence` was not set. + float confidence = 2; + + // A list of word-specific information for each recognized word. + // Note: When `enable_speaker_diarization` is true, you will see all the words + // from the beginning of the audio. + repeated WordInfo words = 3; +} + +// Word-specific information for recognized words. +message WordInfo { + // Time offset relative to the beginning of the audio, + // and corresponding to the start of the spoken word. + // This field is only set if `enable_word_time_offsets=true` and only + // in the top hypothesis. + // This is an experimental feature and the accuracy of the time offset can + // vary. + google.protobuf.Duration start_time = 1; + + // Time offset relative to the beginning of the audio, + // and corresponding to the end of the spoken word. + // This field is only set if `enable_word_time_offsets=true` and only + // in the top hypothesis. + // This is an experimental feature and the accuracy of the time offset can + // vary. + google.protobuf.Duration end_time = 2; + + // The word corresponding to this set of information. + string word = 3; + + // The confidence estimate between 0.0 and 1.0. A higher number + // indicates an estimated greater likelihood that the recognized words are + // correct. This field is set only for the top alternative of a non-streaming + // result or, of a streaming result where `is_final=true`. + // This field is not guaranteed to be accurate and users should not rely on it + // to be always provided. + // The default of 0.0 is a sentinel value indicating `confidence` was not set. + float confidence = 4; + + // Output only. A distinct integer value is assigned for every speaker within + // the audio. This field specifies which one of those speakers was detected to + // have spoken this word. Value ranges from '1' to diarization_speaker_count. + // speaker_tag is set if enable_speaker_diarization = 'true' and only in the + // top alternative. + int32 speaker_tag = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; +} diff --git a/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto b/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto new file mode 100644 index 0000000000..b0d60ab4a1 --- /dev/null +++ b/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto @@ -0,0 +1,370 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.cloud.speech.v1; + +import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/api/resource.proto"; +import "google/cloud/speech/v1/resource.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/field_mask.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/cloud/speech/v1;speech"; +option java_multiple_files = true; +option java_outer_classname = "SpeechAdaptationProto"; +option java_package = "com.google.cloud.speech.v1"; +option objc_class_prefix = "GCS"; + +// Service that implements Google Cloud Speech Adaptation API. +service Adaptation { + option (google.api.default_host) = "speech.googleapis.com"; + option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; + + // Create a set of phrase hints. Each item in the set can be a single word or + // a multi-word phrase. The items in the PhraseSet are favored by the + // recognition model when you send a call that includes the PhraseSet. + rpc CreatePhraseSet(CreatePhraseSetRequest) returns (PhraseSet) { + option (google.api.http) = { + post: "/v1/{parent=projects/*/locations/*}/phraseSets" + body: "*" + }; + option (google.api.method_signature) = "parent,phrase_set,phrase_set_id"; + } + + // Get a phrase set. + rpc GetPhraseSet(GetPhraseSetRequest) returns (PhraseSet) { + option (google.api.http) = { + get: "/v1/{name=projects/*/locations/*/phraseSets/*}" + }; + option (google.api.method_signature) = "name"; + } + + // List phrase sets. + rpc ListPhraseSet(ListPhraseSetRequest) returns (ListPhraseSetResponse) { + option (google.api.http) = { + get: "/v1/{parent=projects/*/locations/*}/phraseSets" + }; + option (google.api.method_signature) = "parent"; + } + + // Update a phrase set. + rpc UpdatePhraseSet(UpdatePhraseSetRequest) returns (PhraseSet) { + option (google.api.http) = { + patch: "/v1/{phrase_set.name=projects/*/locations/*/phraseSets/*}" + body: "phrase_set" + }; + option (google.api.method_signature) = "phrase_set,update_mask"; + } + + // Delete a phrase set. + rpc DeletePhraseSet(DeletePhraseSetRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{name=projects/*/locations/*/phraseSets/*}" + }; + option (google.api.method_signature) = "name"; + } + + // Create a custom class. + rpc CreateCustomClass(CreateCustomClassRequest) returns (CustomClass) { + option (google.api.http) = { + post: "/v1/{parent=projects/*/locations/*}/customClasses" + body: "*" + }; + option (google.api.method_signature) = "parent,custom_class,custom_class_id"; + } + + // Get a custom class. + rpc GetCustomClass(GetCustomClassRequest) returns (CustomClass) { + option (google.api.http) = { + get: "/v1/{name=projects/*/locations/*/customClasses/*}" + }; + option (google.api.method_signature) = "name"; + } + + // List custom classes. + rpc ListCustomClasses(ListCustomClassesRequest) returns (ListCustomClassesResponse) { + option (google.api.http) = { + get: "/v1/{parent=projects/*/locations/*}/customClasses" + }; + option (google.api.method_signature) = "parent"; + } + + // Update a custom class. + rpc UpdateCustomClass(UpdateCustomClassRequest) returns (CustomClass) { + option (google.api.http) = { + patch: "/v1/{custom_class.name=projects/*/locations/*/customClasses/*}" + body: "custom_class" + }; + option (google.api.method_signature) = "custom_class,update_mask"; + } + + // Delete a custom class. + rpc DeleteCustomClass(DeleteCustomClassRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{name=projects/*/locations/*/customClasses/*}" + }; + option (google.api.method_signature) = "name"; + } +} + +// Message sent by the client for the `CreatePhraseSet` method. +message CreatePhraseSetRequest { + // Required. The parent resource where this phrase set will be created. Format: + // + // `projects/{project}/locations/{location}/phraseSets` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "speech.googleapis.com/PhraseSet" + } + ]; + + // Required. The ID to use for the phrase set, which will become the final + // component of the phrase set's resource name. + // + // This value should restrict to letters, numbers, and hyphens, with the first + // character a letter, the last a letter or a number, and be 4-63 characters. + string phrase_set_id = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The phrase set to create. + PhraseSet phrase_set = 3 [(google.api.field_behavior) = REQUIRED]; +} + +// Message sent by the client for the `UpdatePhraseSet` method. +message UpdatePhraseSetRequest { + // Required. The phrase set to update. + // + // The phrase set's `name` field is used to identify the set to be + // updated. Format: + // + // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + PhraseSet phrase_set = 1 [(google.api.field_behavior) = REQUIRED]; + + // The list of fields to be updated. + google.protobuf.FieldMask update_mask = 2; +} + +// Message sent by the client for the `GetPhraseSet` method. +message GetPhraseSetRequest { + // Required. The name of the phrase set to retrieve. Format: + // + // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "speech.googleapis.com/PhraseSet" + } + ]; +} + +// Message sent by the client for the `ListPhraseSet` method. +message ListPhraseSetRequest { + // Required. The parent, which owns this collection of phrase set. Format: + // + // `projects/{project}/locations/{location}` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "speech.googleapis.com/PhraseSet" + } + ]; + + // The maximum number of phrase sets to return. The service may return + // fewer than this value. If unspecified, at most 50 phrase sets will be + // returned. The maximum value is 1000; values above 1000 will be coerced to + // 1000. + int32 page_size = 2; + + // A page token, received from a previous `ListPhraseSet` call. + // Provide this to retrieve the subsequent page. + // + // When paginating, all other parameters provided to `ListPhraseSet` must + // match the call that provided the page token. + string page_token = 3; +} + +// Message returned to the client by the `ListPhraseSet` method. +message ListPhraseSetResponse { + // The phrase set. + repeated PhraseSet phrase_sets = 1; + + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Message sent by the client for the `DeletePhraseSet` method. +message DeletePhraseSetRequest { + // Required. The name of the phrase set to delete. Format: + // + // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "speech.googleapis.com/PhraseSet" + } + ]; +} + +// Message sent by the client for the `CreateCustomClass` method. +message CreateCustomClassRequest { + // Required. The parent resource where this custom class will be created. Format: + // + // `projects/{project}/locations/{location}/customClasses` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "speech.googleapis.com/CustomClass" + } + ]; + + // Required. The ID to use for the custom class, which will become the final + // component of the custom class' resource name. + // + // This value should restrict to letters, numbers, and hyphens, with the first + // character a letter, the last a letter or a number, and be 4-63 characters. + string custom_class_id = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The custom class to create. + CustomClass custom_class = 3 [(google.api.field_behavior) = REQUIRED]; +} + +// Message sent by the client for the `UpdateCustomClass` method. +message UpdateCustomClassRequest { + // Required. The custom class to update. + // + // The custom class's `name` field is used to identify the custom class to be + // updated. Format: + // + // `projects/{project}/locations/{location}/customClasses/{custom_class}` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + CustomClass custom_class = 1 [(google.api.field_behavior) = REQUIRED]; + + // The list of fields to be updated. + google.protobuf.FieldMask update_mask = 2; +} + +// Message sent by the client for the `GetCustomClass` method. +message GetCustomClassRequest { + // Required. The name of the custom class to retrieve. Format: + // + // `projects/{project}/locations/{location}/customClasses/{custom_class}` + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "speech.googleapis.com/CustomClass" + } + ]; +} + +// Message sent by the client for the `ListCustomClasses` method. +message ListCustomClassesRequest { + // Required. The parent, which owns this collection of custom classes. Format: + // + // `projects/{project}/locations/{location}/customClasses` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "speech.googleapis.com/CustomClass" + } + ]; + + // The maximum number of custom classes to return. The service may return + // fewer than this value. If unspecified, at most 50 custom classes will be + // returned. The maximum value is 1000; values above 1000 will be coerced to + // 1000. + int32 page_size = 2; + + // A page token, received from a previous `ListCustomClass` call. + // Provide this to retrieve the subsequent page. + // + // When paginating, all other parameters provided to `ListCustomClass` must + // match the call that provided the page token. + string page_token = 3; +} + +// Message returned to the client by the `ListCustomClasses` method. +message ListCustomClassesResponse { + // The custom classes. + repeated CustomClass custom_classes = 1; + + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Message sent by the client for the `DeleteCustomClass` method. +message DeleteCustomClassRequest { + // Required. The name of the custom class to delete. Format: + // + // `projects/{project}/locations/{location}/customClasses/{custom_class}` + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) + // with matching `us` or `eu` location value. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "speech.googleapis.com/CustomClass" + } + ]; +} diff --git a/tests/configurable_snippetgen/goldens/speech/resource.proto b/tests/configurable_snippetgen/goldens/speech/resource.proto new file mode 100644 index 0000000000..0ae5caa9e9 --- /dev/null +++ b/tests/configurable_snippetgen/goldens/speech/resource.proto @@ -0,0 +1,138 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.cloud.speech.v1; + +import "google/api/resource.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/cloud/speech/v1;speech"; +option java_multiple_files = true; +option java_outer_classname = "SpeechResourceProto"; +option java_package = "com.google.cloud.speech.v1"; +option objc_class_prefix = "GCS"; + +// A set of words or phrases that represents a common concept likely to appear +// in your audio, for example a list of passenger ship names. CustomClass items +// can be substituted into placeholders that you set in PhraseSet phrases. +message CustomClass { + option (google.api.resource) = { + type: "speech.googleapis.com/CustomClass" + pattern: "projects/{project}/locations/{location}/customClasses/{custom_class}" + }; + + // An item of the class. + message ClassItem { + // The class item's value. + string value = 1; + } + + // The resource name of the custom class. + string name = 1; + + // If this custom class is a resource, the custom_class_id is the resource id + // of the CustomClass. Case sensitive. + string custom_class_id = 2; + + // A collection of class items. + repeated ClassItem items = 3; +} + +// Provides "hints" to the speech recognizer to favor specific words and phrases +// in the results. +message PhraseSet { + option (google.api.resource) = { + type: "speech.googleapis.com/PhraseSet" + pattern: "projects/{project}/locations/{location}/phraseSets/{phrase_set}" + }; + + // A phrases containing words and phrase "hints" so that + // the speech recognition is more likely to recognize them. This can be used + // to improve the accuracy for specific words and phrases, for example, if + // specific commands are typically spoken by the user. This can also be used + // to add additional words to the vocabulary of the recognizer. See + // [usage limits](https://cloud.google.com/speech-to-text/quotas#content). + // + // List items can also include pre-built or custom classes containing groups + // of words that represent common concepts that occur in natural language. For + // example, rather than providing a phrase hint for every month of the + // year (e.g. "i was born in january", "i was born in febuary", ...), use the + // pre-built `$MONTH` class improves the likelihood of correctly transcribing + // audio that includes months (e.g. "i was born in $month"). + // To refer to pre-built classes, use the class' symbol prepended with `$` + // e.g. `$MONTH`. To refer to custom classes that were defined inline in the + // request, set the class's `custom_class_id` to a string unique to all class + // resources and inline classes. Then use the class' id wrapped in $`{...}` + // e.g. "${my-months}". To refer to custom classes resources, use the class' + // id wrapped in `${}` (e.g. `${my-months}`). + // + // Speech-to-Text supports three locations: `global`, `us` (US North America), + // and `eu` (Europe). If you are calling the `speech.googleapis.com` + // endpoint, use the `global` location. To specify a region, use a + // [regional endpoint](/speech-to-text/docs/endpoints) with matching `us` or + // `eu` location value. + message Phrase { + // The phrase itself. + string value = 1; + + // Hint Boost. Overrides the boost set at the phrase set level. + // Positive value will increase the probability that a specific phrase will + // be recognized over other similar sounding phrases. The higher the boost, + // the higher the chance of false positive recognition as well. Negative + // boost will simply be ignored. Though `boost` can accept a wide range of + // positive values, most use cases are best served + // with values between 0 and 20. We recommend using a binary search approach + // to finding the optimal value for your use case. Speech recognition + // will skip PhraseSets with a boost value of 0. + float boost = 2; + } + + // The resource name of the phrase set. + string name = 1; + + // A list of word and phrases. + repeated Phrase phrases = 2; + + // Hint Boost. Positive value will increase the probability that a specific + // phrase will be recognized over other similar sounding phrases. The higher + // the boost, the higher the chance of false positive recognition as well. + // Negative boost values would correspond to anti-biasing. Anti-biasing is not + // enabled, so negative boost will simply be ignored. Though `boost` can + // accept a wide range of positive values, most use cases are best served with + // values between 0 (exclusive) and 20. We recommend using a binary search + // approach to finding the optimal value for your use case. Speech recognition + // will skip PhraseSets with a boost value of 0. + float boost = 4; +} + +// Speech adaptation configuration. +message SpeechAdaptation { + // A collection of phrase sets. To specify the hints inline, leave the + // phrase set's `name` blank and fill in the rest of its fields. Any + // phrase set can use any custom class. + repeated PhraseSet phrase_sets = 1; + + // A collection of phrase set resource names to use. + repeated string phrase_set_references = 2 [(google.api.resource_reference) = { + type: "speech.googleapis.com/PhraseSet" + }]; + + // A collection of custom classes. To specify the classes inline, leave the + // class' `name` blank and fill in the rest of its fields, giving it a unique + // `custom_class_id`. Refer to the inline defined class in phrase hints by its + // `custom_class_id`. + repeated CustomClass custom_classes = 3; +} diff --git a/tests/configurable_snippetgen/speech_createCustomClass.json b/tests/configurable_snippetgen/goldens/speech/speech_createCustomClass.json similarity index 100% rename from tests/configurable_snippetgen/speech_createCustomClass.json rename to tests/configurable_snippetgen/goldens/speech/speech_createCustomClass.json diff --git a/tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py b/tests/configurable_snippetgen/goldens/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py similarity index 100% rename from tests/configurable_snippetgen/goldens/speech_v1_generated_adaptation_create_custom_class_basic_async.py rename to tests/configurable_snippetgen/goldens/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py From c5ed2bad8236308e9104951378c7fbe893c5c127 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Sat, 3 Dec 2022 19:50:43 -0800 Subject: [PATCH 06/11] replace proto files with dumped CodeGeneratorRequest for speech v1, with test --- .../goldens/speech/cloud_speech.proto | 899 ------------------ .../speech/cloud_speech_adaptation.proto | 370 ------- .../goldens/speech/request.desc | Bin 0 -> 197661 bytes .../goldens/speech/resource.proto | 138 --- ...ptation_create_custom_class_basic_async.py | 62 +- .../configurable_snippetgen/test_resources.py | 57 ++ 6 files changed, 90 insertions(+), 1436 deletions(-) delete mode 100644 tests/configurable_snippetgen/goldens/speech/cloud_speech.proto delete mode 100644 tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto create mode 100644 tests/configurable_snippetgen/goldens/speech/request.desc delete mode 100644 tests/configurable_snippetgen/goldens/speech/resource.proto create mode 100644 tests/configurable_snippetgen/test_resources.py diff --git a/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto b/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto deleted file mode 100644 index 65aed9837e..0000000000 --- a/tests/configurable_snippetgen/goldens/speech/cloud_speech.proto +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.cloud.speech.v1; - -import "google/api/annotations.proto"; -import "google/api/client.proto"; -import "google/api/field_behavior.proto"; -import "google/cloud/speech/v1/resource.proto"; -import "google/longrunning/operations.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/wrappers.proto"; -import "google/rpc/status.proto"; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/cloud/speech/v1;speech"; -option java_multiple_files = true; -option java_outer_classname = "SpeechProto"; -option java_package = "com.google.cloud.speech.v1"; -option objc_class_prefix = "GCS"; - -// Service that implements Google Cloud Speech API. -service Speech { - option (google.api.default_host) = "speech.googleapis.com"; - option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; - - // Performs synchronous speech recognition: receive results after all audio - // has been sent and processed. - rpc Recognize(RecognizeRequest) returns (RecognizeResponse) { - option (google.api.http) = { - post: "/v1/speech:recognize" - body: "*" - }; - option (google.api.method_signature) = "config,audio"; - } - - // Performs asynchronous speech recognition: receive results via the - // google.longrunning.Operations interface. Returns either an - // `Operation.error` or an `Operation.response` which contains - // a `LongRunningRecognizeResponse` message. - // For more information on asynchronous speech recognition, see the - // [how-to](https://cloud.google.com/speech-to-text/docs/async-recognize). - rpc LongRunningRecognize(LongRunningRecognizeRequest) returns (google.longrunning.Operation) { - option (google.api.http) = { - post: "/v1/speech:longrunningrecognize" - body: "*" - }; - option (google.api.method_signature) = "config,audio"; - option (google.longrunning.operation_info) = { - response_type: "LongRunningRecognizeResponse" - metadata_type: "LongRunningRecognizeMetadata" - }; - } - - // Performs bidirectional streaming speech recognition: receive results while - // sending audio. This method is only available via the gRPC API (not REST). - rpc StreamingRecognize(stream StreamingRecognizeRequest) returns (stream StreamingRecognizeResponse) { - } -} - -// The top-level message sent by the client for the `Recognize` method. -message RecognizeRequest { - // Required. Provides information to the recognizer that specifies how to - // process the request. - RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; - - // Required. The audio data to be recognized. - RecognitionAudio audio = 2 [(google.api.field_behavior) = REQUIRED]; -} - -// The top-level message sent by the client for the `LongRunningRecognize` -// method. -message LongRunningRecognizeRequest { - // Required. Provides information to the recognizer that specifies how to - // process the request. - RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; - - // Required. The audio data to be recognized. - RecognitionAudio audio = 2 [(google.api.field_behavior) = REQUIRED]; - - // Optional. Specifies an optional destination for the recognition results. - TranscriptOutputConfig output_config = 4 [(google.api.field_behavior) = OPTIONAL]; -} - -// Specifies an optional destination for the recognition results. -message TranscriptOutputConfig { - oneof output_type { - // Specifies a Cloud Storage URI for the recognition results. Must be - // specified in the format: `gs://bucket_name/object_name`, and the bucket - // must already exist. - string gcs_uri = 1; - } -} - -// The top-level message sent by the client for the `StreamingRecognize` method. -// Multiple `StreamingRecognizeRequest` messages are sent. The first message -// must contain a `streaming_config` message and must not contain -// `audio_content`. All subsequent messages must contain `audio_content` and -// must not contain a `streaming_config` message. -message StreamingRecognizeRequest { - // The streaming request, which is either a streaming config or audio content. - oneof streaming_request { - // Provides information to the recognizer that specifies how to process the - // request. The first `StreamingRecognizeRequest` message must contain a - // `streaming_config` message. - StreamingRecognitionConfig streaming_config = 1; - - // The audio data to be recognized. Sequential chunks of audio data are sent - // in sequential `StreamingRecognizeRequest` messages. The first - // `StreamingRecognizeRequest` message must not contain `audio_content` data - // and all subsequent `StreamingRecognizeRequest` messages must contain - // `audio_content` data. The audio bytes must be encoded as specified in - // `RecognitionConfig`. Note: as with all bytes fields, proto buffers use a - // pure binary representation (not base64). See - // [content limits](https://cloud.google.com/speech-to-text/quotas#content). - bytes audio_content = 2; - } -} - -// Provides information to the recognizer that specifies how to process the -// request. -message StreamingRecognitionConfig { - // Required. Provides information to the recognizer that specifies how to - // process the request. - RecognitionConfig config = 1 [(google.api.field_behavior) = REQUIRED]; - - // If `false` or omitted, the recognizer will perform continuous - // recognition (continuing to wait for and process audio even if the user - // pauses speaking) until the client closes the input stream (gRPC API) or - // until the maximum time limit has been reached. May return multiple - // `StreamingRecognitionResult`s with the `is_final` flag set to `true`. - // - // If `true`, the recognizer will detect a single spoken utterance. When it - // detects that the user has paused or stopped speaking, it will return an - // `END_OF_SINGLE_UTTERANCE` event and cease recognition. It will return no - // more than one `StreamingRecognitionResult` with the `is_final` flag set to - // `true`. - // - // The `single_utterance` field can only be used with specified models, - // otherwise an error is thrown. The `model` field in [`RecognitionConfig`][] - // must be set to: - // - // * `command_and_search` - // * `phone_call` AND additional field `useEnhanced`=`true` - // * The `model` field is left undefined. In this case the API auto-selects - // a model based on any other parameters that you set in - // `RecognitionConfig`. - bool single_utterance = 2; - - // If `true`, interim results (tentative hypotheses) may be - // returned as they become available (these interim results are indicated with - // the `is_final=false` flag). - // If `false` or omitted, only `is_final=true` result(s) are returned. - bool interim_results = 3; -} - -// Provides information to the recognizer that specifies how to process the -// request. -message RecognitionConfig { - // The encoding of the audio data sent in the request. - // - // All encodings support only 1 channel (mono) audio, unless the - // `audio_channel_count` and `enable_separate_recognition_per_channel` fields - // are set. - // - // For best results, the audio source should be captured and transmitted using - // a lossless encoding (`FLAC` or `LINEAR16`). The accuracy of the speech - // recognition can be reduced if lossy codecs are used to capture or transmit - // audio, particularly if background noise is present. Lossy codecs include - // `MULAW`, `AMR`, `AMR_WB`, `OGG_OPUS`, `SPEEX_WITH_HEADER_BYTE`, `MP3`, - // and `WEBM_OPUS`. - // - // The `FLAC` and `WAV` audio file formats include a header that describes the - // included audio content. You can request recognition for `WAV` files that - // contain either `LINEAR16` or `MULAW` encoded audio. - // If you send `FLAC` or `WAV` audio file format in - // your request, you do not need to specify an `AudioEncoding`; the audio - // encoding format is determined from the file header. If you specify - // an `AudioEncoding` when you send send `FLAC` or `WAV` audio, the - // encoding configuration must match the encoding described in the audio - // header; otherwise the request returns an - // [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] error code. - enum AudioEncoding { - // Not specified. - ENCODING_UNSPECIFIED = 0; - - // Uncompressed 16-bit signed little-endian samples (Linear PCM). - LINEAR16 = 1; - - // `FLAC` (Free Lossless Audio - // Codec) is the recommended encoding because it is - // lossless--therefore recognition is not compromised--and - // requires only about half the bandwidth of `LINEAR16`. `FLAC` stream - // encoding supports 16-bit and 24-bit samples, however, not all fields in - // `STREAMINFO` are supported. - FLAC = 2; - - // 8-bit samples that compand 14-bit audio samples using G.711 PCMU/mu-law. - MULAW = 3; - - // Adaptive Multi-Rate Narrowband codec. `sample_rate_hertz` must be 8000. - AMR = 4; - - // Adaptive Multi-Rate Wideband codec. `sample_rate_hertz` must be 16000. - AMR_WB = 5; - - // Opus encoded audio frames in Ogg container - // ([OggOpus](https://wiki.xiph.org/OggOpus)). - // `sample_rate_hertz` must be one of 8000, 12000, 16000, 24000, or 48000. - OGG_OPUS = 6; - - // Although the use of lossy encodings is not recommended, if a very low - // bitrate encoding is required, `OGG_OPUS` is highly preferred over - // Speex encoding. The [Speex](https://speex.org/) encoding supported by - // Cloud Speech API has a header byte in each block, as in MIME type - // `audio/x-speex-with-header-byte`. - // It is a variant of the RTP Speex encoding defined in - // [RFC 5574](https://tools.ietf.org/html/rfc5574). - // The stream is a sequence of blocks, one block per RTP packet. Each block - // starts with a byte containing the length of the block, in bytes, followed - // by one or more frames of Speex data, padded to an integral number of - // bytes (octets) as specified in RFC 5574. In other words, each RTP header - // is replaced with a single byte containing the block length. Only Speex - // wideband is supported. `sample_rate_hertz` must be 16000. - SPEEX_WITH_HEADER_BYTE = 7; - - // Opus encoded audio frames in WebM container - // ([OggOpus](https://wiki.xiph.org/OggOpus)). `sample_rate_hertz` must be - // one of 8000, 12000, 16000, 24000, or 48000. - WEBM_OPUS = 9; - } - - // Encoding of audio data sent in all `RecognitionAudio` messages. - // This field is optional for `FLAC` and `WAV` audio files and required - // for all other audio formats. For details, see [AudioEncoding][google.cloud.speech.v1.RecognitionConfig.AudioEncoding]. - AudioEncoding encoding = 1; - - // Sample rate in Hertz of the audio data sent in all - // `RecognitionAudio` messages. Valid values are: 8000-48000. - // 16000 is optimal. For best results, set the sampling rate of the audio - // source to 16000 Hz. If that's not possible, use the native sample rate of - // the audio source (instead of re-sampling). - // This field is optional for FLAC and WAV audio files, but is - // required for all other audio formats. For details, see [AudioEncoding][google.cloud.speech.v1.RecognitionConfig.AudioEncoding]. - int32 sample_rate_hertz = 2; - - // The number of channels in the input audio data. - // ONLY set this for MULTI-CHANNEL recognition. - // Valid values for LINEAR16 and FLAC are `1`-`8`. - // Valid values for OGG_OPUS are '1'-'254'. - // Valid value for MULAW, AMR, AMR_WB and SPEEX_WITH_HEADER_BYTE is only `1`. - // If `0` or omitted, defaults to one channel (mono). - // Note: We only recognize the first channel by default. - // To perform independent recognition on each channel set - // `enable_separate_recognition_per_channel` to 'true'. - int32 audio_channel_count = 7; - - // This needs to be set to `true` explicitly and `audio_channel_count` > 1 - // to get each channel recognized separately. The recognition result will - // contain a `channel_tag` field to state which channel that result belongs - // to. If this is not true, we will only recognize the first channel. The - // request is billed cumulatively for all channels recognized: - // `audio_channel_count` multiplied by the length of the audio. - bool enable_separate_recognition_per_channel = 12; - - // Required. The language of the supplied audio as a - // [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag. - // Example: "en-US". - // See [Language - // Support](https://cloud.google.com/speech-to-text/docs/languages) for a list - // of the currently supported language codes. - string language_code = 3 [(google.api.field_behavior) = REQUIRED]; - - // A list of up to 3 additional - // [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tags, - // listing possible alternative languages of the supplied audio. - // See [Language - // Support](https://cloud.google.com/speech-to-text/docs/languages) for a list - // of the currently supported language codes. If alternative languages are - // listed, recognition result will contain recognition in the most likely - // language detected including the main language_code. The recognition result - // will include the language tag of the language detected in the audio. Note: - // This feature is only supported for Voice Command and Voice Search use cases - // and performance may vary for other use cases (e.g., phone call - // transcription). - repeated string alternative_language_codes = 18; - - // Maximum number of recognition hypotheses to be returned. - // Specifically, the maximum number of `SpeechRecognitionAlternative` messages - // within each `SpeechRecognitionResult`. - // The server may return fewer than `max_alternatives`. - // Valid values are `0`-`30`. A value of `0` or `1` will return a maximum of - // one. If omitted, will return a maximum of one. - int32 max_alternatives = 4; - - // If set to `true`, the server will attempt to filter out - // profanities, replacing all but the initial character in each filtered word - // with asterisks, e.g. "f***". If set to `false` or omitted, profanities - // won't be filtered out. - bool profanity_filter = 5; - - // Speech adaptation configuration improves the accuracy of speech - // recognition. For more information, see the [speech - // adaptation](https://cloud.google.com/speech-to-text/docs/adaptation) - // documentation. - // When speech adaptation is set it supersedes the `speech_contexts` field. - SpeechAdaptation adaptation = 20; - - // Array of [SpeechContext][google.cloud.speech.v1.SpeechContext]. - // A means to provide context to assist the speech recognition. For more - // information, see - // [speech - // adaptation](https://cloud.google.com/speech-to-text/docs/adaptation). - repeated SpeechContext speech_contexts = 6; - - // If `true`, the top result includes a list of words and - // the start and end time offsets (timestamps) for those words. If - // `false`, no word-level time offset information is returned. The default is - // `false`. - bool enable_word_time_offsets = 8; - - // If `true`, the top result includes a list of words and the - // confidence for those words. If `false`, no word-level confidence - // information is returned. The default is `false`. - bool enable_word_confidence = 15; - - // If 'true', adds punctuation to recognition result hypotheses. - // This feature is only available in select languages. Setting this for - // requests in other languages has no effect at all. - // The default 'false' value does not add punctuation to result hypotheses. - bool enable_automatic_punctuation = 11; - - // The spoken punctuation behavior for the call - // If not set, uses default behavior based on model of choice - // e.g. command_and_search will enable spoken punctuation by default - // If 'true', replaces spoken punctuation with the corresponding symbols in - // the request. For example, "how are you question mark" becomes "how are - // you?". See https://cloud.google.com/speech-to-text/docs/spoken-punctuation - // for support. If 'false', spoken punctuation is not replaced. - google.protobuf.BoolValue enable_spoken_punctuation = 22; - - // The spoken emoji behavior for the call - // If not set, uses default behavior based on model of choice - // If 'true', adds spoken emoji formatting for the request. This will replace - // spoken emojis with the corresponding Unicode symbols in the final - // transcript. If 'false', spoken emojis are not replaced. - google.protobuf.BoolValue enable_spoken_emojis = 23; - - // Config to enable speaker diarization and set additional - // parameters to make diarization better suited for your application. - // Note: When this is enabled, we send all the words from the beginning of the - // audio for the top alternative in every consecutive STREAMING responses. - // This is done in order to improve our speaker tags as our models learn to - // identify the speakers in the conversation over time. - // For non-streaming requests, the diarization results will be provided only - // in the top alternative of the FINAL SpeechRecognitionResult. - SpeakerDiarizationConfig diarization_config = 19; - - // Metadata regarding this request. - RecognitionMetadata metadata = 9; - - // Which model to select for the given request. Select the model - // best suited to your domain to get best results. If a model is not - // explicitly specified, then we auto-select a model based on the parameters - // in the RecognitionConfig. - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //
ModelDescription
latest_longBest for long form content like media or conversation.
latest_shortBest for short form content like commands or single shot directed - // speech.
command_and_searchBest for short queries such as voice commands or voice search.
phone_callBest for audio that originated from a phone call (typically - // recorded at an 8khz sampling rate).
videoBest for audio that originated from video or includes multiple - // speakers. Ideally the audio is recorded at a 16khz or greater - // sampling rate. This is a premium model that costs more than the - // standard rate.
defaultBest for audio that is not one of the specific audio models. - // For example, long-form audio. Ideally the audio is high-fidelity, - // recorded at a 16khz or greater sampling rate.
medical_conversationBest for audio that originated from a conversation between a - // medical provider and patient.
medical_dictationBest for audio that originated from dictation notes by a medical - // provider.
- string model = 13; - - // Set to true to use an enhanced model for speech recognition. - // If `use_enhanced` is set to true and the `model` field is not set, then - // an appropriate enhanced model is chosen if an enhanced model exists for - // the audio. - // - // If `use_enhanced` is true and an enhanced version of the specified model - // does not exist, then the speech is recognized using the standard version - // of the specified model. - bool use_enhanced = 14; -} - -// Config to enable speaker diarization. -message SpeakerDiarizationConfig { - // If 'true', enables speaker detection for each recognized word in - // the top alternative of the recognition result using a speaker_tag provided - // in the WordInfo. - bool enable_speaker_diarization = 1; - - // Minimum number of speakers in the conversation. This range gives you more - // flexibility by allowing the system to automatically determine the correct - // number of speakers. If not set, the default value is 2. - int32 min_speaker_count = 2; - - // Maximum number of speakers in the conversation. This range gives you more - // flexibility by allowing the system to automatically determine the correct - // number of speakers. If not set, the default value is 6. - int32 max_speaker_count = 3; - - // Output only. Unused. - int32 speaker_tag = 5 [ - deprecated = true, - (google.api.field_behavior) = OUTPUT_ONLY - ]; -} - -// Description of audio data to be recognized. -message RecognitionMetadata { - option deprecated = true; - - // Use case categories that the audio recognition request can be described - // by. - enum InteractionType { - // Use case is either unknown or is something other than one of the other - // values below. - INTERACTION_TYPE_UNSPECIFIED = 0; - - // Multiple people in a conversation or discussion. For example in a - // meeting with two or more people actively participating. Typically - // all the primary people speaking would be in the same room (if not, - // see PHONE_CALL) - DISCUSSION = 1; - - // One or more persons lecturing or presenting to others, mostly - // uninterrupted. - PRESENTATION = 2; - - // A phone-call or video-conference in which two or more people, who are - // not in the same room, are actively participating. - PHONE_CALL = 3; - - // A recorded message intended for another person to listen to. - VOICEMAIL = 4; - - // Professionally produced audio (eg. TV Show, Podcast). - PROFESSIONALLY_PRODUCED = 5; - - // Transcribe spoken questions and queries into text. - VOICE_SEARCH = 6; - - // Transcribe voice commands, such as for controlling a device. - VOICE_COMMAND = 7; - - // Transcribe speech to text to create a written document, such as a - // text-message, email or report. - DICTATION = 8; - } - - // Enumerates the types of capture settings describing an audio file. - enum MicrophoneDistance { - // Audio type is not known. - MICROPHONE_DISTANCE_UNSPECIFIED = 0; - - // The audio was captured from a closely placed microphone. Eg. phone, - // dictaphone, or handheld microphone. Generally if there speaker is within - // 1 meter of the microphone. - NEARFIELD = 1; - - // The speaker if within 3 meters of the microphone. - MIDFIELD = 2; - - // The speaker is more than 3 meters away from the microphone. - FARFIELD = 3; - } - - // The original media the speech was recorded on. - enum OriginalMediaType { - // Unknown original media type. - ORIGINAL_MEDIA_TYPE_UNSPECIFIED = 0; - - // The speech data is an audio recording. - AUDIO = 1; - - // The speech data originally recorded on a video. - VIDEO = 2; - } - - // The type of device the speech was recorded with. - enum RecordingDeviceType { - // The recording device is unknown. - RECORDING_DEVICE_TYPE_UNSPECIFIED = 0; - - // Speech was recorded on a smartphone. - SMARTPHONE = 1; - - // Speech was recorded using a personal computer or tablet. - PC = 2; - - // Speech was recorded over a phone line. - PHONE_LINE = 3; - - // Speech was recorded in a vehicle. - VEHICLE = 4; - - // Speech was recorded outdoors. - OTHER_OUTDOOR_DEVICE = 5; - - // Speech was recorded indoors. - OTHER_INDOOR_DEVICE = 6; - } - - // The use case most closely describing the audio content to be recognized. - InteractionType interaction_type = 1; - - // The industry vertical to which this speech recognition request most - // closely applies. This is most indicative of the topics contained - // in the audio. Use the 6-digit NAICS code to identify the industry - // vertical - see https://www.naics.com/search/. - uint32 industry_naics_code_of_audio = 3; - - // The audio type that most closely describes the audio being recognized. - MicrophoneDistance microphone_distance = 4; - - // The original media the speech was recorded on. - OriginalMediaType original_media_type = 5; - - // The type of device the speech was recorded with. - RecordingDeviceType recording_device_type = 6; - - // The device used to make the recording. Examples 'Nexus 5X' or - // 'Polycom SoundStation IP 6000' or 'POTS' or 'VoIP' or - // 'Cardioid Microphone'. - string recording_device_name = 7; - - // Mime type of the original audio file. For example `audio/m4a`, - // `audio/x-alaw-basic`, `audio/mp3`, `audio/3gpp`. - // A list of possible audio mime types is maintained at - // http://www.iana.org/assignments/media-types/media-types.xhtml#audio - string original_mime_type = 8; - - // Description of the content. Eg. "Recordings of federal supreme court - // hearings from 2012". - string audio_topic = 10; -} - -// Provides "hints" to the speech recognizer to favor specific words and phrases -// in the results. -message SpeechContext { - // A list of strings containing words and phrases "hints" so that - // the speech recognition is more likely to recognize them. This can be used - // to improve the accuracy for specific words and phrases, for example, if - // specific commands are typically spoken by the user. This can also be used - // to add additional words to the vocabulary of the recognizer. See - // [usage limits](https://cloud.google.com/speech-to-text/quotas#content). - // - // List items can also be set to classes for groups of words that represent - // common concepts that occur in natural language. For example, rather than - // providing phrase hints for every month of the year, using the $MONTH class - // improves the likelihood of correctly transcribing audio that includes - // months. - repeated string phrases = 1; - - // Hint Boost. Positive value will increase the probability that a specific - // phrase will be recognized over other similar sounding phrases. The higher - // the boost, the higher the chance of false positive recognition as well. - // Negative boost values would correspond to anti-biasing. Anti-biasing is not - // enabled, so negative boost will simply be ignored. Though `boost` can - // accept a wide range of positive values, most use cases are best served with - // values between 0 and 20. We recommend using a binary search approach to - // finding the optimal value for your use case. - float boost = 4; -} - -// Contains audio data in the encoding specified in the `RecognitionConfig`. -// Either `content` or `uri` must be supplied. Supplying both or neither -// returns [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. See -// [content limits](https://cloud.google.com/speech-to-text/quotas#content). -message RecognitionAudio { - // The audio source, which is either inline content or a Google Cloud - // Storage uri. - oneof audio_source { - // The audio data bytes encoded as specified in - // `RecognitionConfig`. Note: as with all bytes fields, proto buffers use a - // pure binary representation, whereas JSON representations use base64. - bytes content = 1; - - // URI that points to a file that contains audio data bytes as specified in - // `RecognitionConfig`. The file must not be compressed (for example, gzip). - // Currently, only Google Cloud Storage URIs are - // supported, which must be specified in the following format: - // `gs://bucket_name/object_name` (other URI formats return - // [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For more information, see - // [Request URIs](https://cloud.google.com/storage/docs/reference-uris). - string uri = 2; - } -} - -// The only message returned to the client by the `Recognize` method. It -// contains the result as zero or more sequential `SpeechRecognitionResult` -// messages. -message RecognizeResponse { - // Sequential list of transcription results corresponding to - // sequential portions of audio. - repeated SpeechRecognitionResult results = 2; - - // When available, billed audio seconds for the corresponding request. - google.protobuf.Duration total_billed_time = 3; -} - -// The only message returned to the client by the `LongRunningRecognize` method. -// It contains the result as zero or more sequential `SpeechRecognitionResult` -// messages. It is included in the `result.response` field of the `Operation` -// returned by the `GetOperation` call of the `google::longrunning::Operations` -// service. -message LongRunningRecognizeResponse { - // Sequential list of transcription results corresponding to - // sequential portions of audio. - repeated SpeechRecognitionResult results = 2; - - // When available, billed audio seconds for the corresponding request. - google.protobuf.Duration total_billed_time = 3; - - // Original output config if present in the request. - TranscriptOutputConfig output_config = 6; - - // If the transcript output fails this field contains the relevant error. - google.rpc.Status output_error = 7; -} - -// Describes the progress of a long-running `LongRunningRecognize` call. It is -// included in the `metadata` field of the `Operation` returned by the -// `GetOperation` call of the `google::longrunning::Operations` service. -message LongRunningRecognizeMetadata { - // Approximate percentage of audio processed thus far. Guaranteed to be 100 - // when the audio is fully processed and the results are available. - int32 progress_percent = 1; - - // Time when the request was received. - google.protobuf.Timestamp start_time = 2; - - // Time of the most recent processing update. - google.protobuf.Timestamp last_update_time = 3; - - // Output only. The URI of the audio file being transcribed. Empty if the audio was sent - // as byte content. - string uri = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; -} - -// `StreamingRecognizeResponse` is the only message returned to the client by -// `StreamingRecognize`. A series of zero or more `StreamingRecognizeResponse` -// messages are streamed back to the client. If there is no recognizable -// audio, and `single_utterance` is set to false, then no messages are streamed -// back to the client. -// -// Here's an example of a series of `StreamingRecognizeResponse`s that might be -// returned while processing audio: -// -// 1. results { alternatives { transcript: "tube" } stability: 0.01 } -// -// 2. results { alternatives { transcript: "to be a" } stability: 0.01 } -// -// 3. results { alternatives { transcript: "to be" } stability: 0.9 } -// results { alternatives { transcript: " or not to be" } stability: 0.01 } -// -// 4. results { alternatives { transcript: "to be or not to be" -// confidence: 0.92 } -// alternatives { transcript: "to bee or not to bee" } -// is_final: true } -// -// 5. results { alternatives { transcript: " that's" } stability: 0.01 } -// -// 6. results { alternatives { transcript: " that is" } stability: 0.9 } -// results { alternatives { transcript: " the question" } stability: 0.01 } -// -// 7. results { alternatives { transcript: " that is the question" -// confidence: 0.98 } -// alternatives { transcript: " that was the question" } -// is_final: true } -// -// Notes: -// -// - Only two of the above responses #4 and #7 contain final results; they are -// indicated by `is_final: true`. Concatenating these together generates the -// full transcript: "to be or not to be that is the question". -// -// - The others contain interim `results`. #3 and #6 contain two interim -// `results`: the first portion has a high stability and is less likely to -// change; the second portion has a low stability and is very likely to -// change. A UI designer might choose to show only high stability `results`. -// -// - The specific `stability` and `confidence` values shown above are only for -// illustrative purposes. Actual values may vary. -// -// - In each response, only one of these fields will be set: -// `error`, -// `speech_event_type`, or -// one or more (repeated) `results`. -message StreamingRecognizeResponse { - // Indicates the type of speech event. - enum SpeechEventType { - // No speech event specified. - SPEECH_EVENT_UNSPECIFIED = 0; - - // This event indicates that the server has detected the end of the user's - // speech utterance and expects no additional speech. Therefore, the server - // will not process additional audio (although it may subsequently return - // additional results). The client should stop sending additional audio - // data, half-close the gRPC connection, and wait for any additional results - // until the server closes the gRPC connection. This event is only sent if - // `single_utterance` was set to `true`, and is not used otherwise. - END_OF_SINGLE_UTTERANCE = 1; - } - - // If set, returns a [google.rpc.Status][google.rpc.Status] message that - // specifies the error for the operation. - google.rpc.Status error = 1; - - // This repeated list contains zero or more results that - // correspond to consecutive portions of the audio currently being processed. - // It contains zero or one `is_final=true` result (the newly settled portion), - // followed by zero or more `is_final=false` results (the interim results). - repeated StreamingRecognitionResult results = 2; - - // Indicates the type of speech event. - SpeechEventType speech_event_type = 4; - - // When available, billed audio seconds for the stream. - // Set only if this is the last response in the stream. - google.protobuf.Duration total_billed_time = 5; -} - -// A streaming speech recognition result corresponding to a portion of the audio -// that is currently being processed. -message StreamingRecognitionResult { - // May contain one or more recognition hypotheses (up to the - // maximum specified in `max_alternatives`). - // These alternatives are ordered in terms of accuracy, with the top (first) - // alternative being the most probable, as ranked by the recognizer. - repeated SpeechRecognitionAlternative alternatives = 1; - - // If `false`, this `StreamingRecognitionResult` represents an - // interim result that may change. If `true`, this is the final time the - // speech service will return this particular `StreamingRecognitionResult`, - // the recognizer will not return any further hypotheses for this portion of - // the transcript and corresponding audio. - bool is_final = 2; - - // An estimate of the likelihood that the recognizer will not - // change its guess about this interim result. Values range from 0.0 - // (completely unstable) to 1.0 (completely stable). - // This field is only provided for interim results (`is_final=false`). - // The default of 0.0 is a sentinel value indicating `stability` was not set. - float stability = 3; - - // Time offset of the end of this result relative to the - // beginning of the audio. - google.protobuf.Duration result_end_time = 4; - - // For multi-channel audio, this is the channel number corresponding to the - // recognized result for the audio from that channel. - // For audio_channel_count = N, its output values can range from '1' to 'N'. - int32 channel_tag = 5; - - // Output only. The [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag - // of the language in this result. This language code was detected to have - // the most likelihood of being spoken in the audio. - string language_code = 6 [(google.api.field_behavior) = OUTPUT_ONLY]; -} - -// A speech recognition result corresponding to a portion of the audio. -message SpeechRecognitionResult { - // May contain one or more recognition hypotheses (up to the - // maximum specified in `max_alternatives`). - // These alternatives are ordered in terms of accuracy, with the top (first) - // alternative being the most probable, as ranked by the recognizer. - repeated SpeechRecognitionAlternative alternatives = 1; - - // For multi-channel audio, this is the channel number corresponding to the - // recognized result for the audio from that channel. - // For audio_channel_count = N, its output values can range from '1' to 'N'. - int32 channel_tag = 2; - - // Time offset of the end of this result relative to the - // beginning of the audio. - google.protobuf.Duration result_end_time = 4; - - // Output only. The [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag - // of the language in this result. This language code was detected to have - // the most likelihood of being spoken in the audio. - string language_code = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; -} - -// Alternative hypotheses (a.k.a. n-best list). -message SpeechRecognitionAlternative { - // Transcript text representing the words that the user spoke. - // In languages that use spaces to separate words, the transcript might have a - // leading space if it isn't the first result. You can concatenate each result - // to obtain the full transcript without using a separator. - string transcript = 1; - - // The confidence estimate between 0.0 and 1.0. A higher number - // indicates an estimated greater likelihood that the recognized words are - // correct. This field is set only for the top alternative of a non-streaming - // result or, of a streaming result where `is_final=true`. - // This field is not guaranteed to be accurate and users should not rely on it - // to be always provided. - // The default of 0.0 is a sentinel value indicating `confidence` was not set. - float confidence = 2; - - // A list of word-specific information for each recognized word. - // Note: When `enable_speaker_diarization` is true, you will see all the words - // from the beginning of the audio. - repeated WordInfo words = 3; -} - -// Word-specific information for recognized words. -message WordInfo { - // Time offset relative to the beginning of the audio, - // and corresponding to the start of the spoken word. - // This field is only set if `enable_word_time_offsets=true` and only - // in the top hypothesis. - // This is an experimental feature and the accuracy of the time offset can - // vary. - google.protobuf.Duration start_time = 1; - - // Time offset relative to the beginning of the audio, - // and corresponding to the end of the spoken word. - // This field is only set if `enable_word_time_offsets=true` and only - // in the top hypothesis. - // This is an experimental feature and the accuracy of the time offset can - // vary. - google.protobuf.Duration end_time = 2; - - // The word corresponding to this set of information. - string word = 3; - - // The confidence estimate between 0.0 and 1.0. A higher number - // indicates an estimated greater likelihood that the recognized words are - // correct. This field is set only for the top alternative of a non-streaming - // result or, of a streaming result where `is_final=true`. - // This field is not guaranteed to be accurate and users should not rely on it - // to be always provided. - // The default of 0.0 is a sentinel value indicating `confidence` was not set. - float confidence = 4; - - // Output only. A distinct integer value is assigned for every speaker within - // the audio. This field specifies which one of those speakers was detected to - // have spoken this word. Value ranges from '1' to diarization_speaker_count. - // speaker_tag is set if enable_speaker_diarization = 'true' and only in the - // top alternative. - int32 speaker_tag = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; -} diff --git a/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto b/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto deleted file mode 100644 index b0d60ab4a1..0000000000 --- a/tests/configurable_snippetgen/goldens/speech/cloud_speech_adaptation.proto +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.cloud.speech.v1; - -import "google/api/annotations.proto"; -import "google/api/client.proto"; -import "google/api/field_behavior.proto"; -import "google/api/resource.proto"; -import "google/cloud/speech/v1/resource.proto"; -import "google/protobuf/empty.proto"; -import "google/protobuf/field_mask.proto"; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/cloud/speech/v1;speech"; -option java_multiple_files = true; -option java_outer_classname = "SpeechAdaptationProto"; -option java_package = "com.google.cloud.speech.v1"; -option objc_class_prefix = "GCS"; - -// Service that implements Google Cloud Speech Adaptation API. -service Adaptation { - option (google.api.default_host) = "speech.googleapis.com"; - option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; - - // Create a set of phrase hints. Each item in the set can be a single word or - // a multi-word phrase. The items in the PhraseSet are favored by the - // recognition model when you send a call that includes the PhraseSet. - rpc CreatePhraseSet(CreatePhraseSetRequest) returns (PhraseSet) { - option (google.api.http) = { - post: "/v1/{parent=projects/*/locations/*}/phraseSets" - body: "*" - }; - option (google.api.method_signature) = "parent,phrase_set,phrase_set_id"; - } - - // Get a phrase set. - rpc GetPhraseSet(GetPhraseSetRequest) returns (PhraseSet) { - option (google.api.http) = { - get: "/v1/{name=projects/*/locations/*/phraseSets/*}" - }; - option (google.api.method_signature) = "name"; - } - - // List phrase sets. - rpc ListPhraseSet(ListPhraseSetRequest) returns (ListPhraseSetResponse) { - option (google.api.http) = { - get: "/v1/{parent=projects/*/locations/*}/phraseSets" - }; - option (google.api.method_signature) = "parent"; - } - - // Update a phrase set. - rpc UpdatePhraseSet(UpdatePhraseSetRequest) returns (PhraseSet) { - option (google.api.http) = { - patch: "/v1/{phrase_set.name=projects/*/locations/*/phraseSets/*}" - body: "phrase_set" - }; - option (google.api.method_signature) = "phrase_set,update_mask"; - } - - // Delete a phrase set. - rpc DeletePhraseSet(DeletePhraseSetRequest) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/v1/{name=projects/*/locations/*/phraseSets/*}" - }; - option (google.api.method_signature) = "name"; - } - - // Create a custom class. - rpc CreateCustomClass(CreateCustomClassRequest) returns (CustomClass) { - option (google.api.http) = { - post: "/v1/{parent=projects/*/locations/*}/customClasses" - body: "*" - }; - option (google.api.method_signature) = "parent,custom_class,custom_class_id"; - } - - // Get a custom class. - rpc GetCustomClass(GetCustomClassRequest) returns (CustomClass) { - option (google.api.http) = { - get: "/v1/{name=projects/*/locations/*/customClasses/*}" - }; - option (google.api.method_signature) = "name"; - } - - // List custom classes. - rpc ListCustomClasses(ListCustomClassesRequest) returns (ListCustomClassesResponse) { - option (google.api.http) = { - get: "/v1/{parent=projects/*/locations/*}/customClasses" - }; - option (google.api.method_signature) = "parent"; - } - - // Update a custom class. - rpc UpdateCustomClass(UpdateCustomClassRequest) returns (CustomClass) { - option (google.api.http) = { - patch: "/v1/{custom_class.name=projects/*/locations/*/customClasses/*}" - body: "custom_class" - }; - option (google.api.method_signature) = "custom_class,update_mask"; - } - - // Delete a custom class. - rpc DeleteCustomClass(DeleteCustomClassRequest) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/v1/{name=projects/*/locations/*/customClasses/*}" - }; - option (google.api.method_signature) = "name"; - } -} - -// Message sent by the client for the `CreatePhraseSet` method. -message CreatePhraseSetRequest { - // Required. The parent resource where this phrase set will be created. Format: - // - // `projects/{project}/locations/{location}/phraseSets` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string parent = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - child_type: "speech.googleapis.com/PhraseSet" - } - ]; - - // Required. The ID to use for the phrase set, which will become the final - // component of the phrase set's resource name. - // - // This value should restrict to letters, numbers, and hyphens, with the first - // character a letter, the last a letter or a number, and be 4-63 characters. - string phrase_set_id = 2 [(google.api.field_behavior) = REQUIRED]; - - // Required. The phrase set to create. - PhraseSet phrase_set = 3 [(google.api.field_behavior) = REQUIRED]; -} - -// Message sent by the client for the `UpdatePhraseSet` method. -message UpdatePhraseSetRequest { - // Required. The phrase set to update. - // - // The phrase set's `name` field is used to identify the set to be - // updated. Format: - // - // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - PhraseSet phrase_set = 1 [(google.api.field_behavior) = REQUIRED]; - - // The list of fields to be updated. - google.protobuf.FieldMask update_mask = 2; -} - -// Message sent by the client for the `GetPhraseSet` method. -message GetPhraseSetRequest { - // Required. The name of the phrase set to retrieve. Format: - // - // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string name = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "speech.googleapis.com/PhraseSet" - } - ]; -} - -// Message sent by the client for the `ListPhraseSet` method. -message ListPhraseSetRequest { - // Required. The parent, which owns this collection of phrase set. Format: - // - // `projects/{project}/locations/{location}` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string parent = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - child_type: "speech.googleapis.com/PhraseSet" - } - ]; - - // The maximum number of phrase sets to return. The service may return - // fewer than this value. If unspecified, at most 50 phrase sets will be - // returned. The maximum value is 1000; values above 1000 will be coerced to - // 1000. - int32 page_size = 2; - - // A page token, received from a previous `ListPhraseSet` call. - // Provide this to retrieve the subsequent page. - // - // When paginating, all other parameters provided to `ListPhraseSet` must - // match the call that provided the page token. - string page_token = 3; -} - -// Message returned to the client by the `ListPhraseSet` method. -message ListPhraseSetResponse { - // The phrase set. - repeated PhraseSet phrase_sets = 1; - - // A token, which can be sent as `page_token` to retrieve the next page. - // If this field is omitted, there are no subsequent pages. - string next_page_token = 2; -} - -// Message sent by the client for the `DeletePhraseSet` method. -message DeletePhraseSetRequest { - // Required. The name of the phrase set to delete. Format: - // - // `projects/{project}/locations/{location}/phraseSets/{phrase_set}` - string name = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "speech.googleapis.com/PhraseSet" - } - ]; -} - -// Message sent by the client for the `CreateCustomClass` method. -message CreateCustomClassRequest { - // Required. The parent resource where this custom class will be created. Format: - // - // `projects/{project}/locations/{location}/customClasses` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string parent = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - child_type: "speech.googleapis.com/CustomClass" - } - ]; - - // Required. The ID to use for the custom class, which will become the final - // component of the custom class' resource name. - // - // This value should restrict to letters, numbers, and hyphens, with the first - // character a letter, the last a letter or a number, and be 4-63 characters. - string custom_class_id = 2 [(google.api.field_behavior) = REQUIRED]; - - // Required. The custom class to create. - CustomClass custom_class = 3 [(google.api.field_behavior) = REQUIRED]; -} - -// Message sent by the client for the `UpdateCustomClass` method. -message UpdateCustomClassRequest { - // Required. The custom class to update. - // - // The custom class's `name` field is used to identify the custom class to be - // updated. Format: - // - // `projects/{project}/locations/{location}/customClasses/{custom_class}` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - CustomClass custom_class = 1 [(google.api.field_behavior) = REQUIRED]; - - // The list of fields to be updated. - google.protobuf.FieldMask update_mask = 2; -} - -// Message sent by the client for the `GetCustomClass` method. -message GetCustomClassRequest { - // Required. The name of the custom class to retrieve. Format: - // - // `projects/{project}/locations/{location}/customClasses/{custom_class}` - string name = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "speech.googleapis.com/CustomClass" - } - ]; -} - -// Message sent by the client for the `ListCustomClasses` method. -message ListCustomClassesRequest { - // Required. The parent, which owns this collection of custom classes. Format: - // - // `projects/{project}/locations/{location}/customClasses` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string parent = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - child_type: "speech.googleapis.com/CustomClass" - } - ]; - - // The maximum number of custom classes to return. The service may return - // fewer than this value. If unspecified, at most 50 custom classes will be - // returned. The maximum value is 1000; values above 1000 will be coerced to - // 1000. - int32 page_size = 2; - - // A page token, received from a previous `ListCustomClass` call. - // Provide this to retrieve the subsequent page. - // - // When paginating, all other parameters provided to `ListCustomClass` must - // match the call that provided the page token. - string page_token = 3; -} - -// Message returned to the client by the `ListCustomClasses` method. -message ListCustomClassesResponse { - // The custom classes. - repeated CustomClass custom_classes = 1; - - // A token, which can be sent as `page_token` to retrieve the next page. - // If this field is omitted, there are no subsequent pages. - string next_page_token = 2; -} - -// Message sent by the client for the `DeleteCustomClass` method. -message DeleteCustomClassRequest { - // Required. The name of the custom class to delete. Format: - // - // `projects/{project}/locations/{location}/customClasses/{custom_class}` - // - // Speech-to-Text supports three locations: `global`, `us` (US North America), - // and `eu` (Europe). If you are calling the `speech.googleapis.com` - // endpoint, use the `global` location. To specify a region, use a - // [regional endpoint](https://cloud.google.com/speech-to-text/docs/endpoints) - // with matching `us` or `eu` location value. - string name = 1 [ - (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "speech.googleapis.com/CustomClass" - } - ]; -} diff --git a/tests/configurable_snippetgen/goldens/speech/request.desc b/tests/configurable_snippetgen/goldens/speech/request.desc new file mode 100644 index 0000000000000000000000000000000000000000..c1ae2587cfad13c5157947e43d50c4bb0e07cc7f GIT binary patch literal 197661 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 z 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 speech_v1.CustomClass: - """Custom Class Creation. + custom_class_id: str = "passengerships", +) -> speech_v1.CustomClass: + """Custom Class Creation. - Shows how to create a custom class. + Shows how to create a custom class. - Args: - parent: The custom class parent element - custom_class_id: The id for the custom class + Args: + parent: The custom class parent element + custom_class_id: The id for the custom class - Returns: - a CustomClass - """ - client = speech_v1.AdaptationAsyncClient( - client_options={"api_endpoint": "https://us-speech.googleapis.com"}) + Returns: + a CustomClass + """ + client = speech_v1.AdaptationAsyncClient( + client_options={"api_endpoint": "https://us-speech.googleapis.com"} + ) - request = speech_v1.CreateCustomClassRequest( - parent=parent, - custom_class_id=custom_class_id, - custom_class=speech_v1.CustomClass(items=[ - speech_v1.CustomClass.ClassItem(value="Titanic"), - speech_v1.CustomClass.ClassItem(value="RMS Queen Mary") - ]), - ) + request = speech_v1.CreateCustomClassRequest( + parent=parent, + custom_class_id=custom_class_id, + custom_class=speech_v1.CustomClass( + items=[ + speech_v1.CustomClass.ClassItem(value="Titanic"), + speech_v1.CustomClass.ClassItem(value="RMS Queen Mary"), + ] + ), + ) - print("Calling the CreateCustomClass operation.") - response = await client.create_custom_class(request=request) - created_custom_class = response.result() + print("Calling the CreateCustomClass operation.") + response = await client.create_custom_class(request=request) + created_custom_class = response.result() - print("A Custom Class with the following name has been created.") - print(created_custom_class.name) + print("A Custom Class with the following name has been created.") + print(created_custom_class.name) - print("The Custom class contains the following items.") - items_list = created_custom_class.items - for item in items_list: - print(item) + print("The Custom class contains the following items.") + items_list = created_custom_class.items + for item in items_list: + print(item) - return created_custom_class + return created_custom_class # [END speech_v1_generated_Adaptation_CreateCustomClass_Basic_async] diff --git a/tests/configurable_snippetgen/test_resources.py b/tests/configurable_snippetgen/test_resources.py new file mode 100644 index 0000000000..94a40071b6 --- /dev/null +++ b/tests/configurable_snippetgen/test_resources.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path + +from google.protobuf.compiler import plugin_pb2 +import pytest + +from gapic import utils +from gapic.schema import api + + +CURRENT_DIRECTORY = Path(__file__).parent.absolute() + +# This is a copy of the CodeGeneratorRequest dumped with: +# protoc google/cloud/speech/v1/*.proto \ +# --experimental_allow_proto3_optional \ +# --proto_path=../api-common-protos/ --proto_path=. \ +# --dump_out=. +# run from a copy of googleapis with a sibling copy of api-common-protos +# We use this for testing the configurable snippetgen in isolation +# from the rest of the GAPIC generator until it is ready to be integrated. +SPEECH_V1_REQUEST = CURRENT_DIRECTORY / "goldens" / "speech" / "request.desc" + + +def test_request(): + with open(SPEECH_V1_REQUEST, "rb") as f: + req = plugin_pb2.CodeGeneratorRequest.FromString(f.read()) + + # From gapic/cli/generator.py. + opts = utils.Options.build(req.parameter) + api_schema = api.API.build( + req.proto_file, + opts=opts, + package="google.cloud.speech.v1", + ) + + expected_services = [ + "google.cloud.speech.v1.Adaptation", + "google.cloud.speech.v1.Speech", + ] + + # We are only making sure that the dumped request.desc file can be + # successfully loaded to rebuild API schema. + assert list(api_schema.services.keys()) == expected_services From dd34d785020d15722d497ce4d759a65f8f921779 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Sun, 4 Dec 2022 13:09:19 -0800 Subject: [PATCH 07/11] rename goldens to resources --- .../{goldens => resources}/speech/request.desc | Bin .../speech/speech_createCustomClass.json | 0 ...ed_adaptation_create_custom_class_basic_async.py | 0 tests/configurable_snippetgen/test_resources.py | 4 ++-- 4 files changed, 2 insertions(+), 2 deletions(-) rename tests/configurable_snippetgen/{goldens => resources}/speech/request.desc (100%) rename tests/configurable_snippetgen/{goldens => resources}/speech/speech_createCustomClass.json (100%) rename tests/configurable_snippetgen/{goldens => resources}/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py (100%) diff --git a/tests/configurable_snippetgen/goldens/speech/request.desc b/tests/configurable_snippetgen/resources/speech/request.desc similarity index 100% rename from tests/configurable_snippetgen/goldens/speech/request.desc rename to tests/configurable_snippetgen/resources/speech/request.desc diff --git a/tests/configurable_snippetgen/goldens/speech/speech_createCustomClass.json b/tests/configurable_snippetgen/resources/speech/speech_createCustomClass.json similarity index 100% rename from tests/configurable_snippetgen/goldens/speech/speech_createCustomClass.json rename to tests/configurable_snippetgen/resources/speech/speech_createCustomClass.json diff --git a/tests/configurable_snippetgen/goldens/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py b/tests/configurable_snippetgen/resources/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py similarity index 100% rename from tests/configurable_snippetgen/goldens/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py rename to tests/configurable_snippetgen/resources/speech/speech_v1_generated_adaptation_create_custom_class_basic_async.py diff --git a/tests/configurable_snippetgen/test_resources.py b/tests/configurable_snippetgen/test_resources.py index 94a40071b6..2989405999 100644 --- a/tests/configurable_snippetgen/test_resources.py +++ b/tests/configurable_snippetgen/test_resources.py @@ -32,11 +32,11 @@ # run from a copy of googleapis with a sibling copy of api-common-protos # We use this for testing the configurable snippetgen in isolation # from the rest of the GAPIC generator until it is ready to be integrated. -SPEECH_V1_REQUEST = CURRENT_DIRECTORY / "goldens" / "speech" / "request.desc" +SPEECH_V1_REQUEST_PATH = CURRENT_DIRECTORY / "resources" / "speech" / "request.desc" def test_request(): - with open(SPEECH_V1_REQUEST, "rb") as f: + with open(SPEECH_V1_REQUEST_PATH, "rb") as f: req = plugin_pb2.CodeGeneratorRequest.FromString(f.read()) # From gapic/cli/generator.py. From 95e3df3c732682e1de90adc736a7501df7712215 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Sun, 4 Dec 2022 23:39:47 -0800 Subject: [PATCH 08/11] run autopep8 on test_resources.py --- tests/configurable_snippetgen/test_resources.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/configurable_snippetgen/test_resources.py b/tests/configurable_snippetgen/test_resources.py index 2989405999..28369a71b9 100644 --- a/tests/configurable_snippetgen/test_resources.py +++ b/tests/configurable_snippetgen/test_resources.py @@ -32,7 +32,8 @@ # run from a copy of googleapis with a sibling copy of api-common-protos # We use this for testing the configurable snippetgen in isolation # from the rest of the GAPIC generator until it is ready to be integrated. -SPEECH_V1_REQUEST_PATH = CURRENT_DIRECTORY / "resources" / "speech" / "request.desc" +SPEECH_V1_REQUEST_PATH = CURRENT_DIRECTORY / \ + "resources" / "speech" / "request.desc" def test_request(): From 1188997d0b2f0a0752a55f60de6861726f6e43ee Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Sun, 4 Dec 2022 23:47:19 -0800 Subject: [PATCH 09/11] fix style --- tests/configurable_snippetgen/test_resources.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/configurable_snippetgen/test_resources.py b/tests/configurable_snippetgen/test_resources.py index 28369a71b9..27053893f8 100644 --- a/tests/configurable_snippetgen/test_resources.py +++ b/tests/configurable_snippetgen/test_resources.py @@ -32,8 +32,8 @@ # run from a copy of googleapis with a sibling copy of api-common-protos # We use this for testing the configurable snippetgen in isolation # from the rest of the GAPIC generator until it is ready to be integrated. -SPEECH_V1_REQUEST_PATH = CURRENT_DIRECTORY / \ - "resources" / "speech" / "request.desc" +SPEECH_V1_REQUEST_PATH = (CURRENT_DIRECTORY / + "resources" / "speech" / "request.desc") def test_request(): From e514bef01f1f8c677e4e4c666e0eff57d8a4c866 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Mon, 5 Dec 2022 09:07:46 -0800 Subject: [PATCH 10/11] add resources/README.md, update speech/request.desc without using api-common-protos --- .../resources/README.md | 38 ++++++++++++++++++ .../resources/speech/request.desc | Bin 197661 -> 213102 bytes 2 files changed, 38 insertions(+) create mode 100644 tests/configurable_snippetgen/resources/README.md diff --git a/tests/configurable_snippetgen/resources/README.md b/tests/configurable_snippetgen/resources/README.md new file mode 100644 index 0000000000..53bd169411 --- /dev/null +++ b/tests/configurable_snippetgen/resources/README.md @@ -0,0 +1,38 @@ +# Resources for testing Configurable SnippetGen + +Each subdirectory should correspond to an API and contain three types of files. For example: + +``` +. +├── README.md +└── speech + ├── request.desc + ├── speech_createCustomClass.json + └── speech_v1_generated_adaptation_create_custom_class_basic_async.py +``` + +### `request.desc`: + +This is a copy of the CodeGeneratorRequest message used by the GAPIC generator. To generate it: + +1. Install `protoc`. +1. Install [gapic-generator-python](https://github.com/googleapis/gapic-generator-python). +1. Run the following command from the root of a local copy of [googleapis](https://github.com/googleapis/googleapis): + + ``` + API=speech + VERSION=v1 + + protoc google/cloud/$API/$VERSION/*.proto \ + --experimental_allow_proto3_optional \ + --proto_path=. \ + --dump_out=. + ``` + +### Snippet config files + +Handwritten json file containing the configuration of a code snippet. Each config file typically represents both `sync` and `async` Python snippets, and could specify more than one API version. + +### Golden files + +One or more expected snippet for each config file. diff --git a/tests/configurable_snippetgen/resources/speech/request.desc b/tests/configurable_snippetgen/resources/speech/request.desc index c1ae2587cfad13c5157947e43d50c4bb0e07cc7f..44518c7599624663bc3ca2c7cefc81d461cc5212 100644 GIT binary patch delta 22395 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 Nr^RB+(^lQs{{;z8W{3a) delta 7237 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 From f1c0d065aa8da0312d309a07891bee771eca7e27 Mon Sep 17 00:00:00 2001 From: Yu-Han Liu Date: Mon, 5 Dec 2022 10:12:00 -0800 Subject: [PATCH 11/11] remove outdated comment --- tests/configurable_snippetgen/test_resources.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/configurable_snippetgen/test_resources.py b/tests/configurable_snippetgen/test_resources.py index 27053893f8..ce0720574c 100644 --- a/tests/configurable_snippetgen/test_resources.py +++ b/tests/configurable_snippetgen/test_resources.py @@ -23,15 +23,6 @@ CURRENT_DIRECTORY = Path(__file__).parent.absolute() - -# This is a copy of the CodeGeneratorRequest dumped with: -# protoc google/cloud/speech/v1/*.proto \ -# --experimental_allow_proto3_optional \ -# --proto_path=../api-common-protos/ --proto_path=. \ -# --dump_out=. -# run from a copy of googleapis with a sibling copy of api-common-protos -# We use this for testing the configurable snippetgen in isolation -# from the rest of the GAPIC generator until it is ready to be integrated. SPEECH_V1_REQUEST_PATH = (CURRENT_DIRECTORY / "resources" / "speech" / "request.desc")