google-api-client 0.8.3 → 0.9
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.
- checksums.yaml +4 -4
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +63 -0
- data/.travis.yml +22 -0
- data/.yardopts +12 -0
- data/CHANGELOG.md +52 -2
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +35 -1
- data/MIGRATING.md +171 -0
- data/README.md +181 -148
- data/Rakefile +1 -40
- data/api_names.yaml +1036 -0
- data/api_names_out.yaml +26053 -0
- data/bin/generate-api +95 -0
- data/generated/google/apis/adexchangebuyer_v1_3/classes.rb +1335 -0
- data/generated/google/apis/adexchangebuyer_v1_3/representations.rb +446 -0
- data/generated/google/apis/adexchangebuyer_v1_3/service.rb +872 -0
- data/generated/google/apis/adexchangebuyer_v1_3.rb +35 -0
- data/generated/google/apis/adexchangeseller_v2_0/classes.rb +792 -0
- data/generated/google/apis/adexchangeseller_v2_0/representations.rb +309 -0
- data/generated/google/apis/adexchangeseller_v2_0/service.rb +668 -0
- data/generated/google/apis/adexchangeseller_v2_0.rb +38 -0
- data/generated/google/apis/admin_datatransfer_v1/classes.rb +267 -0
- data/generated/google/apis/admin_datatransfer_v1/representations.rb +118 -0
- data/generated/google/apis/admin_datatransfer_v1/service.rb +262 -0
- data/generated/google/apis/admin_datatransfer_v1.rb +37 -0
- data/generated/google/apis/admin_directory_v1/classes.rb +3141 -0
- data/generated/google/apis/admin_directory_v1/representations.rb +1029 -0
- data/generated/google/apis/admin_directory_v1/service.rb +3818 -0
- data/generated/google/apis/admin_directory_v1.rb +113 -0
- data/generated/google/apis/admin_reports_v1/classes.rb +582 -0
- data/generated/google/apis/admin_reports_v1/representations.rb +231 -0
- data/generated/google/apis/admin_reports_v1/service.rb +336 -0
- data/generated/google/apis/admin_reports_v1.rb +38 -0
- data/generated/google/apis/adsense_v1_4/classes.rb +1285 -0
- data/generated/google/apis/adsense_v1_4/representations.rb +494 -0
- data/generated/google/apis/adsense_v1_4/service.rb +1714 -0
- data/generated/google/apis/adsense_v1_4.rb +38 -0
- data/generated/google/apis/adsensehost_v4_1/classes.rb +834 -0
- data/generated/google/apis/adsensehost_v4_1/representations.rb +327 -0
- data/generated/google/apis/adsensehost_v4_1/service.rb +1164 -0
- data/generated/google/apis/adsensehost_v4_1.rb +35 -0
- data/generated/google/apis/analytics_v3/classes.rb +5118 -0
- data/generated/google/apis/analytics_v3/representations.rb +1662 -0
- data/generated/google/apis/analytics_v3/service.rb +3568 -0
- data/generated/google/apis/analytics_v3.rb +49 -0
- data/generated/google/apis/androidenterprise_v1/classes.rb +1443 -0
- data/generated/google/apis/androidenterprise_v1/representations.rb +538 -0
- data/generated/google/apis/androidenterprise_v1/service.rb +2602 -0
- data/generated/google/apis/androidenterprise_v1.rb +35 -0
- data/generated/google/apis/androidpublisher_v2/classes.rb +1411 -0
- data/generated/google/apis/androidpublisher_v2/representations.rb +646 -0
- data/generated/google/apis/androidpublisher_v2/service.rb +2338 -0
- data/generated/google/apis/androidpublisher_v2.rb +34 -0
- data/generated/google/apis/appengine_v1beta4/classes.rb +1532 -0
- data/generated/google/apis/appengine_v1beta4/representations.rb +526 -0
- data/generated/google/apis/appengine_v1beta4/service.rb +476 -0
- data/generated/google/apis/appengine_v1beta4.rb +35 -0
- data/generated/google/apis/appsactivity_v1/classes.rb +392 -0
- data/generated/google/apis/appsactivity_v1/representations.rb +184 -0
- data/generated/google/apis/appsactivity_v1/service.rb +128 -0
- data/generated/google/apis/appsactivity_v1.rb +46 -0
- data/generated/google/apis/appstate_v1/classes.rb +154 -0
- data/generated/google/apis/appstate_v1/representations.rb +79 -0
- data/generated/google/apis/appstate_v1/service.rb +260 -0
- data/generated/google/apis/appstate_v1.rb +34 -0
- data/generated/google/apis/autoscaler_v1beta2/classes.rb +747 -0
- data/generated/google/apis/autoscaler_v1beta2/representations.rb +281 -0
- data/generated/google/apis/autoscaler_v1beta2/service.rb +478 -0
- data/generated/google/apis/autoscaler_v1beta2.rb +38 -0
- data/generated/google/apis/bigquery_v2/classes.rb +2471 -0
- data/generated/google/apis/bigquery_v2/representations.rb +816 -0
- data/generated/google/apis/bigquery_v2/service.rb +982 -0
- data/generated/google/apis/bigquery_v2.rb +52 -0
- data/generated/google/apis/blogger_v3/classes.rb +1354 -0
- data/generated/google/apis/blogger_v3/representations.rb +562 -0
- data/generated/google/apis/blogger_v3/service.rb +1587 -0
- data/generated/google/apis/blogger_v3.rb +37 -0
- data/generated/google/apis/books_v1/classes.rb +3956 -0
- data/generated/google/apis/books_v1/representations.rb +1538 -0
- data/generated/google/apis/books_v1/service.rb +2290 -0
- data/generated/google/apis/books_v1.rb +34 -0
- data/generated/google/apis/calendar_v3/classes.rb +1742 -0
- data/generated/google/apis/calendar_v3/representations.rb +567 -0
- data/generated/google/apis/calendar_v3/service.rb +1968 -0
- data/generated/google/apis/calendar_v3.rb +37 -0
- data/generated/google/apis/civicinfo_v2/classes.rb +1127 -0
- data/generated/google/apis/civicinfo_v2/representations.rb +383 -0
- data/generated/google/apis/civicinfo_v2/service.rb +279 -0
- data/{lib/google/api_client/service_account.rb → generated/google/apis/civicinfo_v2.rb} +18 -8
- data/generated/google/apis/classroom_v1/classes.rb +512 -0
- data/generated/google/apis/classroom_v1/representations.rb +217 -0
- data/generated/google/apis/classroom_v1/service.rb +970 -0
- data/generated/google/apis/classroom_v1.rb +49 -0
- data/generated/google/apis/classroom_v1beta1/classes.rb +447 -0
- data/generated/google/apis/classroom_v1beta1/representations.rb +190 -0
- data/generated/google/apis/classroom_v1beta1/service.rb +791 -0
- data/generated/google/apis/classroom_v1beta1.rb +49 -0
- data/generated/google/apis/cloudbilling_v1/classes.rb +169 -0
- data/generated/google/apis/cloudbilling_v1/representations.rb +79 -0
- data/generated/google/apis/cloudbilling_v1/service.rb +258 -0
- data/generated/google/apis/cloudbilling_v1.rb +35 -0
- data/generated/google/apis/clouddebugger_v2/classes.rb +1004 -0
- data/generated/google/apis/clouddebugger_v2/representations.rb +410 -0
- data/generated/google/apis/clouddebugger_v2/service.rb +370 -0
- data/generated/google/apis/clouddebugger_v2.rb +41 -0
- data/generated/google/apis/cloudmonitoring_v2beta2/classes.rb +679 -0
- data/generated/google/apis/cloudmonitoring_v2beta2/representations.rb +311 -0
- data/generated/google/apis/cloudmonitoring_v2beta2/service.rb +452 -0
- data/generated/google/apis/cloudmonitoring_v2beta2.rb +37 -0
- data/generated/google/apis/cloudresourcemanager_v1beta1/classes.rb +437 -0
- data/generated/google/apis/cloudresourcemanager_v1beta1/representations.rb +188 -0
- data/generated/google/apis/cloudresourcemanager_v1beta1/service.rb +623 -0
- data/generated/google/apis/cloudresourcemanager_v1beta1.rb +38 -0
- data/generated/google/apis/cloudtrace_v1/classes.rb +188 -0
- data/generated/google/apis/cloudtrace_v1/representations.rb +92 -0
- data/generated/google/apis/cloudtrace_v1/service.rb +190 -0
- data/generated/google/apis/cloudtrace_v1.rb +35 -0
- data/generated/google/apis/clouduseraccounts_beta/classes.rb +823 -0
- data/generated/google/apis/clouduseraccounts_beta/representations.rb +313 -0
- data/generated/google/apis/clouduseraccounts_beta/service.rb +854 -0
- data/generated/google/apis/clouduseraccounts_beta.rb +43 -0
- data/generated/google/apis/compute_beta/classes.rb +9128 -0
- data/generated/google/apis/compute_beta/representations.rb +3048 -0
- data/generated/google/apis/compute_beta/service.rb +10154 -0
- data/generated/google/apis/compute_beta.rb +49 -0
- data/generated/google/apis/compute_v1/classes.rb +8681 -0
- data/generated/google/apis/compute_v1/representations.rb +2895 -0
- data/generated/google/apis/compute_v1/service.rb +9252 -0
- data/generated/google/apis/compute_v1.rb +49 -0
- data/generated/google/apis/container_v1/classes.rb +463 -0
- data/generated/google/apis/container_v1/representations.rb +175 -0
- data/generated/google/apis/container_v1/service.rb +367 -0
- data/generated/google/apis/container_v1.rb +35 -0
- data/generated/google/apis/container_v1beta1/classes.rb +466 -0
- data/generated/google/apis/container_v1beta1/representations.rb +177 -0
- data/generated/google/apis/container_v1beta1/service.rb +394 -0
- data/generated/google/apis/container_v1beta1.rb +35 -0
- data/generated/google/apis/content_v2/classes.rb +5986 -0
- data/generated/google/apis/content_v2/representations.rb +2288 -0
- data/generated/google/apis/content_v2/service.rb +2338 -0
- data/generated/google/apis/content_v2.rb +35 -0
- data/generated/google/apis/coordinate_v1/classes.rb +669 -0
- data/generated/google/apis/coordinate_v1/representations.rb +285 -0
- data/generated/google/apis/coordinate_v1/service.rb +678 -0
- data/generated/google/apis/coordinate_v1.rb +37 -0
- data/generated/google/apis/customsearch_v1/classes.rb +771 -0
- data/generated/google/apis/customsearch_v1/representations.rb +276 -0
- data/generated/google/apis/customsearch_v1/service.rb +207 -0
- data/{lib/google/api_client/auth/compute_service_account.rb → generated/google/apis/customsearch_v1.rb} +13 -10
- data/generated/google/apis/datastore_v1beta2/classes.rb +1186 -0
- data/generated/google/apis/datastore_v1beta2/representations.rb +526 -0
- data/generated/google/apis/datastore_v1beta2/service.rb +294 -0
- data/generated/google/apis/datastore_v1beta2.rb +40 -0
- data/generated/google/apis/deploymentmanager_v2/classes.rb +1091 -0
- data/generated/google/apis/deploymentmanager_v2/representations.rb +422 -0
- data/generated/google/apis/deploymentmanager_v2/service.rb +857 -0
- data/generated/google/apis/deploymentmanager_v2.rb +44 -0
- data/generated/google/apis/deploymentmanager_v2beta2/classes.rb +843 -0
- data/generated/google/apis/deploymentmanager_v2beta2/representations.rb +306 -0
- data/generated/google/apis/deploymentmanager_v2beta2/service.rb +689 -0
- data/generated/google/apis/deploymentmanager_v2beta2.rb +44 -0
- data/generated/google/apis/dfareporting_v2_1/classes.rb +10770 -0
- data/generated/google/apis/dfareporting_v2_1/representations.rb +3438 -0
- data/generated/google/apis/dfareporting_v2_1/service.rb +8585 -0
- data/generated/google/apis/dfareporting_v2_1.rb +37 -0
- data/generated/google/apis/discovery_v1/classes.rb +961 -0
- data/generated/google/apis/discovery_v1/representations.rb +357 -0
- data/generated/google/apis/discovery_v1/service.rb +142 -0
- data/generated/google/apis/discovery_v1.rb +32 -0
- data/generated/google/apis/dns_v1/classes.rb +406 -0
- data/generated/google/apis/dns_v1/representations.rb +151 -0
- data/generated/google/apis/dns_v1/service.rb +454 -0
- data/generated/google/apis/dns_v1.rb +44 -0
- data/generated/google/apis/doubleclickbidmanager_v1/classes.rb +716 -0
- data/generated/google/apis/doubleclickbidmanager_v1/representations.rb +298 -0
- data/generated/google/apis/doubleclickbidmanager_v1/service.rb +341 -0
- data/generated/google/apis/doubleclickbidmanager_v1.rb +31 -0
- data/generated/google/apis/doubleclicksearch_v2/classes.rb +956 -0
- data/generated/google/apis/doubleclicksearch_v2/representations.rb +316 -0
- data/generated/google/apis/doubleclicksearch_v2/service.rb +480 -0
- data/generated/google/apis/doubleclicksearch_v2.rb +35 -0
- data/generated/google/apis/drive_v2/classes.rb +2562 -0
- data/generated/google/apis/drive_v2/representations.rb +795 -0
- data/generated/google/apis/drive_v2/service.rb +2696 -0
- data/generated/google/apis/drive_v2.rb +58 -0
- data/generated/google/apis/drive_v3/classes.rb +1534 -0
- data/generated/google/apis/drive_v3/representations.rb +497 -0
- data/generated/google/apis/drive_v3/service.rb +1541 -0
- data/generated/google/apis/drive_v3.rb +55 -0
- data/generated/google/apis/fitness_v1/classes.rb +885 -0
- data/generated/google/apis/fitness_v1/representations.rb +320 -0
- data/generated/google/apis/fitness_v1/service.rb +675 -0
- data/generated/google/apis/fitness_v1.rb +49 -0
- data/generated/google/apis/fusiontables_v2/classes.rb +1048 -0
- data/generated/google/apis/fusiontables_v2/representations.rb +409 -0
- data/generated/google/apis/fusiontables_v2/service.rb +1463 -0
- data/generated/google/apis/fusiontables_v2.rb +37 -0
- data/generated/google/apis/games_configuration_v1configuration/classes.rb +506 -0
- data/generated/google/apis/games_configuration_v1configuration/representations.rb +206 -0
- data/generated/google/apis/games_configuration_v1configuration/service.rb +565 -0
- data/generated/google/apis/games_configuration_v1configuration.rb +34 -0
- data/generated/google/apis/games_management_v1management/classes.rb +524 -0
- data/generated/google/apis/games_management_v1management/representations.rb +231 -0
- data/generated/google/apis/games_management_v1management/service.rb +994 -0
- data/generated/google/apis/games_management_v1management.rb +37 -0
- data/generated/google/apis/games_v1/classes.rb +4617 -0
- data/generated/google/apis/games_v1/representations.rb +1584 -0
- data/generated/google/apis/games_v1/service.rb +2290 -0
- data/generated/google/apis/games_v1.rb +40 -0
- data/generated/google/apis/gan_v1beta1/classes.rb +1428 -0
- data/generated/google/apis/gan_v1beta1/representations.rb +428 -0
- data/generated/google/apis/gan_v1beta1/service.rb +682 -0
- data/generated/google/apis/gan_v1beta1.rb +31 -0
- data/generated/google/apis/genomics_v1/classes.rb +2609 -0
- data/generated/google/apis/genomics_v1/representations.rb +909 -0
- data/generated/google/apis/genomics_v1/service.rb +1676 -0
- data/generated/google/apis/genomics_v1.rb +49 -0
- data/generated/google/apis/genomics_v1beta2/classes.rb +3288 -0
- data/generated/google/apis/genomics_v1beta2/representations.rb +1194 -0
- data/generated/google/apis/genomics_v1beta2/service.rb +2392 -0
- data/generated/google/apis/genomics_v1beta2.rb +46 -0
- data/generated/google/apis/gmail_v1/classes.rb +794 -0
- data/generated/google/apis/gmail_v1/representations.rb +339 -0
- data/generated/google/apis/gmail_v1/service.rb +1470 -0
- data/generated/google/apis/gmail_v1.rb +52 -0
- data/generated/google/apis/groupsmigration_v1/classes.rb +51 -0
- data/generated/google/apis/groupsmigration_v1/representations.rb +38 -0
- data/generated/google/apis/groupsmigration_v1/service.rb +110 -0
- data/generated/google/apis/groupsmigration_v1.rb +34 -0
- data/generated/google/apis/groupssettings_v1/classes.rb +221 -0
- data/generated/google/apis/groupssettings_v1/representations.rb +64 -0
- data/generated/google/apis/groupssettings_v1/service.rb +179 -0
- data/generated/google/apis/groupssettings_v1.rb +34 -0
- data/generated/google/apis/identitytoolkit_v3/classes.rb +1466 -0
- data/generated/google/apis/identitytoolkit_v3/representations.rb +509 -0
- data/generated/google/apis/identitytoolkit_v3/service.rb +581 -0
- data/generated/google/apis/identitytoolkit_v3.rb +31 -0
- data/generated/google/apis/kgsearch_v1/classes.rb +59 -0
- data/generated/google/apis/kgsearch_v1/representations.rb +39 -0
- data/generated/google/apis/kgsearch_v1/service.rb +111 -0
- data/{spec/google/api_client/request_spec.rb → generated/google/apis/kgsearch_v1.rb} +16 -13
- data/generated/google/apis/licensing_v1/classes.rb +132 -0
- data/generated/google/apis/licensing_v1/representations.rb +68 -0
- data/generated/google/apis/licensing_v1/service.rb +369 -0
- data/generated/google/apis/licensing_v1.rb +34 -0
- data/generated/google/apis/logging_v1beta3/classes.rb +1079 -0
- data/generated/google/apis/logging_v1beta3/representations.rb +366 -0
- data/generated/google/apis/logging_v1beta3/service.rb +1001 -0
- data/generated/google/apis/logging_v1beta3.rb +47 -0
- data/generated/google/apis/manager_v1beta2/classes.rb +1287 -0
- data/generated/google/apis/manager_v1beta2/representations.rb +536 -0
- data/generated/google/apis/manager_v1beta2/service.rb +372 -0
- data/generated/google/apis/manager_v1beta2.rb +53 -0
- data/generated/google/apis/mapsengine_v1/classes.rb +2873 -0
- data/generated/google/apis/mapsengine_v1/representations.rb +1235 -0
- data/generated/google/apis/mapsengine_v1/service.rb +3388 -0
- data/generated/google/apis/mapsengine_v1.rb +38 -0
- data/generated/google/apis/mirror_v1/classes.rb +1072 -0
- data/generated/google/apis/mirror_v1/representations.rb +350 -0
- data/generated/google/apis/mirror_v1/service.rb +977 -0
- data/generated/google/apis/mirror_v1.rb +37 -0
- data/generated/google/apis/oauth2_v2/classes.rb +245 -0
- data/generated/google/apis/oauth2_v2/representations.rb +94 -0
- data/generated/google/apis/oauth2_v2/service.rb +199 -0
- data/generated/google/apis/oauth2_v2.rb +43 -0
- data/generated/google/apis/pagespeedonline_v2/classes.rb +614 -0
- data/generated/google/apis/pagespeedonline_v2/representations.rb +244 -0
- data/generated/google/apis/pagespeedonline_v2/service.rb +119 -0
- data/generated/google/apis/pagespeedonline_v2.rb +32 -0
- data/generated/google/apis/partners_v2/classes.rb +942 -0
- data/generated/google/apis/partners_v2/representations.rb +402 -0
- data/generated/google/apis/partners_v2/service.rb +400 -0
- data/generated/google/apis/partners_v2.rb +32 -0
- data/generated/google/apis/plus_domains_v1/classes.rb +2609 -0
- data/generated/google/apis/plus_domains_v1/representations.rb +987 -0
- data/generated/google/apis/plus_domains_v1/service.rb +904 -0
- data/generated/google/apis/plus_domains_v1.rb +61 -0
- data/generated/google/apis/plus_v1/classes.rb +2094 -0
- data/generated/google/apis/plus_v1/representations.rb +805 -0
- data/generated/google/apis/plus_v1/service.rb +470 -0
- data/generated/google/apis/plus_v1.rb +43 -0
- data/generated/google/apis/prediction_v1_6/classes.rb +751 -0
- data/generated/google/apis/prediction_v1_6/representations.rb +327 -0
- data/generated/google/apis/prediction_v1_6/service.rb +380 -0
- data/generated/google/apis/prediction_v1_6.rb +44 -0
- data/generated/google/apis/proximitybeacon_v1beta1/classes.rb +639 -0
- data/generated/google/apis/proximitybeacon_v1beta1/representations.rb +274 -0
- data/generated/google/apis/proximitybeacon_v1beta1/service.rb +591 -0
- data/generated/google/apis/proximitybeacon_v1beta1.rb +31 -0
- data/generated/google/apis/pubsub_v1/classes.rb +614 -0
- data/generated/google/apis/pubsub_v1/representations.rb +281 -0
- data/generated/google/apis/pubsub_v1/service.rb +774 -0
- data/generated/google/apis/pubsub_v1.rb +37 -0
- data/generated/google/apis/pubsub_v1beta2/classes.rb +620 -0
- data/generated/google/apis/pubsub_v1beta2/representations.rb +282 -0
- data/generated/google/apis/pubsub_v1beta2/service.rb +774 -0
- data/generated/google/apis/pubsub_v1beta2.rb +37 -0
- data/generated/google/apis/qpx_express_v1/classes.rb +1268 -0
- data/generated/google/apis/qpx_express_v1/representations.rb +424 -0
- data/generated/google/apis/qpx_express_v1/service.rb +100 -0
- data/generated/google/apis/qpx_express_v1.rb +31 -0
- data/generated/google/apis/replicapool_v1beta2/classes.rb +631 -0
- data/generated/google/apis/replicapool_v1beta2/representations.rb +236 -0
- data/generated/google/apis/replicapool_v1beta2/service.rb +608 -0
- data/generated/google/apis/replicapool_v1beta2.rb +44 -0
- data/generated/google/apis/replicapoolupdater_v1beta1/classes.rb +733 -0
- data/generated/google/apis/replicapoolupdater_v1beta1/representations.rb +264 -0
- data/generated/google/apis/replicapoolupdater_v1beta1/service.rb +508 -0
- data/generated/google/apis/replicapoolupdater_v1beta1.rb +44 -0
- data/generated/google/apis/reseller_v1/classes.rb +520 -0
- data/generated/google/apis/reseller_v1/representations.rb +200 -0
- data/generated/google/apis/reseller_v1/service.rb +623 -0
- data/generated/google/apis/reseller_v1.rb +37 -0
- data/generated/google/apis/resourceviews_v1beta2/classes.rb +660 -0
- data/generated/google/apis/resourceviews_v1beta2/representations.rb +269 -0
- data/generated/google/apis/resourceviews_v1beta2/service.rb +563 -0
- data/generated/google/apis/resourceviews_v1beta2.rb +50 -0
- data/generated/google/apis/script_v1/classes.rb +259 -0
- data/generated/google/apis/script_v1/representations.rb +106 -0
- data/generated/google/apis/script_v1/service.rb +98 -0
- data/generated/google/apis/script_v1.rb +61 -0
- data/generated/google/apis/site_verification_v1/classes.rb +185 -0
- data/generated/google/apis/site_verification_v1/representations.rb +101 -0
- data/generated/google/apis/site_verification_v1/service.rb +315 -0
- data/generated/google/apis/site_verification_v1.rb +37 -0
- data/generated/google/apis/sqladmin_v1beta4/classes.rb +2001 -0
- data/generated/google/apis/sqladmin_v1beta4/representations.rb +758 -0
- data/generated/google/apis/sqladmin_v1beta4/service.rb +1625 -0
- data/generated/google/apis/sqladmin_v1beta4.rb +37 -0
- data/generated/google/apis/storage_v1/classes.rb +1222 -0
- data/generated/google/apis/storage_v1/representations.rb +445 -0
- data/generated/google/apis/storage_v1/service.rb +1903 -0
- data/generated/google/apis/storage_v1.rb +46 -0
- data/generated/google/apis/storagetransfer_v1/classes.rb +1046 -0
- data/generated/google/apis/storagetransfer_v1/representations.rb +370 -0
- data/generated/google/apis/storagetransfer_v1/service.rb +473 -0
- data/generated/google/apis/storagetransfer_v1.rb +35 -0
- data/generated/google/apis/tagmanager_v1/classes.rb +1384 -0
- data/generated/google/apis/tagmanager_v1/representations.rb +515 -0
- data/generated/google/apis/tagmanager_v1/service.rb +1817 -0
- data/generated/google/apis/tagmanager_v1.rb +52 -0
- data/generated/google/apis/taskqueue_v1beta2/classes.rb +254 -0
- data/generated/google/apis/taskqueue_v1beta2/representations.rb +114 -0
- data/generated/google/apis/taskqueue_v1beta2/service.rb +408 -0
- data/generated/google/apis/taskqueue_v1beta2.rb +37 -0
- data/generated/google/apis/tasks_v1/classes.rb +296 -0
- data/generated/google/apis/tasks_v1/representations.rb +115 -0
- data/generated/google/apis/tasks_v1/service.rb +643 -0
- data/generated/google/apis/tasks_v1.rb +37 -0
- data/generated/google/apis/translate_v2/classes.rb +168 -0
- data/generated/google/apis/translate_v2/representations.rb +109 -0
- data/generated/google/apis/translate_v2/service.rb +182 -0
- data/generated/google/apis/translate_v2.rb +31 -0
- data/generated/google/apis/urlshortener_v1/classes.rb +246 -0
- data/generated/google/apis/urlshortener_v1/representations.rb +111 -0
- data/generated/google/apis/urlshortener_v1/service.rb +176 -0
- data/generated/google/apis/urlshortener_v1.rb +34 -0
- data/generated/google/apis/webmasters_v3/classes.rb +563 -0
- data/generated/google/apis/webmasters_v3/representations.rb +250 -0
- data/generated/google/apis/webmasters_v3/service.rb +573 -0
- data/generated/google/apis/webmasters_v3.rb +37 -0
- data/generated/google/apis/youtube_analytics_v1/classes.rb +546 -0
- data/generated/google/apis/youtube_analytics_v1/representations.rb +243 -0
- data/generated/google/apis/youtube_analytics_v1/service.rb +562 -0
- data/generated/google/apis/youtube_analytics_v1.rb +46 -0
- data/generated/google/apis/youtube_v3/classes.rb +8136 -0
- data/generated/google/apis/youtube_v3/representations.rb +2838 -0
- data/generated/google/apis/youtube_v3/service.rb +4403 -0
- data/generated/google/apis/youtube_v3.rb +49 -0
- data/generated/google/apis/youtubereporting_v1/classes.rb +258 -0
- data/generated/google/apis/youtubereporting_v1/representations.rb +128 -0
- data/generated/google/apis/youtubereporting_v1/service.rb +364 -0
- data/generated/google/apis/youtubereporting_v1.rb +38 -0
- data/google-api-client.gemspec +27 -39
- data/lib/google/api_client/auth/installed_app.rb +7 -5
- data/lib/google/api_client/auth/key_utils.rb +12 -11
- data/lib/google/api_client/auth/storage.rb +5 -2
- data/lib/google/api_client/auth/storages/file_store.rb +2 -3
- data/lib/google/api_client/auth/storages/redis_store.rb +7 -2
- data/lib/google/api_client/client_secrets.rb +4 -5
- data/lib/google/apis/core/api_command.rb +135 -0
- data/lib/google/apis/core/base_service.rb +317 -0
- data/lib/google/apis/core/batch.rb +239 -0
- data/lib/google/apis/core/download.rb +94 -0
- data/lib/google/apis/core/hashable.rb +44 -0
- data/lib/google/apis/core/http_client_adapter.rb +82 -0
- data/lib/google/apis/core/http_command.rb +312 -0
- data/lib/google/apis/core/json_representation.rb +127 -0
- data/lib/google/{api_client/version.rb → apis/core/logging.rb} +12 -8
- data/lib/google/apis/core/multipart.rb +187 -0
- data/lib/google/apis/core/upload.rb +288 -0
- data/lib/google/{api_client → apis}/errors.rb +39 -28
- data/lib/google/apis/generator/annotator.rb +295 -0
- data/lib/google/apis/generator/helpers.rb +74 -0
- data/lib/google/apis/generator/model.rb +143 -0
- data/lib/google/apis/generator/template.rb +124 -0
- data/lib/google/apis/generator/templates/_class.tmpl +40 -0
- data/lib/google/apis/generator/templates/_method.tmpl +92 -0
- data/lib/google/apis/generator/templates/_representation.tmpl +51 -0
- data/lib/google/apis/generator/templates/_representation_stub.tmpl +15 -0
- data/lib/google/apis/generator/templates/_representation_type.tmpl +10 -0
- data/lib/google/{api_client/reference.rb → apis/generator/templates/classes.rb.tmpl} +11 -9
- data/lib/google/apis/generator/templates/module.rb.tmpl +40 -0
- data/lib/google/apis/generator/templates/representations.rb.tmpl +32 -0
- data/lib/google/apis/generator/templates/service.rb.tmpl +60 -0
- data/lib/google/apis/generator.rb +70 -0
- data/lib/google/apis/options.rb +85 -0
- data/lib/google/apis/version.rb +39 -0
- data/lib/google/apis.rb +48 -0
- data/rakelib/metrics.rake +22 -0
- data/rakelib/rubocop.rake +10 -0
- data/rakelib/spec.rake +11 -0
- data/rakelib/yard.rake +11 -0
- data/samples/Gemfile +7 -0
- data/samples/README.md +51 -0
- data/samples/google-api-samples +32 -0
- data/samples/lib/base_cli.rb +94 -0
- data/samples/lib/samples/analytics.rb +62 -0
- data/samples/lib/samples/calendar.rb +83 -0
- data/samples/lib/samples/drive.rb +82 -0
- data/samples/lib/samples/gmail.rb +50 -0
- data/samples/lib/samples/pubsub.rb +114 -0
- data/samples/lib/samples/translate.rb +44 -0
- data/samples/lib/samples/you_tube.rb +44 -0
- data/script/generate +95 -0
- data/script/package +8 -0
- data/script/release +15 -0
- data/spec/fixtures/files/api_names.yaml +3 -0
- data/spec/fixtures/files/auth_stored_credentials.json +8 -0
- data/spec/fixtures/files/child/.gitignore +0 -0
- data/spec/fixtures/files/client_secrets.json +1 -0
- data/spec/fixtures/files/invalid.json +1 -0
- data/spec/fixtures/files/test.blah +1 -0
- data/spec/fixtures/files/test.txt +1 -0
- data/spec/fixtures/files/test_api.json +440 -0
- data/spec/google/api_client/auth/storage_spec.rb +1 -3
- data/spec/google/api_client/auth/storages/file_store_spec.rb +1 -2
- data/spec/google/api_client/auth/storages/redis_store_spec.rb +1 -3
- data/spec/google/api_client/client_secrets_spec.rb +38 -1
- data/spec/google/apis/core/api_command_spec.rb +209 -0
- data/spec/google/apis/core/batch_spec.rb +142 -0
- data/spec/google/apis/core/download_spec.rb +103 -0
- data/spec/google/apis/core/hashable_spec.rb +60 -0
- data/spec/google/apis/core/http_command_spec.rb +284 -0
- data/spec/google/apis/core/json_representation_spec.rb +192 -0
- data/spec/google/apis/core/service_spec.rb +247 -0
- data/spec/google/apis/core/upload_spec.rb +300 -0
- data/{lib/google/api_client/discovery.rb → spec/google/apis/generated_spec.rb} +13 -5
- data/spec/google/apis/generator/generator_spec.rb +272 -0
- data/spec/google/apis/logging_spec.rb +45 -0
- data/spec/google/apis/options_spec.rb +40 -0
- data/spec/integration_tests/adsense_spec.rb +29 -0
- data/spec/integration_tests/drive_spec.rb +35 -0
- data/spec/integration_tests/pubsub_spec.rb +48 -0
- data/spec/integration_tests/url_shortener_spec.rb +45 -0
- data/spec/spec_helper/load_path_spec.rb +33 -0
- data/spec/spec_helper.rb +131 -44
- data/third_party/hurley_patches.rb +103 -0
- metadata +533 -170
- data/lib/compat/multi_json.rb +0 -19
- data/lib/google/api_client/auth/file_storage.rb +0 -59
- data/lib/google/api_client/auth/jwt_asserter.rb +0 -126
- data/lib/google/api_client/auth/pkcs12.rb +0 -41
- data/lib/google/api_client/batch.rb +0 -325
- data/lib/google/api_client/charset.rb +0 -33
- data/lib/google/api_client/discovery/api.rb +0 -300
- data/lib/google/api_client/discovery/media.rb +0 -77
- data/lib/google/api_client/discovery/method.rb +0 -363
- data/lib/google/api_client/discovery/resource.rb +0 -156
- data/lib/google/api_client/discovery/schema.rb +0 -119
- data/lib/google/api_client/environment.rb +0 -42
- data/lib/google/api_client/gzip.rb +0 -28
- data/lib/google/api_client/logging.rb +0 -32
- data/lib/google/api_client/media.rb +0 -259
- data/lib/google/api_client/railtie.rb +0 -18
- data/lib/google/api_client/request.rb +0 -350
- data/lib/google/api_client/result.rb +0 -255
- data/lib/google/api_client/service/batch.rb +0 -110
- data/lib/google/api_client/service/request.rb +0 -144
- data/lib/google/api_client/service/resource.rb +0 -40
- data/lib/google/api_client/service/result.rb +0 -162
- data/lib/google/api_client/service/simple_file_store.rb +0 -151
- data/lib/google/api_client/service/stub_generator.rb +0 -61
- data/lib/google/api_client/service.rb +0 -233
- data/lib/google/api_client.rb +0 -750
- data/spec/google/api_client/batch_spec.rb +0 -248
- data/spec/google/api_client/discovery_spec.rb +0 -662
- data/spec/google/api_client/gzip_spec.rb +0 -98
- data/spec/google/api_client/media_spec.rb +0 -178
- data/spec/google/api_client/result_spec.rb +0 -207
- data/spec/google/api_client/service_account_spec.rb +0 -169
- data/spec/google/api_client/service_spec.rb +0 -618
- data/spec/google/api_client/simple_file_store_spec.rb +0 -133
- data/spec/google/api_client_spec.rb +0 -352
|
@@ -0,0 +1,312 @@
|
|
|
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
|
+
end
|
|
149
|
+
|
|
150
|
+
# Release any resources used by this command
|
|
151
|
+
# @private
|
|
152
|
+
# @return [void]
|
|
153
|
+
def release!
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Check the response and either decode body or raise error
|
|
157
|
+
#
|
|
158
|
+
# @param [Fixnum] status
|
|
159
|
+
# HTTP status code of response
|
|
160
|
+
# @param [Hurley::Header] header
|
|
161
|
+
# Response headers
|
|
162
|
+
# @param [String, #read] body
|
|
163
|
+
# Response body
|
|
164
|
+
# @return [Object]
|
|
165
|
+
# Response object
|
|
166
|
+
# @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
|
|
167
|
+
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
|
168
|
+
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
|
169
|
+
def process_response(status, header, body)
|
|
170
|
+
check_status(status, header, body)
|
|
171
|
+
decode_response_body(header[:content_type], body)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Check the response and raise error if needed
|
|
175
|
+
#
|
|
176
|
+
# @param [Fixnum] status
|
|
177
|
+
# HTTP status code of response
|
|
178
|
+
# @param
|
|
179
|
+
# @param [Hurley::Header] header
|
|
180
|
+
# HTTP response headers
|
|
181
|
+
# @param [String] body
|
|
182
|
+
# HTTP response body
|
|
183
|
+
# @param [String] message
|
|
184
|
+
# Error message text
|
|
185
|
+
# @return [void]
|
|
186
|
+
# @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
|
|
187
|
+
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
|
188
|
+
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
|
189
|
+
def check_status(status, header = nil, body = nil, message = nil)
|
|
190
|
+
# TODO: 304 Not Modified depends on context...
|
|
191
|
+
case status
|
|
192
|
+
when 200...300
|
|
193
|
+
nil
|
|
194
|
+
when 301, 302, 303, 307
|
|
195
|
+
message ||= sprintf('Redirect to %s', header[:location])
|
|
196
|
+
raise Google::Apis::RedirectError.new(message, status_code: status, header: header, body: body)
|
|
197
|
+
when 401
|
|
198
|
+
message ||= 'Unauthorized'
|
|
199
|
+
raise Google::Apis::AuthorizationError.new(message, status_code: status, header: header, body: body)
|
|
200
|
+
when 304, 400, 402...500
|
|
201
|
+
message ||= 'Invalid request'
|
|
202
|
+
raise Google::Apis::ClientError.new(message, status_code: status, header: header, body: body)
|
|
203
|
+
when 500...600
|
|
204
|
+
message ||= 'Server error'
|
|
205
|
+
raise Google::Apis::ServerError.new(message, status_code: status, header: header, body: body)
|
|
206
|
+
else
|
|
207
|
+
logger.warn(sprintf('Encountered unexpected status code %s', status))
|
|
208
|
+
message ||= 'Unknown error'
|
|
209
|
+
raise Google::Apis::TransmissionError.new(message, status_code: status, header: header, body: body)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Process the actual response body. Intended to be overridden by subclasses
|
|
214
|
+
#
|
|
215
|
+
# @param [String] _content_type
|
|
216
|
+
# Content type of body
|
|
217
|
+
# @param [String, #read] body
|
|
218
|
+
# Response body
|
|
219
|
+
# @return [Object]
|
|
220
|
+
def decode_response_body(_content_type, body)
|
|
221
|
+
body
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Process a success response
|
|
225
|
+
# @param [Object] result
|
|
226
|
+
# Result object
|
|
227
|
+
# @return [Object] result if no block given
|
|
228
|
+
# @yield [result, nil] if block given
|
|
229
|
+
def success(result, &block)
|
|
230
|
+
logger.debug { sprintf('Success - %s', PP.pp(result, '')) }
|
|
231
|
+
block.call(result, nil) if block_given?
|
|
232
|
+
result
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Process an error response
|
|
236
|
+
# @param [StandardError] err
|
|
237
|
+
# Error object
|
|
238
|
+
# @param [Boolean] rethrow
|
|
239
|
+
# True if error should be raised again after handling
|
|
240
|
+
# @return [void]
|
|
241
|
+
# @yield [nil, err] if block given
|
|
242
|
+
# @raise [StandardError] if no block
|
|
243
|
+
def error(err, rethrow: false, &block)
|
|
244
|
+
logger.debug { sprintf('Error - %s', PP.pp(err, '')) }
|
|
245
|
+
err = Google::Apis::TransmissionError.new(err) if err.is_a?(Hurley::ClientError)
|
|
246
|
+
block.call(nil, err) if block_given?
|
|
247
|
+
fail err if rethrow || block.nil?
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Execute the command once.
|
|
251
|
+
#
|
|
252
|
+
# @private
|
|
253
|
+
# @param [Hurley::Client] client
|
|
254
|
+
# HTTP client
|
|
255
|
+
# @return [Object]
|
|
256
|
+
# @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
|
|
257
|
+
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
|
258
|
+
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
|
259
|
+
def execute_once(client)
|
|
260
|
+
body.rewind if body.respond_to?(:rewind)
|
|
261
|
+
begin
|
|
262
|
+
logger.debug { sprintf('Sending HTTP %s %s', method, url) }
|
|
263
|
+
response = client.send(method, url, body) do |req|
|
|
264
|
+
# Temporary workaround for Hurley bug where the connection preference
|
|
265
|
+
# is ignored and it uses nested anyway
|
|
266
|
+
req.url.query_class = Hurley::Query::Flat
|
|
267
|
+
query.each do | k, v|
|
|
268
|
+
req.url.query[k] = normalize_query_value(v)
|
|
269
|
+
end
|
|
270
|
+
# End workaround
|
|
271
|
+
apply_request_options(req)
|
|
272
|
+
end
|
|
273
|
+
logger.debug { response.status_code }
|
|
274
|
+
logger.debug { response.inspect }
|
|
275
|
+
response = process_response(response.status_code, response.header, response.body)
|
|
276
|
+
success(response)
|
|
277
|
+
rescue => e
|
|
278
|
+
logger.debug { sprintf('Caught error %s', e) }
|
|
279
|
+
error(e, rethrow: true)
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# Update the request with any specified options.
|
|
284
|
+
# @param [Hurley::Request] req
|
|
285
|
+
# HTTP request
|
|
286
|
+
# @return [void]
|
|
287
|
+
def apply_request_options(req)
|
|
288
|
+
if options.authorization.respond_to?(:apply!)
|
|
289
|
+
options.authorization.apply!(req.header)
|
|
290
|
+
elsif options.authorization.is_a?(String)
|
|
291
|
+
req.header[:authorization] = sprintf('Bearer %s', options.authorization)
|
|
292
|
+
end
|
|
293
|
+
req.header.update(header)
|
|
294
|
+
req.options.timeout = options.timeout_sec
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
private
|
|
298
|
+
|
|
299
|
+
def normalize_query_value(v)
|
|
300
|
+
case v
|
|
301
|
+
when Array
|
|
302
|
+
v.map { |v2| normalize_query_value(v2) }
|
|
303
|
+
when nil
|
|
304
|
+
nil
|
|
305
|
+
else
|
|
306
|
+
v.to_s
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
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?(:[])
|
|
42
|
+
self[name] || instance_variable_get(ivar_name)
|
|
43
|
+
else
|
|
44
|
+
instance_variable_get(ivar_name)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Returns a customized function for Representable that checks whether or not
|
|
50
|
+
# an attribute should be serialized. Allows proper patch semantics by distinguishing
|
|
51
|
+
# between nil & unset values
|
|
52
|
+
#
|
|
53
|
+
# @param [String] name Property name
|
|
54
|
+
# @return [Proc]
|
|
55
|
+
def if_fn(name)
|
|
56
|
+
ivar_name = "@#{name}".to_sym
|
|
57
|
+
lambda do |opts|
|
|
58
|
+
if opts[:skip_undefined]
|
|
59
|
+
if respond_to?(:key?)
|
|
60
|
+
self.key?(name) || instance_variable_defined?(ivar_name)
|
|
61
|
+
else
|
|
62
|
+
instance_variable_defined?(ivar_name)
|
|
63
|
+
end
|
|
64
|
+
else
|
|
65
|
+
true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def set_default_options(name, options)
|
|
71
|
+
if options[:base64]
|
|
72
|
+
options[:render_filter] = ->(value, _doc, *_args) { Base64.urlsafe_encode64(value) }
|
|
73
|
+
options[:parse_filter] = ->(fragment, _doc, *_args) { Base64.urlsafe_decode64(fragment) }
|
|
74
|
+
end
|
|
75
|
+
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
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
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
|
-
|
|
18
|
-
module
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|