gcloud 0.9.0 → 0.10.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 +17 -0
- data/OVERVIEW.md +18 -0
- data/lib/gcloud.rb +38 -0
- data/lib/gcloud/bigquery/table.rb +14 -15
- data/lib/gcloud/datastore/dataset/query_results.rb +5 -6
- data/lib/gcloud/storage/bucket.rb +2 -1
- data/lib/gcloud/storage/connection.rb +4 -14
- data/lib/gcloud/upload.rb +47 -3
- data/lib/gcloud/version.rb +1 -1
- data/lib/gcloud/vision.rb +488 -0
- data/lib/gcloud/vision/annotate.rb +221 -0
- data/lib/gcloud/vision/annotation.rb +455 -0
- data/lib/gcloud/vision/annotation/entity.rb +234 -0
- data/lib/gcloud/vision/annotation/face.rb +1750 -0
- data/lib/gcloud/vision/annotation/properties.rb +245 -0
- data/lib/gcloud/vision/annotation/safe_search.rb +161 -0
- data/lib/gcloud/vision/annotation/text.rb +236 -0
- data/lib/gcloud/vision/annotation/vertex.rb +108 -0
- data/lib/gcloud/vision/connection.rb +54 -0
- data/lib/gcloud/vision/credentials.rb +29 -0
- data/lib/gcloud/vision/errors.rb +69 -0
- data/lib/gcloud/vision/image.rb +593 -0
- data/lib/gcloud/vision/location.rb +112 -0
- data/lib/gcloud/vision/project.rb +280 -0
- metadata +21 -6
@@ -0,0 +1,112 @@
|
|
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
|
+
module Gcloud
|
17
|
+
module Vision
|
18
|
+
##
|
19
|
+
# # Location
|
20
|
+
#
|
21
|
+
# A latitude/longitude pair with values conforming to the [WGS84
|
22
|
+
# standard](http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf).
|
23
|
+
#
|
24
|
+
# @attr [Float] latitude The degrees latitude conforming to the [WGS84
|
25
|
+
# standard](http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf).
|
26
|
+
# @attr [Float] longitude The degrees longitude conforming to the [WGS84
|
27
|
+
# standard](http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf).
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
# require "gcloud"
|
31
|
+
#
|
32
|
+
# gcloud = Gcloud.new
|
33
|
+
# vision = gcloud.vision
|
34
|
+
#
|
35
|
+
# image = vision.image "path/to/landmark.jpg"
|
36
|
+
# entity = image.landmark
|
37
|
+
#
|
38
|
+
# location = entity.locations.first
|
39
|
+
#
|
40
|
+
# location.latitude #=> 43.878264
|
41
|
+
# location.longitude #=> -103.45700740814209
|
42
|
+
#
|
43
|
+
class Location
|
44
|
+
attr_accessor :latitude, :longitude
|
45
|
+
|
46
|
+
##
|
47
|
+
# @private Creates a new Location instance.
|
48
|
+
def initialize latitude, longitude
|
49
|
+
@latitude = latitude
|
50
|
+
@longitude = longitude
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Returns the object's property values as an array.
|
55
|
+
#
|
56
|
+
# @return [Array]
|
57
|
+
#
|
58
|
+
def to_a
|
59
|
+
to_ary
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Returns the object's property values as an array.
|
64
|
+
#
|
65
|
+
# @return [Array]
|
66
|
+
#
|
67
|
+
def to_ary
|
68
|
+
[latitude, longitude]
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Converts object to a hash. All keys will be symbolized.
|
73
|
+
#
|
74
|
+
# @return [Hash]
|
75
|
+
#
|
76
|
+
def to_h
|
77
|
+
to_hash
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Converts object to a hash. All keys will be symbolized.
|
82
|
+
#
|
83
|
+
# @return [Hash]
|
84
|
+
#
|
85
|
+
def to_hash
|
86
|
+
{ latitude: latitude, longitude: longitude }
|
87
|
+
end
|
88
|
+
|
89
|
+
# @private
|
90
|
+
def to_s
|
91
|
+
"(latitude: #{latitude.inspect}, longitude: #{longitude.inspect})"
|
92
|
+
end
|
93
|
+
|
94
|
+
# @private
|
95
|
+
def inspect
|
96
|
+
"#<#{self.class.name} #{self}>"
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# @private New Google API Client LatLng object.
|
101
|
+
def to_gapi
|
102
|
+
to_hash
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# @private New Location from a Google API Client LatLng object.
|
107
|
+
def self.from_gapi gapi
|
108
|
+
new gapi["latitude"], gapi["longitude"]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,280 @@
|
|
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/gce"
|
17
|
+
require "gcloud/vision/connection"
|
18
|
+
require "gcloud/vision/credentials"
|
19
|
+
require "gcloud/vision/annotate"
|
20
|
+
require "gcloud/vision/image"
|
21
|
+
require "gcloud/vision/annotation"
|
22
|
+
require "gcloud/vision/errors"
|
23
|
+
|
24
|
+
module Gcloud
|
25
|
+
module Vision
|
26
|
+
##
|
27
|
+
# # Project
|
28
|
+
#
|
29
|
+
# Google Cloud Vision allows easy integration of vision detection features
|
30
|
+
# within developer applications, including image labeling, face and landmark
|
31
|
+
# detection, optical character recognition (OCR), and tagging of explicit
|
32
|
+
# content.
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# require "gcloud"
|
36
|
+
#
|
37
|
+
# gcloud = Gcloud.new
|
38
|
+
# vision = gcloud.vision
|
39
|
+
#
|
40
|
+
# image = vision.image "path/to/landmark.jpg"
|
41
|
+
#
|
42
|
+
# annotation = vision.annotate image, labels: true
|
43
|
+
#
|
44
|
+
# annotation.labels.map &:description
|
45
|
+
# #=> ["stone carving", "ancient history", "statue", "sculpture",
|
46
|
+
# #=> "monument", "landmark"]
|
47
|
+
#
|
48
|
+
# See Gcloud#vision
|
49
|
+
class Project
|
50
|
+
##
|
51
|
+
# @private The Connection object.
|
52
|
+
attr_accessor :connection
|
53
|
+
|
54
|
+
##
|
55
|
+
# @private Creates a new Project instance.
|
56
|
+
def initialize project, credentials
|
57
|
+
project = project.to_s # Always cast to a string
|
58
|
+
fail ArgumentError, "project is missing" if project.empty?
|
59
|
+
@connection = Connection.new project, credentials
|
60
|
+
end
|
61
|
+
|
62
|
+
# The Vision project connected to.
|
63
|
+
#
|
64
|
+
# @example
|
65
|
+
# require "gcloud"
|
66
|
+
#
|
67
|
+
# gcloud = Gcloud.new "my-todo-project",
|
68
|
+
# "/path/to/keyfile.json"
|
69
|
+
# vision = gcloud.vision
|
70
|
+
#
|
71
|
+
# vision.project #=> "my-todo-project"
|
72
|
+
#
|
73
|
+
def project
|
74
|
+
connection.project
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# @private Default project.
|
79
|
+
def self.default_project
|
80
|
+
ENV["VISION_PROJECT"] ||
|
81
|
+
ENV["GCLOUD_PROJECT"] ||
|
82
|
+
ENV["GOOGLE_CLOUD_PROJECT"] ||
|
83
|
+
Gcloud::GCE.project_id
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Returns a new image from the given source.
|
88
|
+
#
|
89
|
+
# Cloud Vision sets upper limits on file size as well as on the total
|
90
|
+
# combined size of all images in a request. Reducing your file size can
|
91
|
+
# significantly improve throughput; however, be careful not to reduce
|
92
|
+
# image quality in the process. See [Best Practices - Image
|
93
|
+
# Sizing](https://cloud.google.com/vision/docs/image-best-practices#image_sizing)
|
94
|
+
# for current file size limits.
|
95
|
+
#
|
96
|
+
# Note that an object in Google Cloud Storage is a single entity;
|
97
|
+
# permissions affect only that object. "Directory permissions" do not
|
98
|
+
# exist (though default bucket permissions do exist). Make sure the code
|
99
|
+
# which performs your request has access to that image.
|
100
|
+
#
|
101
|
+
# @see https://cloud.google.com/vision/docs/image-best-practices Best
|
102
|
+
# Practices
|
103
|
+
#
|
104
|
+
# @param [String, IO, StringIO, Tempfile, Gcloud::Storage::File] source A
|
105
|
+
# string file path or Cloud Storage URI of the form
|
106
|
+
# `"gs://bucketname/path/to/image_filename"`; or a File, IO, StringIO,
|
107
|
+
# or Tempfile instance; or an instance of Gcloud::Storage::File.
|
108
|
+
#
|
109
|
+
# @return [Image] An image for the Vision service.
|
110
|
+
#
|
111
|
+
# @example With a Google Cloud Storage URI:
|
112
|
+
# require "gcloud"
|
113
|
+
#
|
114
|
+
# gcloud = Gcloud.new
|
115
|
+
# vision = gcloud.vision
|
116
|
+
#
|
117
|
+
# image = vision.image "gs://bucket-name/path_to_image_object"
|
118
|
+
#
|
119
|
+
# @example With a local file path:
|
120
|
+
# require "gcloud"
|
121
|
+
#
|
122
|
+
# gcloud = Gcloud.new
|
123
|
+
# vision = gcloud.vision
|
124
|
+
#
|
125
|
+
# image = vision.image "path/to/landmark.jpg"
|
126
|
+
#
|
127
|
+
def image source
|
128
|
+
return source if source.is_a? Image
|
129
|
+
Image.from_source source, self
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Performs detection of Cloud Vision [features](https://cloud.google.com/vision/reference/rest/v1/images/annotate#Feature)
|
134
|
+
# on the given image(s). If no options for features are provided, **all**
|
135
|
+
# image detection features will be performed, with a default of `10`
|
136
|
+
# results for faces, landmarks, logos, and labels. If any feature option
|
137
|
+
# is provided, only the specified feature detections will be performed.
|
138
|
+
# Please review [Pricing](https://cloud.google.com/vision/docs/pricing)
|
139
|
+
# before use, as a separate charge is incurred for each feature performed
|
140
|
+
# on an image.
|
141
|
+
#
|
142
|
+
# Cloud Vision sets upper limits on file size as well as on the total
|
143
|
+
# combined size of all images in a request. Reducing your file size can
|
144
|
+
# significantly improve throughput; however, be careful not to reduce
|
145
|
+
# image quality in the process. See [Best Practices - Image
|
146
|
+
# Sizing](https://cloud.google.com/vision/docs/image-best-practices#image_sizing)
|
147
|
+
# for current file size limits.
|
148
|
+
#
|
149
|
+
# @see https://cloud.google.com/vision/docs/requests-and-responses Cloud
|
150
|
+
# Vision API Requests and Responses
|
151
|
+
# @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#AnnotateImageRequest
|
152
|
+
# AnnotateImageRequest
|
153
|
+
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
154
|
+
#
|
155
|
+
# @param [Image, Object] images The image or images to annotate. This can
|
156
|
+
# be an {Image} instance, or any other type that converts to an {Image}.
|
157
|
+
# See {#image} for details.
|
158
|
+
# @param [Boolean, Integer] faces Whether to perform the facial detection
|
159
|
+
# feature. The maximum number of results is configured in
|
160
|
+
# {Gcloud::Vision.default_max_faces}, or may be provided here. Optional.
|
161
|
+
# @param [Boolean, Integer] landmarks Whether to perform the landmark
|
162
|
+
# detection feature. The maximum number of results is configured in
|
163
|
+
# {Gcloud::Vision.default_max_landmarks}, or may be provided here.
|
164
|
+
# Optional.
|
165
|
+
# @param [Boolean, Integer] logos Whether to perform the logo detection
|
166
|
+
# feature. The maximum number of results is configured in
|
167
|
+
# {Gcloud::Vision.default_max_logos}, or may be provided here. Optional.
|
168
|
+
# @param [Boolean, Integer] labels Whether to perform the label detection
|
169
|
+
# feature. The maximum number of results is configured in
|
170
|
+
# {Gcloud::Vision.default_max_labels}, or may be provided here.
|
171
|
+
# Optional.
|
172
|
+
# @param [Boolean] text Whether to perform the text (OCR) feature.
|
173
|
+
# Optional.
|
174
|
+
# @param [Boolean] safe_search Whether to perform the safe search feature.
|
175
|
+
# Optional.
|
176
|
+
# @param [Boolean] properties Whether to perform the image properties
|
177
|
+
# feature (currently, the image's dominant colors.) Optional.
|
178
|
+
#
|
179
|
+
# @yield [annotate] A block for requests that involve multiple feature
|
180
|
+
# configurations. See {Annotate#annotate}.
|
181
|
+
# @yieldparam [Annotate] annotate the Annotate object
|
182
|
+
#
|
183
|
+
# @return [Annotation, Array<Annotation>] The results for all image
|
184
|
+
# detections, returned as a single {Annotation} instance for one image,
|
185
|
+
# or as an array of {Annotation} instances, one per image, for multiple
|
186
|
+
# images.
|
187
|
+
#
|
188
|
+
# @example With a single image:
|
189
|
+
# require "gcloud"
|
190
|
+
#
|
191
|
+
# gcloud = Gcloud.new
|
192
|
+
# vision = gcloud.vision
|
193
|
+
#
|
194
|
+
# image = vision.image "path/to/landmark.jpg"
|
195
|
+
#
|
196
|
+
# annotation = vision.annotate image, labels: true
|
197
|
+
#
|
198
|
+
# annotation.labels.map &:description
|
199
|
+
# #=> ["stone carving", "ancient history", "statue", "sculpture",
|
200
|
+
# #=> "monument", "landmark"]
|
201
|
+
#
|
202
|
+
# @example With multiple images:
|
203
|
+
# require "gcloud"
|
204
|
+
#
|
205
|
+
# gcloud = Gcloud.new
|
206
|
+
# vision = gcloud.vision
|
207
|
+
#
|
208
|
+
# face_image = vision.image "path/to/face.jpg"
|
209
|
+
# landmark_image = vision.image "path/to/landmark.jpg"
|
210
|
+
#
|
211
|
+
# annotations = vision.annotate face_image, landmark_image, labels: true
|
212
|
+
#
|
213
|
+
# annotations[0].labels.count #=> 4
|
214
|
+
# annotations[1].labels.count #=> 6
|
215
|
+
#
|
216
|
+
# @example With multiple images and configurations passed in a block:
|
217
|
+
# require "gcloud"
|
218
|
+
#
|
219
|
+
# gcloud = Gcloud.new
|
220
|
+
# vision = gcloud.vision
|
221
|
+
#
|
222
|
+
# face_image = vision.image "path/to/face.jpg"
|
223
|
+
# landmark_image = vision.image "path/to/landmark.jpg"
|
224
|
+
# text_image = vision.image "path/to/text.png"
|
225
|
+
#
|
226
|
+
# annotations = vision.annotate do |annotate|
|
227
|
+
# annotate.annotate face_image, faces: true, labels: true
|
228
|
+
# annotate.annotate landmark_image, landmarks: true
|
229
|
+
# annotate.annotate text_image, text: true
|
230
|
+
# end
|
231
|
+
#
|
232
|
+
# annotations[0].faces.count #=> 1
|
233
|
+
# annotations[0].labels.count #=> 4
|
234
|
+
# annotations[1].landmarks.count #=> 1
|
235
|
+
# annotations[2].text.words.count #=> 28
|
236
|
+
#
|
237
|
+
# @example Maximum result values can also be provided:
|
238
|
+
# require "gcloud"
|
239
|
+
#
|
240
|
+
# gcloud = Gcloud.new
|
241
|
+
# vision = gcloud.vision
|
242
|
+
#
|
243
|
+
# image = vision.image "path/to/landmark.jpg"
|
244
|
+
#
|
245
|
+
# annotation = vision.annotate image, labels: 3
|
246
|
+
#
|
247
|
+
# annotation.labels.map &:description
|
248
|
+
# #=> ["stone carving", "ancient history", "statue"]
|
249
|
+
#
|
250
|
+
def annotate *images, faces: false, landmarks: false, logos: false,
|
251
|
+
labels: false, text: false, safe_search: false,
|
252
|
+
properties: false
|
253
|
+
a = Annotate.new self
|
254
|
+
a.annotate(*images, faces: faces, landmarks: landmarks, logos: logos,
|
255
|
+
labels: labels, text: text,
|
256
|
+
safe_search: safe_search, properties: properties)
|
257
|
+
|
258
|
+
yield a if block_given?
|
259
|
+
|
260
|
+
resp = connection.annotate a.requests
|
261
|
+
fail ApiError.from_response(resp) unless resp.success?
|
262
|
+
annotations = Array(resp.data["responses"]).map do |gapi|
|
263
|
+
Annotation.from_gapi gapi
|
264
|
+
end
|
265
|
+
return annotations.first if annotations.count == 1
|
266
|
+
annotations
|
267
|
+
end
|
268
|
+
alias_method :mark, :annotate
|
269
|
+
alias_method :detect, :annotate
|
270
|
+
|
271
|
+
protected
|
272
|
+
|
273
|
+
##
|
274
|
+
# Raise an error unless an active connection is available.
|
275
|
+
def ensure_connection!
|
276
|
+
fail "Must have active connection" unless connection
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gcloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Silvano Luciani
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-05-
|
13
|
+
date: 2016-05-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: grpc
|
@@ -30,16 +30,16 @@ dependencies:
|
|
30
30
|
name: google-protobuf
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - '='
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 3.0.0.alpha.5.0.5
|
35
|
+
version: 3.0.0.alpha.5.0.5.1
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - '='
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 3.0.0.alpha.5.0.5
|
42
|
+
version: 3.0.0.alpha.5.0.5.1
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: google-api-client
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -378,6 +378,21 @@ files:
|
|
378
378
|
- lib/gcloud/translate/translation.rb
|
379
379
|
- lib/gcloud/upload.rb
|
380
380
|
- lib/gcloud/version.rb
|
381
|
+
- lib/gcloud/vision.rb
|
382
|
+
- lib/gcloud/vision/annotate.rb
|
383
|
+
- lib/gcloud/vision/annotation.rb
|
384
|
+
- lib/gcloud/vision/annotation/entity.rb
|
385
|
+
- lib/gcloud/vision/annotation/face.rb
|
386
|
+
- lib/gcloud/vision/annotation/properties.rb
|
387
|
+
- lib/gcloud/vision/annotation/safe_search.rb
|
388
|
+
- lib/gcloud/vision/annotation/text.rb
|
389
|
+
- lib/gcloud/vision/annotation/vertex.rb
|
390
|
+
- lib/gcloud/vision/connection.rb
|
391
|
+
- lib/gcloud/vision/credentials.rb
|
392
|
+
- lib/gcloud/vision/errors.rb
|
393
|
+
- lib/gcloud/vision/image.rb
|
394
|
+
- lib/gcloud/vision/location.rb
|
395
|
+
- lib/gcloud/vision/project.rb
|
381
396
|
- lib/google/api/annotations.rb
|
382
397
|
- lib/google/api/http.rb
|
383
398
|
- lib/google/api/label.rb
|