gapic-generator 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/lib/gapic/generator/version.rb +1 -1
  4. data/lib/gapic/generators/default_generator.rb +2 -0
  5. data/lib/gapic/generators/default_generator_parameters.rb +3 -1
  6. data/lib/gapic/grpc_service_config/{service_config.rb → config.rb} +2 -2
  7. data/lib/gapic/grpc_service_config/parser.rb +8 -8
  8. data/lib/gapic/model/method/http_annotation.rb +123 -0
  9. data/lib/gapic/model/method/lro.rb +160 -0
  10. data/lib/gapic/model/method/routing.rb +263 -0
  11. data/lib/gapic/model/mixins.rb +181 -0
  12. data/lib/gapic/model/model_error.rb +26 -0
  13. data/lib/gapic/model/service/nonstandard_lro_provider.rb +293 -0
  14. data/lib/gapic/model.rb +22 -0
  15. data/lib/gapic/path_pattern/pattern.rb +46 -0
  16. data/lib/gapic/path_pattern/segment.rb +97 -9
  17. data/lib/gapic/presenters/gem_presenter.rb +34 -2
  18. data/lib/gapic/presenters/{service_config_presenter.rb → grpc_service_config_presenter.rb} +1 -1
  19. data/lib/gapic/presenters/method_presenter.rb +43 -3
  20. data/lib/gapic/presenters/method_rest_presenter.rb +33 -55
  21. data/lib/gapic/presenters/service/lro_client_presenter.rb +90 -0
  22. data/lib/gapic/presenters/service_presenter.rb +185 -3
  23. data/lib/gapic/presenters/service_rest_presenter.rb +81 -0
  24. data/lib/gapic/presenters/snippet_presenter.rb +1 -0
  25. data/lib/gapic/presenters.rb +3 -1
  26. data/lib/gapic/schema/api.rb +56 -2
  27. data/lib/gapic/schema/loader.rb +4 -1
  28. data/lib/gapic/schema/service_config_parser.rb +118 -0
  29. data/lib/gapic/schema/wrappers.rb +124 -1
  30. data/lib/google/api/auth.pb.rb +75 -0
  31. data/lib/google/api/backend.pb.rb +59 -0
  32. data/lib/google/api/billing.pb.rb +53 -0
  33. data/lib/google/api/context.pb.rb +47 -0
  34. data/lib/google/api/control.pb.rb +38 -0
  35. data/lib/google/api/documentation.pb.rb +56 -0
  36. data/lib/google/api/endpoint.pb.rb +42 -0
  37. data/lib/google/api/label.pb.rb +49 -0
  38. data/lib/google/api/launch_stage.pb.rb +37 -0
  39. data/lib/google/api/log.pb.rb +47 -0
  40. data/lib/google/api/logging.pb.rb +48 -0
  41. data/lib/google/api/metric.pb.rb +90 -0
  42. data/lib/google/api/monitored_resource.pb.rb +68 -0
  43. data/lib/google/api/monitoring.pb.rb +48 -0
  44. data/lib/google/api/quota.pb.rb +63 -0
  45. data/lib/google/api/routing.pb.rb +58 -0
  46. data/lib/google/api/service.pb.rb +90 -0
  47. data/lib/google/api/source_info.pb.rb +44 -0
  48. data/lib/google/api/system_parameter.pb.rb +51 -0
  49. data/lib/google/api/usage.pb.rb +47 -0
  50. data/lib/google/cloud/extended_operations.pb.rb +57 -0
  51. data/lib/google/protobuf/any.pb.rb +1 -1
  52. data/lib/google/protobuf/api.pb.rb +69 -0
  53. data/lib/google/protobuf/descriptor.pb.rb +1 -1
  54. data/lib/google/protobuf/duration.pb.rb +41 -0
  55. data/lib/google/protobuf/source_context.pb.rb +39 -0
  56. data/lib/google/protobuf/struct.pb.rb +65 -0
  57. data/lib/google/protobuf/type.pb.rb +128 -0
  58. data/lib/google/protobuf/wrappers.pb.rb +80 -0
  59. data/templates/default/gem/yardopts.erb +1 -1
  60. data/templates/default/lib/_package.erb +4 -0
  61. data/templates/default/lib/_service.erb +6 -0
  62. data/templates/default/service/client/_client.erb +20 -8
  63. data/templates/default/service/client/_nonstandard_lro.erb +57 -0
  64. data/templates/default/service/client/_self_configure_defaults.erb +2 -2
  65. data/templates/default/service/client/method/def/_options_defaults.erb +1 -8
  66. data/templates/default/service/client/method/def/_response.erb +2 -0
  67. data/templates/default/service/client/method/def/_response_nonstandard_lro.erb +23 -0
  68. data/templates/default/service/client/method/def/_routing_params.erb +36 -0
  69. data/templates/default/service/nonstandard_lro.erb +6 -0
  70. data/templates/default/service/rest/client/_client.erb +32 -5
  71. data/templates/default/service/rest/client/method/def/_response.erb +2 -2
  72. data/templates/default/service/rest/client/method/def/_response_nonstandard_lro.erb +23 -0
  73. data/templates/default/service/test/method/_assert_response.erb +3 -0
  74. metadata +61 -7
  75. data/templates/default/service/rest/client/method/def/_response_lro.erb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fa15ffab6c84ed42f1e5801ba4481fa755040e69ead95a652a2ab7e611c44e6
