imagga 0.0.3 → 0.0.5

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 (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