gcloud 0.12.2 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +5 -13
  2. data/lib/gcloud.rb +27 -456
  3. data/lib/gcloud/bigquery.rb +2 -382
  4. data/lib/gcloud/datastore.rb +2 -576
  5. data/lib/gcloud/dns.rb +2 -321
  6. data/lib/gcloud/logging.rb +1 -322
  7. data/lib/gcloud/pubsub.rb +2 -476
  8. data/lib/gcloud/resource_manager.rb +2 -273
  9. data/lib/gcloud/storage.rb +2 -440
  10. data/lib/gcloud/translate.rb +1 -250
  11. data/lib/gcloud/version.rb +2 -2
  12. data/lib/gcloud/vision.rb +1 -501
  13. metadata +36 -332
  14. data/AUTHENTICATION.md +0 -75
  15. data/CHANGELOG.md +0 -382
  16. data/OVERVIEW.md +0 -259
  17. data/lib/gcloud/backoff.rb +0 -150
  18. data/lib/gcloud/bigquery/copy_job.rb +0 -97
  19. data/lib/gcloud/bigquery/credentials.rb +0 -29
  20. data/lib/gcloud/bigquery/data.rb +0 -239
  21. data/lib/gcloud/bigquery/dataset.rb +0 -753
  22. data/lib/gcloud/bigquery/dataset/access.rb +0 -507
  23. data/lib/gcloud/bigquery/dataset/list.rb +0 -169
  24. data/lib/gcloud/bigquery/extract_job.rb +0 -117
  25. data/lib/gcloud/bigquery/insert_response.rb +0 -81
  26. data/lib/gcloud/bigquery/job.rb +0 -299
  27. data/lib/gcloud/bigquery/job/list.rb +0 -172
  28. data/lib/gcloud/bigquery/load_job.rb +0 -202
  29. data/lib/gcloud/bigquery/project.rb +0 -475
  30. data/lib/gcloud/bigquery/query_data.rb +0 -234
  31. data/lib/gcloud/bigquery/query_job.rb +0 -137
  32. data/lib/gcloud/bigquery/schema.rb +0 -359
  33. data/lib/gcloud/bigquery/service.rb +0 -506
  34. data/lib/gcloud/bigquery/table.rb +0 -1141
  35. data/lib/gcloud/bigquery/table/list.rb +0 -180
  36. data/lib/gcloud/bigquery/view.rb +0 -475
  37. data/lib/gcloud/credentials.rb +0 -129
  38. data/lib/gcloud/datastore/commit.rb +0 -148
  39. data/lib/gcloud/datastore/credentials.rb +0 -35
  40. data/lib/gcloud/datastore/cursor.rb +0 -76
  41. data/lib/gcloud/datastore/dataset.rb +0 -660
  42. data/lib/gcloud/datastore/dataset/lookup_results.rb +0 -219
  43. data/lib/gcloud/datastore/dataset/query_results.rb +0 -386
  44. data/lib/gcloud/datastore/entity.rb +0 -449
  45. data/lib/gcloud/datastore/errors.rb +0 -41
  46. data/lib/gcloud/datastore/gql_query.rb +0 -211
  47. data/lib/gcloud/datastore/grpc_utils.rb +0 -132
  48. data/lib/gcloud/datastore/key.rb +0 -281
  49. data/lib/gcloud/datastore/properties.rb +0 -128
  50. data/lib/gcloud/datastore/query.rb +0 -348
  51. data/lib/gcloud/datastore/service.rb +0 -167
  52. data/lib/gcloud/datastore/transaction.rb +0 -362
  53. data/lib/gcloud/dns/change.rb +0 -158
  54. data/lib/gcloud/dns/change/list.rb +0 -173
  55. data/lib/gcloud/dns/credentials.rb +0 -29
  56. data/lib/gcloud/dns/importer.rb +0 -183
  57. data/lib/gcloud/dns/project.rb +0 -247
  58. data/lib/gcloud/dns/record.rb +0 -170
  59. data/lib/gcloud/dns/record/list.rb +0 -174
  60. data/lib/gcloud/dns/service.rb +0 -167
  61. data/lib/gcloud/dns/zone.rb +0 -759
  62. data/lib/gcloud/dns/zone/list.rb +0 -168
  63. data/lib/gcloud/dns/zone/transaction.rb +0 -176
  64. data/lib/gcloud/errors.rb +0 -206
  65. data/lib/gcloud/gce.rb +0 -56
  66. data/lib/gcloud/grpc_utils.rb +0 -87
  67. data/lib/gcloud/logging/credentials.rb +0 -29
  68. data/lib/gcloud/logging/entry.rb +0 -465
  69. data/lib/gcloud/logging/entry/http_request.rb +0 -141
  70. data/lib/gcloud/logging/entry/list.rb +0 -177
  71. data/lib/gcloud/logging/entry/operation.rb +0 -90
  72. data/lib/gcloud/logging/logger.rb +0 -307
  73. data/lib/gcloud/logging/metric.rb +0 -169
  74. data/lib/gcloud/logging/metric/list.rb +0 -172
  75. data/lib/gcloud/logging/project.rb +0 -642
  76. data/lib/gcloud/logging/resource.rb +0 -84
  77. data/lib/gcloud/logging/resource_descriptor.rb +0 -137
  78. data/lib/gcloud/logging/resource_descriptor/list.rb +0 -174
  79. data/lib/gcloud/logging/service.rb +0 -267
  80. data/lib/gcloud/logging/sink.rb +0 -227
  81. data/lib/gcloud/logging/sink/list.rb +0 -171
  82. data/lib/gcloud/pubsub/credentials.rb +0 -29
  83. data/lib/gcloud/pubsub/message.rb +0 -94
  84. data/lib/gcloud/pubsub/policy.rb +0 -204
  85. data/lib/gcloud/pubsub/project.rb +0 -482
  86. data/lib/gcloud/pubsub/received_message.rb +0 -160
  87. data/lib/gcloud/pubsub/service.rb +0 -334
  88. data/lib/gcloud/pubsub/subscription.rb +0 -565
  89. data/lib/gcloud/pubsub/subscription/list.rb +0 -208
  90. data/lib/gcloud/pubsub/topic.rb +0 -511
  91. data/lib/gcloud/pubsub/topic/list.rb +0 -174
  92. data/lib/gcloud/pubsub/topic/publisher.rb +0 -85
  93. data/lib/gcloud/resource_manager/credentials.rb +0 -30
  94. data/lib/gcloud/resource_manager/manager.rb +0 -266
  95. data/lib/gcloud/resource_manager/policy.rb +0 -211
  96. data/lib/gcloud/resource_manager/project.rb +0 -484
  97. data/lib/gcloud/resource_manager/project/list.rb +0 -167
  98. data/lib/gcloud/resource_manager/project/updater.rb +0 -130
  99. data/lib/gcloud/resource_manager/service.rb +0 -127
  100. data/lib/gcloud/storage/bucket.rb +0 -775
  101. data/lib/gcloud/storage/bucket/acl.rb +0 -810
  102. data/lib/gcloud/storage/bucket/cors.rb +0 -153
  103. data/lib/gcloud/storage/bucket/list.rb +0 -172
  104. data/lib/gcloud/storage/credentials.rb +0 -29
  105. data/lib/gcloud/storage/errors.rb +0 -65
  106. data/lib/gcloud/storage/file.rb +0 -842
  107. data/lib/gcloud/storage/file/acl.rb +0 -425
  108. data/lib/gcloud/storage/file/list.rb +0 -191
  109. data/lib/gcloud/storage/file/verifier.rb +0 -67
  110. data/lib/gcloud/storage/project.rb +0 -316
  111. data/lib/gcloud/storage/service.rb +0 -347
  112. data/lib/gcloud/translate/api.rb +0 -241
  113. data/lib/gcloud/translate/detection.rb +0 -137
  114. data/lib/gcloud/translate/language.rb +0 -69
  115. data/lib/gcloud/translate/service.rb +0 -80
  116. data/lib/gcloud/translate/translation.rb +0 -112
  117. data/lib/gcloud/vision/annotate.rb +0 -224
  118. data/lib/gcloud/vision/annotation.rb +0 -455
  119. data/lib/gcloud/vision/annotation/entity.rb +0 -234
  120. data/lib/gcloud/vision/annotation/face.rb +0 -1750
  121. data/lib/gcloud/vision/annotation/properties.rb +0 -245
  122. data/lib/gcloud/vision/annotation/safe_search.rb +0 -161
  123. data/lib/gcloud/vision/annotation/text.rb +0 -236
  124. data/lib/gcloud/vision/annotation/vertex.rb +0 -108
  125. data/lib/gcloud/vision/credentials.rb +0 -29
  126. data/lib/gcloud/vision/image.rb +0 -590
  127. data/lib/gcloud/vision/location.rb +0 -115
  128. data/lib/gcloud/vision/project.rb +0 -278
  129. data/lib/gcloud/vision/service.rb +0 -66
  130. data/lib/google/api/annotations.rb +0 -14
  131. data/lib/google/api/http.rb +0 -30
  132. data/lib/google/api/label.rb +0 -24
  133. data/lib/google/api/monitored_resource.rb +0 -25
  134. data/lib/google/datastore/v1beta3/datastore.rb +0 -115
  135. data/lib/google/datastore/v1beta3/datastore_services.rb +0 -33
  136. data/lib/google/datastore/v1beta3/entity.rb +0 -63
  137. data/lib/google/datastore/v1beta3/query.rb +0 -128
  138. data/lib/google/devtools/cloudtrace/v1/trace.rb +0 -78
  139. data/lib/google/devtools/cloudtrace/v1/trace_services.rb +0 -32
  140. data/lib/google/example/library/v1/library.rb +0 -91
  141. data/lib/google/example/library/v1/library_services.rb +0 -40
  142. data/lib/google/iam/v1/iam_policy.rb +0 -33
  143. data/lib/google/iam/v1/iam_policy_services.rb +0 -30
  144. data/lib/google/iam/v1/policy.rb +0 -25
  145. data/lib/google/logging/type/http_request.rb +0 -28
  146. data/lib/google/logging/type/log_severity.rb +0 -27
  147. data/lib/google/logging/v2/log_entry.rb +0 -44
  148. data/lib/google/logging/v2/logging.rb +0 -56
  149. data/lib/google/logging/v2/logging_config.rb +0 -59
  150. data/lib/google/logging/v2/logging_config_services.rb +0 -32
  151. data/lib/google/logging/v2/logging_metrics.rb +0 -51
  152. data/lib/google/logging/v2/logging_metrics_services.rb +0 -32
  153. data/lib/google/logging/v2/logging_services.rb +0 -31
  154. data/lib/google/longrunning/operations.rb +0 -50
  155. data/lib/google/longrunning/operations_services.rb +0 -29
  156. data/lib/google/protobuf/descriptor.rb +0 -0
  157. data/lib/google/pubsub/v1/pubsub.rb +0 -129
  158. data/lib/google/pubsub/v1/pubsub_services.rb +0 -56
  159. data/lib/google/pubsub/v1beta2/pubsub.rb +0 -126
  160. data/lib/google/pubsub/v1beta2/pubsub_services.rb +0 -56
  161. data/lib/google/rpc/code.rb +0 -32
  162. data/lib/google/rpc/error_details.rb +0 -61
  163. data/lib/google/rpc/status.rb +0 -19
  164. data/lib/google/type/color.rb +0 -20
  165. data/lib/google/type/date.rb +0 -18
  166. data/lib/google/type/dayofweek.rb +0 -23
  167. data/lib/google/type/latlng.rb +0 -17
  168. data/lib/google/type/money.rb +0 -18
  169. data/lib/google/type/timeofday.rb +0 -19