4
- data.tar.gz: 8290eb8ae3394afe98876ae03b0ca74b6ef51ca4af9d74537b177c472a44402f
3
+ metadata.gz: a8baa3144f849b60f36cb51b7c7bed258165e9b3a646816aad586912001e4ddc
4
+ data.tar.gz: f1dc6fb877e18c0eed6c461bf6937d3756409da0bb259484149c377244953a70
5
5
  SHA512:
6
- metadata.gz: 6a3d25f24e6c43fd8b52b8ade6b520109b854660ea1d5aa9bdf8afa14802be85de8d47357deb9a5039a34c0e3b466d4228d05da5d5dbb78981065c46270ff682
7
- data.tar.gz: 31c64a0bccabf7a9077c720185b425ac77e443b17cc86ea78ae222e82d0b3237a607ca744ee3488aede394dcf1446dd5da4ad58cb2be3c8a76942905a6e34b7f
6
+ metadata.gz: 90b475c396bcdd3ecdadec8fb27e3e8089e6c8525ad75d2f83142525684b898a38765ebde17d22262e2acaac56b8452e6d77b6a6f2ccc4fab4c21ad3997c9019
7
+ data.tar.gz: 84b4aab4d800b042c4be22f3159ca77fa1cc3489a903b79844d239202c56ffb0c02db39957afa7c0bee28b168547ff1e5afda93d373450f5f8a0e14feb969147
data/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Release History for gapic-generator
2
2
 
3
+ ### 0.11.0 / 2022-03-01
4
+
5
+ * New: Added generation of nonstandard LRO wrapper calls (currently used for Compute)
6
+ * Fixed: Examples in the doc comments for modules are now generated with `@example` tags
7
+ * Fixed: proto files without a proto service can again be generated
8
+ * Ruby prebuilt binaries used in Bazel rules updated to Ruby 2.6.6
9
+
10
+ ### 0.10.6 / 2022-02-02
11
+
12
+ * Point default documentation URL to rubydoc.info.
13
+
14
+ ### 0.10.5 / 2022-01-20
15
+
16
+ * No significant changes
17
+
18
+ ### 0.10.4 / 2022-01-07
19
+
20
+ * Fixed: Set quota_project_id correctly for LRO clients
21
+ * Fixed: Remove old cloud-rad configs and rake tasks
22
+ * Fixed: Properly quote page titles in YARD configs
23
+
24
+ ### 0.10.3 / 2021-11-04
25
+
26
+ * New: Enabled snippet-gen by default
27
+
28
+ ### 0.10.2 / 2021-11-01
29
+
30
+ * New: Added support for service.yaml
31
+ * New: New mixin implementation
32
+ * New: Parse and generate explicit routing headers
33
+ * New: Preliminary support for extended operations for REST LROs
34
+ * Fixed: Potential failures in generated tests when routing headers reference sub-fields
35
+ * Fixed: Renamed service_config to grpc_service_config
36
+
3
37
  ### 0.10.1 / 2021-08-27
4
38
 
