google-api-client 0.8.7 → 0.9.pre1

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 (397) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +20 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +7 -0
  5. data/.rubocop_todo.yml +63 -0
  6. data/.travis.yml +21 -0
  7. data/.yardopts +12 -0
  8. data/CHANGELOG.md +6 -3
  9. data/CONTRIBUTING.md +31 -0
  10. data/Gemfile +28 -2
  11. data/MIGRATING.md +171 -0
  12. data/README.md +158 -150
  13. data/Rakefile +1 -40
  14. data/api_names.yaml +872 -0
  15. data/api_names_out.yaml +20843 -0
  16. data/bin/generate-api +93 -0
  17. data/generated/google/apis/adexchangebuyer_v1_3.rb +35 -0
  18. data/generated/google/apis/adexchangebuyer_v1_3/classes.rb +1124 -0
  19. data/generated/google/apis/adexchangebuyer_v1_3/representations.rb +375 -0
  20. data/generated/google/apis/adexchangebuyer_v1_3/service.rb +893 -0
  21. data/generated/google/apis/adexchangeseller_v2_0.rb +38 -0
  22. data/generated/google/apis/adexchangeseller_v2_0/classes.rb +792 -0
  23. data/generated/google/apis/adexchangeseller_v2_0/representations.rb +309 -0
  24. data/generated/google/apis/adexchangeseller_v2_0/service.rb +682 -0
  25. data/generated/google/apis/admin_directory_v1.rb +89 -0
  26. data/generated/google/apis/admin_directory_v1/classes.rb +2389 -0
  27. data/generated/google/apis/admin_directory_v1/representations.rb +780 -0
  28. data/generated/google/apis/admin_directory_v1/service.rb +2805 -0
  29. data/generated/google/apis/admin_reports_v1.rb +38 -0
  30. data/generated/google/apis/admin_reports_v1/classes.rb +582 -0
  31. data/generated/google/apis/admin_reports_v1/representations.rb +231 -0
  32. data/generated/google/apis/admin_reports_v1/service.rb +341 -0
  33. data/generated/google/apis/adsense_v1_4.rb +38 -0
  34. data/generated/google/apis/adsense_v1_4/classes.rb +1279 -0
  35. data/generated/google/apis/adsense_v1_4/representations.rb +493 -0
  36. data/generated/google/apis/adsense_v1_4/service.rb +1752 -0
  37. data/generated/google/apis/adsensehost_v4_1.rb +35 -0
  38. data/generated/google/apis/adsensehost_v4_1/classes.rb +834 -0
  39. data/generated/google/apis/adsensehost_v4_1/representations.rb +327 -0
  40. data/generated/google/apis/adsensehost_v4_1/service.rb +1190 -0
  41. data/generated/google/apis/analytics_v3.rb +49 -0
  42. data/generated/google/apis/analytics_v3/classes.rb +5113 -0
  43. data/generated/google/apis/analytics_v3/representations.rb +1661 -0
  44. data/generated/google/apis/analytics_v3/service.rb +3600 -0
  45. data/generated/google/apis/androidenterprise_v1.rb +34 -0
  46. data/generated/google/apis/androidenterprise_v1/classes.rb +1162 -0
  47. data/generated/google/apis/androidenterprise_v1/representations.rb +431 -0
  48. data/generated/google/apis/androidenterprise_v1/service.rb +1979 -0
  49. data/generated/google/apis/androidpublisher_v2.rb +34 -0
  50. data/generated/google/apis/androidpublisher_v2/classes.rb +1374 -0
  51. data/generated/google/apis/androidpublisher_v2/representations.rb +630 -0
  52. data/generated/google/apis/androidpublisher_v2/service.rb +2390 -0
  53. data/generated/google/apis/appsactivity_v1.rb +46 -0
  54. data/generated/google/apis/appsactivity_v1/classes.rb +392 -0
  55. data/generated/google/apis/appsactivity_v1/representations.rb +184 -0
  56. data/generated/google/apis/appsactivity_v1/service.rb +129 -0
  57. data/generated/google/apis/appstate_v1.rb +34 -0
  58. data/generated/google/apis/appstate_v1/classes.rb +154 -0
  59. data/generated/google/apis/appstate_v1/representations.rb +79 -0
  60. data/generated/google/apis/appstate_v1/service.rb +265 -0
  61. data/generated/google/apis/autoscaler_v1beta2.rb +38 -0
  62. data/generated/google/apis/autoscaler_v1beta2/classes.rb +747 -0
  63. data/generated/google/apis/autoscaler_v1beta2/representations.rb +281 -0
  64. data/generated/google/apis/autoscaler_v1beta2/service.rb +488 -0
  65. data/generated/google/apis/bigquery_v2.rb +49 -0
  66. data/generated/google/apis/bigquery_v2/classes.rb +2255 -0
  67. data/generated/google/apis/bigquery_v2/representations.rb +754 -0
  68. data/generated/google/apis/bigquery_v2/service.rb +1003 -0
  69. data/generated/google/apis/blogger_v3.rb +37 -0
  70. data/generated/google/apis/blogger_v3/classes.rb +1354 -0
  71. data/generated/google/apis/blogger_v3/representations.rb +562 -0
  72. data/generated/google/apis/blogger_v3/service.rb +1620 -0
  73. data/generated/google/apis/books_v1.rb +34 -0
  74. data/generated/google/apis/books_v1/classes.rb +3515 -0
  75. data/generated/google/apis/books_v1/representations.rb +1361 -0
  76. data/generated/google/apis/books_v1/service.rb +2170 -0
  77. data/generated/google/apis/calendar_v3.rb +37 -0
  78. data/generated/google/apis/calendar_v3/classes.rb +1702 -0
  79. data/generated/google/apis/calendar_v3/representations.rb +566 -0
  80. data/generated/google/apis/calendar_v3/service.rb +1943 -0
  81. data/generated/google/apis/civicinfo_v2.rb +31 -0
  82. data/generated/google/apis/civicinfo_v2/classes.rb +1057 -0
  83. data/generated/google/apis/civicinfo_v2/representations.rb +374 -0
  84. data/generated/google/apis/civicinfo_v2/service.rb +284 -0
  85. data/generated/google/apis/cloudmonitoring_v2beta2.rb +34 -0
  86. data/generated/google/apis/cloudmonitoring_v2beta2/classes.rb +679 -0
  87. data/generated/google/apis/cloudmonitoring_v2beta2/representations.rb +311 -0
  88. data/generated/google/apis/cloudmonitoring_v2beta2/service.rb +458 -0
  89. data/generated/google/apis/cloudresourcemanager_v1beta1.rb +38 -0
  90. data/generated/google/apis/cloudresourcemanager_v1beta1/classes.rb +139 -0
  91. data/generated/google/apis/cloudresourcemanager_v1beta1/representations.rb +65 -0
  92. data/generated/google/apis/cloudresourcemanager_v1beta1/service.rb +301 -0
  93. data/generated/google/apis/compute_v1.rb +49 -0
  94. data/generated/google/apis/compute_v1/classes.rb +6391 -0
  95. data/generated/google/apis/compute_v1/representations.rb +2209 -0
  96. data/generated/google/apis/compute_v1/service.rb +6352 -0
  97. data/generated/google/apis/container_v1beta1.rb +35 -0
  98. data/generated/google/apis/container_v1beta1/classes.rb +466 -0
  99. data/generated/google/apis/container_v1beta1/representations.rb +177 -0
  100. data/generated/google/apis/container_v1beta1/service.rb +394 -0
  101. data/generated/google/apis/content_v2.rb +35 -0
  102. data/generated/google/apis/content_v2/classes.rb +3780 -0
  103. data/generated/google/apis/content_v2/representations.rb +1456 -0
  104. data/generated/google/apis/content_v2/service.rb +1706 -0
  105. data/generated/google/apis/coordinate_v1.rb +37 -0
  106. data/generated/google/apis/coordinate_v1/classes.rb +669 -0
  107. data/generated/google/apis/coordinate_v1/representations.rb +285 -0
  108. data/generated/google/apis/coordinate_v1/service.rb +687 -0
  109. data/{lib/google/api_client/auth/compute_service_account.rb → generated/google/apis/customsearch_v1.rb} +13 -10
  110. data/generated/google/apis/customsearch_v1/classes.rb +771 -0
  111. data/generated/google/apis/customsearch_v1/representations.rb +276 -0
  112. data/generated/google/apis/customsearch_v1/service.rb +208 -0
  113. data/generated/google/apis/datastore_v1beta2.rb +40 -0
  114. data/generated/google/apis/datastore_v1beta2/classes.rb +1186 -0
  115. data/generated/google/apis/datastore_v1beta2/representations.rb +526 -0
  116. data/generated/google/apis/datastore_v1beta2/service.rb +300 -0
  117. data/generated/google/apis/deploymentmanager_v2beta2.rb +41 -0
  118. data/generated/google/apis/deploymentmanager_v2beta2/classes.rb +820 -0
  119. data/generated/google/apis/deploymentmanager_v2beta2/representations.rb +303 -0
  120. data/generated/google/apis/deploymentmanager_v2beta2/service.rb +647 -0
  121. data/generated/google/apis/dfareporting_v2_1.rb +37 -0
  122. data/generated/google/apis/dfareporting_v2_1/classes.rb +10755 -0
  123. data/generated/google/apis/dfareporting_v2_1/representations.rb +3438 -0
  124. data/generated/google/apis/dfareporting_v2_1/service.rb +8775 -0
  125. data/generated/google/apis/discovery_v1.rb +32 -0
  126. data/generated/google/apis/discovery_v1/classes.rb +947 -0
  127. data/generated/google/apis/discovery_v1/representations.rb +355 -0
  128. data/generated/google/apis/discovery_v1/service.rb +144 -0
  129. data/generated/google/apis/dns_v1.rb +41 -0
  130. data/generated/google/apis/dns_v1/classes.rb +406 -0
  131. data/generated/google/apis/dns_v1/representations.rb +151 -0
  132. data/generated/google/apis/dns_v1/service.rb +460 -0
  133. data/{spec/google/api_client/request_spec.rb → generated/google/apis/doubleclickbidmanager_v1.rb} +15 -13
  134. data/generated/google/apis/doubleclickbidmanager_v1/classes.rb +709 -0
  135. data/generated/google/apis/doubleclickbidmanager_v1/representations.rb +297 -0
  136. data/generated/google/apis/doubleclickbidmanager_v1/service.rb +349 -0
  137. data/generated/google/apis/doubleclicksearch_v2.rb +35 -0
  138. data/generated/google/apis/doubleclicksearch_v2/classes.rb +947 -0
  139. data/generated/google/apis/doubleclicksearch_v2/representations.rb +315 -0
  140. data/generated/google/apis/doubleclicksearch_v2/service.rb +490 -0
  141. data/generated/google/apis/drive_v2.rb +55 -0
  142. data/generated/google/apis/drive_v2/classes.rb +2519 -0
  143. data/generated/google/apis/drive_v2/representations.rb +781 -0
  144. data/generated/google/apis/drive_v2/service.rb +2685 -0
  145. data/generated/google/apis/fitness_v1.rb +49 -0
  146. data/generated/google/apis/fitness_v1/classes.rb +809 -0
  147. data/generated/google/apis/fitness_v1/representations.rb +295 -0
  148. data/generated/google/apis/fitness_v1/service.rb +684 -0
  149. data/generated/google/apis/fusiontables_v2.rb +37 -0
  150. data/generated/google/apis/fusiontables_v2/classes.rb +1048 -0
  151. data/generated/google/apis/fusiontables_v2/representations.rb +409 -0
  152. data/generated/google/apis/fusiontables_v2/service.rb +1496 -0
  153. data/generated/google/apis/games_configuration_v1configuration.rb +34 -0
  154. data/generated/google/apis/games_configuration_v1configuration/classes.rb +506 -0
  155. data/generated/google/apis/games_configuration_v1configuration/representations.rb +206 -0
  156. data/generated/google/apis/games_configuration_v1configuration/service.rb +578 -0
  157. data/generated/google/apis/games_v1.rb +40 -0
  158. data/generated/google/apis/games_v1/classes.rb +4578 -0
  159. data/generated/google/apis/games_v1/representations.rb +1570 -0
  160. data/generated/google/apis/games_v1/service.rb +2306 -0
  161. data/generated/google/apis/gan_v1beta1.rb +31 -0
  162. data/generated/google/apis/gan_v1beta1/classes.rb +1428 -0
  163. data/generated/google/apis/gan_v1beta1/representations.rb +428 -0
  164. data/generated/google/apis/gan_v1beta1/service.rb +692 -0
  165. data/generated/google/apis/genomics_v1beta2.rb +46 -0
  166. data/generated/google/apis/genomics_v1beta2/classes.rb +3288 -0
  167. data/generated/google/apis/genomics_v1beta2/representations.rb +1194 -0
  168. data/generated/google/apis/genomics_v1beta2/service.rb +2356 -0
  169. data/generated/google/apis/gmail_v1.rb +49 -0
  170. data/generated/google/apis/gmail_v1/classes.rb +794 -0
  171. data/generated/google/apis/gmail_v1/representations.rb +339 -0
  172. data/generated/google/apis/gmail_v1/service.rb +1502 -0
  173. data/generated/google/apis/groupsmigration_v1.rb +34 -0
  174. data/generated/google/apis/groupsmigration_v1/classes.rb +51 -0
  175. data/generated/google/apis/groupsmigration_v1/representations.rb +38 -0
  176. data/generated/google/apis/groupsmigration_v1/service.rb +111 -0
  177. data/generated/google/apis/groupssettings_v1.rb +34 -0
  178. data/generated/google/apis/groupssettings_v1/classes.rb +221 -0
  179. data/generated/google/apis/groupssettings_v1/representations.rb +64 -0
  180. data/generated/google/apis/groupssettings_v1/service.rb +179 -0
  181. data/generated/google/apis/identitytoolkit_v3.rb +31 -0
  182. data/generated/google/apis/identitytoolkit_v3/classes.rb +1229 -0
  183. data/generated/google/apis/identitytoolkit_v3/representations.rb +422 -0
  184. data/generated/google/apis/identitytoolkit_v3/service.rb +491 -0
  185. data/generated/google/apis/licensing_v1.rb +34 -0
  186. data/generated/google/apis/licensing_v1/classes.rb +132 -0
  187. data/generated/google/apis/licensing_v1/representations.rb +68 -0
  188. data/generated/google/apis/licensing_v1/service.rb +376 -0
  189. data/generated/google/apis/logging_v1beta3.rb +35 -0
  190. data/generated/google/apis/logging_v1beta3/classes.rb +505 -0
  191. data/generated/google/apis/logging_v1beta3/representations.rb +222 -0
  192. data/generated/google/apis/logging_v1beta3/service.rb +670 -0
  193. data/generated/google/apis/manager_v1beta2.rb +50 -0
  194. data/generated/google/apis/manager_v1beta2/classes.rb +1287 -0
  195. data/generated/google/apis/manager_v1beta2/representations.rb +536 -0
  196. data/generated/google/apis/manager_v1beta2/service.rb +380 -0
  197. data/generated/google/apis/mapsengine_v1.rb +38 -0
  198. data/generated/google/apis/mapsengine_v1/classes.rb +2873 -0
  199. data/generated/google/apis/mapsengine_v1/representations.rb +1235 -0
  200. data/generated/google/apis/mapsengine_v1/service.rb +3465 -0
  201. data/generated/google/apis/mirror_v1.rb +37 -0
  202. data/generated/google/apis/mirror_v1/classes.rb +1072 -0
  203. data/generated/google/apis/mirror_v1/representations.rb +350 -0
  204. data/generated/google/apis/mirror_v1/service.rb +1001 -0
  205. data/generated/google/apis/oauth2_v2.rb +43 -0
  206. data/generated/google/apis/oauth2_v2/classes.rb +245 -0
  207. data/generated/google/apis/oauth2_v2/representations.rb +94 -0
  208. data/generated/google/apis/oauth2_v2/service.rb +203 -0
  209. data/generated/google/apis/pagespeedonline_v2.rb +32 -0
  210. data/generated/google/apis/pagespeedonline_v2/classes.rb +614 -0
  211. data/generated/google/apis/pagespeedonline_v2/representations.rb +244 -0
  212. data/generated/google/apis/pagespeedonline_v2/service.rb +120 -0
  213. data/generated/google/apis/plus_domains_v1.rb +61 -0
  214. data/generated/google/apis/plus_domains_v1/classes.rb +2402 -0
  215. data/generated/google/apis/plus_domains_v1/representations.rb +873 -0
  216. data/generated/google/apis/plus_domains_v1/service.rb +924 -0
  217. data/generated/google/apis/plus_v1.rb +43 -0
  218. data/generated/google/apis/plus_v1/classes.rb +2384 -0
  219. data/generated/google/apis/plus_v1/representations.rb +812 -0
  220. data/generated/google/apis/plus_v1/service.rb +616 -0
  221. data/generated/google/apis/prediction_v1_6.rb +44 -0
  222. data/generated/google/apis/prediction_v1_6/classes.rb +751 -0
  223. data/generated/google/apis/prediction_v1_6/representations.rb +327 -0
  224. data/generated/google/apis/prediction_v1_6/service.rb +388 -0
  225. data/generated/google/apis/pubsub_v1beta2.rb +37 -0
  226. data/generated/google/apis/pubsub_v1beta2/classes.rb +824 -0
  227. data/generated/google/apis/pubsub_v1beta2/representations.rb +366 -0
  228. data/generated/google/apis/pubsub_v1beta2/service.rb +778 -0
  229. data/generated/google/apis/qpx_express_v1.rb +31 -0
  230. data/generated/google/apis/qpx_express_v1/classes.rb +1268 -0
  231. data/generated/google/apis/qpx_express_v1/representations.rb +424 -0
  232. data/generated/google/apis/qpx_express_v1/service.rb +101 -0
  233. data/generated/google/apis/replicapool_v1beta2.rb +41 -0
  234. data/generated/google/apis/replicapool_v1beta2/classes.rb +621 -0
  235. data/generated/google/apis/replicapool_v1beta2/representations.rb +235 -0
  236. data/generated/google/apis/replicapool_v1beta2/service.rb +620 -0
  237. data/generated/google/apis/replicapoolupdater_v1beta1.rb +41 -0
  238. data/generated/google/apis/replicapoolupdater_v1beta1/classes.rb +682 -0
  239. data/generated/google/apis/replicapoolupdater_v1beta1/representations.rb +247 -0
  240. data/generated/google/apis/replicapoolupdater_v1beta1/service.rb +472 -0
  241. data/generated/google/apis/reseller_v1.rb +37 -0
  242. data/generated/google/apis/reseller_v1/classes.rb +502 -0
  243. data/generated/google/apis/reseller_v1/representations.rb +199 -0
  244. data/generated/google/apis/reseller_v1/service.rb +637 -0
  245. data/generated/google/apis/resourceviews_v1beta2.rb +47 -0
  246. data/generated/google/apis/resourceviews_v1beta2/classes.rb +660 -0
  247. data/generated/google/apis/resourceviews_v1beta2/representations.rb +269 -0
  248. data/generated/google/apis/resourceviews_v1beta2/service.rb +574 -0
  249. data/generated/google/apis/site_verification_v1.rb +37 -0
  250. data/generated/google/apis/site_verification_v1/classes.rb +185 -0
  251. data/generated/google/apis/site_verification_v1/representations.rb +101 -0
  252. data/generated/google/apis/site_verification_v1/service.rb +322 -0
  253. data/generated/google/apis/sqladmin_v1beta4.rb +37 -0
  254. data/generated/google/apis/sqladmin_v1beta4/classes.rb +1817 -0
  255. data/generated/google/apis/sqladmin_v1beta4/representations.rb +688 -0
  256. data/generated/google/apis/sqladmin_v1beta4/service.rb +1534 -0
  257. data/generated/google/apis/storage_v1.rb +43 -0
  258. data/generated/google/apis/storage_v1/classes.rb +1177 -0
  259. data/generated/google/apis/storage_v1/representations.rb +427 -0
  260. data/generated/google/apis/storage_v1/service.rb +1920 -0
  261. data/generated/google/apis/tagmanager_v1.rb +52 -0
  262. data/generated/google/apis/tagmanager_v1/classes.rb +1226 -0
  263. data/generated/google/apis/tagmanager_v1/representations.rb +461 -0
  264. data/generated/google/apis/tagmanager_v1/service.rb +1978 -0
  265. data/generated/google/apis/taskqueue_v1beta2.rb +37 -0
  266. data/generated/google/apis/taskqueue_v1beta2/classes.rb +254 -0
  267. data/generated/google/apis/taskqueue_v1beta2/representations.rb +114 -0
  268. data/generated/google/apis/taskqueue_v1beta2/service.rb +416 -0
  269. data/generated/google/apis/tasks_v1.rb +37 -0
  270. data/generated/google/apis/tasks_v1/classes.rb +296 -0
  271. data/generated/google/apis/tasks_v1/representations.rb +115 -0
  272. data/generated/google/apis/tasks_v1/service.rb +657 -0
  273. data/generated/google/apis/translate_v2.rb +31 -0
  274. data/generated/google/apis/translate_v2/classes.rb +168 -0
  275. data/generated/google/apis/translate_v2/representations.rb +109 -0
  276. data/generated/google/apis/translate_v2/service.rb +185 -0
  277. data/generated/google/apis/urlshortener_v1.rb +34 -0
  278. data/generated/google/apis/urlshortener_v1/classes.rb +246 -0
  279. data/generated/google/apis/urlshortener_v1/representations.rb +111 -0
  280. data/generated/google/apis/urlshortener_v1/service.rb +179 -0
  281. data/generated/google/apis/webmasters_v3.rb +37 -0
  282. data/generated/google/apis/webmasters_v3/classes.rb +563 -0
  283. data/generated/google/apis/webmasters_v3/representations.rb +250 -0
  284. data/generated/google/apis/webmasters_v3/service.rb +587 -0
  285. data/generated/google/apis/youtube_analytics_v1.rb +46 -0
  286. data/generated/google/apis/youtube_analytics_v1/classes.rb +540 -0
  287. data/generated/google/apis/youtube_analytics_v1/representations.rb +242 -0
  288. data/generated/google/apis/youtube_analytics_v1/service.rb +567 -0
  289. data/generated/google/apis/youtube_v3.rb +49 -0
  290. data/generated/google/apis/youtube_v3/classes.rb +7225 -0
  291. data/generated/google/apis/youtube_v3/representations.rb +2529 -0
  292. data/generated/google/apis/youtube_v3/service.rb +4051 -0
  293. data/google-api-client.gemspec +27 -39
  294. data/lib/google/api_client/auth/storage.rb +3 -2
  295. data/lib/google/api_client/auth/storages/file_store.rb +1 -3
  296. data/lib/google/api_client/auth/storages/redis_store.rb +6 -2
  297. data/lib/google/apis.rb +48 -0
  298. data/lib/google/apis/core/api_command.rb +128 -0
  299. data/lib/google/apis/core/base_service.rb +314 -0
  300. data/lib/google/apis/core/batch.rb +222 -0
  301. data/lib/google/apis/core/download.rb +94 -0
  302. data/lib/google/apis/core/hashable.rb +44 -0
  303. data/lib/google/apis/core/http_command.rb +275 -0
  304. data/lib/google/apis/core/json_representation.rb +122 -0
  305. data/lib/google/{api_client/version.rb → apis/core/logging.rb} +12 -8
  306. data/lib/google/apis/core/multipart.rb +173 -0
  307. data/lib/google/apis/core/upload.rb +275 -0
  308. data/lib/google/{api_client → apis}/errors.rb +32 -28
  309. data/lib/google/apis/generator.rb +70 -0
  310. data/lib/google/apis/generator/annotator.rb +271 -0
  311. data/lib/google/apis/generator/helpers.rb +74 -0
  312. data/lib/google/apis/generator/model.rb +130 -0
  313. data/lib/google/apis/generator/template.rb +124 -0
  314. data/lib/google/apis/generator/templates/_class.tmpl +40 -0
  315. data/lib/google/apis/generator/templates/_method.tmpl +90 -0
  316. data/lib/google/apis/generator/templates/_representation.tmpl +51 -0
  317. data/lib/google/apis/generator/templates/_representation_stub.tmpl +15 -0
  318. data/lib/google/apis/generator/templates/_representation_type.tmpl +10 -0
  319. data/lib/google/{api_client/reference.rb → apis/generator/templates/classes.rb.tmpl} +11 -9
  320. data/lib/google/apis/generator/templates/module.rb.tmpl +40 -0
  321. data/lib/google/apis/generator/templates/representations.rb.tmpl +32 -0
  322. data/lib/google/apis/generator/templates/service.rb.tmpl +60 -0
  323. data/lib/google/apis/options.rb +79 -0
  324. data/lib/google/apis/version.rb +39 -0
  325. data/rakelib/metrics.rake +22 -0
  326. data/rakelib/rubocop.rake +10 -0
  327. data/rakelib/spec.rake +11 -0
  328. data/rakelib/yard.rake +11 -0
  329. data/samples/calendar/calendar.rb +43 -0
  330. data/samples/drive/drive.rb +40 -0
  331. data/samples/pubsub/pubsub.rb +52 -0
  332. data/{lib/google/api_client/discovery.rb → samples/translate/translate.rb} +14 -5
  333. data/script/generate +79 -0
  334. data/script/package +8 -0
  335. data/script/release +15 -0
  336. data/spec/fixtures/files/api_names.yaml +3 -0
  337. data/spec/fixtures/files/auth_stored_credentials.json +8 -0
  338. data/spec/fixtures/files/client_secrets.json +1 -0
  339. data/spec/fixtures/files/test.blah +1 -0
  340. data/spec/fixtures/files/test.txt +1 -0
  341. data/spec/fixtures/files/test_api.json +440 -0
  342. data/spec/google/api_client/auth/storage_spec.rb +1 -3
  343. data/spec/google/api_client/auth/storages/file_store_spec.rb +1 -2
  344. data/spec/google/api_client/auth/storages/redis_store_spec.rb +1 -3
  345. data/spec/google/apis/core/api_command_spec.rb +170 -0
  346. data/spec/google/apis/core/batch_spec.rb +128 -0
  347. data/spec/google/apis/core/download_spec.rb +90 -0
  348. data/spec/google/apis/core/hashable_spec.rb +60 -0
  349. data/spec/google/apis/core/http_command_spec.rb +238 -0
  350. data/spec/google/apis/core/json_representation_spec.rb +192 -0
  351. data/spec/google/apis/core/service_spec.rb +247 -0
  352. data/spec/google/apis/core/upload_spec.rb +238 -0
  353. data/{lib/google/api_client/service_account.rb → spec/google/apis/generated_spec.rb} +14 -8
  354. data/spec/google/apis/generator/generator_spec.rb +272 -0
  355. data/spec/google/apis/logging_spec.rb +45 -0
  356. data/spec/google/apis/options_spec.rb +40 -0
  357. data/spec/integration_tests/drive_spec.rb +35 -0
  358. data/spec/integration_tests/pubsub_spec.rb +48 -0
  359. data/spec/integration_tests/url_shortener_spec.rb +31 -0
  360. data/spec/spec_helper.rb +102 -46
  361. metadata +433 -178
  362. data/lib/compat/multi_json.rb +0 -19
  363. data/lib/google/api_client.rb +0 -750
  364. data/lib/google/api_client/auth/file_storage.rb +0 -59
  365. data/lib/google/api_client/auth/jwt_asserter.rb +0 -126
  366. data/lib/google/api_client/auth/key_utils.rb +0 -93
  367. data/lib/google/api_client/auth/pkcs12.rb +0 -41
  368. data/lib/google/api_client/batch.rb +0 -326
  369. data/lib/google/api_client/charset.rb +0 -33
  370. data/lib/google/api_client/discovery/api.rb +0 -310
  371. data/lib/google/api_client/discovery/media.rb +0 -77
  372. data/lib/google/api_client/discovery/method.rb +0 -363
  373. data/lib/google/api_client/discovery/resource.rb +0 -156
  374. data/lib/google/api_client/discovery/schema.rb +0 -117
  375. data/lib/google/api_client/environment.rb +0 -42
  376. data/lib/google/api_client/gzip.rb +0 -28
  377. data/lib/google/api_client/logging.rb +0 -32
  378. data/lib/google/api_client/media.rb +0 -259
  379. data/lib/google/api_client/railtie.rb +0 -18
  380. data/lib/google/api_client/request.rb +0 -350
  381. data/lib/google/api_client/result.rb +0 -255
  382. data/lib/google/api_client/service.rb +0 -233
  383. data/lib/google/api_client/service/batch.rb +0 -110
  384. data/lib/google/api_client/service/request.rb +0 -144
  385. data/lib/google/api_client/service/resource.rb +0 -40
  386. data/lib/google/api_client/service/result.rb +0 -162
  387. data/lib/google/api_client/service/simple_file_store.rb +0 -151
  388. data/lib/google/api_client/service/stub_generator.rb +0 -61
  389. data/spec/google/api_client/batch_spec.rb +0 -248
  390. data/spec/google/api_client/discovery_spec.rb +0 -708
  391. data/spec/google/api_client/gzip_spec.rb +0 -98
  392. data/spec/google/api_client/media_spec.rb +0 -178
  393. data/spec/google/api_client/result_spec.rb +0 -207
  394. data/spec/google/api_client/service_account_spec.rb +0 -169
  395. data/spec/google/api_client/service_spec.rb +0 -618
  396. data/spec/google/api_client/simple_file_store_spec.rb +0 -133
  397. data/spec/google/api_client_spec.rb +0 -352
