gcloud 0.7.2 → 0.8.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 +16 -0
- data/OVERVIEW.md +23 -18
- data/lib/gcloud.rb +41 -27
- data/lib/gcloud/datastore/credentials.rb +1 -1
- data/lib/gcloud/datastore/dataset.rb +2 -0
- data/lib/gcloud/datastore/transaction.rb +9 -2
- data/lib/gcloud/pubsub.rb +34 -0
- data/lib/gcloud/pubsub/service.rb +5 -0
- data/lib/gcloud/translate.rb +236 -0
- data/lib/gcloud/translate/api.rb +248 -0
- data/lib/gcloud/translate/connection.rb +76 -0
- data/lib/gcloud/translate/detection.rb +137 -0
- data/lib/gcloud/{search → translate}/errors.rb +7 -10
- data/lib/gcloud/translate/language.rb +69 -0
- data/lib/gcloud/translate/translation.rb +112 -0
- data/lib/gcloud/version.rb +1 -1
- metadata +9 -17
- data/lib/gcloud/search.rb +0 -318
- data/lib/gcloud/search/api_client.rb +0 -144
- data/lib/gcloud/search/connection.rb +0 -146
- data/lib/gcloud/search/credentials.rb +0 -30
- data/lib/gcloud/search/document.rb +0 -278
- data/lib/gcloud/search/document/list.rb +0 -85
- data/lib/gcloud/search/field_value.rb +0 -158
- data/lib/gcloud/search/field_values.rb +0 -233
- data/lib/gcloud/search/fields.rb +0 -246
- data/lib/gcloud/search/index.rb +0 -572
- data/lib/gcloud/search/index/list.rb +0 -90
- data/lib/gcloud/search/project.rb +0 -181
- data/lib/gcloud/search/result.rb +0 -165
- data/lib/gcloud/search/result/list.rb +0 -95
@@ -1,90 +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 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
|
-
# @private New Index::List from a response object.
|
66
|
-
def self.from_response resp, conn
|
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
|
@@ -1,181 +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 "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). See {Gcloud#search}.
|
32
|
-
#
|
33
|
-
# @example
|
34
|
-
# require "gcloud"
|
35
|
-
#
|
36
|
-
# gcloud = Gcloud.new
|
37
|
-
# search = gcloud.search
|
38
|
-
# index = search.index "books"
|
39
|
-
#
|
40
|
-
class Project
|
41
|
-
##
|
42
|
-
# @private The Connection object.
|
43
|
-
attr_accessor :connection
|
44
|
-
|
45
|
-
##
|
46
|
-
# @private Creates a new Connection instance.
|
47
|
-
#
|
48
|
-
# See Gcloud.search
|
49
|
-
def initialize project, credentials
|
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
|
-
# @return [String]
|
59
|
-
#
|
60
|
-
# @example
|
61
|
-
# require "gcloud"
|
62
|
-
#
|
63
|
-
# gcloud = Gcloud.new "my-project", "/path/to/keyfile.json"
|
64
|
-
# search = gcloud.search
|
65
|
-
#
|
66
|
-
# search.project #=> "my-project"
|
67
|
-
#
|
68
|
-
def project
|
69
|
-
connection.project
|
70
|
-
end
|
71
|
-
|
72
|
-
##
|
73
|
-
# @private Default project.
|
74
|
-
def self.default_project
|
75
|
-
ENV["SEARCH_PROJECT"] ||
|
76
|
-
ENV["GCLOUD_PROJECT"] ||
|
77
|
-
ENV["GOOGLE_CLOUD_PROJECT"] ||
|
78
|
-
Gcloud::GCE.project_id
|
79
|
-
end
|
80
|
-
|
81
|
-
##
|
82
|
-
# Retrieves an existing index by ID.
|
83
|
-
#
|
84
|
-
# @param [String] index_id The ID of an index.
|
85
|
-
# @param [Boolean] skip_lookup Optionally create an Index object without
|
86
|
-
# verifying the index resource exists on the Search service. Documents
|
87
|
-
# saved on this object will create the index resource if the resource
|
88
|
-
# does not yet exist. Default is `false`.
|
89
|
-
#
|
90
|
-
# @return [Gcloud::Search::Index, nil] nil if the index does not exist
|
91
|
-
#
|
92
|
-
# @example
|
93
|
-
# require "gcloud"
|
94
|
-
#
|
95
|
-
# gcloud = Gcloud.new
|
96
|
-
# search = gcloud.search
|
97
|
-
#
|
98
|
-
# index = search.index "books"
|
99
|
-
# index.index_id #=> "books"
|
100
|
-
#
|
101
|
-
# @example A new index can be created with `index_id` and `skip_lookup`:
|
102
|
-
# require "gcloud"
|
103
|
-
#
|
104
|
-
# gcloud = Gcloud.new
|
105
|
-
# search = gcloud.search
|
106
|
-
#
|
107
|
-
# index = search.index "more-books"
|
108
|
-
# index #=> nil
|
109
|
-
# index = search.index "more-books", skip_lookup: true
|
110
|
-
# index.index_id #=> "more-books"
|
111
|
-
#
|
112
|
-
def index index_id, skip_lookup: false
|
113
|
-
if skip_lookup
|
114
|
-
index_hash = { "indexId" => index_id, "projectId" => project }
|
115
|
-
return Gcloud::Search::Index.from_raw index_hash, connection
|
116
|
-
end
|
117
|
-
indexes(prefix: index_id).all.detect do |ix|
|
118
|
-
ix.index_id == index_id
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
##
|
123
|
-
# Retrieves the list of indexes belonging to the project.
|
124
|
-
#
|
125
|
-
# @param [String] prefix The prefix of the index name. It is used to list
|
126
|
-
# all indexes with names that have this prefix.
|
127
|
-
# @param [String] token A previously-returned page token representing part
|
128
|
-
# of the larger set of results to view.
|
129
|
-
# @param [Integer] max Maximum number of indexes to return. The default is
|
130
|
-
# `100`.
|
131
|
-
#
|
132
|
-
# @return [Array<Gcloud::Search::Index>] (See
|
133
|
-
# {Gcloud::Search::Index::List})
|
134
|
-
#
|
135
|
-
# @example
|
136
|
-
# require "gcloud"
|
137
|
-
#
|
138
|
-
# gcloud = Gcloud.new
|
139
|
-
# search = gcloud.search
|
140
|
-
#
|
141
|
-
# indexes = search.indexes
|
142
|
-
# indexes.each do |index|
|
143
|
-
# puts index.index_id
|
144
|
-
# end
|
145
|
-
#
|
146
|
-
# @example Using pagination: (See {Gcloud::Search::Index::List})
|
147
|
-
# require "gcloud"
|
148
|
-
#
|
149
|
-
# gcloud = Gcloud.new
|
150
|
-
# search = gcloud.search
|
151
|
-
#
|
152
|
-
# indexes = search.indexes
|
153
|
-
# loop do
|
154
|
-
# indexes.each do |index|
|
155
|
-
# puts index.index_id
|
156
|
-
# end
|
157
|
-
# break unless indexes.next?
|
158
|
-
# indexes = indexes.next
|
159
|
-
# end
|
160
|
-
#
|
161
|
-
def indexes prefix: nil, token: nil, max: nil
|
162
|
-
ensure_connection!
|
163
|
-
options = { prefix: prefix, token: token, max: max }
|
164
|
-
resp = connection.list_indexes options
|
165
|
-
if resp.success?
|
166
|
-
Index::List.from_response resp, connection
|
167
|
-
else
|
168
|
-
fail ApiError.from_response(resp)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
protected
|
173
|
-
|
174
|
-
##
|
175
|
-
# Raise an error unless an active connection is available.
|
176
|
-
def ensure_connection!
|
177
|
-
fail "Must have active connection" unless connection
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
data/lib/gcloud/search/result.rb
DELETED
@@ -1,165 +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 "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
|
-
# @private Creates a new Result instance.
|
28
|
-
def initialize
|
29
|
-
@fields = Fields.new
|
30
|
-
@raw = {}
|
31
|
-
end
|
32
|
-
|
33
|
-
##
|
34
|
-
# The unique identifier of the document referenced in the search result.
|
35
|
-
#
|
36
|
-
# @return [String]
|
37
|
-
def doc_id
|
38
|
-
@raw["docId"]
|
39
|
-
end
|
40
|
-
|
41
|
-
##
|
42
|
-
# The token for the next page of results.
|
43
|
-
#
|
44
|
-
# @return [String]
|
45
|
-
def token
|
46
|
-
@raw["nextPageToken"]
|
47
|
-
end
|
48
|
-
|
49
|
-
##
|
50
|
-
# Retrieve the field values associated to a field name.
|
51
|
-
#
|
52
|
-
# @param [String] name The name of the field. New values will be
|
53
|
-
# configured with this name.
|
54
|
-
#
|
55
|
-
# @return [FieldValue]
|
56
|
-
#
|
57
|
-
# @example
|
58
|
-
# require "gcloud"
|
59
|
-
#
|
60
|
-
# gcloud = Gcloud.new
|
61
|
-
# search = gcloud.search
|
62
|
-
# index = search.index "products"
|
63
|
-
#
|
64
|
-
# documents = index.search "best T-shirt ever"
|
65
|
-
# document = documents.first
|
66
|
-
# puts "The best match for your search is:"
|
67
|
-
# document["description"].each do |value|
|
68
|
-
# puts "* #{value} (#{value.type}) [#{value.lang}]"
|
69
|
-
# end
|
70
|
-
#
|
71
|
-
def [] name
|
72
|
-
@fields[name]
|
73
|
-
end
|
74
|
-
|
75
|
-
# Trivial accessor because we want .fields to be listed with methods.
|
76
|
-
|
77
|
-
##
|
78
|
-
# The fields in the search result. Each field has a name (String) and a
|
79
|
-
# list of values ({FieldValues}). (See {Fields})
|
80
|
-
def fields
|
81
|
-
@fields
|
82
|
-
end
|
83
|
-
|
84
|
-
##
|
85
|
-
# Calls block once for each field, passing the field name and values pair
|
86
|
-
# as parameters. If no block is given an enumerator is returned instead.
|
87
|
-
# (See {Fields#each})
|
88
|
-
#
|
89
|
-
# @example
|
90
|
-
# require "gcloud"
|
91
|
-
#
|
92
|
-
# gcloud = Gcloud.new
|
93
|
-
# search = gcloud.search
|
94
|
-
# index = search.index "products"
|
95
|
-
#
|
96
|
-
# documents = index.search "best T-shirt ever"
|
97
|
-
# document = documents.first
|
98
|
-
# puts "The best match for your search is:"
|
99
|
-
# document.each do |name, values|
|
100
|
-
# puts "* #{name}:"
|
101
|
-
# values.each do |value|
|
102
|
-
# puts " * #{value} (#{value.type})"
|
103
|
-
# end
|
104
|
-
# end
|
105
|
-
#
|
106
|
-
def each &block
|
107
|
-
@fields.each(&block)
|
108
|
-
end
|
109
|
-
|
110
|
-
##
|
111
|
-
# Returns a new array populated with all the field names.
|
112
|
-
# (See {Fields#names})
|
113
|
-
#
|
114
|
-
# @return [Array<String>]
|
115
|
-
#
|
116
|
-
# @example
|
117
|
-
# require "gcloud"
|
118
|
-
#
|
119
|
-
# gcloud = Gcloud.new
|
120
|
-
# search = gcloud.search
|
121
|
-
# index = search.index "products"
|
122
|
-
#
|
123
|
-
# documents = index.search "best T-shirt ever"
|
124
|
-
# document = documents.first
|
125
|
-
# puts "The best match has the following fields:"
|
126
|
-
# document.names.each do |name|
|
127
|
-
# puts "* #{name}:"
|
128
|
-
# end
|
129
|
-
#
|
130
|
-
def names
|
131
|
-
@fields.names
|
132
|
-
end
|
133
|
-
|
134
|
-
##
|
135
|
-
# @private Override to keep working in interactive shells manageable.
|
136
|
-
def inspect
|
137
|
-
insp_token = ""
|
138
|
-
if token
|
139
|
-
trunc_token = "#{token[0, 8]}...#{token[-5..-1]}"
|
140
|
-
trunc_token = token if token.length < 20
|
141
|
-
insp_token = ", token: #{trunc_token.inspect}"
|
142
|
-
end
|
143
|
-
insp_fields = ", fields: (#{fields.names.map(&:inspect).join ', '})"
|
144
|
-
"#{self.class}(doc_id: #{doc_id.inspect}#{insp_token}#{insp_fields})"
|
145
|
-
end
|
146
|
-
|
147
|
-
##
|
148
|
-
# @private New Result from a raw data object.
|
149
|
-
def self.from_hash hash
|
150
|
-
result = new
|
151
|
-
result.instance_variable_set "@raw", hash
|
152
|
-
result.instance_variable_set "@fields", Fields.from_raw(hash["fields"])
|
153
|
-
result
|
154
|
-
end
|
155
|
-
|
156
|
-
##
|
157
|
-
# @private Returns the Result data as a hash
|
158
|
-
def to_hash
|
159
|
-
hash = @raw.dup
|
160
|
-
hash["fields"] = @fields.to_raw
|
161
|
-
hash
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
@@ -1,95 +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 Search
|
18
|
-
class Result
|
19
|
-
##
|
20
|
-
# Result::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_reader :token
|
26
|
-
|
27
|
-
##
|
28
|
-
# The number of documents that match the query. It is greater than or
|
29
|
-
# equal to the number of documents actually returned. This is an
|
30
|
-
# approximation and not an exact count unless it is less than or equal
|
31
|
-
# to the {Index#search} `matched_count_accuracy` option.
|
32
|
-
attr_reader :matched_count
|
33
|
-
|
34
|
-
##
|
35
|
-
# Create a new Result::List with an array of {Result} instances.
|
36
|
-
def initialize arr = []
|
37
|
-
super arr
|
38
|
-
end
|
39
|
-
|
40
|
-
##
|
41
|
-
# Whether there a next page of results.
|
42
|
-
def next?
|
43
|
-
!token.nil?
|
44
|
-
end
|
45
|
-
|
46
|
-
##
|
47
|
-
# Retrieve the next page of results.
|
48
|
-
def next
|
49
|
-
return nil unless next?
|
50
|
-
ensure_index!
|
51
|
-
@index.search @query, @search_options.merge(token: token)
|
52
|
-
end
|
53
|
-
|
54
|
-
##
|
55
|
-
# Retrieves all results by repeatedly loading pages until {#next?}
|
56
|
-
# returns false. Returns the list instance for method chaining.
|
57
|
-
def all
|
58
|
-
while next?
|
59
|
-
next_results = self.next
|
60
|
-
push(*next_results)
|
61
|
-
self.token = next_results.token
|
62
|
-
end
|
63
|
-
self
|
64
|
-
end
|
65
|
-
|
66
|
-
##
|
67
|
-
# @private New Result::List from a response object.
|
68
|
-
def self.from_response resp, index, query, search_options
|
69
|
-
data = JSON.parse resp.body
|
70
|
-
results = new(Array(data["results"]).map do |raw|
|
71
|
-
Result.from_hash raw
|
72
|
-
end)
|
73
|
-
results.instance_eval do
|
74
|
-
@token = data["results"].last["nextPageToken"]
|
75
|
-
@matched_count = data["matchedCount"]
|
76
|
-
@index = index
|
77
|
-
@query = query
|
78
|
-
@search_options = search_options
|
79
|
-
end
|
80
|
-
results
|
81
|
-
rescue JSON::ParserError
|
82
|
-
ApiError.from_response_status resp
|
83
|
-
end
|
84
|
-
|
85
|
-
protected
|
86
|
-
|
87
|
-
##
|
88
|
-
# Raise an error unless an active connection is available.
|
89
|
-
def ensure_index!
|
90
|
-
fail "Must have active connection" unless @index
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|