imagga 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +28 -1
  3. data/imagga.gemspec +1 -0
  4. data/lib/imagga.rb +8 -3
  5. data/lib/imagga/client.rb +12 -34
  6. data/lib/imagga/commands.rb +42 -0
  7. data/lib/imagga/core_client.rb +25 -0
  8. data/lib/imagga/exceptions.rb +3 -0
  9. data/lib/imagga/image.rb +59 -2
  10. data/lib/imagga/image_or_url_parametizer.rb +21 -0
  11. data/lib/imagga/options.rb +74 -0
  12. data/lib/imagga/parametizer.rb +18 -0
  13. data/lib/imagga/rank_color_parametizer.rb +17 -0
  14. data/lib/imagga/resolution_parametizer.rb +17 -0
  15. data/lib/imagga/result_builder.rb +27 -0
  16. data/lib/imagga/version.rb +1 -1
  17. data/spec/fixtures/crop_response.txt +62 -0
  18. data/spec/fixtures/extract_response.txt +253 -0
  19. data/spec/fixtures/rank_response.txt +12 -0
  20. data/spec/integration/crop_spec.rb +60 -0
  21. data/spec/integration/extract_spec.rb +51 -0
  22. data/spec/integration/rank_spec.rb +103 -0
  23. data/spec/lib/commands_spec.rb +70 -0
  24. data/spec/lib/core_client_spec.rb +43 -0
  25. data/spec/lib/crop_info_spec.rb +15 -0
  26. data/spec/lib/crop_options_spec.rb +24 -0
  27. data/spec/lib/crop_result_builder_spec.rb +4 -0
  28. data/spec/lib/extraction_options_spec.rb +16 -51
  29. data/spec/lib/image_crop_spec.rb +34 -0
  30. data/spec/lib/image_or_url_parametizer_spec.rb +65 -0
  31. data/spec/lib/parametizer_spec.rb +42 -0
  32. data/spec/lib/rank_color_parametizer_spec.rb +27 -0
  33. data/spec/lib/rank_color_spec.rb +51 -0
  34. data/spec/lib/rank_options_spec.rb +28 -0
  35. data/spec/lib/rank_result_builder_spec.rb +1 -12
  36. data/spec/lib/resolution_parametizer_spec.rb +60 -0
  37. metadata +63 -28
  38. data/lib/imagga/extract_options.rb +0 -74
  39. data/lib/imagga/extract_result_builder.rb +0 -11
  40. data/lib/imagga/rank_result_builder.rb +0 -9
  41. data/spec/lib/client_spec.rb +0 -352