5
39
  * New: Compute REST libraries are now generated with LRO wrappers
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Gapic
18
18
  module Generator
19
- VERSION = "0.10.1"
19
+ VERSION = "0.11.0"
20
20
  end
21
21
  end
@@ -59,6 +59,8 @@ module Gapic
59
59
  files << g("service/credentials.erb", "lib/#{service.credentials_file_path}", service: service) unless gem.generic_endpoint?
60
60
  files << g("service/paths.erb", "lib/#{service.paths_file_path}", service: service) if service.paths?
61
61
  files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
62
+ files << g("service/nonstandard_lro.erb", "lib/#{service.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && !service.methods_rest_bindings?
63
+ files << g("service/nonstandard_lro.erb", "lib/#{service.rest.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && service.methods_rest_bindings?
62
64
  files << g("service/rest/client.erb", "lib/#{service.rest.client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
63
65
  files << g("service/rest/service_stub.erb", "lib/#{service.rest.service_stub_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
64
66
  files << g("service/rest/test/client.erb", "test/#{service.rest.test_client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
@@ -46,6 +46,7 @@ module Gapic
46
46
  ":gem.:factory_method_suffix",
47
47
  ":defaults.:service.:default_host",
48
48
  "grpc_service_config",
49
+ ":service_yaml",
49
50
  ":overrides.:wrapper_gem_name"
50
51
  ].freeze
51
52
 
@@ -84,7 +85,8 @@ module Gapic
84
85
  "gem-api-shortname" => ":gem.:api_shortname",
85
86
  "gem-factory-method-suffix" => ":gem.:factory_method_suffix",
86
87
  "default-service-host" => ":defaults.:service.:default_host",
87
- "grpc-service-config" => "grpc_service_config"
88
+ "grpc-service-config" => "grpc_service_config",
89
+ "service-yaml" => ":service_yaml"
88
90
  }.freeze
89
91
 
90
92
  ARRAY_PARAMETERS_ALIASES = {
@@ -21,12 +21,12 @@ module Gapic
21
21
  # applied on the service level (to all the methods) and the configurations
22
22
  # applied to the specific methods
23
23
  #
24
- class ServiceConfig
24
+ class Config
25
25
  attr_reader :service_level_configs
26
26
  attr_reader :service_method_level_configs
27
27
 
28
28
  ##
29
- # Create new ServiceConfig.
29
+ # Create new GrpcServiceConfig.
30
30
  #
31
31
  # @param service_level_configs [Hash<String, Gapic::GrpcServiceConfig::MethodConfig>] service-level configs
32
32
  # in a lookup hash by the service full grpc name
@@ -14,7 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require "gapic/grpc_service_config/service_config"
17
+ require "gapic/grpc_service_config/config"
18
18
  require "gapic/grpc_service_config/method_config"
19
19
  require "gapic/grpc_service_config/retry_policy"
20
20
  require "gapic/grpc_service_config/parsing_error"
@@ -67,18 +67,18 @@ module Gapic
67
67
  end.freeze
68
68
 
69
69
  ##
70
- # Parses ServiceConfig from a json of a GRPC service config
70
+ # Parses GRPC service configuration from a json
71
71
  #
72
- # @param service_config_json [Hash] a hash that results from JSON.parse
72
+ # @param config_json [Hash] a hash that results from JSON.parse
73
73
  #
74
- # @return [Gapic::GrpcServiceConfig::ServiceConfig] parsed ServiceConfig
74
+ # @return [Gapic::GrpcServiceConfig::Config] parsed GrpcServiceConfig
75
75
  #
76
- def self.parse service_config_json
76
+ def self.parse config_json
77
77
  service_level_result = {}
78
78
  service_method_level_result = {}
79
79
 
80
- if !service_config_json.nil? && key?(service_config_json, METHOD_CONFIG_JSON_KEY)
81
- method_configs_json = get service_config_json, METHOD_CONFIG_JSON_KEY
80
+ if !config_json.nil? && key?(config_json, METHOD_CONFIG_JSON_KEY)
81
+ method_configs_json = get config_json, METHOD_CONFIG_JSON_KEY
82
82
 
83
83
  method_configs_json.each do |method_config_json|
84
84
  method_config = parse_config method_config_json
@@ -99,7 +99,7 @@ module Gapic
99
99
  end
100
100
  end
101
101
 
102
- ServiceConfig.new service_level_result, service_method_level_result
102
+ Config.new service_level_result, service_method_level_result
103
103
  end
104
104
 
105
105
  ##
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "gapic/uri_template"
18
+
19
+ module Gapic
20
+ module Model
21
+ module Method
22
+ ##
23
+ # The information used in the generation process that
24
+ # can be gathered from the `google.api.http` annotation.
25
+ # `google.api.http` is used in two distinct ways:
26
+ # - the rest libs use it as part of the transcoding to set up the REST call
27
+ # - both rest and grpc libs use it as a source of implicit routing headers
28
+ #
29
+ class HttpAnnotation
30
+ ##
31
+ # @param proto_method [Gapic::Schema::Method]
32
+ #
33
+ def initialize proto_method
34
+ @proto_method = proto_method
35
+ end
36
+
37
+ ##
38
+ # Whether a http verb is present for this method
39
+ #
40
+ # @return [Boolean]
41
+ def verb?
42
+ !verb.nil?
43
+ end
44
+
45
+ ##
46
+ # The http verb for this method
47
+ #
48
+ # @return [Symbol, Nil]
49
+ def verb
50
+ return nil if @proto_method.http.nil?
51
+
52
+ method = {
53
+ get: @proto_method.http.get,
54
+ post: @proto_method.http.post,
55
+ put: @proto_method.http.put,
56
+ patch: @proto_method.http.patch,
57
+ delete: @proto_method.http.delete
58
+ }.find { |_, value| !value.empty? }
59
+
60
+ method[0] unless method.nil?
61
+ end
62
+
63
+ ##
64
+ # Whether a method path is present and non-empty
65
+ #
66
+ # @return [Boolean]
67
+ def path?
68
+ !path.empty?
69
+ end
70
+
71
+ ##
72
+ # A method path or an empty string if not present
73
+ #
74
+ # @return [String]
75
+ def path
76
+ return "" if @proto_method.http.nil?
77
+
78
+ verb_path = [
79
+ @proto_method.http.get, @proto_method.http.post, @proto_method.http.put,
80
+ @proto_method.http.patch, @proto_method.http.delete
81
+ ].find { |x| !x.empty? }
82
+
83
+ verb_path || @proto_method.http.custom&.path || ""
84
+ end
85
+
86
+ ##
87
+ # Whether any routing params are present
88
+ #
89
+ # @return [Boolean]
90
+ def routing_params?
91
+ routing_params.any?
92
+ end
93
+
94
+ ##
95
+ # The segment key names.
96
+ #
97
+ # @return [Array<String>]
98
+ def routing_params
99
+ Gapic::UriTemplate.parse_arguments path
100
+ end
101
+
102
+ ##
103
+ # Whether method has body specified in proto
104
+ #
105
+ # @return [Boolean]
106
+ def body?
107
+ return false if @proto_method.http.nil?
108
+
109
+ !@proto_method.http.body.empty?
110
+ end
111
+
112
+ ##
113
+ # The body specified for the given method in proto
114
+ # or an empty string if not specified
115
+ #
116
+ # @return [String]
117
+ def body
118
+ @proto_method.http&.body || ""
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "gapic/path_pattern"
18
+
19
+ module Gapic
20
+ module Model
21
+ ##
22
+ # Method-level models
23
+ #
24
+ module Method
25
+ ##
26
+ # Nonstandard (AIP-151 nonconforming) long-running operation method-level model
27
+ #
28
+ # @!attribute [r] service_full_name
29
+ # @return [String] Full grpc name of the provider service for this method's LRO
30
+ # e.g. `google.example.LroProvider`
31
+ #
32
+ # @!attribute [r] operation_request_fields
33
+ # @return [Map<String, String>] Map of the field names of this method's request message
34
+ # that should be saved and later used when constructing the LRO polling request.
35
+ # The values are the names of the fields in the polling request.
36
+ # The semantics are `from -> to`, e.g. `{"foo" => "bar"}` means that
37
+ # when constructing a polling request, the following assignment should be carried out:
38
+ # `lro_polling_request.bar = this_method_request.foo`.
39
+ #
40
+ class NonStandardLro
41
+ # @return [String]
42
+ attr_reader :service_full_name
43
+ # @return [Map<String, String>]
44
+ attr_reader :operation_request_fields
45
+
46
+ ##
47
+ # @param method [Gapic::Schema::Method]
48
+ # @param service_full_name [String] Full grpc name of the provider service for this method's LRO
49
+ def initialize method, service_full_name
50
+ @service_full_name = service_full_name
51
+
52
+ # optionally, there might be things to copy from this method's input object
53
+ # to the LRO service's input object (`operation_request_field` annotation)
54
+ ops_request_fields = method.input.fields.find_all do |f|
55
+ !f.operation_request_field.nil? && !f.operation_request_field.empty?
56
+ end
57
+
58
+ @operation_request_fields = ops_request_fields.map do |field|
59
+ [field.name, field.operation_request_field]
60
+ end.to_h
61
+ end
62
+
63
+ ##
64
+ # @return [Boolean] Whether this is a model for the nonstandard LRO
65
+ #
66
+ def nonstandard_lro?
67
+ true
68
+ end
69
+
70
+ ##
71
+ # @return [Boolean] Whether this is a model for the AIP-151 LRO
72
+ #
73
+ def aip_lro?
74
+ false
75
+ end
76
+ end
77
+
78
+ ##
79
+ # AIP-151 LRO Model
80
+ #
81
+ class AipLro
82
+ include Singleton
83
+ ##
84
+ # @return [Boolean] Whether this is a model for the nonstandard LRO
85
+ #
86
+ def nonstandard_lro?
87
+ false
88
+ end
89
+
90
+ ##
91
+ # @return [Boolean] Whether this is a model for the AIP-151 LRO
92
+ #
93
+ def aip_lro?
94
+ true
95
+ end
96
+ end
97
+
98
+ ##
99
+ # Method does not represent a long-running operation
100
+ #
101
+ class NoLro
102
+ include Singleton
103
+ ##
104
+ # @return [Boolean] Whether this is a model for the nonstandard LRO
105
+ #
106
+ def nonstandard_lro?
107
+ false
108
+ end
109
+
110
+ ##
111
+ # @return [Boolean] Whether this is a model for the AIP-151 LRO
112
+ #
113
+ def aip_lro?
114
+ false
115
+ end
116
+ end
117
+
118
+ class << self
119
+ ##
120
+ # Inspects the method and returns it's long-running operation model
121
+ #
122
+ # @param method [Gapic::Schema::Method]
123
+ # @param api [Gapic::Schema::Api]
124
+ #
125
+ # @raises [Gapic::Model::ModelError]
126
+ #
127
+ # @returns [Gapic::Model::Method::NonStandardLro, Gapic::Model::Method::AipLro, Gapic::Model::Method::NoLro]
128
+ #
129
+ def parse_lro method, api
130
+ is_aip_lro = method.output.full_name == "google.longrunning.Operation"
131
+ return AipLro.instance if is_aip_lro
132
+
133
+ # If a method is annotated with operation_service, this is a nonstandard LRO consumer method
134
+ is_nonstandard_lro = !method.operation_service.nil? && !method.operation_service.empty?
135
+ if is_nonstandard_lro
136
+ # LRO service name is given plain, so it has to be in the same package as this method's service
137
+ service_full_name = (method.address[0..-3] << method.operation_service).join "."
138
+ ops_service_lro = api.nonstandard_lro_model_for service_full_name
139
+ unless ops_service_lro.nonstandard_lro?
140
+ error_text = "A service #{service_full_name} specified as a nonstandard LRO service for " \
141
+ "the method #{method.full_name} was not found."
142
+ raise ModelError, error_text
143
+ end
144
+
145
+ unless method.output.full_name == ops_service_lro.lro_object_full_name
146
+ error_text = "A service #{service_full_name} specified as a nonstandard LRO service for " \
147
+ "the method #{method.full_name} has a different LRO object (#{ops_service_lro.lro_object_full_name}) " \
148
+ "from the method's return type (#{method.output.full_name})."
149
+ raise ModelError, error_text
150
+ end
151
+
152
+ return NonStandardLro.new method, service_full_name
153
+ end
154
+
155
+ NoLro.instance
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end