google-api-client 0.52.0 → 0.53.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 (264) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +0 -14
  3. data/CHANGELOG.md +6 -0
  4. data/OVERVIEW.md +36 -27
  5. data/generated/google/apis/accesscontextmanager_v1.rb +1 -1
  6. data/generated/google/apis/accesscontextmanager_v1/classes.rb +326 -0
  7. data/generated/google/apis/accesscontextmanager_v1/representations.rb +139 -0
  8. data/generated/google/apis/admin_directory_v1.rb +1 -1
  9. data/generated/google/apis/admin_directory_v1/service.rb +2 -2
  10. data/generated/google/apis/analyticsadmin_v1alpha.rb +2 -2
  11. data/generated/google/apis/analyticsadmin_v1alpha/classes.rb +8 -0
  12. data/generated/google/apis/analyticsadmin_v1alpha/representations.rb +1 -0
  13. data/generated/google/apis/analyticsadmin_v1alpha/service.rb +12 -1
  14. data/{lib/google/apis/core/logging.rb → generated/google/apis/apigateway_v1.rb} +14 -10
  15. data/generated/google/apis/apigateway_v1/classes.rb +1116 -0
  16. data/generated/google/apis/apigateway_v1/representations.rb +442 -0
  17. data/generated/google/apis/apigateway_v1/service.rb +1172 -0
  18. data/generated/google/apis/apigateway_v1beta.rb +1 -1
  19. data/generated/google/apis/apigateway_v1beta/classes.rb +19 -8
  20. data/generated/google/apis/apigateway_v1beta/representations.rb +1 -0
  21. data/generated/google/apis/apigee_v1.rb +1 -1
  22. data/generated/google/apis/apigee_v1/classes.rb +24 -22
  23. data/generated/google/apis/apigee_v1/service.rb +50 -48
  24. data/generated/google/apis/artifactregistry_v1.rb +38 -0
  25. data/generated/google/apis/artifactregistry_v1/classes.rb +242 -0
  26. data/generated/google/apis/artifactregistry_v1/representations.rb +116 -0
  27. data/generated/google/apis/artifactregistry_v1/service.rb +210 -0
  28. data/generated/google/apis/artifactregistry_v1beta1.rb +1 -1
  29. data/generated/google/apis/artifactregistry_v1beta1/classes.rb +0 -120
  30. data/generated/google/apis/artifactregistry_v1beta1/representations.rb +0 -62
  31. data/generated/google/apis/artifactregistry_v1beta2.rb +1 -1
  32. data/generated/google/apis/artifactregistry_v1beta2/classes.rb +0 -120
  33. data/generated/google/apis/artifactregistry_v1beta2/representations.rb +0 -62
  34. data/generated/google/apis/chat_v1.rb +1 -1
  35. data/generated/google/apis/chat_v1/service.rb +132 -0
  36. data/generated/google/apis/cloudasset_v1.rb +1 -1
  37. data/generated/google/apis/cloudasset_v1/classes.rb +326 -0
  38. data/generated/google/apis/cloudasset_v1/representations.rb +139 -0
  39. data/generated/google/apis/cloudasset_v1beta1.rb +1 -1
  40. data/generated/google/apis/cloudasset_v1beta1/classes.rb +326 -0
  41. data/generated/google/apis/cloudasset_v1beta1/representations.rb +139 -0
  42. data/generated/google/apis/cloudasset_v1p5beta1.rb +1 -1
  43. data/generated/google/apis/cloudasset_v1p5beta1/classes.rb +326 -0
  44. data/generated/google/apis/cloudasset_v1p5beta1/representations.rb +139 -0
  45. data/generated/google/apis/cloudbuild_v1.rb +1 -1
  46. data/generated/google/apis/cloudbuild_v1/classes.rb +3 -3
  47. data/generated/google/apis/cloudbuild_v1alpha1.rb +1 -1
  48. data/generated/google/apis/cloudbuild_v1alpha1/classes.rb +3 -3
  49. data/generated/google/apis/cloudbuild_v1alpha2.rb +1 -1
  50. data/generated/google/apis/cloudbuild_v1alpha2/classes.rb +3 -3
  51. data/generated/google/apis/cloudidentity_v1beta1.rb +1 -1
  52. data/generated/google/apis/cloudidentity_v1beta1/classes.rb +1 -1
  53. data/generated/google/apis/cloudresourcemanager_v1.rb +1 -1
  54. data/generated/google/apis/cloudresourcemanager_v1/classes.rb +0 -26
  55. data/generated/google/apis/cloudresourcemanager_v1/representations.rb +0 -24
  56. data/generated/google/apis/cloudresourcemanager_v1beta1.rb +1 -1
  57. data/generated/google/apis/cloudresourcemanager_v1beta1/classes.rb +0 -26
  58. data/generated/google/apis/cloudresourcemanager_v1beta1/representations.rb +0 -24
  59. data/generated/google/apis/cloudresourcemanager_v2.rb +1 -1
  60. data/generated/google/apis/cloudresourcemanager_v2/classes.rb +0 -26
  61. data/generated/google/apis/cloudresourcemanager_v2/representations.rb +0 -24
  62. data/generated/google/apis/cloudresourcemanager_v2beta1.rb +1 -1
  63. data/generated/google/apis/cloudresourcemanager_v2beta1/classes.rb +0 -26
  64. data/generated/google/apis/cloudresourcemanager_v2beta1/representations.rb +0 -24
  65. data/generated/google/apis/container_v1.rb +1 -1
  66. data/generated/google/apis/container_v1/classes.rb +7 -7
  67. data/generated/google/apis/container_v1beta1.rb +1 -1
  68. data/generated/google/apis/container_v1beta1/classes.rb +7 -7
  69. data/generated/google/apis/content_v2_1.rb +1 -1
  70. data/generated/google/apis/content_v2_1/classes.rb +434 -0
  71. data/generated/google/apis/content_v2_1/representations.rb +187 -0
  72. data/generated/google/apis/content_v2_1/service.rb +116 -0
  73. data/generated/google/apis/datacatalog_v1beta1.rb +1 -1
  74. data/generated/google/apis/datacatalog_v1beta1/classes.rb +6 -0
  75. data/generated/google/apis/datacatalog_v1beta1/representations.rb +1 -0
  76. data/generated/google/apis/dataflow_v1b3.rb +1 -1
  77. data/generated/google/apis/datalabeling_v1beta1.rb +1 -1
  78. data/generated/google/apis/dataproc_v1.rb +1 -1
  79. data/generated/google/apis/dataproc_v1/classes.rb +29 -1
  80. data/generated/google/apis/dataproc_v1/representations.rb +14 -0
  81. data/generated/google/apis/dataproc_v1/service.rb +42 -0
  82. data/generated/google/apis/dataproc_v1beta2.rb +1 -1
  83. data/generated/google/apis/dataproc_v1beta2/classes.rb +29 -1
  84. data/generated/google/apis/dataproc_v1beta2/representations.rb +14 -0
  85. data/generated/google/apis/dataproc_v1beta2/service.rb +42 -0
  86. data/generated/google/apis/dialogflow_v2.rb +1 -1
  87. data/generated/google/apis/dialogflow_v2/classes.rb +4041 -678
  88. data/generated/google/apis/dialogflow_v2/representations.rb +1851 -298
  89. data/generated/google/apis/dialogflow_v2beta1.rb +1 -1
  90. data/generated/google/apis/dialogflow_v2beta1/classes.rb +4047 -684
  91. data/generated/google/apis/dialogflow_v2beta1/representations.rb +1862 -309
  92. data/generated/google/apis/dialogflow_v3.rb +1 -1
  93. data/generated/google/apis/dialogflow_v3/classes.rb +3120 -311
  94. data/generated/google/apis/dialogflow_v3/representations.rb +2002 -617
  95. data/generated/google/apis/dialogflow_v3/service.rb +408 -0
  96. data/generated/google/apis/dialogflow_v3beta1.rb +1 -1
  97. data/generated/google/apis/dialogflow_v3beta1/classes.rb +5145 -2336
  98. data/generated/google/apis/dialogflow_v3beta1/representations.rb +1729 -344
  99. data/generated/google/apis/dialogflow_v3beta1/service.rb +408 -0
  100. data/generated/google/apis/dlp_v2.rb +1 -1
  101. data/generated/google/apis/dlp_v2/service.rb +3 -9
  102. data/generated/google/apis/documentai_v1beta2.rb +1 -1
  103. data/generated/google/apis/documentai_v1beta2/classes.rb +5 -92
  104. data/generated/google/apis/documentai_v1beta2/representations.rb +2 -15
  105. data/generated/google/apis/documentai_v1beta3.rb +1 -1
  106. data/generated/google/apis/documentai_v1beta3/classes.rb +5 -92
  107. data/generated/google/apis/documentai_v1beta3/representations.rb +2 -15
  108. data/generated/google/apis/gameservices_v1.rb +1 -1
  109. data/generated/google/apis/gameservices_v1/service.rb +14 -14
  110. data/generated/google/apis/gameservices_v1beta.rb +1 -1
  111. data/generated/google/apis/gameservices_v1beta/service.rb +14 -14
  112. data/generated/google/apis/localservices_v1.rb +4 -1
  113. data/generated/google/apis/manufacturers_v1.rb +1 -1
  114. data/generated/google/apis/manufacturers_v1/classes.rb +2 -2
  115. data/generated/google/apis/monitoring_v3.rb +1 -1
  116. data/generated/google/apis/monitoring_v3/classes.rb +2 -2
  117. data/generated/google/apis/notebooks_v1.rb +1 -1
  118. data/generated/google/apis/notebooks_v1/classes.rb +13 -0
  119. data/generated/google/apis/notebooks_v1/representations.rb +12 -0
  120. data/generated/google/apis/notebooks_v1/service.rb +34 -0
  121. data/generated/google/apis/prod_tt_sasportal_v1alpha1.rb +1 -1
  122. data/generated/google/apis/prod_tt_sasportal_v1alpha1/classes.rb +0 -37
  123. data/generated/google/apis/prod_tt_sasportal_v1alpha1/representations.rb +0 -18
  124. data/generated/google/apis/recommendationengine_v1beta1.rb +1 -1
  125. data/generated/google/apis/recommendationengine_v1beta1/service.rb +2 -1
  126. data/generated/google/apis/securitycenter_v1.rb +1 -1
  127. data/generated/google/apis/securitycenter_v1/classes.rb +18 -10
  128. data/generated/google/apis/securitycenter_v1/representations.rb +1 -0
  129. data/generated/google/apis/securitycenter_v1/service.rb +30 -30
  130. data/generated/google/apis/securitycenter_v1beta1.rb +1 -1
  131. data/generated/google/apis/securitycenter_v1beta1/classes.rb +7 -0
  132. data/generated/google/apis/securitycenter_v1beta1/representations.rb +1 -0
  133. data/generated/google/apis/securitycenter_v1beta2.rb +1 -1
  134. data/generated/google/apis/securitycenter_v1beta2/classes.rb +7 -0
  135. data/generated/google/apis/securitycenter_v1beta2/representations.rb +1 -0
  136. data/generated/google/apis/servicemanagement_v1.rb +1 -1
  137. data/generated/google/apis/servicemanagement_v1/classes.rb +11 -10
  138. data/generated/google/apis/sqladmin_v1beta4.rb +1 -1
  139. data/generated/google/apis/sqladmin_v1beta4/classes.rb +7 -7
  140. data/generated/google/apis/sqladmin_v1beta4/service.rb +4 -1
  141. data/generated/google/apis/storagetransfer_v1.rb +1 -1
  142. data/generated/google/apis/storagetransfer_v1/classes.rb +25 -0
  143. data/generated/google/apis/storagetransfer_v1/representations.rb +3 -0
  144. data/generated/google/apis/webmasters_v3/classes.rb +8 -0
  145. data/generated/google/apis/webmasters_v3/representations.rb +1 -0
  146. data/generated/google/apis/youtube_v3.rb +1 -1
  147. data/generated/google/apis/youtube_v3/classes.rb +18 -143
  148. data/generated/google/apis/youtube_v3/representations.rb +0 -57
  149. data/generated/google/apis/youtube_v3/service.rb +0 -43
  150. data/lib/google/apis/version.rb +1 -23
  151. metadata +27 -263
  152. data/.github/CONTRIBUTING.md +0 -31
  153. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -36
  154. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -21
  155. data/.github/ISSUE_TEMPLATE/support_request.md +0 -7
  156. data/.github/workflows/autoapprove.yml +0 -49
  157. data/.github/workflows/release-please.yml +0 -57
  158. data/.gitignore +0 -23
  159. data/.kokoro/build.bat +0 -11
  160. data/.kokoro/build.sh +0 -4
  161. data/.kokoro/continuous/common.cfg +0 -25
  162. data/.kokoro/continuous/linux.cfg +0 -25
  163. data/.kokoro/continuous/osx.cfg +0 -8
  164. data/.kokoro/continuous/post.cfg +0 -30
  165. data/.kokoro/continuous/windows.cfg +0 -29
  166. data/.kokoro/osx.sh +0 -4
  167. data/.kokoro/presubmit/common.cfg +0 -24
  168. data/.kokoro/presubmit/linux.cfg +0 -24
  169. data/.kokoro/presubmit/osx.cfg +0 -8
  170. data/.kokoro/presubmit/windows.cfg +0 -29
  171. data/.kokoro/release.cfg +0 -94
  172. data/.kokoro/trampoline.bat +0 -10
  173. data/.kokoro/trampoline.sh +0 -4
  174. data/.repo-metadata.json +0 -5
  175. data/.rspec +0 -2
  176. data/.rubocop.yml +0 -12
  177. data/.rubocop_todo.yml +0 -63
  178. data/CODE_OF_CONDUCT.md +0 -43
  179. data/Gemfile +0 -55
  180. data/MIGRATING.md +0 -215
  181. data/README.md +0 -402
  182. data/Rakefile +0 -131
  183. data/api_list_config.yaml +0 -9
  184. data/api_names.yaml +0 -1082
  185. data/bin/generate-api +0 -194
  186. data/docs/api-keys.md +0 -20
  187. data/docs/auth.md +0 -53
  188. data/docs/client-secrets.md +0 -69
  189. data/docs/getting-started.md +0 -340
  190. data/docs/installation.md +0 -0
  191. data/docs/logging.md +0 -34
  192. data/docs/media-upload.md +0 -25
  193. data/docs/oauth-installed.md +0 -191
  194. data/docs/oauth-server.md +0 -133
  195. data/docs/oauth-web.md +0 -280
  196. data/docs/oauth.md +0 -268
  197. data/docs/pagination.md +0 -29
  198. data/docs/performance.md +0 -25
  199. data/google-api-client.gemspec +0 -36
  200. data/lib/google/api_client/auth/installed_app.rb +0 -143
  201. data/lib/google/api_client/auth/key_utils.rb +0 -94
  202. data/lib/google/api_client/auth/storage.rb +0 -104
  203. data/lib/google/api_client/auth/storages/file_store.rb +0 -57
  204. data/lib/google/api_client/auth/storages/redis_store.rb +0 -59
  205. data/lib/google/api_client/client_secrets.rb +0 -176
  206. data/lib/google/apis.rb +0 -58
  207. data/lib/google/apis/core/api_command.rb +0 -209
  208. data/lib/google/apis/core/base_service.rb +0 -447
  209. data/lib/google/apis/core/batch.rb +0 -236
  210. data/lib/google/apis/core/composite_io.rb +0 -97
  211. data/lib/google/apis/core/download.rb +0 -118
  212. data/lib/google/apis/core/hashable.rb +0 -44
  213. data/lib/google/apis/core/http_command.rb +0 -447
  214. data/lib/google/apis/core/json_representation.rb +0 -153
  215. data/lib/google/apis/core/multipart.rb +0 -135
  216. data/lib/google/apis/core/upload.rb +0 -273
  217. data/lib/google/apis/errors.rb +0 -89
  218. data/lib/google/apis/generator.rb +0 -71
  219. data/lib/google/apis/generator/annotator.rb +0 -339
  220. data/lib/google/apis/generator/helpers.rb +0 -76
  221. data/lib/google/apis/generator/model.rb +0 -187
  222. data/lib/google/apis/generator/template.rb +0 -124
  223. data/lib/google/apis/generator/templates/_class.tmpl +0 -43
  224. data/lib/google/apis/generator/templates/_method.tmpl +0 -92
  225. data/lib/google/apis/generator/templates/_representation.tmpl +0 -51
  226. data/lib/google/apis/generator/templates/_representation_stub.tmpl +0 -17
  227. data/lib/google/apis/generator/templates/_representation_type.tmpl +0 -10
  228. data/lib/google/apis/generator/templates/classes.rb.tmpl +0 -29
  229. data/lib/google/apis/generator/templates/module.rb.tmpl +0 -40
  230. data/lib/google/apis/generator/templates/representations.rb.tmpl +0 -32
  231. data/lib/google/apis/generator/templates/service.rb.tmpl +0 -61
  232. data/lib/google/apis/options.rb +0 -116
  233. data/rakelib/devsite/devsite_builder.rb +0 -126
  234. data/rakelib/devsite/link_checker.rb +0 -64
  235. data/rakelib/devsite/repo_metadata.rb +0 -56
  236. data/rakelib/metrics.rake +0 -22
  237. data/rakelib/rubocop.rake +0 -10
  238. data/rakelib/spec.rake +0 -11
  239. data/rakelib/yard.rake +0 -11
  240. data/samples/cli/.env +0 -4
  241. data/samples/cli/Gemfile +0 -7
  242. data/samples/cli/README.md +0 -51
  243. data/samples/cli/google-api-samples +0 -32
  244. data/samples/cli/lib/base_cli.rb +0 -95
  245. data/samples/cli/lib/samples/adsense.rb +0 -99
  246. data/samples/cli/lib/samples/analytics.rb +0 -80
  247. data/samples/cli/lib/samples/androidpublisher.rb +0 -47
  248. data/samples/cli/lib/samples/bigquery.rb +0 -101
  249. data/samples/cli/lib/samples/calendar.rb +0 -83
  250. data/samples/cli/lib/samples/drive.rb +0 -82
  251. data/samples/cli/lib/samples/gmail.rb +0 -157
  252. data/samples/cli/lib/samples/pubsub.rb +0 -114
  253. data/samples/cli/lib/samples/sheets.rb +0 -61
  254. data/samples/cli/lib/samples/translate.rb +0 -44
  255. data/samples/cli/lib/samples/vision.rb +0 -69
  256. data/samples/cli/lib/samples/you_tube.rb +0 -47
  257. data/samples/web/Gemfile +0 -9
  258. data/samples/web/README.md +0 -44
  259. data/samples/web/app.rb +0 -120
  260. data/samples/web/views/calendar.erb +0 -34
  261. data/samples/web/views/drive.erb +0 -33
  262. data/samples/web/views/home.erb +0 -34
  263. data/samples/web/views/layout.erb +0 -40
  264. data/synth.py +0 -40