@@ -1,167 +0,0 @@
1
- # Copyright 2015 Google Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- module Gcloud
17
- module ResourceManager
18
- class Project
19
- ##
20
- # Project::List is a special case Array with additional values.
21
- class List < DelegateClass(::Array)
22
- ##
23
- # If not empty, indicates that there are more projects that match
24
- # the request and this value should be passed to continue.
25
- attr_accessor :token
26
-
27
- ##
28
- # @private Create a new Project::List with an array of Project
29
- # instances.
30
- def initialize arr = []
31
- super arr
32
- end
33
-
34
- ##
35
- # Whether there is a next page of projects.
36
- #
37
- # @return [Boolean]
38
- #
39
- # @example
40
- # require "gcloud"
41
- #
42
- # gcloud = Gcloud.new
43
- # resource_manager = gcloud.resource_manager
44
- #
45
- # projects = resource_manager.projects
46
- # if projects.next?
47
- # next_projects = projects.next
48
- # end
49
- #
50
- def next?
51
- !token.nil?
52
- end
53
-
54
- ##
55
- # Retrieve the next page of projects.
56
- #
57
- # @return [Project::List]
58
- #
59
- # @example
60
- # require "gcloud"
61
- #
62
- # gcloud = Gcloud.new
63
- # resource_manager = gcloud.resource_manager
64
- #
65
- # projects = resource_manager.projects
66
- # if projects.next?
67
- # next_projects = projects.next
68
- # end
69
- #
70
- def next
71
- return nil unless next?
72
- ensure_manager!
73
- @manager.projects token: token, filter: @filter, max: @max
74
- end
75
-
76
- ##
77
- # Retrieves all projects by repeatedly loading {#next} until {#next?}
78
- # returns `false`. Calls the given block once for each project, which is
79
- # passed as the parameter.
80
- #
81
- # An Enumerator is returned if no block is given.
82
- #
83
- # This method may make several API calls until all projects are
84
- # retrieved. Be sure to use as narrow a search criteria as possible.
85
- # Please use with caution.
86
- #
87
- # @param [Integer] request_limit The upper limit of API requests to make
88
- # to load all projects. Default is no limit.
89
- # @yield [project] The block for accessing each project.
90
- # @yieldparam [Project] project The project object.
91
- #
92
- # @return [Enumerator]
93
- #
94
- # @example Iterating each project by passing a block:
95
- # require "gcloud"
96
- #
97
- # gcloud = Gcloud.new
98
- # resource_manager = gcloud.resource_manager
99
- # projects = resource_manager.projects
100
- #
101
- # projects.all do |project|
102
- # puts project.project_id
103
- # end
104
- #
105
- # @example Using the enumerator by not passing a block:
106
- # require "gcloud"
107
- #
108
- # gcloud = Gcloud.new
109
- # resource_manager = gcloud.resource_manager
110
- # projects = resource_manager.projects
111
- #
112
- # all_project_ids = projects.all.map do |project|
113
- # project.project_id
114
- # end
115
- #
116
- # @example Limit the number of API calls made:
117
- # require "gcloud"
118
- #
119
- # gcloud = Gcloud.new
120
- # resource_manager = gcloud.resource_manager
121
- # projects = resource_manager.projects
122
- #
123
- # projects.all(request_limit: 10) do |project|
124
- # puts project.project_id
125
- # end
126
- #
127
- def all request_limit: nil
128
- request_limit = request_limit.to_i if request_limit
129
- unless block_given?
130
- return enum_for(:all, request_limit: request_limit)
131
- end
132
- results = self
133
- loop do
134
- results.each { |r| yield r }
135
- if request_limit
136
- request_limit -= 1
137
- break if request_limit < 0
138
- end
139
- break unless results.next?
140
- results = results.next
141
- end
142
- end
143
-
144
- ##
145
- # @private New Projects::List from a response object.
146
- def self.from_gapi gapi_list, manager, filter = nil, max = nil
147
- projects = new(Array(gapi_list.projects).map do |gapi_object|
148
- Project.from_gapi gapi_object, manager.service
149
- end)
150
- projects.instance_variable_set :@token, gapi_list.next_page_token
151
- projects.instance_variable_set :@manager, manager
152
- projects.instance_variable_set :@filter, filter
153
- projects.instance_variable_set :@max, max
154
- projects
155
- end
156
-
157
- protected
158
-
159
- ##
160
- # Raise an error unless an active connection is available.
161
- def ensure_manager!
162
- fail "Must have active connection" unless @manager
163
- end
164
- end
165
- end
166
- end
167
- end
@@ -1,130 +0,0 @@
1
- # Copyright 2015 Google Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "time"
17
-
18
- module Gcloud
19
- module ResourceManager
20
- class Project
21
- ##
22
- # # Project Updater
23
- #
24
- # This object is used by Project#update when passed a block. These methods
25
- # are used to update the project data in a single API call.
26
- #
27
- # @example
28
- # require "gcloud"
29
- #
30
- # gcloud = Gcloud.new
31
- # resource_manager = gcloud.resource_manager
32
- # project = resource_manager.project "tokyo-rain-123"
33
- # project.update do |p|
34
- # p.name = "My Project"
35
- # p.labels["env"] = "production"
36
- # end
37
- #
38
- class Updater < DelegateClass(Project)
39
- ##
40
- # @private Create an Updater object.
41
- def initialize project
42
- super project
43
- end
44
-
45
- ##
46
- # Updates the user-assigned name of the project. This field is optional
47
- # and can remain unset.
48
- #
49
- # Allowed characters are: lowercase and uppercase letters, numbers,
50
- # hyphen, single-quote, double-quote, space, and exclamation point.
51
- #
52
- # @example
53
- # require "gcloud"
54
- #
55
- # gcloud = Gcloud.new
56
- # resource_manager = gcloud.resource_manager
57
- # project = resource_manager.project "tokyo-rain-123"
58
- # project.update do |p|
59
- # p.name = "My Project"
60
- # end
61
- #
62
- def name= new_name
63
- gapi.name = new_name
64
- end
65
-
66
- ##
67
- # The labels associated with this project.
68
- #
69
- # Label keys must be between 1 and 63 characters long and must conform
70
- # to the following regular expression:
71
- # <code>[a-z]([-a-z0-9]*[a-z0-9])?</code>.
72
- #
73
- # Label values must be between 0 and 63 characters long and must conform
74
- # to the regular expression <code>([a-z]([-a-z0-9]*[a-z0-9])?)?</code>.
75
- #
76
- # No more than 256 labels can be associated with a given resource.
77
- # (`Hash`)
78
- #
79
- # @example
80
- # require "gcloud"
81
- #
82
- # gcloud = Gcloud.new
83
- # resource_manager = gcloud.resource_manager
84
- # project = resource_manager.project "tokyo-rain-123"
85
- # project.update do |p|
86
- # p.labels["env"] = "production"
87
- # end
88
- #
89
- def labels
90
- gapi.labels
91
- end
92
-
93
- ##
94
- # Updates the labels associated with this project.
95
- #
96
- # Label keys must be between 1 and 63 characters long and must conform
97
- # to the following regular expression:
98
- # <code>[a-z]([-a-z0-9]*[a-z0-9])?</code>.
99
- #
100
- # Label values must be between 0 and 63 characters long and must conform
101
- # to the regular expression <code>([a-z]([-a-z0-9]*[a-z0-9])?)?</code>.
102
- #
103
- # No more than 256 labels can be associated with a given resource.
104
- # (`Hash`)
105
- #
106
- # @example
107
- # require "gcloud"
108
- #
109
- # gcloud = Gcloud.new
110
- # resource_manager = gcloud.resource_manager
111
- # project = resource_manager.project "tokyo-rain-123"
112
- # project.update do |p|
113
- # p.labels = { "env" => "production" }
114
- # end
115
- #
116
- def labels= new_labels
117
- gapi.labels = new_labels
118
- end
119
-
120
- ##
121
- # @private Create an Updater object.
122
- def self.from_project project
123
- dupe_gapi = project.gapi.class.new project.gapi.to_h
124
- dupe_project = Project.from_gapi dupe_gapi, nil # no way to update
125
- Updater.new dupe_project
126
- end
127
- end
128
- end
129
- end
130
- end
@@ -1,127 +0,0 @@
1
- # Copyright 2016 Google Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "gcloud/version"
17
- require "gcloud/errors"
18
- require "google/apis/cloudresourcemanager_v1"
19
-
20
- module Gcloud
21
- module ResourceManager
22
- ##
23
- # @private
24
- # Represents the service to Resource Manager, as well as expose the API
25
- # calls.
26
- class Service
27
- ##
28
- # Alias to the Google Client API module
29
- API = Google::Apis::CloudresourcemanagerV1
30
-
31
- attr_accessor :credentials
32
-
33
- ##
34
- # Creates a new Service instance.
35
- def initialize credentials, retries: nil, timeout: nil
36
- @credentials = credentials
37
- @service = API::CloudResourceManagerService.new
38
- @service.client_options.application_name = "gcloud-ruby"
39
- @service.client_options.application_version = Gcloud::VERSION
40
- @service.request_options.retries = retries || 3
41
- @service.request_options.timeout_sec = timeout if timeout
42
- @service.authorization = @credentials.client
43
- end
44
-
45
- def service
46
- return mocked_service if mocked_service
47
- @service
48
- end
49
- attr_accessor :mocked_service
50
-
51
- ##
52
- # Returns API::ListProjectsResponse
53
- def list_project filter: nil, token: nil, max: nil
54
- service.list_projects page_token: token, page_size: max, filter: filter
55
- end
56
-
57
- ##
58
- # Returns API::Project
59
- def get_project project_id
60
- service.get_project project_id
61
- rescue Google::Apis::Error => e
62
- raise Gcloud::Error.from_error(e)
63
- end
64
-
65
- ##
66
- # Returns API::Project
67
- def create_project project_id, name, labels
68
- project_attrs = { projectId: project_id, name: name,
69
- labels: labels }.delete_if { |_, v| v.nil? }
70
- service.create_project API::Project.new(project_attrs)
71
- rescue Google::Apis::Error => e
72
- raise Gcloud::Error.from_error(e)
73
- end
74
-
75
- ##
76
- # Updated the project, given a API::Project.
77
- # Returns API::Project
78
- def update_project project_gapi
79
- service.update_project project_gapi.project_id, project_gapi
80
- rescue Google::Apis::Error => e
81
- raise Gcloud::Error.from_error(e)
82
- end
83
-
84
- def delete_project project_id
85
- service.delete_project project_id
86
- rescue Google::Apis::Error => e
87
- raise Gcloud::Error.from_error(e)
88
- end
89
-
90
- def undelete_project project_id
91
- service.undelete_project project_id
92
- rescue Google::Apis::Error => e
93
- raise Gcloud::Error.from_error(e)
94
- end
95
-
96
- ##
97
- # Returns API::Policy
98
- def get_policy project_id
99
- service.get_project_iam_policy "projects/#{project_id}"
100
- rescue Google::Apis::Error => e
101
- raise Gcloud::Error.from_error(e)
102
- end
103
-
104
- ##
105
- # Returns API::Policy
106
- def set_policy project_id, new_policy
107
- req = API::SetIamPolicyRequest.new policy: new_policy
108
- service.set_project_iam_policy "projects/#{project_id}", req
109
- rescue Google::Apis::Error => e
110
- raise Gcloud::Error.from_error(e)
111
- end
112
-
113
- ##
114
- # Returns API::TestIamPermissionsResponse
115
- def test_permissions project_id, permissions
116
- req = API::TestIamPermissionsRequest.new permissions: permissions
117
- service.test_project_iam_permissions "projects/#{project_id}", req
118
- rescue Google::Apis::Error => e
119
- raise Gcloud::Error.from_error(e)
120
- end
121
-
122
- def inspect
123
- "#{self.class}"
124
- end
125
- end
126
- end
127
- end
@@ -1,775 +0,0 @@
1
- # Copyright 2014 Google Inc. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "gcloud/storage/bucket/acl"
17
- require "gcloud/storage/bucket/list"
18
- require "gcloud/storage/bucket/cors"
19
- require "gcloud/storage/file"
20
- require "pathname"
21
-
22
- module Gcloud
23
- module Storage
24
- ##
25
- # # Bucket
26
- #
27
- # Represents a Storage bucket. Belongs to a Project and has many Files.
28
- #
29
- # @example
30
- # require "gcloud"
31
- #
32
- # gcloud = Gcloud.new
33
- # storage = gcloud.storage
34
- #
35
- # bucket = storage.bucket "my-bucket"
36
- # file = bucket.file "path/to/my-file.ext"
37
- #
38
- class Bucket
39
- ##
40
- # @private The Service object.
41
- attr_accessor :service
42
-
43
- ##
44
- # @private The Google API Client object.
45
- attr_accessor :gapi
46
-
47
- ##
48
- # @private Create an empty Bucket object.
49
- def initialize
50
- @service = nil
51
- @gapi = Google::Apis::StorageV1::Bucket.new
52
- end
53
-
54
- ##
55
- # The kind of item this is.
56
- # For buckets, this is always `storage#bucket`.
57
- def kind
58
- @gapi.kind
59
- end
60
-
61
- ##
62
- # The ID of the bucket.
63
- def id
64
- @gapi.id
65
- end
66
-
67
- ##
68
- # The name of the bucket.
69
- def name
70
- @gapi.name
71
- end
72
-
73
- ##
74
- # A URL that can be used to access the bucket using the REST API.
75
- def api_url
76
- @gapi.self_link
77
- end
78
-
79
- ##
80
- # Creation time of the bucket.
81
- def created_at
82
- @gapi.time_created
83
- end
84
-
85
- ##
86
- # Returns the current CORS configuration for a static website served from
87
- # the bucket.
88
- #
89
- # The return value is a frozen (unmodifiable) array of hashes containing
90
- # the attributes specified for the Bucket resource field
91
- # [cors](https://cloud.google.com/storage/docs/json_api/v1/buckets#cors).
92
- #
93
- # This method also accepts a block for updating the bucket's CORS rules.
94
- # See {Bucket::Cors} for details.
95
- #
96
- # @see https://cloud.google.com/storage/docs/cross-origin Cross-Origin
97
- # Resource Sharing (CORS)
98
- #
99
- # @yield [cors] a block for setting CORS rules
100
- # @yieldparam [Bucket::Cors] cors the object accepting CORS rules
101
- #
102
- # @example Retrieving the bucket's CORS rules.
103
- # require "gcloud"
104
- #
105
- # gcloud = Gcloud.new
106
- # storage = gcloud.storage
107
- #
108
- # bucket = storage.bucket "my-todo-app"
109
- # bucket.cors #=> [{"origin"=>["http://example.org"],
110
- # # "method"=>["GET","POST","DELETE"],
111
- # # "responseHeader"=>["X-My-Custom-Header"],
112
- # # "maxAgeSeconds"=>3600}]
113
- #
114
- # @example Updating the bucket's CORS rules inside a block.
115
- # require "gcloud"
116
- #
117
- # gcloud = Gcloud.new
118
- # storage = gcloud.storage
119
- # bucket = storage.bucket "my-todo-app"
120
- #
121
- # bucket.update do |b|
122
- # b.cors do |c|
123
- # c.add_rule ["http://example.org", "https://example.org"],
124
- # "*",
125
- # response_headers: ["X-My-Custom-Header"],
126
- # max_age: 3600
127
- # end
128
- # end
129
- #
130
- def cors
131
- cors_builder = Bucket::Cors.from_gapi @gapi.cors_configurations
132
- if block_given?
133
- yield cors_builder
134
- if cors_builder.changed?
135
- @gapi.cors_configurations = cors_builder.to_gapi
136
- patch_gapi! :cors_configurations
137
- end
138
- end
139
- cors_builder.freeze # always return frozen objects
140
- end
141
-
142
- ##
143
- # The location of the bucket.
144
- # Object data for objects in the bucket resides in physical
145
- # storage within this region. Defaults to US.
146
- # See the developer's guide for the authoritative list.
147
- #
148
- # @see https://cloud.google.com/storage/docs/concepts-techniques
149
- def location
150
- @gapi.location
151
- end
152
-
153
- ##
154
- # The destination bucket name for the bucket's logs.
155
- #
156
- # @see https://cloud.google.com/storage/docs/access-logs Access Logs
157
- #
158
- def logging_bucket
159
- @gapi.logging.log_bucket if @gapi.logging
160
- end
161
-
162
- ##
163
- # Updates the destination bucket for the bucket's logs.
164
- #
165
- # @see https://cloud.google.com/storage/docs/access-logs Access Logs
166
- #
167
- # @param [String] logging_bucket The bucket to hold the logging output
168
- #
169
- def logging_bucket= logging_bucket
170
- @gapi.logging ||= Google::Apis::StorageV1::Bucket::Logging.new
171
- @gapi.logging.log_bucket = logging_bucket
172
- patch_gapi! :logging
173
- end
174
-
175
- ##
176
- # The logging object prefix for the bucket's logs. For more information,
177
- #
178
- # @see https://cloud.google.com/storage/docs/access-logs Access Logs
179
- #
180
- def logging_prefix
181
- @gapi.logging.log_object_prefix if @gapi.logging
182
- end
183
-
184
- ##
185
- # Updates the logging object prefix. This prefix will be used to create
186
- # log object names for the bucket. It can be at most 900 characters and
187
- # must be a [valid object
188
- # name](https://cloud.google.com/storage/docs/bucket-naming#objectnames).
189
- # By default, the object prefix is the name
190
- # of the bucket for which the logs are enabled.
191
- #
192
- # @see https://cloud.google.com/storage/docs/access-logs Access Logs
193
- #
194
- def logging_prefix= logging_prefix
195
- @gapi.logging ||= Google::Apis::StorageV1::Bucket::Logging.new
196
- @gapi.logging.log_object_prefix = logging_prefix
197
- patch_gapi! :logging
198
- end
199
-
200
- ##
201
- # The bucket's storage class. This defines how objects in the bucket are
202
- # stored and determines the SLA and the cost of storage. Values include
203
- # `STANDARD`, `NEARLINE`, and `DURABLE_REDUCED_AVAILABILITY`.
204
- def storage_class
205
- @gapi.storage_class
206
- end
207
-
208
- ##
209
- # Whether [Object
210
- # Versioning](https://cloud.google.com/storage/docs/object-versioning) is
211
- # enabled for the bucket.
212
- def versioning?
213
- @gapi.versioning.enabled? unless @gapi.versioning.nil?
214
- end
215
-
216
- ##
217
- # Updates whether [Object
218
- # Versioning](https://cloud.google.com/storage/docs/object-versioning) is
219
- # enabled for the bucket.
220
- #
221
- # @return [Boolean]
222
- #
223
- def versioning= new_versioning
224
- @gapi.versioning ||= Google::Apis::StorageV1::Bucket::Versioning.new
225
- @gapi.versioning.enabled = new_versioning
226
- patch_gapi! :versioning
227
- end
228
-
229
- ##
230
- # The index page returned from a static website served from the bucket
231
- # when a site visitor requests the top level directory.
232
- #
233
- # @see https://cloud.google.com/storage/docs/website-configuration#step4
234
- # How to Host a Static Website
235
- #
236
- def website_main
237
- @gapi.website.main_page_suffix if @gapi.website
238
- end
239
-
240
- ##
241
- # Updates the index page returned from a static website served from the
242
- # bucket when a site visitor requests the top level directory.
243
- #
244
- # @see https://cloud.google.com/storage/docs/website-configuration#step4
245
- # How to Host a Static Website
246
- #
247
- def website_main= website_main
248
- @gapi.website ||= Google::Apis::StorageV1::Bucket::Website.new
249
- @gapi.website.main_page_suffix = website_main
250
- patch_gapi! :website
251
- end
252
-
253
- ##
254
- # The page returned from a static website served from the bucket when a
255
- # site visitor requests a resource that does not exist.
256
- #
257
- # @see https://cloud.google.com/storage/docs/website-configuration#step4
258
- # How to Host a Static Website
259
- #
260
- def website_404
261
- @gapi.website.not_found_page if @gapi.website
262
- end
263
-
264
- ##
265
- # Updates the page returned from a static website served from the bucket
266
- # when a site visitor requests a resource that does not exist.
267
- #
268
- # @see https://cloud.google.com/storage/docs/website-configuration#step4
269
- # How to Host a Static Website
270
- #
271
- def website_404= website_404
272
- @gapi.website ||= Google::Apis::StorageV1::Bucket::Website.new
273
- @gapi.website.not_found_page = website_404
274
- patch_gapi! :website
275
- end
276
-
277
- ##
278
- # Updates the bucket with changes made in the given block in a single
279
- # PATCH request. The following attributes may be set: {#cors},
280
- # {#logging_bucket=}, {#logging_prefix=}, {#versioning=},
281
- # {#website_main=}, and {#website_404=}. In addition, the #cors
282
- # configuration accessible in the block is completely mutable and will be
283
- # included in the request. (See {Bucket::Cors})
284
- #
285
- # @yield [bucket] a block yielding a delegate object for updating the file
286
- #
287
- # @example
288
- # require "gcloud"
289
- #
290
- # gcloud = Gcloud.new
291
- # storage = gcloud.storage
292
- #
293
- # bucket = storage.bucket "my-bucket"
294
- # bucket.update do |b|
295
- # b.website_main = "index.html"
296
- # b.website_404 = "not_found.html"
297
- # b.cors[0]["method"] = ["GET","POST","DELETE"]
298
- # b.cors[1]["responseHeader"] << "X-Another-Custom-Header"
299
- # end
300
- #
301
- # @example New CORS rules can also be added in a nested block:
302
- # require "gcloud"
303
- #
304
- # gcloud = Gcloud.new
305
- # storage = gcloud.storage
306
- # bucket = storage.bucket "my-todo-app"
307
- #
308
- # bucket.update do |b|
309
- # b.cors do |c|
310
- # c.add_rule ["http://example.org", "https://example.org"],
311
- # "*",
312
- # response_headers: ["X-My-Custom-Header"],
313
- # max_age: 300
314
- # end
315
- # end
316
- #
317
- def update
318
- updater = Updater.new @gapi
319
- yield updater
320
- # Add check for mutable cors
321
- updater.check_for_mutable_cors!
322
- patch_gapi! updater.updates unless updater.updates.empty?
323
- end
324
-
325
- ##
326
- # Permanently deletes the bucket.
327
- # The bucket must be empty before it can be deleted.
328
- #
329
- # The API call to delete the bucket may be retried under certain
330
- # conditions. See {Gcloud#storage} to control this behavior.
331
- #
332
- # @return [Boolean] Returns `true` if the bucket was deleted.
333
- #
334
- # @example
335
- # require "gcloud"
336
- #
337
- # gcloud = Gcloud.new
338
- # storage = gcloud.storage
339
- #
340
- # bucket = storage.bucket "my-bucket"
341
- # bucket.delete
342
- #
343
- def delete
344
- ensure_service!
345
- service.delete_bucket name
346
- true
347
- end
348
-
349
- ##
350
- # Retrieves a list of files matching the criteria.
351
- #
352
- # @param [String] prefix Filter results to files whose names begin with
353
- # this prefix.
354
- # @param [String] delimiter Returns results in a directory-like mode.
355
- # `items` will contain only objects whose names, aside from the
356
- # `prefix`, do not contain `delimiter`. Objects whose names, aside from
357
- # the `prefix`, contain `delimiter` will have their name, truncated
358
- # after the `delimiter`, returned in `prefixes`. Duplicate `prefixes`
359
- # are omitted.
360
- # @param [String] token A previously-returned page token representing part
361
- # of the larger set of results to view.
362
- # @param [Integer] max Maximum number of items plus prefixes to return. As
363
- # duplicate prefixes are omitted, fewer total results may be returned
364
- # than requested. The default value of this parameter is 1,000 items.
365
- # @param [Boolean] versions If `true`, lists all versions of an object as
366
- # distinct results. The default is `false`. For more information, see
367
- # [Object Versioning
368
- # ](https://cloud.google.com/storage/docs/object-versioning).
369
- #
370
- # @return [Array<Gcloud::Storage::File>] (See
371
- # {Gcloud::Storage::File::List})
372
- #
373
- # @example
374
- # require "gcloud"
375
- #
376
- # gcloud = Gcloud.new
377
- # storage = gcloud.storage
378
- #
379
- # bucket = storage.bucket "my-bucket"
380
- # files = bucket.files
381
- # files.each do |file|
382
- # puts file.name
383
- # end
384
- #
385
- # @example Retrieve all files: (See {File::List#all})
386
- # require "gcloud"
387
- #
388
- # gcloud = Gcloud.new
389
- # storage = gcloud.storage
390
- #
391
- # bucket = storage.bucket "my-bucket"
392
- # files = bucket.files
393
- # files.all do |file|
394
- # puts file.name
395
- # end
396
- #
397
- def files prefix: nil, delimiter: nil, token: nil, max: nil, versions: nil
398
- ensure_service!
399
- options = {
400
- prefix: prefix,
401
- delimiter: delimiter,
402
- token: token,
403
- max: max,
404
- versions: versions
405
- }
406
- gapi = service.list_files name, options
407
- File::List.from_gapi gapi, service, name, prefix, delimiter, max,
408
- versions
409
- end
410
- alias_method :find_files, :files
411
-
412
- ##
413
- # Retrieves a file matching the path.
414
- #
415
- # If a [customer-supplied encryption
416
- # key](https://cloud.google.com/storage/docs/encryption#customer-supplied)
417
- # was used with {#create_file}, the `encryption_key` and
418
- # `encryption_key_sha256` options must be provided or else the file's
419
- # CRC32C checksum and MD5 hash will not be returned.
420
- #
421
- # @param [String] path Name (path) of the file.
422
- # @param [Integer] generation When present, selects a specific revision of
423
- # this object. Default is the latest version.
424
- # @param [String] encryption_key Optional. The customer-supplied, AES-256
425
- # encryption key used to encrypt the file, if one was provided to
426
- # {#create_file}. Must be provided if `encryption_key_sha256` is
427
- # provided.
428
- # @param [String] encryption_key_sha256 Optional. The SHA256 hash of the
429
- # customer-supplied, AES-256 encryption key used to encrypt the file, if
430
- # one was provided to {#create_file}. Must be provided if
431
- # `encryption_key` is provided.
432
- #
433
- # @return [Gcloud::Storage::File, nil] Returns nil if file does not exist
434
- #
435
- # @example
436
- # require "gcloud"
437
- #
438
- # gcloud = Gcloud.new
439
- # storage = gcloud.storage
440
- #
441
- # bucket = storage.bucket "my-bucket"
442
- #
443
- # file = bucket.file "path/to/my-file.ext"
444
- # puts file.name
445
- #
446
- def file path, generation: nil, encryption_key: nil,
447
- encryption_key_sha256: nil
448
- ensure_service!
449
- options = { generation: generation, key: encryption_key,
450
- key_sha256: encryption_key_sha256 }
451
- gapi = service.get_file name, path, options
452
- File.from_gapi gapi, service
453
- rescue Gcloud::NotFoundError
454
- nil
455
- end
456
- alias_method :find_file, :file
457
-
458
- ##
459
- # Creates a new {File} object by providing a path to a local file to
460
- # upload and the path to store it with in the bucket.
461
- #
462
- # #### Customer-supplied encryption keys
463
- #
464
- # By default, Google Cloud Storage manages server-side encryption keys on
465
- # your behalf. However, a [customer-supplied encryption
466
- # key](https://cloud.google.com/storage/docs/encryption#customer-supplied)
467
- # can be provided with the `encryption_key` and `encryption_key_sha256`
468
- # options. If given, the same key and SHA256 hash also must be provided to
469
- # subsequently download or copy the file. If you use customer-supplied
470
- # encryption keys, you must securely manage your keys and ensure that they
471
- # are not lost. Also, please note that file metadata is not encrypted,
472
- # with the exception of the CRC32C checksum and MD5 hash. The names of
473
- # files and buckets are also not encrypted, and you can read or update the
474
- # metadata of an encrypted file without providing the encryption key.
475
- #
476
- # @param [String] file Path of the file on the filesystem to upload.
477
- # @param [String] path Path to store the file in Google Cloud Storage.
478
- # @param [String] acl A predefined set of access controls to apply to this
479
- # file.
480
- #
481
- # Acceptable values are:
482
- #
483
- # * `auth`, `auth_read`, `authenticated`, `authenticated_read`,
484
- # `authenticatedRead` - File owner gets OWNER access, and
485
- # allAuthenticatedUsers get READER access.
486
- # * `owner_full`, `bucketOwnerFullControl` - File owner gets OWNER
487
- # access, and project team owners get OWNER access.
488
- # * `owner_read`, `bucketOwnerRead` - File owner gets OWNER access, and
489
- # project team owners get READER access.
490
- # * `private` - File owner gets OWNER access.
491
- # * `project_private`, `projectPrivate` - File owner gets OWNER access,
492
- # and project team members get access according to their roles.
493
- # * `public`, `public_read`, `publicRead` - File owner gets OWNER
494
- # access, and allUsers get READER access.
495
- # @param [String] cache_control The
496
- # [Cache-Control](https://tools.ietf.org/html/rfc7234#section-5.2)
497
- # response header to be returned when the file is downloaded.
498
- # @param [String] content_disposition The
499
- # [Content-Disposition](https://tools.ietf.org/html/rfc6266)
500
- # response header to be returned when the file is downloaded.
501
- # @param [String] content_encoding The [Content-Encoding
502
- # ](https://tools.ietf.org/html/rfc7231#section-3.1.2.2) response header
503
- # to be returned when the file is downloaded.
504
- # @param [String] content_language The
505
- # [Content-Language](http://tools.ietf.org/html/bcp47) response
506
- # header to be returned when the file is downloaded.
507
- # @param [String] content_type The
508
- # [Content-Type](https://tools.ietf.org/html/rfc2616#section-14.17)
509
- # response header to be returned when the file is downloaded.
510
- # @param [String] crc32c The CRC32c checksum of the file data, as
511
- # described in [RFC 4960, Appendix
512
- # B](http://tools.ietf.org/html/rfc4960#appendix-B).
513
- # If provided, Cloud Storage will only create the file if the value
514
- # matches the value calculated by the service. See
515
- # [Validation](https://cloud.google.com/storage/docs/hashes-etags)
516
- # for more information.
517
- # @param [String] md5 The MD5 hash of the file data. If provided, Cloud
518
- # Storage will only create the file if the value matches the value
519
- # calculated by the service. See
520
- # [Validation](https://cloud.google.com/storage/docs/hashes-etags) for
521
- # more information.
522
- # @param [Hash] metadata A hash of custom, user-provided web-safe keys and
523
- # arbitrary string values that will returned with requests for the file
524
- # as "x-goog-meta-" response headers.
525
- # @param [String] encryption_key Optional. A customer-supplied, AES-256
526
- # encryption key that will be used to encrypt the file. Must be provided
527
- # if `encryption_key_sha256` is provided.
528
- # @param [String] encryption_key_sha256 Optional. The SHA256 hash of the
529
- # customer-supplied, AES-256 encryption key that will be used to encrypt
530
- # the file. Must be provided if `encryption_key` is provided.
531
- #
532
- # @return [Gcloud::Storage::File]
533
- #
534
- # @example
535
- # require "gcloud"
536
- #
537
- # gcloud = Gcloud.new
538
- # storage = gcloud.storage
539
- #
540
- # bucket = storage.bucket "my-bucket"
541
- #
542
- # bucket.create_file "path/to/local.file.ext"
543
- #
544
- # @example Specifying a destination path:
545
- # require "gcloud"
546
- #
547
- # gcloud = Gcloud.new
548
- # storage = gcloud.storage
549
- #
550
- # bucket = storage.bucket "my-bucket"
551
- #
552
- # bucket.create_file "path/to/local.file.ext",
553
- # "destination/path/file.ext"
554
- #
555
- # @example Providing a customer-supplied encryption key:
556
- # require "gcloud"
557
- # require "digest/sha2"
558
- #
559
- # gcloud = Gcloud.new
560
- # storage = gcloud.storage
561
- # bucket = storage.bucket "my-bucket"
562
- #
563
- # # Key generation shown for example purposes only. Write your own.
564
- # cipher = OpenSSL::Cipher.new "aes-256-cfb"
565
- # cipher.encrypt
566
- # key = cipher.random_key
567
- # key_hash = Digest::SHA256.digest key
568
- #
569
- # bucket.create_file "path/to/local.file.ext",
570
- # "destination/path/file.ext",
571
- # encryption_key: key,
572
- # encryption_key_sha256: key_hash
573
- #
574
- # # Store your key and hash securely for later use.
575
- # file = bucket.file "destination/path/file.ext",
576
- # encryption_key: key,
577
- # encryption_key_sha256: key_hash
578
- #
579
- def create_file file, path = nil, acl: nil, cache_control: nil,
580
- content_disposition: nil, content_encoding: nil,
581
- content_language: nil, content_type: nil,
582
- crc32c: nil, md5: nil, metadata: nil, encryption_key: nil,
583
- encryption_key_sha256: nil
584
- ensure_service!
585
- options = { acl: File::Acl.predefined_rule_for(acl), md5: md5,
586
- cache_control: cache_control, content_type: content_type,
587
- content_disposition: content_disposition, crc32c: crc32c,
588
- content_encoding: content_encoding,
589
- content_language: content_language, metadata: metadata,
590
- key: encryption_key, key_sha256: encryption_key_sha256 }
591
- ensure_file_exists! file
592
- # TODO: Handle file as an IO and path is missing more gracefully
593
- path ||= Pathname(file).to_path
594
- gapi = service.insert_file name, file, path, options
595
- File.from_gapi gapi, service
596
- end
597
- alias_method :upload_file, :create_file
598
- alias_method :new_file, :create_file
599
-
600
- ##
601
- # The Bucket::Acl instance used to control access to the bucket.
602
- #
603
- # A bucket has owners, writers, and readers. Permissions can be granted to
604
- # an individual user's email address, a group's email address, as well as
605
- # many predefined lists.
606
- #
607
- # @see https://cloud.google.com/storage/docs/access-control Access Control
608
- # guide
609
- #
610
- # @example Grant access to a user by pre-pending `"user-"` to an email:
611
- # require "gcloud"
612
- #
613
- # gcloud = Gcloud.new
614
- # storage = gcloud.storage
615
- #
616
- # bucket = storage.bucket "my-todo-app"
617
- #
618
- # email = "heidi@example.net"
619
- # bucket.acl.add_reader "user-#{email}"
620
- #
621
- # @example Grant access to a group by pre-pending `"group-"` to an email:
622
- # require "gcloud"
623
- #
624
- # gcloud = Gcloud.new
625
- # storage = gcloud.storage
626
- #
627
- # bucket = storage.bucket "my-todo-app"
628
- #
629
- # email = "authors@example.net"
630
- # bucket.acl.add_reader "group-#{email}"
631
- #
632
- # @example Or, grant access via a predefined permissions list:
633
- # require "gcloud"
634
- #
635
- # gcloud = Gcloud.new
636
- # storage = gcloud.storage
637
- #
638
- # bucket = storage.bucket "my-todo-app"
639
- #
640
- # bucket.acl.public!
641
- #
642
- def acl
643
- @acl ||= Bucket::Acl.new self
644
- end
645
-
646
- ##
647
- # The Bucket::DefaultAcl instance used to control access to the bucket's
648
- # files.
649
- #
650
- # A bucket's files have owners, writers, and readers. Permissions can be
651
- # granted to an individual user's email address, a group's email address,
652
- # as well as many predefined lists.
653
- #
654
- # @see https://cloud.google.com/storage/docs/access-control Access Control
655
- # guide
656
- #
657
- # @example Grant access to a user by pre-pending `"user-"` to an email:
658
- # require "gcloud"
659
- #
660
- # gcloud = Gcloud.new
661
- # storage = gcloud.storage
662
- #
663
- # bucket = storage.bucket "my-todo-app"
664
- #
665
- # email = "heidi@example.net"
666
- # bucket.default_acl.add_reader "user-#{email}"
667
- #
668
- # @example Grant access to a group by pre-pending `"group-"` to an email
669
- # require "gcloud"
670
- #
671
- # gcloud = Gcloud.new
672
- # storage = gcloud.storage
673
- #
674
- # bucket = storage.bucket "my-todo-app"
675
- #
676
- # email = "authors@example.net"
677
- # bucket.default_acl.add_reader "group-#{email}"
678
- #
679
- # @example Or, grant access via a predefined permissions list:
680
- # require "gcloud"
681
- #
682
- # gcloud = Gcloud.new
683
- # storage = gcloud.storage
684
- #
685
- # bucket = storage.bucket "my-todo-app"
686
- #
687
- # bucket.default_acl.public!
688
- #
689
- def default_acl
690
- @default_acl ||= Bucket::DefaultAcl.new self
691
- end
692
-
693
- ##
694
- # Reloads the bucket with current data from the Storage service.
695
- def reload!
696
- ensure_service!
697
- @gapi = service.get_bucket name
698
- end
699
- alias_method :refresh!, :reload!
700
-
701
- ##
702
- # @private New Bucket from a Google API Client object.
703
- def self.from_gapi gapi, conn
704
- new.tap do |f|
705
- f.gapi = gapi
706
- f.service = conn
707
- end
708
- end
709
-
710
- protected
711
-
712
- ##
713
- # Raise an error unless an active service is available.
714
- def ensure_service!
715
- fail "Must have active connection" unless service
716
- end
717
-
718
- def patch_gapi! *attributes
719
- attributes.flatten!
720
- return if attributes.empty?
721
- ensure_service!
722
- patch_args = Hash[attributes.map do |attr|
723
- [attr, @gapi.send(attr)]
724
- end]
725
- patch_gapi = Google::Apis::StorageV1::Bucket.new patch_args
726
- @gapi = service.patch_bucket name, patch_gapi
727
- end
728
-
729
- ##
730
- # Raise an error if the file is not found.
731
- def ensure_file_exists! file
732
- return if ::File.file? file
733
- fail ArgumentError, "cannot find file #{file}"
734
- end
735
-
736
- ##
737
- # Yielded to a block to accumulate changes for a patch request.
738
- class Updater < Bucket
739
- attr_reader :updates
740
- ##
741
- # Create an Updater object.
742
- def initialize gapi
743
- @updates = []
744
- @gapi = gapi
745
- @cors_builder = nil
746
- end
747
-
748
- def cors
749
- # Same as Bucket#cors, but not frozen
750
- @cors_builder ||= Bucket::Cors.from_gapi @gapi.cors_configurations
751
- yield @cors_builder if block_given?
752
- @cors_builder
753
- end
754
-
755
- ##
756
- # @private Make sure any cors changes are saved
757
- def check_for_mutable_cors!
758
- return if @cors_builder.nil?
759
- return unless @cors_builder.changed?
760
- @gapi.cors_configurations = @cors_builder.to_gapi
761
- patch_gapi! :cors_configurations
762
- end
763
-
764
- protected
765
-
766
- ##
767
- # Queue up all the updates instead of making them.
768
- def patch_gapi! attribute
769
- @updates << attribute
770
- @updates.uniq!
771
- end
772
- end
773
- end
774
- end
775
- end