gcloud 0.5.0 → 0.6.0
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 +8 -8
- data/CHANGELOG.md +8 -0
- data/lib/gcloud.rb +48 -30
- data/lib/gcloud/bigquery.rb +4 -6
- data/lib/gcloud/bigquery/connection.rb +2 -14
- data/lib/gcloud/bigquery/dataset.rb +41 -42
- data/lib/gcloud/bigquery/project.rb +50 -46
- data/lib/gcloud/bigquery/query_job.rb +7 -8
- data/lib/gcloud/bigquery/table.rb +54 -55
- data/lib/gcloud/bigquery/table/schema.rb +30 -40
- data/lib/gcloud/bigquery/view.rb +10 -11
- data/lib/gcloud/credentials.rb +19 -25
- data/lib/gcloud/datastore.rb +4 -6
- data/lib/gcloud/datastore/dataset.rb +3 -5
- data/lib/gcloud/dns.rb +4 -6
- data/lib/gcloud/dns/connection.rb +17 -16
- data/lib/gcloud/dns/importer.rb +5 -11
- data/lib/gcloud/dns/project.rb +11 -12
- data/lib/gcloud/dns/zone.rb +52 -92
- data/lib/gcloud/dns/zone/transaction.rb +2 -2
- data/lib/gcloud/pubsub.rb +4 -6
- data/lib/gcloud/pubsub/connection.rb +1 -12
- data/lib/gcloud/pubsub/project.rb +30 -36
- data/lib/gcloud/pubsub/subscription.rb +18 -26
- data/lib/gcloud/pubsub/topic.rb +16 -26
- data/lib/gcloud/resource_manager.rb +5 -6
- data/lib/gcloud/resource_manager/connection.rb +4 -4
- data/lib/gcloud/resource_manager/manager.rb +10 -14
- data/lib/gcloud/resource_manager/project.rb +3 -5
- data/lib/gcloud/search.rb +295 -0
- data/lib/gcloud/search/api_client.rb +144 -0
- data/lib/gcloud/search/connection.rb +146 -0
- data/lib/gcloud/search/credentials.rb +30 -0
- data/lib/gcloud/search/document.rb +301 -0
- data/lib/gcloud/search/document/list.rb +85 -0
- data/lib/gcloud/search/errors.rb +67 -0
- data/lib/gcloud/search/field_value.rb +164 -0
- data/lib/gcloud/search/field_values.rb +263 -0
- data/lib/gcloud/search/fields.rb +267 -0
- data/lib/gcloud/search/index.rb +613 -0
- data/lib/gcloud/search/index/list.rb +90 -0
- data/lib/gcloud/search/project.rb +197 -0
- data/lib/gcloud/search/result.rb +169 -0
- data/lib/gcloud/search/result/list.rb +95 -0
- data/lib/gcloud/storage.rb +4 -6
- data/lib/gcloud/storage/bucket.rb +55 -43
- data/lib/gcloud/storage/bucket/cors.rb +5 -7
- data/lib/gcloud/storage/file.rb +35 -30
- data/lib/gcloud/storage/file/acl.rb +12 -16
- data/lib/gcloud/storage/project.rb +56 -22
- data/lib/gcloud/version.rb +1 -1
- metadata +20 -3
@@ -0,0 +1,90 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2015 Google Inc. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module Gcloud
|
17
|
+
module Search
|
18
|
+
class Index
|
19
|
+
##
|
20
|
+
# Index::List is a special case Array with additional values.
|
21
|
+
class List < DelegateClass(::Array)
|
22
|
+
##
|
23
|
+
# If not empty, indicates that there are more records that match
|
24
|
+
# the request and this value should be passed to continue.
|
25
|
+
attr_accessor :token
|
26
|
+
|
27
|
+
##
|
28
|
+
# Create a new Index::List with an array of Index instances.
|
29
|
+
def initialize arr = []
|
30
|
+
super arr
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Whether there a next page of indexes.
|
35
|
+
def next?
|
36
|
+
!token.nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Retrieve the next page of indexes.
|
41
|
+
def next
|
42
|
+
return nil unless next?
|
43
|
+
ensure_connection!
|
44
|
+
resp = @connection.list_indexes token: token
|
45
|
+
if resp.success?
|
46
|
+
Index::List.from_response resp, @connection
|
47
|
+
else
|
48
|
+
fail ApiError.from_response(resp)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Retrieves all indexes by repeatedly loading pages until #next?
|
54
|
+
# returns false. Returns the list instance for method chaining.
|
55
|
+
def all
|
56
|
+
while next?
|
57
|
+
next_indexes = self.next
|
58
|
+
push(*next_indexes)
|
59
|
+
self.token = next_indexes.token
|
60
|
+
end
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# New Indexs::List from a response object.
|
66
|
+
def self.from_response resp, conn #:nodoc:
|
67
|
+
data = JSON.parse resp.body
|
68
|
+
indexes = new(Array(data["indexes"]).map do |raw_index|
|
69
|
+
Index.from_raw raw_index, conn
|
70
|
+
end)
|
71
|
+
indexes.instance_eval do
|
72
|
+
@token = data["nextPageToken"]
|
73
|
+
@connection = conn
|
74
|
+
end
|
75
|
+
indexes
|
76
|
+
rescue JSON::ParserError
|
77
|
+
raise ApiError.from_response(resp)
|
78
|
+
end
|
79
|
+
|
80
|
+
protected
|
81
|
+
|
82
|
+
##
|
83
|
+
# Raise an error unless an active connection is available.
|
84
|
+
def ensure_connection!
|
85
|
+
fail "Must have active connection" unless @connection
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2015 Google Inc. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require "gcloud/gce"
|
17
|
+
require "gcloud/search/connection"
|
18
|
+
require "gcloud/search/credentials"
|
19
|
+
require "gcloud/search/index"
|
20
|
+
require "gcloud/search/errors"
|
21
|
+
|
22
|
+
module Gcloud
|
23
|
+
module Search
|
24
|
+
##
|
25
|
+
# = Project
|
26
|
+
#
|
27
|
+
# Projects are top-level containers in Google Cloud Platform. They store
|
28
|
+
# information about billing and authorized users, and they control access to
|
29
|
+
# Google Cloud Search resources. Each project has a friendly name and a
|
30
|
+
# unique ID. Projects can be created only in the {Google Developers
|
31
|
+
# Console}[https://console.developers.google.com].
|
32
|
+
#
|
33
|
+
# require "gcloud"
|
34
|
+
#
|
35
|
+
# gcloud = Gcloud.new
|
36
|
+
# search = gcloud.search
|
37
|
+
# index = search.index "books"
|
38
|
+
#
|
39
|
+
# See Gcloud#search
|
40
|
+
class Project
|
41
|
+
##
|
42
|
+
# The Connection object.
|
43
|
+
attr_accessor :connection #:nodoc:
|
44
|
+
|
45
|
+
##
|
46
|
+
# Creates a new Connection instance.
|
47
|
+
#
|
48
|
+
# See Gcloud.search
|
49
|
+
def initialize project, credentials #:nodoc:
|
50
|
+
project = project.to_s # Always cast to a string
|
51
|
+
fail ArgumentError, "project is missing" if project.empty?
|
52
|
+
@connection = Connection.new project, credentials
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# The ID of the current project.
|
57
|
+
#
|
58
|
+
# === Example
|
59
|
+
#
|
60
|
+
# require "gcloud"
|
61
|
+
#
|
62
|
+
# gcloud = Gcloud.new "my-project", "/path/to/keyfile.json"
|
63
|
+
# search = gcloud.search
|
64
|
+
#
|
65
|
+
# search.project #=> "my-project"
|
66
|
+
#
|
67
|
+
def project
|
68
|
+
connection.project
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Default project.
|
73
|
+
def self.default_project #:nodoc:
|
74
|
+
ENV["SEARCH_PROJECT"] ||
|
75
|
+
ENV["GCLOUD_PROJECT"] ||
|
76
|
+
ENV["GOOGLE_CLOUD_PROJECT"] ||
|
77
|
+
Gcloud::GCE.project_id
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Retrieves an existing index by ID.
|
82
|
+
#
|
83
|
+
# === Parameters
|
84
|
+
#
|
85
|
+
# +index_id+::
|
86
|
+
# The ID of an index. (+String+)
|
87
|
+
# +skip_lookup+::
|
88
|
+
# Optionally create an Index object without verifying the index resource
|
89
|
+
# exists on the Search service. Documents saved on this object will
|
90
|
+
# create the index resource if the resource does not yet exist. Default
|
91
|
+
# is +false+. (+Boolean+)
|
92
|
+
#
|
93
|
+
# === Returns
|
94
|
+
#
|
95
|
+
# Gcloud::Search::Index or nil if the index does not exist
|
96
|
+
#
|
97
|
+
# === Examples
|
98
|
+
#
|
99
|
+
# require "gcloud"
|
100
|
+
#
|
101
|
+
# gcloud = Gcloud.new
|
102
|
+
# search = gcloud.search
|
103
|
+
#
|
104
|
+
# index = search.index "books"
|
105
|
+
# index.index_id #=> "books"
|
106
|
+
#
|
107
|
+
# A new index can be created by providing the desired +index_id+ and the
|
108
|
+
# +skip_lookup+ option:
|
109
|
+
#
|
110
|
+
# require "gcloud"
|
111
|
+
#
|
112
|
+
# gcloud = Gcloud.new
|
113
|
+
# search = gcloud.search
|
114
|
+
#
|
115
|
+
# index = search.index "more-books"
|
116
|
+
# index #=> nil
|
117
|
+
# index = search.index "more-books", skip_lookup: true
|
118
|
+
# index.index_id #=> "more-books"
|
119
|
+
#
|
120
|
+
def index index_id, skip_lookup: false
|
121
|
+
if skip_lookup
|
122
|
+
index_hash = { "indexId" => index_id, "projectId" => project }
|
123
|
+
return Gcloud::Search::Index.from_raw index_hash, connection
|
124
|
+
end
|
125
|
+
indexes(prefix: index_id).all.detect do |ix|
|
126
|
+
ix.index_id == index_id
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
##
|
131
|
+
# Retrieves the list of indexes belonging to the project.
|
132
|
+
#
|
133
|
+
# === Parameters
|
134
|
+
#
|
135
|
+
# +prefix+::
|
136
|
+
# The prefix of the index name. It is used to list all indexes with
|
137
|
+
# names that have this prefix. (+String+)
|
138
|
+
# +token+::
|
139
|
+
# A previously-returned page token representing part of the larger set
|
140
|
+
# of results to view. (+String+)
|
141
|
+
# +max+::
|
142
|
+
# Maximum number of indexes to return. The default is +100+. (+Integer+)
|
143
|
+
#
|
144
|
+
# === Returns
|
145
|
+
#
|
146
|
+
# Array of Gcloud::Search::Index (See Gcloud::Search::Index::List)
|
147
|
+
#
|
148
|
+
# === Examples
|
149
|
+
#
|
150
|
+
# require "gcloud"
|
151
|
+
#
|
152
|
+
# gcloud = Gcloud.new
|
153
|
+
# search = gcloud.search
|
154
|
+
#
|
155
|
+
# indexes = search.indexes
|
156
|
+
# indexes.each do |index|
|
157
|
+
# puts index.index_id
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# If you have a significant number of indexes, you may need to paginate
|
161
|
+
# through them: (See Gcloud::Search::Index::List)
|
162
|
+
#
|
163
|
+
# require "gcloud"
|
164
|
+
#
|
165
|
+
# gcloud = Gcloud.new
|
166
|
+
# search = gcloud.search
|
167
|
+
#
|
168
|
+
# indexes = search.indexes
|
169
|
+
# loop do
|
170
|
+
# indexes.each do |index|
|
171
|
+
# puts index.index_id
|
172
|
+
# end
|
173
|
+
# break unless indexes.next?
|
174
|
+
# indexes = indexes.next
|
175
|
+
# end
|
176
|
+
#
|
177
|
+
def indexes prefix: nil, token: nil, max: nil
|
178
|
+
ensure_connection!
|
179
|
+
options = { prefix: prefix, token: token, max: max }
|
180
|
+
resp = connection.list_indexes options
|
181
|
+
if resp.success?
|
182
|
+
Index::List.from_response resp, connection
|
183
|
+
else
|
184
|
+
fail ApiError.from_response(resp)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
protected
|
189
|
+
|
190
|
+
##
|
191
|
+
# Raise an error unless an active connection is available.
|
192
|
+
def ensure_connection!
|
193
|
+
fail "Must have active connection" unless connection
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2015 Google Inc. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require "gcloud/search/result/list"
|
17
|
+
require "gcloud/search/fields"
|
18
|
+
|
19
|
+
module Gcloud
|
20
|
+
module Search
|
21
|
+
##
|
22
|
+
# = Result
|
23
|
+
#
|
24
|
+
# See Gcloud#search
|
25
|
+
class Result
|
26
|
+
##
|
27
|
+
# Creates a new Result instance.
|
28
|
+
def initialize #:nodoc:
|
29
|
+
@fields = Fields.new
|
30
|
+
@raw = {}
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# The unique identifier of the document referenced in the search result.
|
35
|
+
def doc_id
|
36
|
+
@raw["docId"]
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# The token for the next page of results.
|
41
|
+
def token
|
42
|
+
@raw["nextPageToken"]
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Retrieve the field values associated to a field name.
|
47
|
+
#
|
48
|
+
# === Parameters
|
49
|
+
#
|
50
|
+
# +name+::
|
51
|
+
# The name of the field. New values will be configured with this name.
|
52
|
+
# (+String+)
|
53
|
+
#
|
54
|
+
# === Returns
|
55
|
+
#
|
56
|
+
# FieldValue
|
57
|
+
#
|
58
|
+
# === Example
|
59
|
+
#
|
60
|
+
# require "gcloud"
|
61
|
+
#
|
62
|
+
# gcloud = Gcloud.new
|
63
|
+
# search = gcloud.search
|
64
|
+
# index = search.index "products"
|
65
|
+
#
|
66
|
+
# documents = index.search "best T-shirt ever"
|
67
|
+
# document = documents.first
|
68
|
+
# puts "The best match for your search is:"
|
69
|
+
# document["description"].each do |value|
|
70
|
+
# puts "* #{value} (#{value.type}) [#{value.lang}]"
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
def [] name
|
74
|
+
@fields[name]
|
75
|
+
end
|
76
|
+
|
77
|
+
# rubocop:disable Style/TrivialAccessors
|
78
|
+
# Disable rubocop because we want .fields to be listed with the other
|
79
|
+
# methods on the class.
|
80
|
+
|
81
|
+
##
|
82
|
+
# The fields in the search result. Each field has a name (String) and a
|
83
|
+
# list of values (FieldValues). (See Fields)
|
84
|
+
def fields
|
85
|
+
@fields
|
86
|
+
end
|
87
|
+
|
88
|
+
# rubocop:enable Style/TrivialAccessors
|
89
|
+
|
90
|
+
##
|
91
|
+
# Calls block once for each field, passing the field name and values pair
|
92
|
+
# as parameters. If no block is given an enumerator is returned instead.
|
93
|
+
# (See Fields#each)
|
94
|
+
#
|
95
|
+
# === Example
|
96
|
+
#
|
97
|
+
# require "gcloud"
|
98
|
+
#
|
99
|
+
# gcloud = Gcloud.new
|
100
|
+
# search = gcloud.search
|
101
|
+
# index = search.index "products"
|
102
|
+
#
|
103
|
+
# documents = index.search "best T-shirt ever"
|
104
|
+
# document = documents.first
|
105
|
+
# puts "The best match for your search is:"
|
106
|
+
# document.each do |name, values|
|
107
|
+
# puts "* #{name}:"
|
108
|
+
# values.each do |value|
|
109
|
+
# puts " * #{value} (#{value.type})"
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
def each &block
|
114
|
+
@fields.each(&block)
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Returns a new array populated with all the field names.
|
119
|
+
# (See Fields#names)
|
120
|
+
#
|
121
|
+
# require "gcloud"
|
122
|
+
#
|
123
|
+
# gcloud = Gcloud.new
|
124
|
+
# search = gcloud.search
|
125
|
+
# index = search.index "products"
|
126
|
+
#
|
127
|
+
# documents = index.search "best T-shirt ever"
|
128
|
+
# document = documents.first
|
129
|
+
# puts "The best match has the following fields:"
|
130
|
+
# document.names.each do |name|
|
131
|
+
# puts "* #{name}:"
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
def names
|
135
|
+
@fields.names
|
136
|
+
end
|
137
|
+
|
138
|
+
##
|
139
|
+
# Override to keep working in interactive shells manageable.
|
140
|
+
def inspect #:nodoc:
|
141
|
+
insp_token = ""
|
142
|
+
if token
|
143
|
+
trunc_token = "#{token[0, 8]}...#{token[-5..-1]}"
|
144
|
+
trunc_token = token if token.length < 20
|
145
|
+
insp_token = ", token: #{trunc_token.inspect}"
|
146
|
+
end
|
147
|
+
insp_fields = ", fields: (#{fields.names.map(&:inspect).join ', '})"
|
148
|
+
"#{self.class}(doc_id: #{doc_id.inspect}#{insp_token}#{insp_fields})"
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# New Result from a raw data object.
|
153
|
+
def self.from_hash hash #:nodoc:
|
154
|
+
result = new
|
155
|
+
result.instance_variable_set "@raw", hash
|
156
|
+
result.instance_variable_set "@fields", Fields.from_raw(hash["fields"])
|
157
|
+
result
|
158
|
+
end
|
159
|
+
|
160
|
+
##
|
161
|
+
# Returns the Result data as a hash
|
162
|
+
def to_hash #:nodoc:
|
163
|
+
hash = @raw.dup
|
164
|
+
hash["fields"] = @fields.to_raw
|
165
|
+
hash
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|