google-api-client 0.13.1 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a59d2cdff30d2d331bea0998da8d5c0ddb1b467
4
- data.tar.gz: 76c712189ee38c05d6c4a19b7cf8fab437ab5d55
3
+ metadata.gz: 1b144a44272f08c1d1afebee4a0605f0bdfbb979
4
+ data.tar.gz: 12569977c6f24d207d619d2c07f280d8c6e88fca
5
5
  SHA512:
6
- metadata.gz: 572cdced03d8d48a4283e6928a562b2eaa364d1a706dec8cad766258016b927e55f782bd7afc124a95694b26d9260ba7a547f27d897a945eb023d9071f859b46
7
- data.tar.gz: 314ec88326a0d47fd2136f096c9930208361addf4571cb32ef52b304f21c75c8af3cb69b1c58c3de9ded633c1a65194f82ce7703bae5ab7d00c9ce8bf442e932
6
+ metadata.gz: 555fb114b9964c23803499d70cd90a373d49ed9a68c8821cded8b701c1bc581c26961a313b9b1583519c284a713bf57f1eda59b4167e71f1fde9ca6850439201
7
+ data.tar.gz: 733c081171862ddfac514512d4b09ed407c8b7b8099167e4a7a1c114f5d941840f5bdd085d5d890a793e0e4687d5c4094bde4b2b2cfedcd168eb2c5b3db4cba9
@@ -1,3 +1,7 @@
1
+ # 0.13.2
2
+ * Light generator refactoring
3
+ * Recover from non-Ranged responses without rewinding (#593)
4
+
1
5
  # 0.13.1
2
6
  * Regenerate APIs
3
7
 
@@ -26,9 +26,8 @@ module Google
26
26
  Discovery = Google::Apis::DiscoveryV1
27
27
 
28
28
  desc 'gen OUTDIR', 'Generate ruby API from an API description'
29
- method_options url: :array, file: :array, from_discovery: :boolean, id: :array,
30
- preferred_only: :boolean, verbose: :boolean, names: :string,
31
- names_out: :string
29
+ method_options url: :array, file: :array, from_discovery: :boolean, preferred_only: :boolean,
30
+ verbose: :boolean, names: :string, names_out: :string
32
31
  method_option :preferred_only, default: true
33
32
  def gen(dir)
34
33
  ensure_active_support
@@ -38,7 +37,7 @@ module Google
38
37
  Google::Apis.logger.level = Logger::DEBUG if options[:verbose]
39
38
  generate_from_url(options[:url]) if options[:url]
40
39
  generate_from_file(options[:file]) if options[:file]
41
- generate_from_discovery(preferred_only: options[:preferred_only], id: options[:id] ) if options[:id] || options[:from_discovery]
40
+ generate_from_discovery(preferred_only: options[:preferred_only]) if options[:from_discovery]
42
41
  create_file(options[:names_out]) { |*| generator.dump_api_names } if options[:names_out]
43
42
  end
44
43
 
@@ -69,16 +68,22 @@ module Google
69
68
  end
70
69
  end
71
70
 
72
- def generate_from_discovery(preferred_only: false, id: nil)
71
+ def generate_from_discovery(preferred_only: false)
73
72
  say 'Fetching API list'
74
- id = Array(id)
75
73
  apis = discovery.list_apis
76
74
  apis.items.each do |api|
77
- if (id.empty? && preferred_only && api.preferred?) || id.include?(api.id)
78
- say sprintf('Loading %s, version %s from %s', api.name, api.version, api.discovery_rest_url)
79
- generate_from_url(api.discovery_rest_url)
80
- else
75
+ if (preferred_only && !api.preferred?)
81
76
  say sprintf('Ignoring disoverable API %s', api.id)
77
+ else
78
+ # The Discovery service may returned cached versions of a Discovery document that are
79
+ # not the most recent revision. That means that subsequent requests to the same
80
+ # Discovery document URL can return different documents. The
81
+ # `discovery-artifact-manager` repo always holds the most recent revision, so it's
82
+ # easier to use that document than to force revision checking against the URL returned
83
+ # by the Discovery index.
84
+ discovery_rest_url = "https://raw.githubusercontent.com/googleapis/discovery-artifact-manager/master/discoveries/#{api.name}.#{api.version}.json"
85
+ say sprintf('Loading %s, version %s from %s', api.name, api.version, discovery_rest_url)
86
+ generate_from_url(discovery_rest_url)
82
87
  end
83
88
  end
84
89
  end
@@ -67,12 +67,11 @@ module Google
67
67
  def execute_once(client, &block)
68
68
  request_header = header.dup
69
69
  apply_request_options(request_header)
70
+ download_offset = nil
70
71
 
71
- check_if_rewind_needed = false
72
72
  if @offset > 0
73
73
  logger.debug { sprintf('Resuming download from offset %d', @offset) }
74
74
  request_header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
75
- check_if_rewind_needed = true
76
75
  end
77
76
 
78
77
  http_res = client.get(url.to_s,
@@ -80,17 +79,24 @@ module Google
80
79
  header: request_header,
81
80
  follow_redirect: true) do |res, chunk|
82
81
  status = res.http_header.status_code.to_i
83
- if OK_STATUS.include?(status)
84
- if check_if_rewind_needed && status != 206
85
- # Oh no! Requested a chunk, but received the entire content
86
- # Attempt to rewind the stream
87
- @download_io.rewind
88
- check_if_rewind_needed = false
89
- end
90
- # logger.debug { sprintf('Writing chunk (%d bytes, %d total)', chunk.length, bytes_read) }
91
- @download_io.write(chunk)
92
- @offset += chunk.length
82
+ next unless OK_STATUS.include?(status)
83
+
84
+ download_offset ||= (status == 206 ? @offset : 0)
85
+ download_offset += chunk.bytesize
86
+
87
+ if download_offset - chunk.bytesize == @offset
88
+ next_chunk = chunk
89
+ else
90
+ # Oh no! Requested a chunk, but received the entire content
91
+ chunk_index = @offset - (download_offset - chunk.bytesize)
92
+ next_chunk = chunk.byteslice(chunk_index..-1)
93
+ next if next_chunk.nil?
93
94
  end
95
+
96
+ # logger.debug { sprintf('Writing chunk (%d bytes, %d total)', chunk.length, bytes_read) }
97
+ @download_io.write(next_chunk)
98
+
99
+ @offset += next_chunk.bytesize
94
100
  end
95
101
 
96
102
  @download_io.flush
@@ -27,8 +27,9 @@ module Google
27
27
  Discovery = Google::Apis::DiscoveryV1
28
28
 
29
29
  # Load templates
30
- def initialize(api_names: nil)
31
- @names = Google::Apis::Generator::Names.new(api_names || File.join(Google::Apis::ROOT, 'api_names.yaml'))
30
+ def initialize(api_names: nil, api_names_out: nil)
31
+ @names = Google::Apis::Generator::Names.new(api_names_out || File.join(Google::Apis::ROOT, 'api_names_out.yaml'),
32
+ api_names || File.join(Google::Apis::ROOT, 'api_names.yaml'))
32
33
  @module_template = Template.load('module.rb')
33
34
  @service_template = Template.load('service.rb')
34
35
  @classes_template = Template.load('classes.rb')
@@ -41,13 +41,17 @@ module Google
41
41
  include Google::Apis::Core::Logging
42
42
  include NameHelpers
43
43
 
44
- def initialize(file_path = nil)
45
- if file_path
46
- logger.info { sprintf('Loading API names from %s', file_path) }
47
- @names = YAML.load(File.read(file_path)) || {}
44
+ def initialize(names_out_file_path = nil, names_file_path = nil)
45
+ if names_out_file_path
46
+ logger.info { sprintf('Loading API names from %s', names_out_file_path) }
47
+ @names = YAML.load(File.read(names_out_file_path)) || {}
48
48
  else
49
49
  @names = {}
50
50
  end
51
+ if names_file_path
52
+ logger.info { sprintf('Loading API names from %s', names_file_path) }
53
+ @names = @names.merge(YAML.load(File.read(names_file_path)) || {})
54
+ end
51
55
  @path = []
52
56
  end
53
57
 
@@ -64,13 +68,6 @@ module Google
64
68
  pick_name(normalize_param_name(@path.last))
65
69
  end
66
70
 
67
- # Determine the ruby method name to generate for a given method in discovery.
68
- # @param [Google::Apis::DiscoveryV1::RestMethod] method
69
- # Fragment of the discovery doc describing the method
70
- def infer_method_name(method)
71
- pick_name(infer_method_name_for_rpc(method) || infer_method_name_from_id(method))
72
- end
73
-
74
71
  def infer_property_name
75
72
  pick_name(normalize_property_name(@path.last))
76
73
  end
@@ -85,12 +82,16 @@ module Google
85
82
  preferred_name
86
83
  end
87
84
 
85
+ def [](key)
86
+ @names[key]
87
+ end
88
+
88
89
  def []=(key, value)
89
90
  @names[key] = value
90
91
  end
91
92
 
92
93
  def dump
93
- YAML.dump(@names)
94
+ YAML.dump(Hash[@names.sort])
94
95
  end
95
96
 
96
97
  def key
@@ -101,12 +102,11 @@ module Google
101
102
  @names[sprintf('%s?%s', key, opt_name)]
102
103
  end
103
104
 
104
- private
105
-
106
105
  # For RPC style methods, pick a name based off the request objects.
107
106
  # @param [Google::Apis::DiscoveryV1::RestMethod] method
107
+ # @param [Boolean] pick_name
108
108
  # Fragment of the discovery doc describing the method
109
- def infer_method_name_for_rpc(method)
109
+ def infer_method_name_for_rpc(method, pick_name = true)
110
110
  return nil if method.request.nil?
111
111
  parts = method.id.split('.')
112
112
  parts.shift
@@ -122,7 +122,11 @@ module Google
122
122
  name = name.split('_').insert(1, resource_name).join('_')
123
123
  end
124
124
  end
125
- name
125
+ if pick_name
126
+ pick_name(name)
127
+ else
128
+ name
129
+ end
126
130
  end
127
131
 
128
132
  # For REST style methods, build a method name from the verb/resource(s) in the method
@@ -149,7 +153,7 @@ module Google
149
153
  end.join('_') + '_' + resource_name
150
154
  end
151
155
  method_name = verb.split('_').insert(1, resource_path.split('_')).join('_')
152
- method_name
156
+ pick_name(method_name)
153
157
  end
154
158
  end
155
159
 
@@ -161,10 +165,6 @@ module Google
161
165
  include NameHelpers
162
166
  include Google::Apis::Core::Logging
163
167
 
164
- # Don't expose these in the API directly.
165
- PARAMETER_BLACKLIST = %w(alt access_token bearer_token oauth_token pp prettyPrint
166
- $.xgafv callback upload_protocol uploadType)
167
-
168
168
  # Prepare the API for the templates.
169
169
  # @param [Google::Apis::DiscoveryV1::RestDescription] description
170
170
  # API Description
@@ -184,9 +184,33 @@ module Google
184
184
  @deferred_types = []
185
185
  @strip_prefixes = []
186
186
  @all_methods = {}
187
+ @dup_method_names_for_rpc = collect_dup_method_names_for_rpc
187
188
  @path = []
188
189
  end
189
190
 
191
+ def collect_method_names_for_rpc(resource, method_names_for_rpc)
192
+ resource.api_methods.each do |_k, v|
193
+ # First look for the method name in the `@names` hash. If there's
194
+ # no override set, generate it without inserting the generated name
195
+ # into the `@names` hash.
196
+ method_name_for_rpc = @names[@names.key]
197
+ if method_name_for_rpc.nil?
198
+ method_name_for_rpc = @names.infer_method_name_for_rpc(v, false)
199
+ end
200
+ method_names_for_rpc << method_name_for_rpc if method_name_for_rpc
201
+ end unless resource.api_methods.nil?
202
+
203
+ resource.resources.each do |_k, v|
204
+ collect_method_names_for_rpc(v, method_names_for_rpc)
205
+ end unless resource.resources.nil?
206
+ end
207
+
208
+ def collect_dup_method_names_for_rpc
209
+ method_names_for_rpc = []
210
+ collect_method_names_for_rpc(@rest_description, method_names_for_rpc)
211
+ method_names_for_rpc.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
212
+ end
213
+
190
214
  def annotate_api
191
215
  @names.with_path(@rest_description.id) do
192
216
  @strip_prefixes << @rest_description.name
@@ -196,7 +220,6 @@ module Google
196
220
  end
197
221
  end
198
222
  @rest_description.force_alt_json = @names.option('force_alt_json')
199
- @rest_description.parameters.reject! { |k, _v| PARAMETER_BLACKLIST.include?(k) }
200
223
  annotate_parameters(@rest_description.parameters)
201
224
  annotate_resource(@rest_description.name, @rest_description)
202
225
  @rest_description.schemas.each do |k, v|
@@ -245,7 +268,20 @@ module Google
245
268
  def annotate_method(method, parent_resource = nil)
246
269
  @names.with_path(method.id) do
247
270
  method.parent = parent_resource
248
- method.generated_name = @names.infer_method_name(method)
271
+ # Grab the method name generated from the request object without
272
+ # inserting into, or querying, the names hash.
273
+ method_name_for_rpc = @names.infer_method_name_for_rpc(method, false)
274
+ # If `method_name_for_rpc` is a duplicate (more than one method in
275
+ # the API will generate this name), generate the method name from
276
+ # the method ID instead.
277
+ if @dup_method_names_for_rpc.include?(method_name_for_rpc)
278
+ method.generated_name = @names.infer_method_name_from_id(method)
279
+ # Otherwise, proceed as normal.
280
+ elsif method_name_for_rpc
281
+ method.generated_name = @names.infer_method_name_for_rpc(method)
282
+ else
283
+ method.generated_name = @names.infer_method_name_from_id(method)
284
+ end
249
285
  check_duplicate_method(method)
250
286
  annotate_parameters(method.parameters)
251
287
  end
@@ -39,7 +39,7 @@ module Google
39
39
  attr_accessor :path
40
40
 
41
41
  def properties
42
- @properties ||= {}
42
+ Hash[(@properties || {}).sort]
43
43
  end
44
44
 
45
45
  def qualified_name
@@ -68,6 +68,10 @@ module Google
68
68
  attr_accessor :generated_name
69
69
  attr_accessor :parent
70
70
 
71
+ def parameters
72
+ Hash[(@parameters || {}).sort]
73
+ end
74
+
71
75
  def path_parameters
72
76
  return [] if parameter_order.nil? || parameters.nil?
73
77
  parameter_order.map { |name| parameters[name] }.select { |param| param.location == 'path' }
@@ -92,6 +96,14 @@ module Google
92
96
  class RestResource
93
97
  attr_accessor :parent
94
98
 
99
+ def api_methods
100
+ Hash[(@api_methods || {}).sort]
101
+ end
102
+
103
+ def resources
104
+ Hash[(@resources || {}).sort]
105
+ end
106
+
95
107
  def all_methods
96
108
  m = []
97
109
  m << api_methods.values unless api_methods.nil?
@@ -104,6 +116,10 @@ module Google
104
116
  attr_accessor :force_alt_json
105
117
  alias_method :force_alt_json?, :force_alt_json
106
118
 
119
+ # Don't expose these in the API directly.
120
+ PARAMETER_BLACKLIST = %w(alt access_token bearer_token oauth_token pp prettyPrint
121
+ $.xgafv callback upload_protocol uploadType)
122
+
107
123
  def version
108
124
  ActiveSupport::Inflector.camelize(@version.gsub(/\W/, '-')).gsub(/-/, '_')
109
125
  end
@@ -125,6 +141,14 @@ module Google
125
141
  ActiveSupport::Inflector.camelize(sprintf('%sService', class_name))
126
142
  end
127
143
 
144
+ def api_methods
145
+ Hash[(@api_methods || {}).sort]
146
+ end
147
+
148
+ def resources
149
+ Hash[(@resources || {}).sort]
150
+ end
151
+
128
152
  def all_methods
129
153
  m = []
130
154
  m << api_methods.values unless api_methods.nil?
@@ -132,11 +156,23 @@ module Google
132
156
  m.flatten
133
157
  end
134
158
 
159
+ def parameters
160
+ Hash[(@parameters || {}).sort].reject! { |k, _v| PARAMETER_BLACKLIST.include?(k) }
161
+ end
162
+
163
+ def schemas
164
+ Hash[(@schemas || {}).sort]
165
+ end
166
+
135
167
  class Auth
136
168
  class Oauth2
137
169
  class Scope
138
170
  attr_accessor :constant
139
171
  end
172
+
173
+ def scopes
174
+ Hash[(@scopes || {}).sort]
175
+ end
140
176
  end
141
177
  end
142
178
  end
@@ -15,7 +15,7 @@
15
15
  module Google
16
16
  module Apis
17
17
  # Client library version
18
- VERSION = '0.13.1'
18
+ VERSION = '0.13.2'
19
19
 
20
20
  # Current operating system
21
21
  # @private
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-api-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.13.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Bazyl
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-07-12 00:00:00.000000000 Z
14
+ date: 2017-08-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: representable