picguard 1.0.0 → 1.0.1

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +10 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +81 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +6 -0
  10. data/bin/setup +8 -0
  11. data/circle.yml +3 -0
  12. data/lib/configuration.rb +11 -0
  13. data/lib/google/apis/vision_v1.rb +37 -0
  14. data/lib/google/apis/vision_v1/classes.rb +1259 -0
  15. data/lib/google/apis/vision_v1/representations.rb +370 -0
  16. data/lib/google/apis/vision_v1/service.rb +91 -0
  17. data/lib/guard_validator.rb +58 -0
  18. data/lib/picguard.rb +40 -0
  19. data/lib/picguard/version.rb +3 -0
  20. data/lib/services/analyzer.rb +40 -0
  21. data/lib/services/builders/annotate_image.rb +16 -0
  22. data/lib/services/builders/batch.rb +15 -0
  23. data/lib/services/builders/feature.rb +16 -0
  24. data/lib/services/builders/image.rb +15 -0
  25. data/lib/services/builders/request.rb +27 -0
  26. data/lib/services/builders/vision.rb +17 -0
  27. data/lib/services/image_preparator.rb +46 -0
  28. data/lib/services/validators/likelihood.rb +31 -0
  29. data/picguard.gemspec +30 -0
  30. data/spec/guard_validator_spec.rb +72 -0
  31. data/spec/picguard_spec.rb +22 -0
  32. data/spec/services/analyzer_spec.rb +33 -0
  33. data/spec/services/builders/annotate_image_spec.rb +15 -0
  34. data/spec/services/builders/batch_spec.rb +18 -0
  35. data/spec/services/builders/feature_spec.rb +26 -0
  36. data/spec/services/builders/image_spec.rb +12 -0
  37. data/spec/services/builders/vision_spec.rb +14 -0
  38. data/spec/services/image_preparator_spec.rb +36 -0
  39. data/spec/services/validators/likelihood_spec.rb +26 -0
  40. data/spec/spec_helper.rb +10 -0
  41. data/spec/support/img/cat.jpg +0 -0
  42. data/spec/support/img/face-example.jpg +0 -0
  43. data/spec/support/img/gun-violence.jpg +0 -0
  44. data/spec/support/result_hash_stub.rb +212 -0
  45. metadata +64 -4