@@ -0,0 +1,17 @@
1
+ module Imagga
2
+ class ResolutionParametizer
3
+ include Parametizer
4
+
5
+ def parametrize(resolution_array_or_string)
6
+ { resolutions: build_resolutions(resolution_array_or_string) }
7
+ end
8
+
9
+ def build_resolutions(resolution_array_or_string)
10
+ [resolution_array_or_string].flatten.map{ |o| build_resolution_string(o) rescue o }.join(',')
11
+ end
12
+
13
+ def build_resolution_string(resolution)
14
+ resolution.gsub('x', ',')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ module Imagga
2
+
3
+ class BaseBuilder
4
+ def build_from(result)
5
+ result[key].map { |o| result_class.new(o) }
6
+ end
7
+
8
+ def key; self.class::KEY; end
9
+ def result_class; self.class::CLASS; end
10
+ end
11
+
12
+ class RankResultBuilder < BaseBuilder
13
+ KEY = 'rank_similarity'
14
+ CLASS = RankSimilarity
15
+ end
16
+
17
+ class ExtractResultBuilder < BaseBuilder
18
+ KEY = 'colors'
19
+ CLASS = ImageInfo
20
+ end
21
+
22
+ class CropResultBuilder < BaseBuilder
23
+ KEY = 'smart_croppings'
24
+ CLASS = CropInfo
25
+ end
26
+
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Imagga
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -0,0 +1,62 @@
1
+ {
2
+ "smart_croppings":[
3
+ {
4
+ "url":"http:\/\/www.stockpodium.com\/stock-photo-7890736\/couple-child-spending-time-together-image.jpg",
5
+ "croppings":[
6
+ {
7
+ "target_width":"150",
8
+ "target_height":"200",
9
+ "x1":156,
10
+ "y1":0,
11
+ "x2":355,
12
+ "y2":265
13
+ },
14
+ {
15
+ "target_width":"100",
16
+ "target_height":"50",
17
+ "x1":0,
18
+ "y1":0,
19
+ "x2":399,
20
+ "y2":200
21
+ },
22
+ {
23
+ "target_width":"75",
24
+ "target_height":"75",
25
+ "x1":86,
26
+ "y1":0,
27
+ "x2":352,
28
+ "y2":265
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "url":"http:\/\/www.stockpodium.com\/stock-photo-7314730\/hand-keys-car-image.jpg",
34
+ "croppings":[
35
+ {
36
+ "target_width":"150",
37
+ "target_height":"200",
38
+ "x1":61,
39
+ "y1":0,
40
+ "x2":286,
41
+ "y2":299
42
+ },
43
+ {
44
+ "target_width":"100",
45
+ "target_height":"50",
46
+ "x1":0,
47
+ "y1":37,
48
+ "x2":399,
49
+ "y2":237
50
+ },
51
+ {
52
+ "target_width":"75",
53
+ "target_height":"75",
54
+ "x1":24,
55
+ "y1":0,
56
+ "x2":324,
57
+ "y2":299
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ }
@@ -0,0 +1,253 @@
1
+ {
2
+ "colors":[
3
+ {
4
+ "url":"http:\/\/www.stockpodium.com\/stock-photo-8244245\/smiling-presenting-2-apples-image.jpg",
5
+ "info":{
6
+ "image_colors":[
7
+ {
8
+ "percent":"38.90",
9
+ "r":"247",
10
+ "g":"245",
11
+ "b":"243",
12
+ "html_code":"#f7f5f3",
13
+ "closest_palette_color":"white",
14
+ "closest_palette_color_parent":"white",
15
+ "closest_palette_distance":1.8304102578
16
+ },
17
+ {
18
+ "percent":"35.16",
19
+ "r":"206",
20
+ "g":"167",
21
+ "b":"146",
22
+ "html_code":"#cea792",
23
+ "closest_palette_color":"fresco",
24
+ "closest_palette_color_parent":"beige",
25
+ "closest_palette_distance":4.93287465177
26
+ },
27
+ {
28
+ "percent":"10.41",
29
+ "r":"150",
30
+ "g":"60",
31
+ "b":"45",
32
+ "html_code":"#963c2d",
33
+ "closest_palette_color":"ribbon red",
34
+ "closest_palette_color_parent":"red",
35
+ "closest_palette_distance":5.6423821179
36
+ },
37
+ {
38
+ "percent":"8.38",
39
+ "r":"55",
40
+ "g":"37",
41
+ "b":"31",
42
+ "html_code":"#37251f",
43
+ "closest_palette_color":"espresso",
44
+ "closest_palette_color_parent":"brown",
45
+ "closest_palette_distance":5.91329502182
46
+ },
47
+ {
48
+ "percent":"7.15",
49
+ "r":"168",
50
+ "g":"181",
51
+ "b":"45",
52
+ "html_code":"#a8b52d",
53
+ "closest_palette_color":"mint",
54
+ "closest_palette_color_parent":"olive green",
55
+ "closest_palette_distance":10.7126507469
56
+ }
57
+ ],
58
+ "foreground_colors":[
59
+ {
60
+ "percent":"45.92",
61
+ "r":"200",
62
+ "g":"180",
63
+ "b":"112",
64
+ "html_code":"#c8b470",
65
+ "closest_palette_color":"medium olive",
66
+ "closest_palette_color_parent":"skin",
67
+ "closest_palette_distance":7.22056402093
68
+ },
69
+ {
70
+ "percent":"34.21",
71
+ "r":"162",
72
+ "g":"79",
73
+ "b":"61",
74
+ "html_code":"#a24f3d",
75
+ "closest_palette_color":"fiesta",
76
+ "closest_palette_color_parent":"red",
77
+ "closest_palette_distance":6.29194294147
78
+ },
79
+ {
80
+ "percent":"19.86",
81
+ "r":"52",
82
+ "g":"35",
83
+ "b":"31",
84
+ "html_code":"#34231f",
85
+ "closest_palette_color":"espresso",
86
+ "closest_palette_color_parent":"brown",
87
+ "closest_palette_distance":6.49089812519
88
+ }
89
+ ],
90
+ "background_colors":[
91
+ {
92
+ "percent":"58.05",
93
+ "r":"249",
94
+ "g":"248",
95
+ "b":"247",
96
+ "html_code":"#f9f8f7",
97
+ "closest_palette_color":"white",
98
+ "closest_palette_color_parent":"white",
99
+ "closest_palette_distance":2.48109615666
100
+ },
101
+ {
102
+ "percent":"36.41",
103
+ "r":"206",
104
+ "g":"177",
105
+ "b":"161",
106
+ "html_code":"#ceb1a1",
107
+ "closest_palette_color":"pearl pink",
108
+ "closest_palette_color_parent":"light pink",
109
+ "closest_palette_distance":4.11506425614
110
+ },
111
+ {
112
+ "percent":"5.55",
113
+ "r":"150",
114
+ "g":"100",
115
+ "b":"77",
116
+ "html_code":"#96644d",
117
+ "closest_palette_color":"light bronze",
118
+ "closest_palette_color_parent":"skin",
119
+ "closest_palette_distance":6.37479340147
120
+ }
121
+ ],
122
+ "object_percentage":38.4,
123
+ "color_variance":"33"
124
+ }
125
+ },
126
+ {
127
+ "url":"http:\/\/www.stockpodium.com\/stock-photo-9289532\/car-dirving-very-fast-under-image.jpg",
128
+ "info":{
129
+ "image_colors":[
130
+ {
131
+ "percent":"38.53",
132
+ "r":"103",
133
+ "g":"98",
134
+ "b":"98",
135
+ "html_code":"#676262",
136
+ "closest_palette_color":"blue steel",
137
+ "closest_palette_color_parent":"grey",
138
+ "closest_palette_distance":10.486937593
139
+ },
140
+ {
141
+ "percent":"26.31",
142
+ "r":"42",
143
+ "g":"37",
144
+ "b":"33",
145
+ "html_code":"#2a2521",
146
+ "closest_palette_color":"espresso",
147
+ "closest_palette_color_parent":"brown",
148
+ "closest_palette_distance":8.14492880108
149
+ },
150
+ {
151
+ "percent":"16.19",
152
+ "r":"178",
153
+ "g":"182",
154
+ "b":"190",
155
+ "html_code":"#b2b6be",
156
+ "closest_palette_color":"frost",
157
+ "closest_palette_color_parent":"light grey",
158
+ "closest_palette_distance":2.82095071372
159
+ },
160
+ {
161
+ "percent":"12.06",
162
+ "r":"197",
163
+ "g":"51",
164
+ "b":"45",
165
+ "html_code":"#c5332d",
166
+ "closest_palette_color":"fiesta",
167
+ "closest_palette_color_parent":"red",
168
+ "closest_palette_distance":5.41278686601
169
+ },
170
+ {
171
+ "percent":"6.91",
172
+ "r":"86",
173
+ "g":"97",
174
+ "b":"28",
175
+ "html_code":"#56611c",
176
+ "closest_palette_color":"moss",
177
+ "closest_palette_color_parent":"olive green",
178
+ "closest_palette_distance":9.97695248255
179
+ }
180
+ ],
181
+ "foreground_colors":[
182
+ {
183
+ "percent":"62.98",
184
+ "r":"199",
185
+ "g":"50",
186
+ "b":"43",
187
+ "html_code":"#c7322b",
188
+ "closest_palette_color":"fiesta",
189
+ "closest_palette_color_parent":"red",
190
+ "closest_palette_distance":5.44027296941
191
+ },
192
+ {
193
+ "percent":"22.01",
194
+ "r":"140",
195
+ "g":"132",
196
+ "b":"144",
197
+ "html_code":"#8c8490",
198
+ "closest_palette_color":"shadow",
199
+ "closest_palette_color_parent":"light grey",
200
+ "closest_palette_distance":3.40761167276
201
+ },
202
+ {
203
+ "percent":"15.01",
204
+ "r":"61",
205
+ "g":"38",
206
+ "b":"43",
207
+ "html_code":"#3d262b",
208
+ "closest_palette_color":"espresso",
209
+ "closest_palette_color_parent":"brown",
210
+ "closest_palette_distance":5.85441000013
211
+ }
212
+ ],
213
+ "background_colors":[
214
+ {
215
+ "percent":"41.07",
216
+ "r":"103",
217
+ "g":"97",
218
+ "b":"97",
219
+ "html_code":"#676161",
220
+ "closest_palette_color":"blue steel",
221
+ "closest_palette_color_parent":"grey",
222
+ "closest_palette_distance":10.6345471176
223
+ },
224
+ {
225
+ "percent":"39.63",
226
+ "r":"53",
227
+ "g":"51",
228
+ "b":"34",
229
+ "html_code":"#353322",
230
+ "closest_palette_color":"graphite",
231
+ "closest_palette_color_parent":"black",
232
+ "closest_palette_distance":9.18317865786
233
+ },
234
+ {
235
+ "percent":"19.29",
236
+ "r":"174",
237
+ "g":"180",
238
+ "b":"187",
239
+ "html_code":"#aeb4bb",
240
+ "closest_palette_color":"frost",
241
+ "closest_palette_color_parent":"light grey",
242
+ "closest_palette_distance":2.03931376316
243
+ }
244
+ ],
245
+ "object_percentage":17.99,
246
+ "color_variance":"37",
247
+ "image_packed":null,
248
+ "foreground_packed":null,
249
+ "background_packed":null
250
+ }
251
+ }
252
+ ]
253
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "rank_similarity":[
3
+ {
4
+ "id":8774077,
5
+ "dist":2597.38299
6
+ },
7
+ {
8
+ "id":9085916,
9
+ "dist":2681.33259
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'fake_web'
3
+
4
+ describe "Image crop suggestions" do
5
+
6
+ let(:base_uri) { 'http://example.com' }
7
+ let(:image_url) { 'http://image' }
8
+ let(:fake_service_url) { 'http://example.com/extractionrestserver.php' }
9
+ let(:crop_response) { IO.read('./spec/fixtures/crop_response.txt') }
10
+ let(:failed_signature_response) { '{"error_code":3,"error_message":"Invalid signature"}' }
11
+ let(:params) { [
12
+ [
13
+ Imagga::Image.new(url: 'http://image1', id: '333'),
14
+ Imagga::Image.new(url: 'http://image2')
15
+ ],
16
+ resolutions: ['100x50', '40x200'],
17
+ no_scaling: true
18
+ ]
19
+ }
20
+
21
+ subject { Imagga::Client.new(api_key: '123456', api_secret: 'secret', base_uri: base_uri) }
22
+
23
+ context "with successful request" do
24
+ before do
25
+ FakeWeb.register_uri(:post, fake_service_url, body: crop_response)
26
+ end
27
+
28
+ it "produces image crop info" do
29
+ subject.crop(*params).size.should == 2
30
+ end
31
+ end
32
+
33
+ context "with failing request" do
34
+ before do
35
+ FakeWeb.register_uri(:post, fake_service_url, body: failed_signature_response)
36
+ end
37
+
38
+ it "raises exception" do
39
+ expect { subject.crop(*params) }.to raise_error(Imagga::ClientException)
40
+ end
41
+
42
+ context "exception" do
43
+ before do
44
+ begin
45
+ subject.crop(*params)
46
+ rescue Imagga::ClientException => e
47
+ @exception = e
48
+ end
49
+ end
50
+
51
+ it "has message" do
52
+ @exception.message.should == 'Invalid signature'
53
+ end
54
+
55
+ it "has error code" do
56
+ @exception.error_code.should == 3
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'fake_web'
3
+
4
+ describe "Image info extraction service" do
5
+
6
+ let(:base_uri) { 'http://example.com' }
7
+ let(:image_url) { 'http://image' }
8
+ let(:fake_service_url) { 'http://example.com/colorsearchserver.php' }
9
+ let(:extract_response) { IO.read('./spec/fixtures/extract_response.txt') }
10
+ let(:failed_signature_response) { '{"error_code":3,"error_message":"Invalid signature"}' }
11
+
12
+ subject { Imagga::Client.new(api_key: '123456', api_secret: 'secret', base_uri: base_uri) }
13
+
14
+ context "with successful request" do
15
+ before do
16
+ FakeWeb.register_uri(:post, fake_service_url, body: extract_response)
17
+ end
18
+
19
+ it "extracts image info" do
20
+ subject.extract(image_url).size.should == 2
21
+ end
22
+ end
23
+
24
+ context "with failing request" do
25
+ before do
26
+ FakeWeb.register_uri(:post, fake_service_url, body: failed_signature_response)
27
+ end
28
+
29
+ it "raises exception" do
30
+ expect { subject.extract(image_url) }.to raise_error(Imagga::ClientException)
31
+ end
32
+
33
+ context "exception" do
34
+ before do
35
+ begin
36
+ subject.extract(image_url)
37
+ rescue Imagga::ClientException => e
38
+ @exception = e
39
+ end
40
+ end
41
+
42
+ it "has message" do
43
+ @exception.message.should == 'Invalid signature'
44
+ end
45
+
46
+ it "has error code" do
47
+ @exception.error_code.should == 3
48
+ end
49
+ end
50
+ end
51
+ end