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,222 @@
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
+ # Copyright 2015 Google Inc.
15
+ #
16
+ # Licensed under the Apache License, Version 2.0 (the "License");
17
+ # you may not use this file except in compliance with the License.
18
+ # You may obtain a copy of the License at
19
+ #
20
+ # http://www.apache.org/licenses/LICENSE-2.0
21
+ #
22
+ # Unless required by applicable law or agreed to in writing, software
23
+ # distributed under the License is distributed on an "AS IS" BASIS,
24
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
+ # See the License for the specific language governing permissions and
26
+ # limitations under the License.
27
+
28
+ require 'hurley'
29
+ require 'google/apis/core/multipart'
30
+ require 'google/apis/core/http_command'
31
+ require 'google/apis/core/upload'
32
+ require 'google/apis/core/download'
33
+ require 'addressable/uri'
34
+
35
+ module Google
36
+ module Apis
37
+ module Core
38
+ # Wrapper request for batching multiple calls in a single server request
39
+ class BatchCommand < HttpCommand
40
+ BATCH_BOUNDARY = 'RubyApiBatchRequest'.freeze
41
+ MULTIPART_MIXED = 'multipart/mixed'
42
+
43
+ # @param [symbol] method
44
+ # HTTP method
45
+ # @param [String,Addressable::URI, Addressable::Template] url
46
+ # HTTP URL or template
47
+ def initialize(method, url)
48
+ super(method, url)
49
+ @calls = []
50
+ end
51
+
52
+ ##
53
+ # Add a new call to the batch request.
54
+ #
55
+ # @param [Google::Apis::Core::HttpCommand] call API Request to add
56
+ # @yield [result, err] Result & error when response available
57
+ # @return [Google::Apis::Core::BatchCommand] self
58
+ def add(call, &block)
59
+ ensure_valid_command(call)
60
+ @calls << [call, block]
61
+ self
62
+ end
63
+
64
+ protected
65
+
66
+ ##
67
+ # Deconstruct the batch response and process the individual results
68
+ #
69
+ # @param [String] content_type
70
+ # Content type of body
71
+ # @param [String, #read] body
72
+ # Response body
73
+ # @return [Object]
74
+ # Response object
75
+ def decode_response_body(content_type, body)
76
+ m = /.*boundary=(.+)/.match(content_type)
77
+ if m
78
+ parts = split_parts(body, m[1])
79
+ deserializer = CallDeserializer.new
80
+ parts.each_index do |index|
81
+ call, callback = @calls[index]
82
+ begin
83
+ result = call.process_response(*deserializer.to_http_response(parts[index])) unless call.nil?
84
+ success(result, &callback)
85
+ rescue => e
86
+ error(e, &callback)
87
+ end
88
+ end
89
+ end
90
+ nil
91
+ end
92
+
93
+ def split_parts(body, boundary)
94
+ parts = body.split(/\r?\n?--#{Regexp.escape(boundary)}/)
95
+ parts[1...-1]
96
+ end
97
+
98
+ # Encode the batch request
99
+ # @return [void]
100
+ # @raise [Google::Apis::BatchError] if batch is empty
101
+ def prepare!
102
+ fail BatchError, 'Cannot make an empty batch request' if @calls.empty?
103
+
104
+ serializer = CallSerializer.new
105
+ multipart = Multipart.new(boundary: BATCH_BOUNDARY, content_type: MULTIPART_MIXED)
106
+ @calls.each do |(call, _)|
107
+ io = serializer.to_upload_io(call)
108
+ multipart.add_upload(io)
109
+ end
110
+ self.body = multipart.assemble
111
+
112
+ header[:content_type] = multipart.content_type
113
+ header[:content_length] = "#{body.length}"
114
+ super
115
+ end
116
+
117
+ def ensure_valid_command(command)
118
+ if command.is_a?(Google::Apis::Core::BaseUploadCommand) || command.is_a?(Google::Apis::Core::DownloadCommand)
119
+ fail Google::Apis::ClientError, 'Can not include media requests in batch'
120
+ end
121
+ fail Google::Apis::ClientError, 'Invalid command object' unless command.is_a?(HttpCommand)
122
+ end
123
+ end
124
+
125
+ # Wrapper request for batching multiple uploads in a single server request
126
+ class BatchUploadCommand < BatchCommand
127
+ def ensure_valid_command(command)
128
+ fail Google::Apis::ClientError, 'Can only include upload commands in batch' \
129
+ unless command.is_a?(Google::Apis::Core::BaseUploadCommand)
130
+ end
131
+
132
+ def prepare!
133
+ header['X-Goog-Upload-Protocol'] = 'batch'
134
+ super
135
+ end
136
+ end
137
+
138
+ # Serializes a command for embedding in a multipart batch request
139
+ # @private
140
+ class CallSerializer
141
+ HTTP_CONTENT_TYPE = 'application/http'
142
+
143
+ ##
144
+ # Serialize a single batched call for assembling the multipart message
145
+ #
146
+ # @param [Google::Apis::Core::HttpCommand] call
147
+ # the call to serialize.
148
+ # @return [Hurley::UploadIO]
149
+ # the serialized request
150
+ def to_upload_io(call)
151
+ call.prepare!
152
+ parts = []
153
+ parts << build_head(call)
154
+ parts << build_body(call) unless call.body.nil?
155
+ length = parts.inject(0) { |a, e| a + e.length }
156
+ Hurley::UploadIO.new(Hurley::CompositeReadIO.new(length, *parts),
157
+ HTTP_CONTENT_TYPE,
158
+ 'ruby-api-request')
159
+ end
160
+
161
+ protected
162
+
163
+ def build_head(call)
164
+ request_head = "#{call.method.to_s.upcase} #{Addressable::URI.parse(call.url).request_uri} HTTP/1.1"
165
+ call.header.each do |key, value|
166
+ request_head << sprintf("\r\n%s: %s", key, value)
167
+ end
168
+ request_head << sprintf("\r\nHost: %s", call.url.host)
169
+ request_head << "\r\n\r\n"
170
+ StringIO.new(request_head)
171
+ end
172
+
173
+ def build_body(call)
174
+ return nil if call.body.nil?
175
+ return call.body if call.body.respond_to?(:read)
176
+ StringIO.new(call.body)
177
+ end
178
+ end
179
+
180
+ # Deconstructs a raw HTTP response part
181
+ # @private
182
+ class CallDeserializer
183
+ # Convert a single batched response into a BatchedCallResponse object.
184
+ #
185
+ # @param [String] call_response
186
+ # the response to parse.
187
+ # @return [Array<(Fixnum, Hurley::Header, String)>]
188
+ # Status, header, and response body.
189
+ def to_http_response(call_response)
190
+ _, outer_body = split_header_and_body(call_response)
191
+ status_line, payload = outer_body.split(/\n/, 2)
192
+ _, status = status_line.split(' ', 3)
193
+
194
+ header, body = split_header_and_body(payload)
195
+ [status.to_i, header, body]
196
+ end
197
+
198
+ protected
199
+
200
+ # Auxiliary method to split the header from the body in an HTTP response.
201
+ #
202
+ # @param [String] response
203
+ # the response to parse.
204
+ # @return [Array<(Hurley::Header, String)>]
205
+ # the header and the body, separately.
206
+ def split_header_and_body(response)
207
+ header = Hurley::Header.new
208
+ payload = response.lstrip
209
+ while payload
210
+ line, payload = payload.split(/\n/, 2)
211
+ line.sub!(/\s+\z/, '')
212
+ break if line.empty?
213
+ match = /\A([^:]+):\s*/.match(line)
214
+ fail BatchError, sprintf('Invalid header line in response: %s', line) if match.nil?
215
+ header[match[1]] = match.post_match
216
+ end
217
+ [header, payload]
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,94 @@
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/api_command'
17
+ require 'google/apis/errors'
18
+ require 'addressable/uri'
19
+
20
+ module Google
21
+ module Apis
22
+ module Core
23
+ # Streaming/resumable media download support
24
+ class DownloadCommand < ApiCommand
25
+ RANGE_HEADER = 'range'
26
+
27
+ # File or IO to write content to
28
+ # @return [String, File, #write]
29
+ attr_accessor :download_dest
30
+
31
+ # Ensure the download destination is a writable stream.
32
+ #
33
+ # @return [void]
34
+ def prepare!
35
+ @state = :start
36
+ @download_url = nil
37
+ @offset = 0
38
+ if download_dest.respond_to?(:write)
39
+ @download_io = download_dest
40
+ @close_io_on_finish = false
41
+ elsif download_dest.is_a?(String)
42
+ @download_io = File.open(download_dest, 'wb')
43
+ @close_io_on_finish = true
44
+ else
45
+ @download_io = StringIO.new('', 'wb')
46
+ @close_io_on_finish = false
47
+ end
48
+ super
49
+ end
50
+
51
+ # Close IO stream when command done. Only closes the stream if it was opened by the command.
52
+ def release!
53
+ @download_io.close if @close_io_on_finish
54
+ end
55
+
56
+ # Execute the upload request once. Overrides the default implementation to handle streaming/chunking
57
+ # of file content.
58
+ #
59
+ # @private
60
+ # @param [Hurley::Client] client
61
+ # HTTP client
62
+ # @yield [result, err] Result or error if block supplied
63
+ # @return [Object]
64
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
65
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
66
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
67
+ def execute_once(client, &block)
68
+ client.get(@download_url || url) do |req|
69
+ apply_request_options(req)
70
+ if @offset > 0
71
+ logger.debug { sprintf('Resuming download from offset %d', @offset) }
72
+ req.header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
73
+ end
74
+ req.on_body do |res, chunk|
75
+ check_status(res.status_code, chunk) unless res.status_code.nil?
76
+ logger.debug { sprintf('Writing chunk (%d bytes)', chunk.length) }
77
+ @offset += chunk.length
78
+ @download_io.write(chunk)
79
+ @download_io.flush
80
+ end
81
+ end
82
+ if @close_io_on_finish
83
+ result = nil
84
+ else
85
+ result = @download_io
86
+ end
87
+ success(result, &block)
88
+ rescue => e
89
+ error(e, rethrow: true, &block)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,44 @@
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
+ module Google
16
+ module Apis
17
+ module Core
18
+ # Adds to_hash to objects
19
+ module Hashable
20
+ # Convert object to hash representation
21
+ #
22
+ # @return [Hash]
23
+ def to_h
24
+ Hash[instance_variables.map { |k| [k[1..-1].to_sym, Hashable.process_value(instance_variable_get(k))] }]
25
+ end
26
+
27
+ # Recursively serialize an object
28
+ #
29
+ # @param [Object] val
30
+ # @return [Hash]
31
+ def self.process_value(val)
32
+ case val
33
+ when Hash
34
+ Hash[val.map {|k, v| [k.to_sym, Hashable.process_value(v)] }]
35
+ when Array
36
+ val.map{ |v| Hashable.process_value(v) }
37
+ else
38
+ val.respond_to?(:to_h) ? val.to_h : val
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ 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 'addressable/uri'
16
+ require 'addressable/template'
17
+ require 'google/apis/options'
18
+ require 'google/apis/errors'
19
+ require 'retriable'
20
+ require 'hurley'
21
+ require 'hurley/addressable'
22
+ require 'google/apis/core/logging'
23
+ require 'pp'
24
+
25
+ module Google
26
+ module Apis
27
+ module Core
28
+ # Command for HTTP request/response.
29
+ class HttpCommand
30
+ include Logging
31
+
32
+ RETRIABLE_ERRORS = [Google::Apis::ServerError, Google::Apis::RateLimitError, Google::Apis::TransmissionError]
33
+
34
+ # Request options
35
+ # @return [Google::Apis::RequestOptions]
36
+ attr_accessor :options
37
+
38
+ # HTTP request URL
39
+ # @return [String, Addressable::URI]
40
+ attr_accessor :url
41
+
42
+ # HTTP headers
43
+ # @return [Hurley::Header]
44
+ attr_accessor :header
45
+
46
+ # Request body
47
+ # @return [#read]
48
+ attr_accessor :body
49
+
50
+ # HTTP method
51
+ # @return [symbol]
52
+ attr_accessor :method
53
+
54
+ # HTTP Client
55
+ # @return [Hurley::Client]
56
+ attr_accessor :connection
57
+
58
+ # Query params
59
+ # @return [Hash]
60
+ attr_accessor :query
61
+
62
+ # Path params for URL Template
63
+ # @return [Hash]
64
+ attr_accessor :params
65
+
66
+ # @param [symbol] method
67
+ # HTTP method
68
+ # @param [String,Addressable::URI, Addressable::Template] url
69
+ # HTTP URL or template
70
+ # @param [String, #read] body
71
+ # Request body
72
+ def initialize(method, url, body: nil)
73
+ self.options = Google::Apis::RequestOptions.default.dup
74
+ self.url = url
75
+ self.url = Addressable::Template.new(url) if url.is_a?(String)
76
+ self.method = method
77
+ self.header = Hurley::Header.new
78
+ self.body = body
79
+ self.query = {}
80
+ self.params = {}
81
+ end
82
+
83
+ # Execute the command, retrying as necessary
84
+ #
85
+ # @param [Hurley::Client] client
86
+ # HTTP client
87
+ # @yield [result, err] Result or error if block supplied
88
+ # @return [Object]
89
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
90
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
91
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
92
+ def execute(client)
93
+ prepare!
94
+ proc = block_given? ? Proc.new : nil
95
+ begin
96
+ Retriable.retriable tries: options.retries + 1,
97
+ base_interval: 1,
98
+ multiplier: 2,
99
+ on: RETRIABLE_ERRORS do |try|
100
+ # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
101
+ # auth to be re-attempted without having to retry all sorts of other failures like
102
+ # NotFound, etc
103
+ auth_tries = (try == 1 && authorization_refreshable? ? 2 : 1)
104
+ Retriable.retriable tries: auth_tries,
105
+ on: [Google::Apis::AuthorizationError],
106
+ on_retry: proc { |*| refresh_authorization } do
107
+ return execute_once(client, &proc)
108
+ end
109
+ end
110
+ rescue => e
111
+ raise e if proc.nil?
112
+ end
113
+ ensure
114
+ release!
115
+ end
116
+
117
+ # Refresh the authorization authorization after a 401 error
118
+ #
119
+ # @private
120
+ # @return [void]
121
+ def refresh_authorization
122
+ # Handled implicitly by auth lib, here in case need to override
123
+ logger.debug('Retrying after authentication failure')
124
+ end
125
+
126
+ # Check if attached credentials can be automatically refreshed
127
+ # @return [Boolean]
128
+ def authorization_refreshable?
129
+ options.authorization.respond_to?(:apply!)
130
+ end
131
+
132
+ # Prepare the request (e.g. calculate headers, serialize data, etc) before sending
133
+ #
134
+ # @private
135
+ # @return [void]
136
+ def prepare!
137
+ header.update(options.header) if options && options.header
138
+ self.url = url.expand(params) if url.is_a?(Addressable::Template)
139
+ url.query_values = query
140
+ end
141
+
142
+ # Release any resources used by this command
143
+ # @private
144
+ # @return [void]
145
+ def release!
146
+ end
147
+
148
+ # Check the response and either decode body or raise error
149
+ #
150
+ # @param [Fixnum] status
151
+ # HTTP status code of response
152
+ # @param [Hurley::Header] 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
+ check_status(status, body)
163
+ decode_response_body(header[:content_type], body)
164
+ end
165
+
166
+ # Check the response and raise error if needed
167
+ #
168
+ # @param [Fixnum] status
169
+ # HTTP status code of response
170
+ # @param [String] body
171
+ # HTTP response body
172
+ # @return [void]
173
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
174
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
175
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
176
+ def check_status(status, body = nil)
177
+ # TODO: 304 Not Modified depends on context...
178
+ case status
179
+ when 200...300
180
+ nil
181
+ when 301, 302, 303, 307
182
+ fail Google::Apis::RedirectError, header[:location]
183
+ when 401
184
+ fail Google::Apis::AuthorizationError, body
185
+ when 304, 400, 402...500
186
+ fail Google::Apis::ClientError, body
187
+ when 500...600
188
+ fail Google::Apis::ServerError, body
189
+ else
190
+ logger.warn(sprintf('Encountered unexpected status code %s', status))
191
+ fail Google::Apis::TransmissionError, body
192
+ end
193
+ end
194
+
195
+ # Process the actual response body. Intended to be overridden by subclasses
196
+ #
197
+ # @param [String] _content_type
198
+ # Content type of body
199
+ # @param [String, #read] body
200
+ # Response body
201
+ # @return [Object]
202
+ def decode_response_body(_content_type, body)
203
+ body
204
+ end
205
+
206
+ # Process a success response
207
+ # @param [Object] result
208
+ # Result object
209
+ # @return [Object] result if no block given
210
+ # @yield [result, nil] if block given
211
+ def success(result, &block)
212
+ logger.debug { sprintf('Success - %s', PP.pp(result, '')) }
213
+ block.call(result, nil) if block_given?
214
+ result
215
+ end
216
+
217
+ # Process an error response
218
+ # @param [StandardError] err
219
+ # Error object
220
+ # @param [Boolean] rethrow
221
+ # True if error should be raised again after handling
222
+ # @return [void]
223
+ # @yield [nil, err] if block given
224
+ # @raise [StandardError] if no block
225
+ def error(err, rethrow: false, &block)
226
+ logger.debug { sprintf('Error - %s', PP.pp(err, '')) }
227
+ err = Google::Apis::TransmissionError.new(err) if err.is_a?(Hurley::ClientError)
228
+ block.call(nil, err) if block_given?
229
+ fail err if rethrow || block.nil?
230
+ end
231
+
232
+ # Execute the command once.
233
+ #
234
+ # @private
235
+ # @param [Hurley::Client] client
236
+ # HTTP client
237
+ # @yield [result, err] Result or error if block supplied
238
+ # @return [Object]
239
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
240
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
241
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
242
+ def execute_once(client, &block)
243
+ body.rewind if body.respond_to?(:rewind)
244
+ begin
245
+ logger.debug { sprintf('Sending HTTP %s %s', method, url) }
246
+ response = client.send(method, url, body) do |req|
247
+ apply_request_options(req)
248
+ end
249
+ logger.debug { response.status_code }
250
+ logger.debug { response.inspect }
251
+ response = process_response(response.status_code, response.header, response.body)
252
+ success(response, &block)
253
+ rescue => e
254
+ logger.debug { sprintf('Caught error %s', e) }
255
+ error(e, rethrow: true, &block)
256
+ end
257
+ end
258
+
259
+ # Update the request with any specified options.
260
+ # @param [Hurley::Request] req
261
+ # HTTP request
262
+ # @return [void]
263
+ def apply_request_options(req)
264
+ if options.authorization.respond_to?(:apply!)
265
+ options.authorization.apply!(req.header)
266
+ elsif options.authorization.is_a?(String)
267
+ req.header[:authorization] = sprintf('Bearer %s', options.authorization)
268
+ end
269
+ req.header.update(header)
270
+ req.options.timeout = options.timeout_sec
271
+ end
272
+ end
273
+ end
274
+ end
275
+ end