@@ -0,0 +1,370 @@
1
+ # Copyright 2015 Google Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'date'
16
+ require 'google/apis/core/base_service'
17
+ require 'google/apis/core/json_representation'
18
+ require 'google/apis/core/hashable'
19
+ require 'google/apis/errors'
20
+
21
+ module Google
22
+ module Apis
23
+ module VisionV1
24
+
25
+ class ImageSource
26
+ class Representation < Google::Apis::Core::JsonRepresentation; end
27
+ end
28
+
29
+ class AnnotateImageRequest
30
+ class Representation < Google::Apis::Core::JsonRepresentation; end
31
+ end
32
+
33
+ class AnnotateImageResponse
34
+ class Representation < Google::Apis::Core::JsonRepresentation; end
35
+ end
36
+
37
+ class LatLongRect
38
+ class Representation < Google::Apis::Core::JsonRepresentation; end
39
+ end
40
+
41
+ class Status
42
+ class Representation < Google::Apis::Core::JsonRepresentation; end
43
+ end
44
+
45
+ class FaceAnnotation
46
+ class Representation < Google::Apis::Core::JsonRepresentation; end
47
+ end
48
+
49
+ class Vertex
50
+ class Representation < Google::Apis::Core::JsonRepresentation; end
51
+ end
52
+
53
+ class ColorInfo
54
+ class Representation < Google::Apis::Core::JsonRepresentation; end
55
+ end
56
+
57
+ class BoundingPoly
58
+ class Representation < Google::Apis::Core::JsonRepresentation; end
59
+ end
60
+
61
+ class Landmark
62
+ class Representation < Google::Apis::Core::JsonRepresentation; end
63
+ end
64
+
65
+ class ImageContext
66
+ class Representation < Google::Apis::Core::JsonRepresentation; end
67
+ end
68
+
69
+ class BatchAnnotateImagesRequest
70
+ class Representation < Google::Apis::Core::JsonRepresentation; end
71
+ end
72
+
73
+ class EntityAnnotation
74
+ class Representation < Google::Apis::Core::JsonRepresentation; end
75
+ end
76
+
77
+ class Property
78
+ class Representation < Google::Apis::Core::JsonRepresentation; end
79
+ end
80
+
81
+ class Color
82
+ class Representation < Google::Apis::Core::JsonRepresentation; end
83
+ end
84
+
85
+ class LocationInfo
86
+ class Representation < Google::Apis::Core::JsonRepresentation; end
87
+ end
88
+
89
+ class SafeSearchAnnotation
90
+ class Representation < Google::Apis::Core::JsonRepresentation; end
91
+ end
92
+
93
+ class Image
94
+ class Representation < Google::Apis::Core::JsonRepresentation; end
95
+ end
96
+
97
+ class DominantColorsAnnotation
98
+ class Representation < Google::Apis::Core::JsonRepresentation; end
99
+ end
100
+
101
+ class Feature
102
+ class Representation < Google::Apis::Core::JsonRepresentation; end
103
+ end
104
+
105
+ class BatchAnnotateImagesResponse
106
+ class Representation < Google::Apis::Core::JsonRepresentation; end
107
+ end
108
+
109
+ class ImageProperties
110
+ class Representation < Google::Apis::Core::JsonRepresentation; end
111
+ end
112
+
113
+ class Position
114
+ class Representation < Google::Apis::Core::JsonRepresentation; end
115
+ end
116
+
117
+ class LatLng
118
+ class Representation < Google::Apis::Core::JsonRepresentation; end
119
+ end
120
+
121
+ class ImageSource
122
+ # @private
123
+ class Representation < Google::Apis::Core::JsonRepresentation
124
+ property :gcs_image_uri, as: 'gcsImageUri'
125
+ end
126
+ end
127
+
128
+ class AnnotateImageRequest
129
+ # @private
130
+ class Representation < Google::Apis::Core::JsonRepresentation
131
+ property :image, as: 'image', class: Google::Apis::VisionV1::Image, decorator: Google::Apis::VisionV1::Image::Representation
132
+
133
+ property :image_context, as: 'imageContext', class: Google::Apis::VisionV1::ImageContext, decorator: Google::Apis::VisionV1::ImageContext::Representation
134
+
135
+ collection :features, as: 'features', class: Google::Apis::VisionV1::Feature, decorator: Google::Apis::VisionV1::Feature::Representation
136
+
137
+ end
138
+ end
139
+
140
+ class AnnotateImageResponse
141
+ # @private
142
+ class Representation < Google::Apis::Core::JsonRepresentation
143
+ collection :label_annotations, as: 'labelAnnotations', class: Google::Apis::VisionV1::EntityAnnotation, decorator: Google::Apis::VisionV1::EntityAnnotation::Representation
144
+
145
+ collection :landmark_annotations, as: 'landmarkAnnotations', class: Google::Apis::VisionV1::EntityAnnotation, decorator: Google::Apis::VisionV1::EntityAnnotation::Representation
146
+
147
+ property :safe_search_annotation, as: 'safeSearchAnnotation', class: Google::Apis::VisionV1::SafeSearchAnnotation, decorator: Google::Apis::VisionV1::SafeSearchAnnotation::Representation
148
+
149
+ property :image_properties_annotation, as: 'imagePropertiesAnnotation', class: Google::Apis::VisionV1::ImageProperties, decorator: Google::Apis::VisionV1::ImageProperties::Representation
150
+
151
+ collection :text_annotations, as: 'textAnnotations', class: Google::Apis::VisionV1::EntityAnnotation, decorator: Google::Apis::VisionV1::EntityAnnotation::Representation
152
+
153
+ collection :logo_annotations, as: 'logoAnnotations', class: Google::Apis::VisionV1::EntityAnnotation, decorator: Google::Apis::VisionV1::EntityAnnotation::Representation
154
+
155
+ collection :face_annotations, as: 'faceAnnotations', class: Google::Apis::VisionV1::FaceAnnotation, decorator: Google::Apis::VisionV1::FaceAnnotation::Representation
156
+
157
+ property :error, as: 'error', class: Google::Apis::VisionV1::Status, decorator: Google::Apis::VisionV1::Status::Representation
158
+
159
+ end
160
+ end
161
+
162
+ class LatLongRect
163
+ # @private
164
+ class Representation < Google::Apis::Core::JsonRepresentation
165
+ property :max_lat_lng, as: 'maxLatLng', class: Google::Apis::VisionV1::LatLng, decorator: Google::Apis::VisionV1::LatLng::Representation
166
+
167
+ property :min_lat_lng, as: 'minLatLng', class: Google::Apis::VisionV1::LatLng, decorator: Google::Apis::VisionV1::LatLng::Representation
168
+
169
+ end
170
+ end
171
+
172
+ class Status
173
+ # @private
174
+ class Representation < Google::Apis::Core::JsonRepresentation
175
+ property :code, as: 'code'
176
+ collection :details, as: 'details'
177
+ property :message, as: 'message'
178
+ end
179
+ end
180
+
181
+ class FaceAnnotation
182
+ # @private
183
+ class Representation < Google::Apis::Core::JsonRepresentation
184
+ property :tilt_angle, as: 'tiltAngle'
185
+ property :under_exposed_likelihood, as: 'underExposedLikelihood'
186
+ property :fd_bounding_poly, as: 'fdBoundingPoly', class: Google::Apis::VisionV1::BoundingPoly, decorator: Google::Apis::VisionV1::BoundingPoly::Representation
187
+
188
+ property :landmarking_confidence, as: 'landmarkingConfidence'
189
+ property :joy_likelihood, as: 'joyLikelihood'
190
+ property :detection_confidence, as: 'detectionConfidence'
191
+ property :surprise_likelihood, as: 'surpriseLikelihood'
192
+ property :anger_likelihood, as: 'angerLikelihood'
193
+ property :headwear_likelihood, as: 'headwearLikelihood'
194
+ property :bounding_poly, as: 'boundingPoly', class: Google::Apis::VisionV1::BoundingPoly, decorator: Google::Apis::VisionV1::BoundingPoly::Representation
195
+
196
+ property :pan_angle, as: 'panAngle'
197
+ collection :landmarks, as: 'landmarks', class: Google::Apis::VisionV1::Landmark, decorator: Google::Apis::VisionV1::Landmark::Representation
198
+
199
+ property :blurred_likelihood, as: 'blurredLikelihood'
200
+ property :roll_angle, as: 'rollAngle'
201
+ property :sorrow_likelihood, as: 'sorrowLikelihood'
202
+ end
203
+ end
204
+
205
+ class Vertex
206
+ # @private
207
+ class Representation < Google::Apis::Core::JsonRepresentation
208
+ property :y, as: 'y'
209
+ property :x, as: 'x'
210
+ end
211
+ end
212
+
213
+ class ColorInfo
214
+ # @private
215
+ class Representation < Google::Apis::Core::JsonRepresentation
216
+ property :pixel_fraction, as: 'pixelFraction'
217
+ property :color, as: 'color', class: Google::Apis::VisionV1::Color, decorator: Google::Apis::VisionV1::Color::Representation
218
+
219
+ property :score, as: 'score'
220
+ end
221
+ end
222
+
223
+ class BoundingPoly
224
+ # @private
225
+ class Representation < Google::Apis::Core::JsonRepresentation
226
+ collection :vertices, as: 'vertices', class: Google::Apis::VisionV1::Vertex, decorator: Google::Apis::VisionV1::Vertex::Representation
227
+
228
+ end
229
+ end
230
+
231
+ class Landmark
232
+ # @private
233
+ class Representation < Google::Apis::Core::JsonRepresentation
234
+ property :position, as: 'position', class: Google::Apis::VisionV1::Position, decorator: Google::Apis::VisionV1::Position::Representation
235
+
236
+ property :type, as: 'type'
237
+ end
238
+ end
239
+
240
+ class ImageContext
241
+ # @private
242
+ class Representation < Google::Apis::Core::JsonRepresentation
243
+ collection :language_hints, as: 'languageHints'
244
+ property :lat_long_rect, as: 'latLongRect', class: Google::Apis::VisionV1::LatLongRect, decorator: Google::Apis::VisionV1::LatLongRect::Representation
245
+
246
+ end
247
+ end
248
+
249
+ class BatchAnnotateImagesRequest
250
+ # @private
251
+ class Representation < Google::Apis::Core::JsonRepresentation
252
+ collection :requests, as: 'requests', class: Google::Apis::VisionV1::AnnotateImageRequest, decorator: Google::Apis::VisionV1::AnnotateImageRequest::Representation
253
+
254
+ end
255
+ end
256
+
257
+ class EntityAnnotation
258
+ # @private
259
+ class Representation < Google::Apis::Core::JsonRepresentation
260
+ property :mid, as: 'mid'
261
+ property :description, as: 'description'
262
+ property :topicality, as: 'topicality'
263
+ property :locale, as: 'locale'
264
+ collection :properties, as: 'properties', class: Google::Apis::VisionV1::Property, decorator: Google::Apis::VisionV1::Property::Representation
265
+
266
+ property :score, as: 'score'
267
+ property :bounding_poly, as: 'boundingPoly', class: Google::Apis::VisionV1::BoundingPoly, decorator: Google::Apis::VisionV1::BoundingPoly::Representation
268
+
269
+ collection :locations, as: 'locations', class: Google::Apis::VisionV1::LocationInfo, decorator: Google::Apis::VisionV1::LocationInfo::Representation
270
+
271
+ property :confidence, as: 'confidence'
272
+ end
273
+ end
274
+
275
+ class Property
276
+ # @private
277
+ class Representation < Google::Apis::Core::JsonRepresentation
278
+ property :value, as: 'value'
279
+ property :name, as: 'name'
280
+ end
281
+ end
282
+
283
+ class Color
284
+ # @private
285
+ class Representation < Google::Apis::Core::JsonRepresentation
286
+ property :green, as: 'green'
287
+ property :blue, as: 'blue'
288
+ property :red, as: 'red'
289
+ property :alpha, as: 'alpha'
290
+ end
291
+ end
292
+
293
+ class LocationInfo
294
+ # @private
295
+ class Representation < Google::Apis::Core::JsonRepresentation
296
+ property :lat_lng, as: 'latLng', class: Google::Apis::VisionV1::LatLng, decorator: Google::Apis::VisionV1::LatLng::Representation
297
+
298
+ end
299
+ end
300
+
301
+ class SafeSearchAnnotation
302
+ # @private
303
+ class Representation < Google::Apis::Core::JsonRepresentation
304
+ property :medical, as: 'medical'
305
+ property :violence, as: 'violence'
306
+ property :spoof, as: 'spoof'
307
+ property :adult, as: 'adult'
308
+ end
309
+ end
310
+
311
+ class Image
312
+ # @private
313
+ class Representation < Google::Apis::Core::JsonRepresentation
314
+ property :source, as: 'source', class: Google::Apis::VisionV1::ImageSource, decorator: Google::Apis::VisionV1::ImageSource::Representation
315
+
316
+ property :content, :base64 => true, as: 'content'
317
+ end
318
+ end
319
+
320
+ class DominantColorsAnnotation
321
+ # @private
322
+ class Representation < Google::Apis::Core::JsonRepresentation
323
+ collection :colors, as: 'colors', class: Google::Apis::VisionV1::ColorInfo, decorator: Google::Apis::VisionV1::ColorInfo::Representation
324
+
325
+ end
326
+ end
327
+
328
+ class Feature
329
+ # @private
330
+ class Representation < Google::Apis::Core::JsonRepresentation
331
+ property :max_results, as: 'maxResults'
332
+ property :type, as: 'type'
333
+ end
334
+ end
335
+
336
+ class BatchAnnotateImagesResponse
337
+ # @private
338
+ class Representation < Google::Apis::Core::JsonRepresentation
339
+ collection :responses, as: 'responses', class: Google::Apis::VisionV1::AnnotateImageResponse, decorator: Google::Apis::VisionV1::AnnotateImageResponse::Representation
340
+
341
+ end
342
+ end
343
+
344
+ class ImageProperties
345
+ # @private
346
+ class Representation < Google::Apis::Core::JsonRepresentation
347
+ property :dominant_colors, as: 'dominantColors', class: Google::Apis::VisionV1::DominantColorsAnnotation, decorator: Google::Apis::VisionV1::DominantColorsAnnotation::Representation
348
+
349
+ end
350
+ end
351
+
352
+ class Position
353
+ # @private
354
+ class Representation < Google::Apis::Core::JsonRepresentation
355
+ property :y, as: 'y'
356
+ property :z, as: 'z'
357
+ property :x, as: 'x'
358
+ end
359
+ end
360
+
361
+ class LatLng
362
+ # @private
363
+ class Representation < Google::Apis::Core::JsonRepresentation
364
+ property :longitude, as: 'longitude'
365
+ property :latitude, as: 'latitude'
366
+ end
367
+ end
368
+ end
369
+ end
370
+ end
@@ -0,0 +1,91 @@
1
+ # Copyright 2015 Google Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'google/apis/core/base_service'
16
+ require 'google/apis/core/json_representation'
17
+ require 'google/apis/core/hashable'
18
+ require 'google/apis/errors'
19
+
20
+ module Google
21
+ module Apis
22
+ module VisionV1
23
+ # Cloud Vision API
24
+ #
25
+ # The Google Cloud Vision API allows developers to easily integrate Google
26
+ # vision features, including image labeling, face, logo, and landmark detection,
27
+ # optical character recognition (OCR), and detection of explicit content, into
28
+ # applications.
29
+ #
30
+ # @example
31
+ # require 'google/apis/vision_v1'
32
+ #
33
+ # Vision = Google::Apis::VisionV1 # Alias the module
34
+ # service = Vision::VisionService.new
35
+ #
36
+ # @see https://cloud.google.com/vision/
37
+ class VisionService < Google::Apis::Core::BaseService
38
+ # @return [String]
39
+ # API key. Your API key identifies your project and provides you with API access,
40
+ # quota, and reports. Required unless you provide an OAuth 2.0 token.
41
+ attr_accessor :key
42
+
43
+ # @return [String]
44
+ # Available to use for quota purposes for server-side applications. Can be any
45
+ # arbitrary string assigned to a user, but should not exceed 40 characters.
46
+ attr_accessor :quota_user
47
+
48
+ def initialize
49
+ super('https://vision.googleapis.com/', '')
50
+ end
51
+
52
+ # Run image detection and annotation for a batch of images.
53
+ # @param [Google::Apis::VisionV1::BatchAnnotateImagesRequest] batch_annotate_images_request_object
54
+ # @param [String] quota_user
55
+ # Available to use for quota purposes for server-side applications. Can be any
56
+ # arbitrary string assigned to a user, but should not exceed 40 characters.
57
+ # @param [String] fields
58
+ # Selector specifying which fields to include in a partial response.
59
+ # @param [Google::Apis::RequestOptions] options
60
+ # Request-specific options
61
+ #
62
+ # @yield [result, err] Result & error if block supplied
63
+ # @yieldparam result [Google::Apis::VisionV1::BatchAnnotateImagesResponse] parsed result object
64
+ # @yieldparam err [StandardError] error object if request failed
65
+ #
66
+ # @return [Google::Apis::VisionV1::BatchAnnotateImagesResponse]
67
+ #
68
+ # @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
69
+ # @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
70
+ # @raise [Google::Apis::AuthorizationError] Authorization is required
71
+ def annotate_image(batch_annotate_images_request_object = nil, quota_user: nil, fields: nil, options: nil, &block)
72
+ command = make_simple_command(:post, 'v1/images:annotate', options)
73
+ command.request_representation = Google::Apis::VisionV1::BatchAnnotateImagesRequest::Representation
74
+ command.request_object = batch_annotate_images_request_object
75
+ command.response_representation = Google::Apis::VisionV1::BatchAnnotateImagesResponse::Representation
76
+ command.response_class = Google::Apis::VisionV1::BatchAnnotateImagesResponse
77
+ command.query['quotaUser'] = quota_user unless quota_user.nil?
78
+ command.query['fields'] = fields unless fields.nil?
79
+ execute_or_queue_command(command, &block)
80
+ end
81
+
82
+ protected
83
+
84
+ def apply_command_defaults(command)
85
+ command.query['key'] = key unless key.nil?
86
+ command.query['quotaUser'] = quota_user unless quota_user.nil?
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end