google-api-client 0.8.6 → 0.9.3

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 (537) 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 +23 -0
  7. data/.yardopts +12 -0
  8. data/CHANGELOG.md +58 -2
  9. data/CONTRIBUTING.md +31 -0
  10. data/Gemfile +38 -2
  11. data/MIGRATING.md +171 -0
  12. data/README.md +189 -147
  13. data/Rakefile +1 -40
  14. data/api_names.yaml +1088 -0
  15. data/api_names_out.yaml +26978 -0
  16. data/bin/generate-api +109 -0
  17. data/generated/google/apis/adexchangebuyer_v1_3/classes.rb +1335 -0
  18. data/generated/google/apis/adexchangebuyer_v1_3/representations.rb +446 -0
  19. data/generated/google/apis/adexchangebuyer_v1_3/service.rb +872 -0
  20. data/generated/google/apis/adexchangebuyer_v1_3.rb +35 -0
  21. data/generated/google/apis/adexchangebuyer_v1_4/classes.rb +3025 -0
  22. data/generated/google/apis/adexchangebuyer_v1_4/representations.rb +1240 -0
  23. data/generated/google/apis/adexchangebuyer_v1_4/service.rb +1446 -0
  24. data/generated/google/apis/adexchangebuyer_v1_4.rb +35 -0
  25. data/generated/google/apis/adexchangeseller_v2_0/classes.rb +792 -0
  26. data/generated/google/apis/adexchangeseller_v2_0/representations.rb +347 -0
  27. data/generated/google/apis/adexchangeseller_v2_0/service.rb +668 -0
  28. data/generated/google/apis/adexchangeseller_v2_0.rb +38 -0
  29. data/generated/google/apis/admin_datatransfer_v1/classes.rb +267 -0
  30. data/generated/google/apis/admin_datatransfer_v1/representations.rb +130 -0
  31. data/generated/google/apis/admin_datatransfer_v1/service.rb +262 -0
  32. data/generated/google/apis/admin_datatransfer_v1.rb +37 -0
  33. data/generated/google/apis/admin_directory_v1/classes.rb +3141 -0
  34. data/generated/google/apis/admin_directory_v1/representations.rb +1147 -0
  35. data/generated/google/apis/admin_directory_v1/service.rb +3818 -0
  36. data/generated/google/apis/admin_directory_v1.rb +113 -0
  37. data/generated/google/apis/admin_reports_v1/classes.rb +582 -0
  38. data/generated/google/apis/admin_reports_v1/representations.rb +257 -0
  39. data/generated/google/apis/admin_reports_v1/service.rb +336 -0
  40. data/generated/google/apis/admin_reports_v1.rb +38 -0
  41. data/generated/google/apis/adsense_v1_4/classes.rb +1280 -0
  42. data/generated/google/apis/adsense_v1_4/representations.rb +555 -0
  43. data/generated/google/apis/adsense_v1_4/service.rb +1714 -0
  44. data/generated/google/apis/adsense_v1_4.rb +38 -0
  45. data/generated/google/apis/adsensehost_v4_1/classes.rb +837 -0
  46. data/generated/google/apis/adsensehost_v4_1/representations.rb +367 -0
  47. data/generated/google/apis/adsensehost_v4_1/service.rb +1164 -0
  48. data/generated/google/apis/adsensehost_v4_1.rb +35 -0
  49. data/generated/google/apis/analytics_v3/classes.rb +5118 -0
  50. data/generated/google/apis/analytics_v3/representations.rb +1850 -0
  51. data/generated/google/apis/analytics_v3/service.rb +3568 -0
  52. data/generated/google/apis/analytics_v3.rb +49 -0
  53. data/generated/google/apis/androidenterprise_v1/classes.rb +1443 -0
  54. data/generated/google/apis/androidenterprise_v1/representations.rb +614 -0
  55. data/generated/google/apis/androidenterprise_v1/service.rb +2607 -0
  56. data/generated/google/apis/androidenterprise_v1.rb +35 -0
  57. data/generated/google/apis/androidpublisher_v2/classes.rb +1411 -0
  58. data/generated/google/apis/androidpublisher_v2/representations.rb +738 -0
  59. data/generated/google/apis/androidpublisher_v2/service.rb +2338 -0
  60. data/generated/google/apis/androidpublisher_v2.rb +34 -0
  61. data/generated/google/apis/appengine_v1beta4/classes.rb +1585 -0
  62. data/generated/google/apis/appengine_v1beta4/representations.rb +542 -0
  63. data/generated/google/apis/appengine_v1beta4/service.rb +477 -0
  64. data/generated/google/apis/appengine_v1beta4.rb +35 -0
  65. data/generated/google/apis/appengine_v1beta5/classes.rb +1544 -0
  66. data/generated/google/apis/appengine_v1beta5/representations.rb +594 -0
  67. data/generated/google/apis/appengine_v1beta5/service.rb +521 -0
  68. data/generated/google/apis/appengine_v1beta5.rb +35 -0
  69. data/generated/google/apis/appsactivity_v1/classes.rb +392 -0
  70. data/generated/google/apis/appsactivity_v1/representations.rb +206 -0
  71. data/generated/google/apis/appsactivity_v1/service.rb +128 -0
  72. data/generated/google/apis/appsactivity_v1.rb +46 -0
  73. data/generated/google/apis/appstate_v1/classes.rb +154 -0
  74. data/generated/google/apis/appstate_v1/representations.rb +87 -0
  75. data/generated/google/apis/appstate_v1/service.rb +260 -0
  76. data/generated/google/apis/appstate_v1.rb +34 -0
  77. data/generated/google/apis/autoscaler_v1beta2/classes.rb +747 -0
  78. data/generated/google/apis/autoscaler_v1beta2/representations.rb +313 -0
  79. data/generated/google/apis/autoscaler_v1beta2/service.rb +478 -0
  80. data/generated/google/apis/autoscaler_v1beta2.rb +38 -0
  81. data/generated/google/apis/bigquery_v2/classes.rb +2503 -0
  82. data/generated/google/apis/bigquery_v2/representations.rb +914 -0
  83. data/generated/google/apis/bigquery_v2/service.rb +982 -0
  84. data/generated/google/apis/bigquery_v2.rb +52 -0
  85. data/generated/google/apis/blogger_v3/classes.rb +1354 -0
  86. data/generated/google/apis/blogger_v3/representations.rb +632 -0
  87. data/generated/google/apis/blogger_v3/service.rb +1587 -0
  88. data/generated/google/apis/blogger_v3.rb +37 -0
  89. data/generated/google/apis/books_v1/classes.rb +4006 -0
  90. data/generated/google/apis/books_v1/representations.rb +1742 -0
  91. data/generated/google/apis/books_v1/service.rb +2293 -0
  92. data/generated/google/apis/books_v1.rb +34 -0
  93. data/generated/google/apis/calendar_v3/classes.rb +1742 -0
  94. data/generated/google/apis/calendar_v3/representations.rb +631 -0
  95. data/generated/google/apis/calendar_v3/service.rb +1968 -0
  96. data/generated/google/apis/calendar_v3.rb +37 -0
  97. data/generated/google/apis/civicinfo_v2/classes.rb +1127 -0
  98. data/generated/google/apis/civicinfo_v2/representations.rb +423 -0
  99. data/generated/google/apis/civicinfo_v2/service.rb +279 -0
  100. data/generated/google/apis/civicinfo_v2.rb +31 -0
  101. data/generated/google/apis/classroom_v1/classes.rb +512 -0
  102. data/generated/google/apis/classroom_v1/representations.rb +245 -0
  103. data/generated/google/apis/classroom_v1/service.rb +970 -0
  104. data/generated/google/apis/classroom_v1.rb +49 -0
  105. data/generated/google/apis/classroom_v1beta1/classes.rb +447 -0
  106. data/generated/google/apis/classroom_v1beta1/representations.rb +190 -0
  107. data/generated/google/apis/classroom_v1beta1/service.rb +791 -0
  108. data/generated/google/apis/classroom_v1beta1.rb +49 -0
  109. data/generated/google/apis/cloudbilling_v1/classes.rb +169 -0
  110. data/generated/google/apis/cloudbilling_v1/representations.rb +87 -0
  111. data/generated/google/apis/cloudbilling_v1/service.rb +258 -0
  112. data/generated/google/apis/cloudbilling_v1.rb +35 -0
  113. data/generated/google/apis/cloudbuild_v1/classes.rb +521 -0
  114. data/generated/google/apis/cloudbuild_v1/representations.rb +214 -0
  115. data/generated/google/apis/cloudbuild_v1/service.rb +278 -0
  116. data/generated/google/apis/cloudbuild_v1.rb +35 -0
  117. data/generated/google/apis/clouddebugger_v2/classes.rb +1004 -0
  118. data/generated/google/apis/clouddebugger_v2/representations.rb +464 -0
  119. data/generated/google/apis/clouddebugger_v2/service.rb +370 -0
  120. data/generated/google/apis/clouddebugger_v2.rb +41 -0
  121. data/generated/google/apis/cloudlatencytest_v2/classes.rb +195 -0
  122. data/generated/google/apis/cloudlatencytest_v2/representations.rb +127 -0
  123. data/generated/google/apis/cloudlatencytest_v2/service.rb +135 -0
  124. data/generated/google/apis/cloudlatencytest_v2.rb +34 -0
  125. data/generated/google/apis/cloudmonitoring_v2beta2/classes.rb +679 -0
  126. data/generated/google/apis/cloudmonitoring_v2beta2/representations.rb +353 -0
  127. data/generated/google/apis/cloudmonitoring_v2beta2/service.rb +452 -0
  128. data/generated/google/apis/cloudmonitoring_v2beta2.rb +37 -0
  129. data/generated/google/apis/cloudresourcemanager_v1beta1/classes.rb +450 -0
  130. data/generated/google/apis/cloudresourcemanager_v1beta1/representations.rb +226 -0
  131. data/generated/google/apis/cloudresourcemanager_v1beta1/service.rb +626 -0
  132. data/generated/google/apis/cloudresourcemanager_v1beta1.rb +38 -0
  133. data/generated/google/apis/cloudtrace_v1/classes.rb +188 -0
  134. data/generated/google/apis/cloudtrace_v1/representations.rb +102 -0
  135. data/generated/google/apis/cloudtrace_v1/service.rb +190 -0
  136. data/generated/google/apis/cloudtrace_v1.rb +35 -0
  137. data/generated/google/apis/clouduseraccounts_beta/classes.rb +823 -0
  138. data/generated/google/apis/clouduseraccounts_beta/representations.rb +351 -0
  139. data/generated/google/apis/clouduseraccounts_beta/service.rb +854 -0
  140. data/generated/google/apis/clouduseraccounts_beta.rb +43 -0
  141. data/generated/google/apis/compute_beta/classes.rb +9741 -0
  142. data/generated/google/apis/compute_beta/representations.rb +3649 -0
  143. data/generated/google/apis/compute_beta/service.rb +10636 -0
  144. data/generated/google/apis/compute_beta.rb +49 -0
  145. data/generated/google/apis/compute_v1/classes.rb +9095 -0
  146. data/generated/google/apis/compute_v1/representations.rb +3389 -0
  147. data/generated/google/apis/compute_v1/service.rb +9627 -0
  148. data/generated/google/apis/compute_v1.rb +49 -0
  149. data/generated/google/apis/container_v1/classes.rb +463 -0
  150. data/generated/google/apis/container_v1/representations.rb +195 -0
  151. data/generated/google/apis/container_v1/service.rb +367 -0
  152. data/generated/google/apis/container_v1.rb +35 -0
  153. data/generated/google/apis/container_v1beta1/classes.rb +466 -0
  154. data/generated/google/apis/container_v1beta1/representations.rb +177 -0
  155. data/generated/google/apis/container_v1beta1/service.rb +394 -0
  156. data/generated/google/apis/container_v1beta1.rb +35 -0
  157. data/generated/google/apis/content_v2/classes.rb +6114 -0
  158. data/generated/google/apis/content_v2/representations.rb +2624 -0
  159. data/generated/google/apis/content_v2/service.rb +2338 -0
  160. data/generated/google/apis/content_v2.rb +35 -0
  161. data/generated/google/apis/coordinate_v1/classes.rb +669 -0
  162. data/generated/google/apis/coordinate_v1/representations.rb +321 -0
  163. data/generated/google/apis/coordinate_v1/service.rb +678 -0
  164. data/generated/google/apis/coordinate_v1.rb +37 -0
  165. data/generated/google/apis/customsearch_v1/classes.rb +771 -0
  166. data/generated/google/apis/customsearch_v1/representations.rb +302 -0
  167. data/generated/google/apis/customsearch_v1/service.rb +207 -0
  168. data/{lib/google/api_client/auth/compute_service_account.rb → generated/google/apis/customsearch_v1.rb} +13 -10
  169. data/generated/google/apis/dataproc_v1/classes.rb +1590 -0
  170. data/generated/google/apis/dataproc_v1/representations.rb +653 -0
  171. data/generated/google/apis/dataproc_v1/service.rb +719 -0
  172. data/generated/google/apis/dataproc_v1.rb +43 -0
  173. data/generated/google/apis/datastore_v1beta2/classes.rb +1186 -0
  174. data/generated/google/apis/datastore_v1beta2/representations.rb +594 -0
  175. data/generated/google/apis/datastore_v1beta2/service.rb +294 -0
  176. data/generated/google/apis/datastore_v1beta2.rb +40 -0
  177. data/generated/google/apis/deploymentmanager_v2/classes.rb +1162 -0
  178. data/generated/google/apis/deploymentmanager_v2/representations.rb +508 -0
  179. data/generated/google/apis/deploymentmanager_v2/service.rb +862 -0
  180. data/generated/google/apis/deploymentmanager_v2.rb +44 -0
  181. data/generated/google/apis/deploymentmanager_v2beta2/classes.rb +843 -0
  182. data/generated/google/apis/deploymentmanager_v2beta2/representations.rb +306 -0
  183. data/generated/google/apis/deploymentmanager_v2beta2/service.rb +689 -0
  184. data/generated/google/apis/deploymentmanager_v2beta2.rb +44 -0
  185. data/generated/google/apis/dfareporting_v2_1/classes.rb +10770 -0
  186. data/generated/google/apis/dfareporting_v2_1/representations.rb +3438 -0
  187. data/generated/google/apis/dfareporting_v2_1/service.rb +8585 -0
  188. data/generated/google/apis/dfareporting_v2_1.rb +37 -0
  189. data/generated/google/apis/dfareporting_v2_3/classes.rb +10830 -0
  190. data/generated/google/apis/dfareporting_v2_3/representations.rb +3829 -0
  191. data/generated/google/apis/dfareporting_v2_3/service.rb +8581 -0
  192. data/generated/google/apis/dfareporting_v2_3.rb +37 -0
  193. data/generated/google/apis/discovery_v1/classes.rb +961 -0
  194. data/generated/google/apis/discovery_v1/representations.rb +397 -0
  195. data/generated/google/apis/discovery_v1/service.rb +142 -0
  196. data/generated/google/apis/discovery_v1.rb +32 -0
  197. data/generated/google/apis/dns_v1/classes.rb +406 -0
  198. data/generated/google/apis/dns_v1/representations.rb +167 -0
  199. data/generated/google/apis/dns_v1/service.rb +454 -0
  200. data/generated/google/apis/dns_v1.rb +44 -0
  201. data/generated/google/apis/doubleclickbidmanager_v1/classes.rb +802 -0
  202. data/generated/google/apis/doubleclickbidmanager_v1/representations.rb +371 -0
  203. data/generated/google/apis/doubleclickbidmanager_v1/service.rb +374 -0
  204. data/generated/google/apis/doubleclickbidmanager_v1.rb +31 -0
  205. data/generated/google/apis/doubleclicksearch_v2/classes.rb +958 -0
  206. data/generated/google/apis/doubleclicksearch_v2/representations.rb +350 -0
  207. data/generated/google/apis/doubleclicksearch_v2/service.rb +480 -0
  208. data/generated/google/apis/doubleclicksearch_v2.rb +35 -0
  209. data/generated/google/apis/drive_v2/classes.rb +2569 -0
  210. data/generated/google/apis/drive_v2/representations.rb +878 -0
  211. data/generated/google/apis/drive_v2/service.rb +2740 -0
  212. data/generated/google/apis/drive_v2.rb +58 -0
  213. data/generated/google/apis/drive_v3/classes.rb +1541 -0
  214. data/generated/google/apis/drive_v3/representations.rb +548 -0
  215. data/generated/google/apis/drive_v3/service.rb +1542 -0
  216. data/generated/google/apis/drive_v3.rb +55 -0
  217. data/generated/google/apis/fitness_v1/classes.rb +885 -0
  218. data/generated/google/apis/fitness_v1/representations.rb +360 -0
  219. data/generated/google/apis/fitness_v1/service.rb +675 -0
  220. data/generated/google/apis/fitness_v1.rb +49 -0
  221. data/generated/google/apis/fusiontables_v2/classes.rb +1048 -0
  222. data/generated/google/apis/fusiontables_v2/representations.rb +457 -0
  223. data/generated/google/apis/fusiontables_v2/service.rb +1463 -0
  224. data/generated/google/apis/fusiontables_v2.rb +37 -0
  225. data/generated/google/apis/games_configuration_v1configuration/classes.rb +506 -0
  226. data/generated/google/apis/games_configuration_v1configuration/representations.rb +228 -0
  227. data/generated/google/apis/games_configuration_v1configuration/service.rb +565 -0
  228. data/generated/google/apis/games_configuration_v1configuration.rb +34 -0
  229. data/generated/google/apis/games_management_v1management/classes.rb +533 -0
  230. data/generated/google/apis/games_management_v1management/representations.rb +262 -0
  231. data/generated/google/apis/games_management_v1management/service.rb +994 -0
  232. data/generated/google/apis/games_management_v1management.rb +37 -0
  233. data/generated/google/apis/games_v1/classes.rb +4626 -0
  234. data/generated/google/apis/games_v1/representations.rb +1783 -0
  235. data/generated/google/apis/games_v1/service.rb +2290 -0
  236. data/generated/google/apis/games_v1.rb +40 -0
  237. data/generated/google/apis/gan_v1beta1/classes.rb +1428 -0
  238. data/generated/google/apis/gan_v1beta1/representations.rb +462 -0
  239. data/generated/google/apis/gan_v1beta1/service.rb +682 -0
  240. data/generated/google/apis/gan_v1beta1.rb +31 -0
  241. data/generated/google/apis/genomics_v1/classes.rb +2609 -0
  242. data/generated/google/apis/genomics_v1/representations.rb +1029 -0
  243. data/generated/google/apis/genomics_v1/service.rb +1676 -0
  244. data/generated/google/apis/genomics_v1.rb +49 -0
  245. data/generated/google/apis/genomics_v1beta2/classes.rb +3288 -0
  246. data/generated/google/apis/genomics_v1beta2/representations.rb +1194 -0
  247. data/generated/google/apis/genomics_v1beta2/service.rb +2392 -0
  248. data/generated/google/apis/genomics_v1beta2.rb +46 -0
  249. data/generated/google/apis/gmail_v1/classes.rb +794 -0
  250. data/generated/google/apis/gmail_v1/representations.rb +383 -0
  251. data/generated/google/apis/gmail_v1/service.rb +1470 -0
  252. data/generated/google/apis/gmail_v1.rb +52 -0
  253. data/generated/google/apis/groupsmigration_v1/classes.rb +51 -0
  254. data/generated/google/apis/groupsmigration_v1/representations.rb +40 -0
  255. data/generated/google/apis/groupsmigration_v1/service.rb +110 -0
  256. data/generated/google/apis/groupsmigration_v1.rb +34 -0
  257. data/generated/google/apis/groupssettings_v1/classes.rb +221 -0
  258. data/generated/google/apis/groupssettings_v1/representations.rb +66 -0
  259. data/generated/google/apis/groupssettings_v1/service.rb +179 -0
  260. data/generated/google/apis/groupssettings_v1.rb +34 -0
  261. data/generated/google/apis/identitytoolkit_v3/classes.rb +1637 -0
  262. data/generated/google/apis/identitytoolkit_v3/representations.rb +618 -0
  263. data/generated/google/apis/identitytoolkit_v3/service.rb +616 -0
  264. data/generated/google/apis/identitytoolkit_v3.rb +31 -0
  265. data/generated/google/apis/kgsearch_v1/classes.rb +59 -0
  266. data/generated/google/apis/kgsearch_v1/representations.rb +41 -0
  267. data/generated/google/apis/kgsearch_v1/service.rb +111 -0
  268. data/{spec/google/api_client/request_spec.rb → generated/google/apis/kgsearch_v1.rb} +16 -13
  269. data/generated/google/apis/licensing_v1/classes.rb +132 -0
  270. data/generated/google/apis/licensing_v1/representations.rb +74 -0
  271. data/generated/google/apis/licensing_v1/service.rb +369 -0
  272. data/generated/google/apis/licensing_v1.rb +34 -0
  273. data/generated/google/apis/logging_v1beta3/classes.rb +1079 -0
  274. data/generated/google/apis/logging_v1beta3/representations.rb +366 -0
  275. data/generated/google/apis/logging_v1beta3/service.rb +1001 -0
  276. data/generated/google/apis/logging_v1beta3.rb +47 -0
  277. data/generated/google/apis/logging_v2beta1/classes.rb +990 -0
  278. data/generated/google/apis/logging_v2beta1/representations.rb +377 -0
  279. data/generated/google/apis/logging_v2beta1/service.rb +547 -0
  280. data/generated/google/apis/logging_v2beta1.rb +47 -0
  281. data/generated/google/apis/manager_v1beta2/classes.rb +1287 -0
  282. data/generated/google/apis/manager_v1beta2/representations.rb +606 -0
  283. data/generated/google/apis/manager_v1beta2/service.rb +372 -0
  284. data/generated/google/apis/manager_v1beta2.rb +53 -0
  285. data/generated/google/apis/mirror_v1/classes.rb +1072 -0
  286. data/generated/google/apis/mirror_v1/representations.rb +390 -0
  287. data/generated/google/apis/mirror_v1/service.rb +977 -0
  288. data/generated/google/apis/mirror_v1.rb +37 -0
  289. data/generated/google/apis/oauth2_v2/classes.rb +245 -0
  290. data/generated/google/apis/oauth2_v2/representations.rb +102 -0
  291. data/generated/google/apis/oauth2_v2/service.rb +199 -0
  292. data/generated/google/apis/oauth2_v2.rb +43 -0
  293. data/generated/google/apis/pagespeedonline_v2/classes.rb +614 -0
  294. data/generated/google/apis/pagespeedonline_v2/representations.rb +272 -0
  295. data/generated/google/apis/pagespeedonline_v2/service.rb +119 -0
  296. data/generated/google/apis/pagespeedonline_v2.rb +32 -0
  297. data/generated/google/apis/partners_v2/classes.rb +942 -0
  298. data/generated/google/apis/partners_v2/representations.rb +454 -0
  299. data/generated/google/apis/partners_v2/service.rb +400 -0
  300. data/generated/google/apis/partners_v2.rb +32 -0
  301. data/generated/google/apis/people_v1/classes.rb +1521 -0
  302. data/generated/google/apis/people_v1/representations.rb +663 -0
  303. data/generated/google/apis/people_v1/service.rb +189 -0
  304. data/generated/google/apis/people_v1.rb +59 -0
  305. data/generated/google/apis/plus_domains_v1/classes.rb +2609 -0
  306. data/generated/google/apis/plus_domains_v1/representations.rb +1111 -0
  307. data/generated/google/apis/plus_domains_v1/service.rb +904 -0
  308. data/generated/google/apis/plus_domains_v1.rb +61 -0
  309. data/generated/google/apis/plus_v1/classes.rb +2094 -0
  310. data/generated/google/apis/plus_v1/representations.rb +907 -0
  311. data/generated/google/apis/plus_v1/service.rb +470 -0
  312. data/generated/google/apis/plus_v1.rb +43 -0
  313. data/generated/google/apis/prediction_v1_6/classes.rb +751 -0
  314. data/generated/google/apis/prediction_v1_6/representations.rb +369 -0
  315. data/generated/google/apis/prediction_v1_6/service.rb +380 -0
  316. data/generated/google/apis/prediction_v1_6.rb +44 -0
  317. data/generated/google/apis/proximitybeacon_v1beta1/classes.rb +639 -0
  318. data/generated/google/apis/proximitybeacon_v1beta1/representations.rb +312 -0
  319. data/generated/google/apis/proximitybeacon_v1beta1/service.rb +591 -0
  320. data/generated/google/apis/proximitybeacon_v1beta1.rb +31 -0
  321. data/generated/google/apis/pubsub_v1/classes.rb +614 -0
  322. data/generated/google/apis/pubsub_v1/representations.rb +323 -0
  323. data/generated/google/apis/pubsub_v1/service.rb +774 -0
  324. data/generated/google/apis/pubsub_v1.rb +37 -0
  325. data/generated/google/apis/pubsub_v1beta2/classes.rb +620 -0
  326. data/generated/google/apis/pubsub_v1beta2/representations.rb +282 -0
  327. data/generated/google/apis/pubsub_v1beta2/service.rb +774 -0
  328. data/generated/google/apis/pubsub_v1beta2.rb +37 -0
  329. data/generated/google/apis/qpx_express_v1/classes.rb +1268 -0
  330. data/generated/google/apis/qpx_express_v1/representations.rb +472 -0
  331. data/generated/google/apis/qpx_express_v1/service.rb +100 -0
  332. data/generated/google/apis/qpx_express_v1.rb +31 -0
  333. data/generated/google/apis/replicapool_v1beta2/classes.rb +631 -0
  334. data/generated/google/apis/replicapool_v1beta2/representations.rb +264 -0
  335. data/generated/google/apis/replicapool_v1beta2/service.rb +608 -0
  336. data/generated/google/apis/replicapool_v1beta2.rb +44 -0
  337. data/generated/google/apis/replicapoolupdater_v1beta1/classes.rb +733 -0
  338. data/generated/google/apis/replicapoolupdater_v1beta1/representations.rb +294 -0
  339. data/generated/google/apis/replicapoolupdater_v1beta1/service.rb +508 -0
  340. data/generated/google/apis/replicapoolupdater_v1beta1.rb +44 -0
  341. data/generated/google/apis/reseller_v1/classes.rb +526 -0
  342. data/generated/google/apis/reseller_v1/representations.rb +223 -0
  343. data/generated/google/apis/reseller_v1/service.rb +623 -0
  344. data/generated/google/apis/reseller_v1.rb +37 -0
  345. data/generated/google/apis/resourceviews_v1beta2/classes.rb +660 -0
  346. data/generated/google/apis/resourceviews_v1beta2/representations.rb +301 -0
  347. data/generated/google/apis/resourceviews_v1beta2/service.rb +563 -0
  348. data/generated/google/apis/resourceviews_v1beta2.rb +50 -0
  349. data/generated/google/apis/script_v1/classes.rb +259 -0
  350. data/generated/google/apis/script_v1/representations.rb +118 -0
  351. data/generated/google/apis/script_v1/service.rb +98 -0
  352. data/generated/google/apis/script_v1.rb +61 -0
  353. data/generated/google/apis/site_verification_v1/classes.rb +185 -0
  354. data/generated/google/apis/site_verification_v1/representations.rb +113 -0
  355. data/generated/google/apis/site_verification_v1/service.rb +315 -0
  356. data/generated/google/apis/site_verification_v1.rb +37 -0
  357. data/generated/google/apis/sqladmin_v1beta4/classes.rb +2030 -0
  358. data/generated/google/apis/sqladmin_v1beta4/representations.rb +856 -0
  359. data/generated/google/apis/sqladmin_v1beta4/service.rb +1625 -0
  360. data/generated/google/apis/sqladmin_v1beta4.rb +37 -0
  361. data/generated/google/apis/storage_v1/classes.rb +1222 -0
  362. data/generated/google/apis/storage_v1/representations.rb +497 -0
  363. data/generated/google/apis/storage_v1/service.rb +1903 -0
  364. data/generated/google/apis/storage_v1.rb +46 -0
  365. data/generated/google/apis/storagetransfer_v1/classes.rb +1046 -0
  366. data/generated/google/apis/storagetransfer_v1/representations.rb +418 -0
  367. data/generated/google/apis/storagetransfer_v1/service.rb +473 -0
  368. data/generated/google/apis/storagetransfer_v1.rb +35 -0
  369. data/generated/google/apis/tagmanager_v1/classes.rb +1494 -0
  370. data/generated/google/apis/tagmanager_v1/representations.rb +611 -0
  371. data/generated/google/apis/tagmanager_v1/service.rb +2119 -0
  372. data/generated/google/apis/tagmanager_v1.rb +52 -0
  373. data/generated/google/apis/taskqueue_v1beta2/classes.rb +254 -0
  374. data/generated/google/apis/taskqueue_v1beta2/representations.rb +126 -0
  375. data/generated/google/apis/taskqueue_v1beta2/service.rb +408 -0
  376. data/generated/google/apis/taskqueue_v1beta2.rb +37 -0
  377. data/generated/google/apis/tasks_v1/classes.rb +296 -0
  378. data/generated/google/apis/tasks_v1/representations.rb +125 -0
  379. data/generated/google/apis/tasks_v1/service.rb +643 -0
  380. data/generated/google/apis/tasks_v1.rb +37 -0
  381. data/generated/google/apis/translate_v2/classes.rb +168 -0
  382. data/generated/google/apis/translate_v2/representations.rb +121 -0
  383. data/generated/google/apis/translate_v2/service.rb +182 -0
  384. data/generated/google/apis/translate_v2.rb +31 -0
  385. data/generated/google/apis/urlshortener_v1/classes.rb +246 -0
  386. data/generated/google/apis/urlshortener_v1/representations.rb +121 -0
  387. data/generated/google/apis/urlshortener_v1/service.rb +176 -0
  388. data/generated/google/apis/urlshortener_v1.rb +34 -0
  389. data/generated/google/apis/vision_v1/classes.rb +1259 -0
  390. data/generated/google/apis/vision_v1/representations.rb +418 -0
  391. data/generated/google/apis/vision_v1/service.rb +91 -0
  392. data/generated/google/apis/vision_v1.rb +37 -0
  393. data/generated/google/apis/webmasters_v3/classes.rb +563 -0
  394. data/generated/google/apis/webmasters_v3/representations.rb +282 -0
  395. data/generated/google/apis/webmasters_v3/service.rb +573 -0
  396. data/generated/google/apis/webmasters_v3.rb +37 -0
  397. data/generated/google/apis/youtube_analytics_v1/classes.rb +546 -0
  398. data/generated/google/apis/youtube_analytics_v1/representations.rb +273 -0
  399. data/generated/google/apis/youtube_analytics_v1/service.rb +562 -0
  400. data/generated/google/apis/youtube_analytics_v1.rb +46 -0
  401. data/generated/google/apis/youtube_v3/classes.rb +8071 -0
  402. data/generated/google/apis/youtube_v3/representations.rb +3134 -0
  403. data/generated/google/apis/youtube_v3/service.rb +4403 -0
  404. data/generated/google/apis/youtube_v3.rb +49 -0
  405. data/generated/google/apis/youtubereporting_v1/classes.rb +258 -0
  406. data/generated/google/apis/youtubereporting_v1/representations.rb +144 -0
  407. data/generated/google/apis/youtubereporting_v1/service.rb +364 -0
  408. data/generated/google/apis/youtubereporting_v1.rb +38 -0
  409. data/google-api-client.gemspec +25 -39
  410. data/lib/google/api_client/auth/installed_app.rb +7 -5
  411. data/lib/google/api_client/auth/key_utils.rb +1 -0
  412. data/lib/google/api_client/auth/storage.rb +4 -2
  413. data/lib/google/api_client/auth/storages/file_store.rb +2 -3
  414. data/lib/google/api_client/auth/storages/redis_store.rb +7 -2
  415. data/lib/google/api_client/client_secrets.rb +7 -9
  416. data/lib/google/apis/core/api_command.rb +136 -0
  417. data/lib/google/apis/core/base_service.rb +317 -0
  418. data/lib/google/apis/core/batch.rb +239 -0
  419. data/lib/google/apis/core/download.rb +94 -0
  420. data/lib/google/apis/core/hashable.rb +44 -0
  421. data/lib/google/apis/core/http_client_adapter.rb +82 -0
  422. data/lib/google/apis/core/http_command.rb +328 -0
  423. data/lib/google/apis/core/json_representation.rb +145 -0
  424. data/lib/google/{api_client/version.rb → apis/core/logging.rb} +12 -8
  425. data/lib/google/apis/core/multipart.rb +187 -0
  426. data/lib/google/apis/core/upload.rb +289 -0
  427. data/lib/google/{api_client → apis}/errors.rb +39 -28
  428. data/lib/google/apis/generator/annotator.rb +295 -0
  429. data/lib/google/apis/generator/helpers.rb +74 -0
  430. data/lib/google/apis/generator/model.rb +143 -0
  431. data/lib/google/apis/generator/template.rb +124 -0
  432. data/lib/google/apis/generator/templates/_class.tmpl +40 -0
  433. data/lib/google/apis/generator/templates/_method.tmpl +92 -0
  434. data/lib/google/apis/generator/templates/_representation.tmpl +51 -0
  435. data/lib/google/apis/generator/templates/_representation_stub.tmpl +17 -0
  436. data/lib/google/apis/generator/templates/_representation_type.tmpl +10 -0
  437. data/lib/google/{api_client/reference.rb → apis/generator/templates/classes.rb.tmpl} +11 -9
  438. data/lib/google/apis/generator/templates/module.rb.tmpl +40 -0
  439. data/lib/google/apis/generator/templates/representations.rb.tmpl +32 -0
  440. data/lib/google/apis/generator/templates/service.rb.tmpl +60 -0
  441. data/lib/google/apis/generator.rb +70 -0
  442. data/lib/google/apis/options.rb +85 -0
  443. data/lib/google/apis/version.rb +39 -0
  444. data/lib/google/apis.rb +48 -0
  445. data/rakelib/metrics.rake +22 -0
  446. data/rakelib/rubocop.rake +10 -0
  447. data/rakelib/spec.rake +11 -0
  448. data/rakelib/yard.rake +11 -0
  449. data/samples/cli/Gemfile +7 -0
  450. data/samples/cli/README.md +51 -0
  451. data/samples/cli/google-api-samples +32 -0
  452. data/samples/cli/lib/base_cli.rb +95 -0
  453. data/samples/cli/lib/samples/analytics.rb +62 -0
  454. data/samples/cli/lib/samples/androidpublisher.rb +47 -0
  455. data/samples/cli/lib/samples/calendar.rb +83 -0
  456. data/samples/cli/lib/samples/drive.rb +82 -0
  457. data/samples/cli/lib/samples/gmail.rb +50 -0
  458. data/samples/cli/lib/samples/pubsub.rb +114 -0
  459. data/samples/cli/lib/samples/translate.rb +44 -0
  460. data/samples/cli/lib/samples/you_tube.rb +44 -0
  461. data/samples/web/Gemfile +7 -0
  462. data/samples/web/README.md +44 -0
  463. data/samples/web/app.rb +120 -0
  464. data/samples/web/views/calendar.erb +34 -0
  465. data/{lib/google/api_client/service_account.rb → samples/web/views/drive.erb} +20 -8
  466. data/samples/web/views/home.erb +35 -0
  467. data/samples/web/views/layout.erb +40 -0
  468. data/script/generate +100 -0
  469. data/script/package +8 -0
  470. data/script/release +15 -0
  471. data/spec/fixtures/files/api_names.yaml +3 -0
  472. data/spec/fixtures/files/auth_stored_credentials.json +8 -0
  473. data/spec/fixtures/files/child/.gitignore +0 -0
  474. data/spec/fixtures/files/client_secrets.json +1 -0
  475. data/spec/fixtures/files/invalid.json +1 -0
  476. data/spec/fixtures/files/test.blah +1 -0
  477. data/spec/fixtures/files/test.txt +1 -0
  478. data/spec/fixtures/files/test_api.json +440 -0
  479. data/spec/google/api_client/auth/storage_spec.rb +1 -3
  480. data/spec/google/api_client/auth/storages/file_store_spec.rb +1 -2
  481. data/spec/google/api_client/auth/storages/redis_store_spec.rb +1 -3
  482. data/spec/google/api_client/client_secrets_spec.rb +338 -2
  483. data/spec/google/apis/core/api_command_spec.rb +209 -0
  484. data/spec/google/apis/core/batch_spec.rb +142 -0
  485. data/spec/google/apis/core/download_spec.rb +103 -0
  486. data/spec/google/apis/core/hashable_spec.rb +60 -0
  487. data/spec/google/apis/core/http_command_spec.rb +303 -0
  488. data/spec/google/apis/core/json_representation_spec.rb +199 -0
  489. data/spec/google/apis/core/service_spec.rb +247 -0
  490. data/spec/google/apis/core/upload_spec.rb +300 -0
  491. data/{lib/google/api_client/discovery.rb → spec/google/apis/generated_spec.rb} +13 -5
  492. data/spec/google/apis/generator/generator_spec.rb +324 -0
  493. data/spec/google/apis/logging_spec.rb +45 -0
  494. data/spec/google/apis/options_spec.rb +40 -0
  495. data/spec/integration_tests/adsense_spec.rb +29 -0
  496. data/spec/integration_tests/drive_spec.rb +35 -0
  497. data/spec/integration_tests/pubsub_spec.rb +48 -0
  498. data/spec/integration_tests/url_shortener_spec.rb +45 -0
  499. data/spec/spec_helper/load_path_spec.rb +33 -0
  500. data/spec/spec_helper.rb +131 -44
  501. data/third_party/hurley_patches.rb +103 -0
  502. metadata +563 -188
  503. data/lib/compat/multi_json.rb +0 -19
  504. data/lib/google/api_client/auth/file_storage.rb +0 -59
  505. data/lib/google/api_client/auth/jwt_asserter.rb +0 -126
  506. data/lib/google/api_client/auth/pkcs12.rb +0 -41
  507. data/lib/google/api_client/batch.rb +0 -326
  508. data/lib/google/api_client/charset.rb +0 -33
  509. data/lib/google/api_client/discovery/api.rb +0 -310
  510. data/lib/google/api_client/discovery/media.rb +0 -77
  511. data/lib/google/api_client/discovery/method.rb +0 -363
  512. data/lib/google/api_client/discovery/resource.rb +0 -156
  513. data/lib/google/api_client/discovery/schema.rb +0 -117
  514. data/lib/google/api_client/environment.rb +0 -42
  515. data/lib/google/api_client/gzip.rb +0 -28
  516. data/lib/google/api_client/logging.rb +0 -32
  517. data/lib/google/api_client/media.rb +0 -259
  518. data/lib/google/api_client/railtie.rb +0 -18
  519. data/lib/google/api_client/request.rb +0 -350
  520. data/lib/google/api_client/result.rb +0 -255
  521. data/lib/google/api_client/service/batch.rb +0 -110
  522. data/lib/google/api_client/service/request.rb +0 -144
  523. data/lib/google/api_client/service/resource.rb +0 -40
  524. data/lib/google/api_client/service/result.rb +0 -162
  525. data/lib/google/api_client/service/simple_file_store.rb +0 -151
  526. data/lib/google/api_client/service/stub_generator.rb +0 -61
  527. data/lib/google/api_client/service.rb +0 -233
  528. data/lib/google/api_client.rb +0 -750
  529. data/spec/google/api_client/batch_spec.rb +0 -248
  530. data/spec/google/api_client/discovery_spec.rb +0 -708
  531. data/spec/google/api_client/gzip_spec.rb +0 -98
  532. data/spec/google/api_client/media_spec.rb +0 -178
  533. data/spec/google/api_client/result_spec.rb +0 -207
  534. data/spec/google/api_client/service_account_spec.rb +0 -169
  535. data/spec/google/api_client/service_spec.rb +0 -618
  536. data/spec/google/api_client/simple_file_store_spec.rb +0 -133
  537. data/spec/google/api_client_spec.rb +0 -352