@@ -1,153 +0,0 @@
1
- # Copyright 2015 Google Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'representable/json'
16
- require 'representable/json/hash'
17
- require 'base64'
18
- require 'date'
19
-
20
- module Google
21
- module Apis
22
- module Core
23
- # Support for serializing hashes + property value/nil/unset tracking
24
- # To be included in representers as a feature.
25
- # @private
26
- module JsonRepresentationSupport
27
- def self.included(base)
28
- base.extend(JsonSupport)
29
- end
30
-
31
- # @private
32
- module JsonSupport
33
- # Returns a customized getter function for Representable. Allows
34
- # indifferent hash/attribute access.
35
- #
36
- # @param [String] name Property name
37
- # @return [Proc]
38
- def getter_fn(name)
39
- ivar_name = "@#{name}".to_sym
40
- lambda do |_|
41
- if respond_to?(:fetch)
42
- fetch(name, instance_variable_get(ivar_name))
43
- else
44
- instance_variable_get(ivar_name)
45
- end
46
- end
47
- end
48
-
49
- # Returns a customized function for Representable that checks whether or not
50
- # an attribute should be serialized. Allows proper patch semantics by distinguishing
51
- # between nil & unset values
52
- #
53
- # @param [String] name Property name
54
- # @return [Proc]
55
- def if_fn(name)
56
- ivar_name = "@#{name}".to_sym
57
- lambda do |opts|
58
- if opts[:user_options] && opts[:user_options][:skip_undefined]
59
- if respond_to?(:key?)
60
- self.key?(name) || instance_variable_defined?(ivar_name)
61
- else
62
- instance_variable_defined?(ivar_name)
63
- end
64
- else
65
- true
66
- end
67
- end
68
- end
69
-
70
- def set_default_options(name, options)
71
- if options[:base64]
72
- options[:render_filter] = ->(value, _doc, *_args) { value.nil? ? nil : Base64.urlsafe_encode64(value) }
73
- options[:parse_filter] = ->(fragment, _doc, *_args) { Base64.urlsafe_decode64(fragment) }
74
- end
75
- if options[:numeric_string]
76
- options[:render_filter] = ->(value, _doc, *_args) { value.nil? ? nil : value.to_s}
77
- options[:parse_filter] = ->(fragment, _doc, *_args) { fragment.to_i }
78
- end
79
- if options[:type] == DateTime
80
- options[:render_filter] = ->(value, _doc, *_args) { value.nil? ? nil : value.is_a?(DateTime) ? value.rfc3339(3) : value.to_s }
81
- options[:parse_filter] = ->(fragment, _doc, *_args) { DateTime.parse(fragment) }
82
- end
83
- if options[:type] == Date
84
- options[:render_filter] = ->(value, _doc, *_args) { value.nil? ? nil : value.to_s}
85
- options[:parse_filter] = ->(fragment, _doc, *_args) { Date.parse(fragment) }
86
- end
87
-
88
- options[:render_nil] = true
89
- options[:getter] = getter_fn(name)
90
- options[:if] = if_fn(name)
91
- end
92
-
93
- # Define a single value property
94
- #
95
- # @param [String] name
96
- # Property name
97
- # @param [Hash] options
98
- def property(name, options = {})
99
- set_default_options(name, options)
100
- super(name, options)
101
- end
102
-
103
- # Define a collection property
104
- #
105
- # @param [String] name
106
- # Property name
107
- # @param [Hash] options
108
- def collection(name, options = {})
109
- set_default_options(name, options)
110
- super(name, options)
111
- end
112
-
113
- # Define a hash property
114
- #
115
- # @param [String] name
116
- # Property name
117
- # @param [Hash] options
118
- def hash(name = nil, options = nil)
119
- return super() unless name # Allow Object.hash
120
- set_default_options(name, options)
121
- super(name, options)
122
- end
123
- end
124
- end
125
-
126
- # Base decorator for JSON representers
127
- #
128
- # @see https://github.com/apotonick/representable
129
- class JsonRepresentation < Representable::Decorator
130
- include Representable::JSON
131
- feature JsonRepresentationSupport
132
- end
133
-
134
- module JsonObjectSupport
135
- def self.included(base)
136
- base.extend(ClassMethods)
137
- end
138
-
139
- module ClassMethods
140
- def from_json(json)
141
- representation = self.const_get(:Representation)
142
- representation.new(self.new).from_json(json, unwrap: self)
143
- end
144
- end
145
-
146
- def to_json(*a)
147
- representation = self.class.const_get(:Representation)
148
- representation.new(self).to_hash(user_options: { skip_undefined: true }).to_json(*a)
149
- end
150
- end
151
- end
152
- end
153
- end
@@ -1,135 +0,0 @@
1
- # Copyright 2015 Google Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- module Google
17
- module Apis
18
- module Core
19
- # Part of a multipart request for holding JSON data
20
- #
21
- # @private
22
- class JsonPart
23
-
24
- # @param [String] value
25
- # JSON content
26
- # @param [Hash] header
27
- # Additional headers
28
- def initialize(value, header = {})
29
- @value = value
30
- @header = header
31
- end
32
-
33
- def to_io(boundary)
34
- part = ''
35
- part << "--#{boundary}\r\n"
36
- part << "Content-Type: application/json\r\n"
37
- @header.each do |(k, v)|
38
- part << "#{k}: #{v}\r\n"
39
- end
40
- part << "\r\n"
41
- part << "#{@value}\r\n"
42
- StringIO.new(part)
43
- end
44
-
45
- end
46
-
47
- # Part of a multipart request for holding arbitrary content.
48
- #
49
- # @private
50
- class FilePart
51
- # @param [IO] io
52
- # IO stream
53
- # @param [Hash] header
54
- # Additional headers
55
- def initialize(io, header = {})
56
- @io = io
57
- @header = header
58
- @length = io.respond_to?(:size) ? io.size : nil
59
- end
60
-
61
- def to_io(boundary)
62
- head = ''
63
- head << "--#{boundary}\r\n"
64
- @header.each do |(k, v)|
65
- head << "#{k}: #{v}\r\n"
66
- end
67
- head << "Content-Length: #{@length}\r\n" unless @length.nil?
68
- head << "Content-Transfer-Encoding: binary\r\n"
69
- head << "\r\n"
70
- Google::Apis::Core::CompositeIO.new(StringIO.new(head), @io, StringIO.new("\r\n"))
71
- end
72
- end
73
-
74
- # Helper for building multipart requests
75
- class Multipart
76
- MULTIPART_RELATED = 'multipart/related'
77
-
78
- # @return [String]
79
- # Content type header
80
- attr_reader :content_type
81
-
82
- # @param [String] content_type
83
- # Content type for the multipart request
84
- # @param [String] boundary
85
- # Part delimiter
86
-
87
- def initialize(content_type: MULTIPART_RELATED, boundary: nil)
88
- @parts = []
89
- @boundary = boundary || Digest::SHA1.hexdigest(SecureRandom.random_bytes(8))
90
- @content_type = "#{content_type}; boundary=#{@boundary}"
91
- end
92
-
93
- # Append JSON data part
94
- #
95
- # @param [String] body
96
- # JSON text
97
- # @param [String] content_id
98
- # Optional unique ID of this part
99
- # @return [self]
100
- def add_json(body, content_id: nil)
101
- header = {}
102
- header['Content-ID'] = content_id unless content_id.nil?
103
- @parts << Google::Apis::Core::JsonPart.new(body, header).to_io(@boundary)
104
- self
105
- end
106
-
107
- # Append arbitrary data as a part
108
- #
109
- # @param [IO] upload_io
110
- # IO stream
111
- # @param [String] content_id
112
- # Optional unique ID of this part
113
- # @return [self]
114
- def add_upload(upload_io, content_type: nil, content_id: nil)
115
- header = {
116
- 'Content-Type' => content_type || 'application/octet-stream'
117
- }
118
- header['Content-Id'] = content_id unless content_id.nil?
119
- @parts << Google::Apis::Core::FilePart.new(upload_io,
120
- header).to_io(@boundary)
121
- self
122
- end
123
-
124
- # Assemble the multipart requests
125
- #
126
- # @return [IO]
127
- # IO stream
128
- def assemble
129
- @parts << StringIO.new("--#{@boundary}--\r\n\r\n")
130
- Google::Apis::Core::CompositeIO.new(*@parts)
131
- end
132
- end
133
- end
134
- end
135
- end
@@ -1,273 +0,0 @@
1
- # Copyright 2015 Google Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'google/apis/core/multipart'
16
- require 'google/apis/core/http_command'
17
- require 'google/apis/core/api_command'
18
- require 'google/apis/errors'
19
- require 'addressable/uri'
20
- require 'tempfile'
21
- require 'mini_mime'
22
-
23
- module Google
24
- module Apis
25
- module Core
26
- # Base upload command. Not intended to be used directly
27
- # @private
28
- class BaseUploadCommand < ApiCommand
29
- UPLOAD_PROTOCOL_HEADER = 'X-Goog-Upload-Protocol'
30
- UPLOAD_CONTENT_TYPE_HEADER = 'X-Goog-Upload-Header-Content-Type'
31
- UPLOAD_CONTENT_LENGTH = 'X-Goog-Upload-Header-Content-Length'
32
- CONTENT_TYPE_HEADER = 'Content-Type'
33
-
34
- # File name or IO containing the content to upload
35
- # @return [String, File, #read]
36
- attr_accessor :upload_source
37
-
38
- # Content type of the upload material
39
- # @return [String]
40
- attr_accessor :upload_content_type
41
-
42
- # Content, as UploadIO
43
- # @return [Google::Apis::Core::UploadIO]
44
- attr_accessor :upload_io
45
-
46
- # Ensure the content is readable and wrapped in an IO instance.
47
- #
48
- # @return [void]
49
- # @raise [Google::Apis::ClientError] if upload source is invalid
50
- def prepare!
51
- super
52
- if streamable?(upload_source)
53
- self.upload_io = upload_source
54
- @close_io_on_finish = false
55
- elsif self.upload_source.is_a?(String)
56
- self.upload_io = File.new(upload_source, 'r')
57
- if self.upload_content_type.nil?
58
- type = MiniMime.lookup_by_filename(upload_source)
59
- self.upload_content_type = type && type.content_type
60
- end
61
- @close_io_on_finish = true
62
- else
63
- fail Google::Apis::ClientError, 'Invalid upload source'
64
- end
65
- if self.upload_content_type.nil? || self.upload_content_type.empty?
66
- self.upload_content_type = 'application/octet-stream'
67
- end
68
- end
69
-
70
- # Close IO stream when command done. Only closes the stream if it was opened by the command.
71
- def release!
72
- upload_io.close if @close_io_on_finish
73
- end
74
-
75
- private
76
-
77
- def streamable?(upload_source)
78
- upload_source.is_a?(IO) || upload_source.is_a?(StringIO) || upload_source.is_a?(Tempfile)
79
- end
80
- end
81
-
82
- # Implementation of the raw upload protocol
83
- class RawUploadCommand < BaseUploadCommand
84
- RAW_PROTOCOL = 'raw'
85
-
86
- # Ensure the content is readable and wrapped in an {{Google::Apis::Core::UploadIO}} instance.
87
- #
88
- # @return [void]
89
- # @raise [Google::Apis::ClientError] if upload source is invalid
90
- def prepare!
91
- super
92
- self.body = upload_io
93
- header[UPLOAD_PROTOCOL_HEADER] = RAW_PROTOCOL
94
- header[UPLOAD_CONTENT_TYPE_HEADER] = upload_content_type
95
- end
96
- end
97
-
98
- # Implementation of the multipart upload protocol
99
- class MultipartUploadCommand < BaseUploadCommand
100
- MULTIPART_PROTOCOL = 'multipart'
101
- MULTIPART_RELATED = 'multipart/related'
102
-
103
- # Encode the multipart request
104
- #
105
- # @return [void]
106
- # @raise [Google::Apis::ClientError] if upload source is invalid
107
- def prepare!
108
- super
109
- multipart = Multipart.new
110
- multipart.add_json(body)
111
- multipart.add_upload(upload_io, content_type: upload_content_type)
112
- self.body = multipart.assemble
113
- header['Content-Type'] = multipart.content_type
114
- header[UPLOAD_PROTOCOL_HEADER] = MULTIPART_PROTOCOL
115
- end
116
- end
117
-
118
- # Implementation of the resumable upload protocol
119
- class ResumableUploadCommand < BaseUploadCommand
120
- UPLOAD_COMMAND_HEADER = 'X-Goog-Upload-Command'
121
- UPLOAD_OFFSET_HEADER = 'X-Goog-Upload-Offset'
122
- BYTES_RECEIVED_HEADER = 'X-Goog-Upload-Size-Received'
123
- UPLOAD_URL_HEADER = 'X-Goog-Upload-URL'
124
- UPLOAD_STATUS_HEADER = 'X-Goog-Upload-Status'
125
- STATUS_ACTIVE = 'active'
126
- STATUS_FINAL = 'final'
127
- STATUS_CANCELLED = 'cancelled'
128
- RESUMABLE = 'resumable'
129
- START_COMMAND = 'start'
130
- QUERY_COMMAND = 'query'
131
- UPLOAD_COMMAND = 'upload, finalize'
132
-
133
- # Reset upload to initial state.
134
- #
135
- # @return [void]
136
- # @raise [Google::Apis::ClientError] if upload source is invalid
137
- def prepare!
138
- @state = :start
139
- @upload_url = nil
140
- @offset = 0
141
- # Prevent the command from populating the body with form encoding, by
142
- # asserting that it already has a body. Form encoding is never used
143
- # by upload requests.
144
- self.body = '' unless self.body
145
- super
146
- end
147
-
148
- # Check the to see if the upload is complete or needs to be resumed.
149
- #
150
- # @param [Fixnum] status
151
- # HTTP status code of response
152
- # @param [HTTP::Message::Headers] header
153
- # Response headers
154
- # @param [String, #read] body
155
- # Response body
156
- # @return [Object]
157
- # Response object
158
- # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
159
- # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
160
- # @raise [Google::Apis::AuthorizationError] Authorization is required
161
- def process_response(status, header, body)
162
- @offset = Integer(header[BYTES_RECEIVED_HEADER].first) unless header[BYTES_RECEIVED_HEADER].empty?
163
- @upload_url = header[UPLOAD_URL_HEADER].first unless header[UPLOAD_URL_HEADER].empty?
164
- upload_status = header[UPLOAD_STATUS_HEADER].first
165
- logger.debug { sprintf('Upload status %s', upload_status) }
166
- if upload_status == STATUS_ACTIVE
167
- @state = :active
168
- elsif upload_status == STATUS_FINAL
169
- @state = :final
170
- elsif upload_status == STATUS_CANCELLED
171
- @state = :cancelled
172
- fail Google::Apis::ClientError, body
173
- end
174
- super(status, header, body)
175
- end
176
-
177
- def send_start_command(client)
178
- logger.debug { sprintf('Sending upload start command to %s', url) }
179
-
180
- request_header = header.dup
181
- apply_request_options(request_header)
182
- request_header[UPLOAD_PROTOCOL_HEADER] = RESUMABLE
183
- request_header[UPLOAD_COMMAND_HEADER] = START_COMMAND
184
- request_header[UPLOAD_CONTENT_LENGTH] = upload_io.size.to_s
185
- request_header[UPLOAD_CONTENT_TYPE_HEADER] = upload_content_type
186
-
187
- client.request(method.to_s.upcase,
188
- url.to_s, query: nil,
189
- body: body,
190
- header: request_header,
191
- follow_redirect: true)
192
- rescue => e
193
- raise Google::Apis::ServerError, e.message
194
- end
195
-
196
- # Query for the status of an incomplete upload
197
- #
198
- # @param [HTTPClient] client
199
- # HTTP client
200
- # @return [HTTP::Message]
201
- # @raise [Google::Apis::ServerError] Unable to send the request
202
- def send_query_command(client)
203
- logger.debug { sprintf('Sending upload query command to %s', @upload_url) }
204
-
205
- request_header = header.dup
206
- apply_request_options(request_header)
207
- request_header[UPLOAD_COMMAND_HEADER] = QUERY_COMMAND
208
-
209
- client.post(@upload_url, body: '', header: request_header, follow_redirect: true)
210
- end
211
-
212
-
213
- # Send the actual content
214
- #
215
- # @param [HTTPClient] client
216
- # HTTP client
217
- # @return [HTTP::Message]
218
- # @raise [Google::Apis::ServerError] Unable to send the request
219
- def send_upload_command(client)
220
- logger.debug { sprintf('Sending upload command to %s', @upload_url) }
221
-
222
- content = upload_io
223
- content.pos = @offset
224
-
225
- request_header = header.dup
226
- apply_request_options(request_header)
227
- request_header[UPLOAD_COMMAND_HEADER] = QUERY_COMMAND
228
- request_header[UPLOAD_COMMAND_HEADER] = UPLOAD_COMMAND
229
- request_header[UPLOAD_OFFSET_HEADER] = @offset.to_s
230
- request_header[CONTENT_TYPE_HEADER] = upload_content_type
231
-
232
- client.post(@upload_url, body: content, header: request_header, follow_redirect: true)
233
- end
234
-
235
- # Execute the upload request once. This will typically perform two HTTP requests -- one to initiate or query
236
- # for the status of the upload, the second to send the (remaining) content.
237
- #
238
- # @private
239
- # @param [HTTPClient] client
240
- # HTTP client
241
- # @yield [result, err] Result or error if block supplied
242
- # @return [Object]
243
- # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
244
- # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
245
- # @raise [Google::Apis::AuthorizationError] Authorization is required
246
- def execute_once(client, &block)
247
- case @state
248
- when :start
249
- response = send_start_command(client)
250
- result = process_response(response.status_code, response.header, response.body)
251
- when :active
252
- response = send_query_command(client)
253
- result = process_response(response.status_code, response.header, response.body)
254
- when :cancelled, :final
255
- error(@last_error, rethrow: true, &block)
256
- end
257
- if @state == :active
258
- response = send_upload_command(client)
259
- result = process_response(response.status_code, response.header, response.body)
260
- end
261
-
262
- success(result, &block) if @state == :final
263
- rescue => e
264
- # Some APIs like Youtube generate non-retriable 401 errors and mark
265
- # the upload as finalized. Save the error just in case we get
266
- # retried.
267
- @last_error = e
268
- error(e, rethrow: true, &block)
269
- end
270
- end
271
- end
272
- end
273
- end