@@ -0,0 +1,122 @@
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 'representable/coercion'
18
+ require 'base64'
19
+
20
+ module Google
21
+ module Apis
22
+ module Core
23
+ # Support for serializing hashes + propery 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?(:[])
42
+ self[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[: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) { Base64.urlsafe_encode64(value) }
73
+ options[:parse_filter] = ->(fragment, _doc, *_args) { Base64.urlsafe_decode64(fragment) }
74
+ end
75
+ options[:render_nil] = true
76
+ options[:getter] = getter_fn(name)
77
+ options[:if] = if_fn(name)
78
+ end
79
+
80
+ # Define a single value property
81
+ #
82
+ # @param [String] name
83
+ # Property name
84
+ # @param [Hash] options
85
+ def property(name, options = {})
86
+ set_default_options(name, options)
87
+ super(name, options)
88
+ end
89
+
90
+ # Define a collection property
91
+ #
92
+ # @param [String] name
93
+ # Property name
94
+ # @param [Hash] options
95
+ def collection(name, options = {})
96
+ set_default_options(name, options)
97
+ super(name, options)
98
+ end
99
+
100
+ # Define a hash property
101
+ #
102
+ # @param [String] name
103
+ # Property name
104
+ # @param [Hash] options
105
+ def hash(name, options)
106
+ set_default_options(name, options)
107
+ super(name, options)
108
+ end
109
+ end
110
+ end
111
+
112
+ # Base decorator for JSON representers
113
+ #
114
+ # @see https://github.com/apotonick/representable
115
+ class JsonRepresentation < Representable::Decorator
116
+ include Representable::JSON
117
+ include Representable::Coercion
118
+ feature JsonRepresentationSupport
119
+ end
120
+ end
121
+ end
122
+ end
@@ -1,4 +1,4 @@
1
- # Copyright 2010 Google Inc.
1
+ # Copyright 2015 Google Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,15 +12,19 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'google/apis'
15
16
 
16
17
  module Google
17
- class APIClient
18
- module VERSION
19
- MAJOR = 0
20
- MINOR = 8
21
- TINY = 7
22
- PATCH = nil
23
- STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
18
+ module Apis
19
+ module Core
20
+ # Logging support
21
+ module Logging
22
+ # Get the logger instance
23
+ # @return [Logger]
24
+ def logger
25
+ Google::Apis.logger
26
+ end
27
+ end
24
28
  end
25
29
  end
26
30
  end
@@ -0,0 +1,173 @@
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 'hurley'
16
+
17
+ module Google
18
+ module Apis
19
+ module Core
20
+ # Part of a multipart request for holding JSON data
21
+ #
22
+ # @private
23
+ class JsonPart
24
+ include Hurley::Multipart::Part
25
+
26
+ # @return [Fixnum]
27
+ # Length of part
28
+ attr_reader :length
29
+
30
+ # @param [String] boundary
31
+ # Multipart boundary
32
+ # @param [String] value
33
+ # JSON content
34
+ def initialize(boundary, value)
35
+ @part = build_part(boundary, value)
36
+ @length = @part.bytesize
37
+ @io = StringIO.new(@part)
38
+ end
39
+
40
+ private
41
+
42
+ # Format the part
43
+ #
44
+ # @param [String] boundary
45
+ # Multipart boundary
46
+ # @param [String] value
47
+ # JSON content
48
+ # @return [String]
49
+ def build_part(boundary, value)
50
+ part = ''
51
+ part << "--#{boundary}\r\n"
52
+ part << "Content-Type: application/json\r\n"
53
+ part << "\r\n"
54
+ part << "#{value}\r\n"
55
+ end
56
+ end
57
+
58
+ # Part of a multipart request for holding arbitrary content. Modified
59
+ # from Hurley::Multipart::FilePart to remove Content-Disposition
60
+ #
61
+ # @private
62
+ class FilePart
63
+ include Hurley::Multipart::Part
64
+
65
+ # @return [Fixnum]
66
+ # Length of part
67
+ attr_reader :length
68
+
69
+ # @param [String] boundary
70
+ # Multipart boundary
71
+ # @param [Google::Apis::Core::UploadIO] io
72
+ # IO stream
73
+ # @param [Hash] header
74
+ # Additional headers
75
+ def initialize(boundary, io, header = {})
76
+ file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
77
+
78
+ @head = build_head(boundary, io.content_type, file_length,
79
+ io.respond_to?(:opts) ? io.opts.merge(header) : header)
80
+
81
+ @length = @head.bytesize + file_length + FOOT.length
82
+ @io = Hurley::CompositeReadIO.new(@length, StringIO.new(@head), io, StringIO.new(FOOT))
83
+ end
84
+
85
+ private
86
+
87
+ # Construct the header for the part
88
+ #
89
+ # @param [String] boundary
90
+ # Multipart boundary
91
+ # @param [String] type
92
+ # Content type for the part
93
+ # @param [Fixnum] content_len
94
+ # Length of the part
95
+ # @param [Hash] header
96
+ # Headers for the part
97
+ def build_head(boundary, type, content_len, header)
98
+ sprintf(HEAD_FORMAT,
99
+ boundary,
100
+ content_len.to_i,
101
+ header[:content_type] || type,
102
+ header[:content_transfer_encoding] || DEFAULT_TR_ENCODING)
103
+ end
104
+
105
+ DEFAULT_TR_ENCODING = 'binary'.freeze
106
+ FOOT = "\r\n".freeze
107
+ HEAD_FORMAT = <<-END
108
+ --%s\r
109
+ Content-Length: %d\r
110
+ Content-Type: %s\r
111
+ Content-Transfer-Encoding: %s\r
112
+ \r
113
+ END
114
+ end
115
+
116
+ # Helper for building multipart requests
117
+ class Multipart
118
+ MULTIPART_RELATED = 'multipart/related'
119
+ DEFAULT_BOUNDARY = 'RubyApiClientMultiPart'
120
+
121
+ # @return [String]
122
+ # Content type header
123
+ attr_reader :content_type
124
+
125
+ # @param [String] content_type
126
+ # Content type for the multipart request
127
+ # @param [String] boundary
128
+ # Part delimiter
129
+
130
+ def initialize(content_type: MULTIPART_RELATED, boundary: nil)
131
+ @parts = []
132
+ @boundary = boundary || DEFAULT_BOUNDARY
133
+ @content_type = "#{content_type}; boundary=#{boundary}"
134
+ end
135
+
136
+ # Append JSON data part
137
+ #
138
+ # @param [String] body
139
+ # JSON text
140
+ # @return [self]
141
+ def add_json(body)
142
+ @parts << Google::Apis::Core::JsonPart.new(@boundary, body)
143
+ self
144
+ end
145
+
146
+ # Append arbitrary data as a part
147
+ #
148
+ # @param [Google::Apis::Core::UploadIO] upload_io
149
+ # IO stream
150
+ # @return [self]
151
+ def add_upload(upload_io)
152
+ @parts << Google::Apis::Core::FilePart.new(@boundary, upload_io)
153
+ self
154
+ end
155
+
156
+ # Assemble the multipart requests
157
+ #
158
+ # @return [IO]
159
+ # IO stream
160
+ def assemble
161
+ @parts << Hurley::Multipart::EpiloguePart.new(@boundary)
162
+ ios = []
163
+ len = 0
164
+ @parts.each do |part|
165
+ len += part.length
166
+ ios << part.to_io
167
+ end
168
+ Hurley::CompositeReadIO.new(len, *ios)
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,275 @@
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 'mime-types'
21
+
22
+ module Google
23
+ module Apis
24
+ module Core
25
+ # Extension of Hurley's UploadIO to add length accessor
26
+ class UploadIO < Hurley::UploadIO
27
+ OCTET_STREAM_CONTENT_TYPE = 'application/octet-stream'
28
+
29
+ # Get the length of the stream
30
+ # @return [Fixnum]
31
+ def length
32
+ io.respond_to?(:length) ? io.length : File.size(local_path)
33
+ end
34
+
35
+ # Create a new instance given a file path
36
+ # @param [String, File] file_name
37
+ # Path to file
38
+ # @param [String] content_type
39
+ # Optional content type. If nil, will attempt to auto-detect
40
+ # @return [Google::Apis::Core::UploadIO]
41
+ def self.from_file(file_name, content_type: nil)
42
+ if content_type.nil?
43
+ type = MIME::Types.of(file_name)
44
+ content_type = type.first.content_type unless type.nil? || type.empty?
45
+ end
46
+ new(file_name, content_type || OCTET_STREAM_CONTENT_TYPE)
47
+ end
48
+
49
+ # Wraps an IO stream in UploadIO
50
+ # @param [#read] io
51
+ # IO to wrap
52
+ # @param [String] content_type
53
+ # Optional content type.
54
+ # @return [Google::Apis::Core::UploadIO]
55
+ def self.from_io(io, content_type: OCTET_STREAM_CONTENT_TYPE)
56
+ new(io, content_type)
57
+ end
58
+ end
59
+
60
+ # Base upload command. Not intended to be used directly
61
+ # @private
62
+ class BaseUploadCommand < ApiCommand
63
+ UPLOAD_PROTOCOL_HEADER = 'X-Goog-Upload-Protocol'
64
+ UPLOAD_CONTENT_TYPE_HEADER = 'X-Goog-Upload-Header-Content-Type'
65
+ UPLOAD_CONTENT_LENGTH = 'X-Goog-Upload-Header-Content-Length'
66
+
67
+ # File name or IO containing the content to upload
68
+ # @return [String, File, #read]
69
+ attr_accessor :upload_source
70
+
71
+ # Content type of the upload material
72
+ # @return [String]
73
+ attr_accessor :upload_content_type
74
+
75
+ # Content, as UploadIO
76
+ # @return [Google::Apis::Core::UploadIO]
77
+ attr_accessor :upload_io
78
+
79
+ # Ensure the content is readable and wrapped in an {{Google::Apis::Core::UploadIO}} instance.
80
+ #
81
+ # @return [void]
82
+ # @raise [Google::Apis::ClientError] if upload source is invalid
83
+ def prepare!
84
+ super
85
+ if upload_source.is_a?(IO) || upload_source.is_a?(StringIO)
86
+ self.upload_io = UploadIO.from_io(upload_source, content_type: upload_content_type)
87
+ @close_io_on_finish = false
88
+ elsif upload_source.is_a?(String)
89
+ self.upload_io = UploadIO.from_file(upload_source, content_type: upload_content_type)
90
+ @close_io_on_finish = true
91
+ else
92
+ fail Google::Apis::ClientError, 'Invalid upload source'
93
+ end
94
+ end
95
+
96
+ # Close IO stream when command done. Only closes the stream if it was opened by the command.
97
+ def release!
98
+ upload_io.close if @close_io_on_finish
99
+ end
100
+ end
101
+
102
+ # Implementation of the raw upload protocol
103
+ class RawUploadCommand < BaseUploadCommand
104
+ RAW_PROTOCOL = 'raw'
105
+
106
+ # Ensure the content is readable and wrapped in an {{Google::Apis::Core::UploadIO}} instance.
107
+ #
108
+ # @return [void]
109
+ # @raise [Google::Apis::ClientError] if upload source is invalid
110
+ def prepare!
111
+ super
112
+ self.body = upload_io
113
+ header[UPLOAD_PROTOCOL_HEADER] = RAW_PROTOCOL
114
+ header[UPLOAD_CONTENT_TYPE_HEADER] = upload_io.content_type
115
+ end
116
+ end
117
+
118
+ # Implementation of the multipart upload protocol
119
+ class MultipartUploadCommand < BaseUploadCommand
120
+ UPLOAD_BOUNDARY = 'RubyApiClientUpload'
121
+ MULTIPART_PROTOCOL = 'multipart'
122
+ MULTIPART_RELATED = 'multipart/related'
123
+
124
+ # Encode the multipart request
125
+ #
126
+ # @return [void]
127
+ # @raise [Google::Apis::ClientError] if upload source is invalid
128
+ def prepare!
129
+ super
130
+ @multipart = Multipart.new(boundary: UPLOAD_BOUNDARY, content_type: MULTIPART_RELATED)
131
+ @multipart.add_json(body)
132
+ @multipart.add_upload(upload_io)
133
+ self.body = @multipart.assemble
134
+ header[:content_type] = @multipart.content_type
135
+ header[UPLOAD_PROTOCOL_HEADER] = MULTIPART_PROTOCOL
136
+ end
137
+ end
138
+
139
+ # Implementation of the resumable upload protocol
140
+ class ResumableUploadCommand < BaseUploadCommand
141
+ UPLOAD_COMMAND_HEADER = 'X-Goog-Upload-Command'
142
+ UPLOAD_OFFSET_HEADER = 'X-Goog-Upload-Offset'
143
+ BYTES_RECEIVED_HEADER = 'X-Goog-Upload-Size-Received'
144
+ UPLOAD_URL_HEADER = 'X-Goog-Upload-URL'
145
+ UPLOAD_STATUS_HEADER = 'X-Goog-Upload-Status'
146
+ STATUS_ACTIVE = 'active'
147
+ STATUS_FINAL = 'final'
148
+ STATUS_CANCELLED = 'cancelled'
149
+ RESUMABLE = 'resumable'
150
+ START_COMMAND = 'start'
151
+ QUERY_COMMAND = 'query'
152
+ UPLOAD_COMMAND = 'upload, finalize'
153
+
154
+ # Reset upload to initial state.
155
+ #
156
+ # @return [void]
157
+ # @raise [Google::Apis::ClientError] if upload source is invalid
158
+ def prepare!
159
+ @state = :start
160
+ @upload_url = nil
161
+ @offset = 0
162
+ super
163
+ end
164
+
165
+ # Check the to see if the upload is complete or needs to be resumed.
166
+ #
167
+ # @param [Fixnum] status
168
+ # HTTP status code of response
169
+ # @param [Hurley::Header] header
170
+ # Response headers
171
+ # @param [String, #read] body
172
+ # Response body
173
+ # @return [Object]
174
+ # Response object
175
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
176
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
177
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
178
+ def process_response(status, header, body)
179
+ @offset = Integer(header[BYTES_RECEIVED_HEADER]) if header.key?(BYTES_RECEIVED_HEADER)
180
+ @upload_url = header[UPLOAD_URL_HEADER] if header.key?(UPLOAD_URL_HEADER)
181
+
182
+ upload_status = header[UPLOAD_STATUS_HEADER]
183
+ logger.debug { sprintf('Upload status %s', upload_status) }
184
+ if upload_status == STATUS_ACTIVE
185
+ @state = :active
186
+ elsif upload_status == STATUS_FINAL
187
+ @state = :final
188
+ elsif upload_status == STATUS_CANCELLED
189
+ @state = :cancelled
190
+ fail Google::Apis::ClientError, body
191
+ end
192
+ super(status, header, body)
193
+ end
194
+
195
+ # Send the start command to initiate the upload
196
+ #
197
+ # @param [Hurley::Client] client
198
+ # HTTP client
199
+ # @return [Hurley::Response]
200
+ # @raise [Google::Apis::ServerError] Unable to send the request
201
+ def send_start_command(client)
202
+ logger.debug { sprintf('Sending upload start command to %s', url) }
203
+ client.send(method, url, body) do |req|
204
+ apply_request_options(req)
205
+ req.header[UPLOAD_PROTOCOL_HEADER] = RESUMABLE
206
+ req.header[UPLOAD_COMMAND_HEADER] = START_COMMAND
207
+ req.header[UPLOAD_CONTENT_LENGTH] = upload_io.length.to_s
208
+ req.header[UPLOAD_CONTENT_TYPE_HEADER] = upload_io.content_type
209
+ end
210
+ rescue => e
211
+ raise Google::Apis::ServerError, e.message
212
+ end
213
+
214
+ # Query for the status of an incomplete upload
215
+ #
216
+ # @param [Hurley::Client] client
217
+ # HTTP client
218
+ # @return [Hurley::Response]
219
+ # @raise [Google::Apis::ServerError] Unable to send the request
220
+ def send_query_command(client)
221
+ logger.debug { sprintf('Sending upload query command to %s', @upload_url) }
222
+ client.post(@upload_url, nil) do |req|
223
+ apply_request_options(req)
224
+ req.header[UPLOAD_COMMAND_HEADER] = QUERY_COMMAND
225
+ end
226
+ end
227
+
228
+ # Send the actual content
229
+ #
230
+ # @param [Hurley::Client] client
231
+ # HTTP client
232
+ # @return [Hurley::Response]
233
+ # @raise [Google::Apis::ServerError] Unable to send the request
234
+ def send_upload_command(client)
235
+ logger.debug { sprintf('Sending upload command to %s', @upload_url) }
236
+ content = upload_io
237
+ content.pos = @offset
238
+ client.post(@upload_url, content) do |req|
239
+ apply_request_options(req)
240
+ req.header[UPLOAD_COMMAND_HEADER] = UPLOAD_COMMAND
241
+ req.header[UPLOAD_OFFSET_HEADER] = @offset.to_s
242
+ end
243
+ end
244
+
245
+ # Execute the upload request once. This will typically perform two HTTP requests -- one to initiate or query
246
+ # for the status of the upload, the second to send the (remaining) content.
247
+ #
248
+ # @private
249
+ # @param [Hurley::Client] client
250
+ # HTTP client
251
+ # @yield [result, err] Result or error if block supplied
252
+ # @return [Object]
253
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
254
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
255
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
256
+ def execute_once(client, &block)
257
+ if @state == :start
258
+ response = send_start_command(client)
259
+ else
260
+ response = send_query_command(client)
261
+ end
262
+ result = process_response(response.status_code, response.header, response.body)
263
+ if @state == :active
264
+ response = send_upload_command(client)
265
+ result = process_response(response.status_code, response.header, response.body)
266
+ end
267
+
268
+ success(result, &block) if @state == :final
269
+ rescue => e
270
+ error(e, rethrow: true, &block)
271
+ end
272
+ end
273
+ end
274
+ end
275
+ end