@@ -0,0 +1,328 @@
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 'hurley_patches'
23
+ require 'google/apis/core/logging'
24
+ require 'pp'
25
+
26
+ module Google
27
+ module Apis
28
+ module Core
29
+ # Command for HTTP request/response.
30
+ class HttpCommand
31
+ include Logging
32
+
33
+ RETRIABLE_ERRORS = [Google::Apis::ServerError, Google::Apis::RateLimitError, Google::Apis::TransmissionError]
34
+
35
+ # Request options
36
+ # @return [Google::Apis::RequestOptions]
37
+ attr_accessor :options
38
+
39
+ # HTTP request URL
40
+ # @return [String, Addressable::URI]
41
+ attr_accessor :url
42
+
43
+ # HTTP headers
44
+ # @return [Hurley::Header]
45
+ attr_accessor :header
46
+
47
+ # Request body
48
+ # @return [#read]
49
+ attr_accessor :body
50
+
51
+ # HTTP method
52
+ # @return [symbol]
53
+ attr_accessor :method
54
+
55
+ # HTTP Client
56
+ # @return [Hurley::Client]
57
+ attr_accessor :connection
58
+
59
+ # Query params
60
+ # @return [Hash]
61
+ attr_accessor :query
62
+
63
+ # Path params for URL Template
64
+ # @return [Hash]
65
+ attr_accessor :params
66
+
67
+ # @param [symbol] method
68
+ # HTTP method
69
+ # @param [String,Addressable::URI, Addressable::Template] url
70
+ # HTTP URL or template
71
+ # @param [String, #read] body
72
+ # Request body
73
+ def initialize(method, url, body: nil)
74
+ self.options = Google::Apis::RequestOptions.default.dup
75
+ self.url = url
76
+ self.url = Addressable::Template.new(url) if url.is_a?(String)
77
+ self.method = method
78
+ self.header = Hurley::Header.new
79
+ self.body = body
80
+ self.query = {}
81
+ self.params = {}
82
+ end
83
+
84
+ # Execute the command, retrying as necessary
85
+ #
86
+ # @param [Hurley::Client] client
87
+ # HTTP client
88
+ # @yield [result, err] Result or error if block supplied
89
+ # @return [Object]
90
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
91
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
92
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
93
+ def execute(client)
94
+ prepare!
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
+ execute_once(client).tap do |result|
108
+ if block_given?
109
+ yield result, nil
110
+ end
111
+ end
112
+ end
113
+ end
114
+ rescue => e
115
+ if block_given?
116
+ yield nil, e
117
+ else
118
+ raise e
119
+ end
120
+ end
121
+ ensure
122
+ release!
123
+ end
124
+
125
+ # Refresh the authorization authorization after a 401 error
126
+ #
127
+ # @private
128
+ # @return [void]
129
+ def refresh_authorization
130
+ # Handled implicitly by auth lib, here in case need to override
131
+ logger.debug('Retrying after authentication failure')
132
+ end
133
+
134
+ # Check if attached credentials can be automatically refreshed
135
+ # @return [Boolean]
136
+ def authorization_refreshable?
137
+ options.authorization.respond_to?(:apply!)
138
+ end
139
+
140
+ # Prepare the request (e.g. calculate headers, serialize data, etc) before sending
141
+ #
142
+ # @private
143
+ # @return [void]
144
+ def prepare!
145
+ header.update(options.header) if options && options.header
146
+ self.url = url.expand(params) if url.is_a?(Addressable::Template)
147
+ url.query_values = query.merge(url.query_values || {})
148
+
149
+ if [:post, :put].include?(method) && body.nil?
150
+ @form_encoded = true
151
+ self.body = Addressable::URI.form_encode(url.query_values(Array))
152
+ self.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
153
+ self.url.query_values = {}
154
+ else
155
+ @form_encoded = false
156
+ end
157
+ end
158
+
159
+ # Release any resources used by this command
160
+ # @private
161
+ # @return [void]
162
+ def release!
163
+ end
164
+
165
+ # Check the response and either decode body or raise error
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
+ check_status(status, header, body)
180
+ decode_response_body(header[:content_type], body)
181
+ end
182
+
183
+ # Check the response and raise error if needed
184
+ #
185
+ # @param [Fixnum] status
186
+ # HTTP status code of response
187
+ # @param
188
+ # @param [Hurley::Header] header
189
+ # HTTP response headers
190
+ # @param [String] body
191
+ # HTTP response body
192
+ # @param [String] message
193
+ # Error message text
194
+ # @return [void]
195
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
196
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
197
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
198
+ def check_status(status, header = nil, body = nil, message = nil)
199
+ # TODO: 304 Not Modified depends on context...
200
+ case status
201
+ when 200...300
202
+ nil
203
+ when 301, 302, 303, 307
204
+ message ||= sprintf('Redirect to %s', header[:location])
205
+ raise Google::Apis::RedirectError.new(message, status_code: status, header: header, body: body)
206
+ when 401
207
+ message ||= 'Unauthorized'
208
+ raise Google::Apis::AuthorizationError.new(message, status_code: status, header: header, body: body)
209
+ when 304, 400, 402...500
210
+ message ||= 'Invalid request'
211
+ raise Google::Apis::ClientError.new(message, status_code: status, header: header, body: body)
212
+ when 500...600
213
+ message ||= 'Server error'
214
+ raise Google::Apis::ServerError.new(message, status_code: status, header: header, body: body)
215
+ else
216
+ logger.warn(sprintf('Encountered unexpected status code %s', status))
217
+ message ||= 'Unknown error'
218
+ raise Google::Apis::TransmissionError.new(message, status_code: status, header: header, body: body)
219
+ end
220
+ end
221
+
222
+ # Process the actual response body. Intended to be overridden by subclasses
223
+ #
224
+ # @param [String] _content_type
225
+ # Content type of body
226
+ # @param [String, #read] body
227
+ # Response body
228
+ # @return [Object]
229
+ def decode_response_body(_content_type, body)
230
+ body
231
+ end
232
+
233
+ # Process a success response
234
+ # @param [Object] result
235
+ # Result object
236
+ # @return [Object] result if no block given
237
+ # @yield [result, nil] if block given
238
+ def success(result, &block)
239
+ logger.debug { sprintf('Success - %s', PP.pp(result, '')) }
240
+ block.call(result, nil) if block_given?
241
+ result
242
+ end
243
+
244
+ # Process an error response
245
+ # @param [StandardError] err
246
+ # Error object
247
+ # @param [Boolean] rethrow
248
+ # True if error should be raised again after handling
249
+ # @return [void]
250
+ # @yield [nil, err] if block given
251
+ # @raise [StandardError] if no block
252
+ def error(err, rethrow: false, &block)
253
+ logger.debug { sprintf('Error - %s', PP.pp(err, '')) }
254
+ err = Google::Apis::TransmissionError.new(err) if err.is_a?(Hurley::ClientError) || err.is_a?(SocketError)
255
+ block.call(nil, err) if block_given?
256
+ fail err if rethrow || block.nil?
257
+ end
258
+
259
+ # Execute the command once.
260
+ #
261
+ # @private
262
+ # @param [Hurley::Client] client
263
+ # HTTP client
264
+ # @return [Object]
265
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
266
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
267
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
268
+ def execute_once(client)
269
+ body.rewind if body.respond_to?(:rewind)
270
+ begin
271
+ logger.debug { sprintf('Sending HTTP %s %s', method, url) }
272
+ response = client.send(method, url, body) do |req|
273
+ # Temporary workaround for Hurley bug where the connection preference
274
+ # is ignored and it uses nested anyway
275
+ unless form_encoded?
276
+ req.url.query_class = Hurley::Query::Flat
277
+ query.each do | k, v|
278
+ req.url.query[k] = normalize_query_value(v)
279
+ end
280
+ end
281
+ # End workaround
282
+ apply_request_options(req)
283
+ end
284
+ logger.debug { response.status_code }
285
+ logger.debug { response.inspect }
286
+ response = process_response(response.status_code, response.header, response.body)
287
+ success(response)
288
+ rescue => e
289
+ logger.debug { sprintf('Caught error %s', e) }
290
+ error(e, rethrow: true)
291
+ end
292
+ end
293
+
294
+ # Update the request with any specified options.
295
+ # @param [Hurley::Request] req
296
+ # HTTP request
297
+ # @return [void]
298
+ def apply_request_options(req)
299
+ if options.authorization.respond_to?(:apply!)
300
+ options.authorization.apply!(req.header)
301
+ elsif options.authorization.is_a?(String)
302
+ req.header[:authorization] = sprintf('Bearer %s', options.authorization)
303
+ end
304
+ req.header.update(header)
305
+ req.options.timeout = options.timeout_sec
306
+ req.options.open_timeout = options.open_timeout_sec
307
+ end
308
+
309
+ private
310
+
311
+ def form_encoded?
312
+ @form_encoded
313
+ end
314
+
315
+ def normalize_query_value(v)
316
+ case v
317
+ when Array
318
+ v.map { |v2| normalize_query_value(v2) }
319
+ when nil
320
+ nil
321
+ else
322
+ v.to_s
323
+ end
324
+ end
325
+ end
326
+ end
327
+ end
328
+ end
@@ -0,0 +1,145 @@
1
+ # Copyright 2015 Google Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'representable/json'
16
+ require 'representable/json/hash'
17
+ require 'base64'
18
+ require 'date'
19
+
20
+ module Google
21
+ module Apis
22
+ module Core
23
+ # Support for serializing hashes + 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?(:fetch)
42
+ fetch(name, instance_variable_get(ivar_name))
43
+ else
44
+ instance_variable_get(ivar_name)
45
+ end
46
+ end
47
+ end
48
+
49
+ # Returns a customized function for Representable that checks whether or not
50
+ # an attribute should be serialized. Allows proper patch semantics by distinguishing
51
+ # between nil & unset values
52
+ #
53
+ # @param [String] name Property name
54
+ # @return [Proc]
55
+ def if_fn(name)
56
+ ivar_name = "@#{name}".to_sym
57
+ lambda do |opts|
58
+ if opts[: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
+ if options[:type] == DateTime
76
+ options[:render_filter] = ->(value, _doc, *_args) { value.is_a?(DateTime) ? value.rfc3339(3) : value.to_s }
77
+ options[:parse_filter] = ->(fragment, _doc, *_args) { DateTime.parse(fragment) }
78
+ end
79
+
80
+ options[:render_nil] = true
81
+ options[:getter] = getter_fn(name)
82
+ options[:if] = if_fn(name)
83
+ end
84
+
85
+ # Define a single value property
86
+ #
87
+ # @param [String] name
88
+ # Property name
89
+ # @param [Hash] options
90
+ def property(name, options = {})
91
+ set_default_options(name, options)
92
+ super(name, options)
93
+ end
94
+
95
+ # Define a collection property
96
+ #
97
+ # @param [String] name
98
+ # Property name
99
+ # @param [Hash] options
100
+ def collection(name, options = {})
101
+ set_default_options(name, options)
102
+ super(name, options)
103
+ end
104
+
105
+ # Define a hash property
106
+ #
107
+ # @param [String] name
108
+ # Property name
109
+ # @param [Hash] options
110
+ def hash(name = nil, options = nil)
111
+ return super() unless name # Allow Object.hash
112
+ set_default_options(name, options)
113
+ super(name, options)
114
+ end
115
+ end
116
+ end
117
+
118
+ # Base decorator for JSON representers
119
+ #
120
+ # @see https://github.com/apotonick/representable
121
+ class JsonRepresentation < Representable::Decorator
122
+ include Representable::JSON
123
+ feature JsonRepresentationSupport
124
+ end
125
+
126
+ module JsonObjectSupport
127
+ def self.included(base)
128
+ base.extend(ClassMethods)
129
+ end
130
+
131
+ module ClassMethods
132
+ def from_json(json)
133
+ representation = self.const_get(:Representation)
134
+ representation.new(self.new).from_json(json, unwrap: self)
135
+ end
136
+ end
137
+
138
+ def to_json
139
+ representation = self.class.const_get(:Representation)
140
+ representation.new(self).to_json(skip_undefined: true)
141
+ end
142
+ end
143
+ end
144
+ end
145
+ 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 = 6
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,187 @@
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, header = {})
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
+ content_id = ''
99
+ if header[:content_id]
100
+ content_id = sprintf(CID_FORMAT, header[:content_id])
101
+ end
102
+ sprintf(HEAD_FORMAT,
103
+ boundary,
104
+ content_len.to_i,
105
+ content_id,
106
+ header[:content_type] || type,
107
+ header[:content_transfer_encoding] || DEFAULT_TR_ENCODING)
108
+ end
109
+
110
+ DEFAULT_TR_ENCODING = 'binary'.freeze
111
+ FOOT = "\r\n".freeze
112
+ CID_FORMAT = "Content-ID: %s\r\n"
113
+ HEAD_FORMAT = <<-END
114
+ --%s\r
115
+ Content-Length: %d\r
116
+ %sContent-Type: %s\r
117
+ Content-Transfer-Encoding: %s\r
118
+ \r
119
+ END
120
+ end
121
+
122
+ # Helper for building multipart requests
123
+ class Multipart
124
+ MULTIPART_RELATED = 'multipart/related'
125
+ DEFAULT_BOUNDARY = 'RubyApiClientMultiPart'
126
+
127
+ # @return [String]
128
+ # Content type header
129
+ attr_reader :content_type
130
+
131
+ # @param [String] content_type
132
+ # Content type for the multipart request
133
+ # @param [String] boundary
134
+ # Part delimiter
135
+
136
+ def initialize(content_type: MULTIPART_RELATED, boundary: nil)
137
+ @parts = []
138
+ @boundary = boundary || DEFAULT_BOUNDARY
139
+ @content_type = "#{content_type}; boundary=#{boundary}"
140
+ end
141
+
142
+ # Append JSON data part
143
+ #
144
+ # @param [String] body
145
+ # JSON text
146
+ # @param [String] content_id
147
+ # Optional unique ID of this part
148
+ # @return [self]
149
+ def add_json(body, content_id: nil)
150
+ header = { :content_id => content_id }
151
+ @parts << Google::Apis::Core::JsonPart.new(@boundary, body, header)
152
+ self
153
+ end
154
+
155
+ # Append arbitrary data as a part
156
+ #
157
+ # @param [Google::Apis::Core::UploadIO] upload_io
158
+ # IO stream
159
+ # @param [String] content_id
160
+ # Optional unique ID of this part
161
+ # @return [self]
162
+ def add_upload(upload_io, content_id: nil)
163
+ header = { :content_id => content_id }
164
+ @parts << Google::Apis::Core::FilePart.new(@boundary,
165
+ upload_io,
166
+ header)
167
+ self
168
+ end
169
+
170
+ # Assemble the multipart requests
171
+ #
172
+ # @return [IO]
173
+ # IO stream
174
+ def assemble
175
+ @parts << Hurley::Multipart::EpiloguePart.new(@boundary)
176
+ ios = []
177
+ len = 0
178
+ @parts.each do |part|
179
+ len += part.length
180
+ ios << part.to_io
181
+ end
182
+ Hurley::CompositeReadIO.new(len, *ios)
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end