imagga 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README.md +28 -1
- data/imagga.gemspec +1 -0
- data/lib/imagga.rb +8 -3
- data/lib/imagga/client.rb +12 -34
- data/lib/imagga/commands.rb +42 -0
- data/lib/imagga/core_client.rb +25 -0
- data/lib/imagga/exceptions.rb +3 -0
- data/lib/imagga/image.rb +59 -2
- data/lib/imagga/image_or_url_parametizer.rb +21 -0
- data/lib/imagga/options.rb +74 -0
- data/lib/imagga/parametizer.rb +18 -0
- data/lib/imagga/rank_color_parametizer.rb +17 -0
- data/lib/imagga/resolution_parametizer.rb +17 -0
- data/lib/imagga/result_builder.rb +27 -0
- data/lib/imagga/version.rb +1 -1
- data/spec/fixtures/crop_response.txt +62 -0
- data/spec/fixtures/extract_response.txt +253 -0
- data/spec/fixtures/rank_response.txt +12 -0
- data/spec/integration/crop_spec.rb +60 -0
- data/spec/integration/extract_spec.rb +51 -0
- data/spec/integration/rank_spec.rb +103 -0
- data/spec/lib/commands_spec.rb +70 -0
- data/spec/lib/core_client_spec.rb +43 -0
- data/spec/lib/crop_info_spec.rb +15 -0
- data/spec/lib/crop_options_spec.rb +24 -0
- data/spec/lib/crop_result_builder_spec.rb +4 -0
- data/spec/lib/extraction_options_spec.rb +16 -51
- data/spec/lib/image_crop_spec.rb +34 -0
- data/spec/lib/image_or_url_parametizer_spec.rb +65 -0
- data/spec/lib/parametizer_spec.rb +42 -0
- data/spec/lib/rank_color_parametizer_spec.rb +27 -0
- data/spec/lib/rank_color_spec.rb +51 -0
- data/spec/lib/rank_options_spec.rb +28 -0
- data/spec/lib/rank_result_builder_spec.rb +1 -12
- data/spec/lib/resolution_parametizer_spec.rb +60 -0
- metadata +63 -28
- data/lib/imagga/extract_options.rb +0 -74
- data/lib/imagga/extract_result_builder.rb +0 -11
- data/lib/imagga/rank_result_builder.rb +0 -9
- data/spec/lib/client_spec.rb +0 -352
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fake_web'
|
3
|
+
|
4
|
+
describe "Multicolor search" do
|
5
|
+
|
6
|
+
let(:base_uri) { 'http://example.com' }
|
7
|
+
let(:fake_service_url) { 'http://example.com/colorsearchserver.php' }
|
8
|
+
let(:rank_response) { IO.read('./spec/fixtures/rank_response.txt') }
|
9
|
+
let(:failed_signature_response) { '{"error_code":3,"error_message":"Invalid signature"}' }
|
10
|
+
|
11
|
+
subject { Imagga::Client.new(api_key: '123456', api_secret: 'secret', base_uri: base_uri) }
|
12
|
+
|
13
|
+
context "with successful request" do
|
14
|
+
before do
|
15
|
+
FakeWeb.register_uri(:post, fake_service_url, body: rank_response)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "searches images by color" do
|
19
|
+
subject.rank(
|
20
|
+
colors: [
|
21
|
+
Imagga::RankColor.new(percent: 60, r: 10, g: 20, b: 30),
|
22
|
+
Imagga::RankColor.new(percent: 20, hex: '#ff00ff'),
|
23
|
+
'39,12,34,123'
|
24
|
+
],
|
25
|
+
type: :overall,
|
26
|
+
dist: 3000,
|
27
|
+
count: 10
|
28
|
+
).size.should == 2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with missing colors in params" do
|
33
|
+
it "throws an error" do
|
34
|
+
expect {
|
35
|
+
subject.rank(
|
36
|
+
type: :overall,
|
37
|
+
dist: 3000,
|
38
|
+
count: 10
|
39
|
+
) }.to raise_error(ArgumentError, 'colors is missing')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "with missing colors in params" do
|
44
|
+
it "throws an error" do
|
45
|
+
expect {
|
46
|
+
subject.rank(
|
47
|
+
colors: [
|
48
|
+
Imagga::RankColor.new(percent: 60, r: 10, g: 20, b: 30),
|
49
|
+
Imagga::RankColor.new(percent: 20, hex: '#ff00ff'),
|
50
|
+
'39,12,34,123'
|
51
|
+
],
|
52
|
+
dist: 3000,
|
53
|
+
count: 10
|
54
|
+
) }.to raise_error(ArgumentError, 'type is missing')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "with failing request" do
|
59
|
+
before do
|
60
|
+
FakeWeb.register_uri(:post, fake_service_url, body: failed_signature_response)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "raises exception" do
|
64
|
+
expect { subject.rank(
|
65
|
+
colors: [
|
66
|
+
Imagga::RankColor.new(percent: 60, r: 10, g: 20, b: 30),
|
67
|
+
Imagga::RankColor.new(percent: 20, hex: '#ff00ff'),
|
68
|
+
'39,12,34,123'
|
69
|
+
],
|
70
|
+
type: :overall,
|
71
|
+
dist: 3000,
|
72
|
+
count: 10
|
73
|
+
) }.to raise_error(Imagga::ClientException)
|
74
|
+
end
|
75
|
+
|
76
|
+
context "exception" do
|
77
|
+
before do
|
78
|
+
begin
|
79
|
+
subject.rank(
|
80
|
+
colors: [
|
81
|
+
Imagga::RankColor.new(percent: 60, r: 10, g: 20, b: 30),
|
82
|
+
Imagga::RankColor.new(percent: 20, hex: '#ff00ff'),
|
83
|
+
'39,12,34,123'
|
84
|
+
],
|
85
|
+
type: :overall,
|
86
|
+
dist: 3000,
|
87
|
+
count: 10
|
88
|
+
)
|
89
|
+
rescue Imagga::ClientException => e
|
90
|
+
@exception = e
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it "has message" do
|
95
|
+
@exception.message.should == 'Invalid signature'
|
96
|
+
end
|
97
|
+
|
98
|
+
it "has error code" do
|
99
|
+
@exception.error_code.should == 3
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fake_web'
|
3
|
+
|
4
|
+
class DummyCommand < Imagga::BaseCommand
|
5
|
+
def args(options); options.merge(c: :d); end
|
6
|
+
def service_path; '/service.php'; end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Imagga::BaseCommand do
|
10
|
+
subject { DummyCommand.new('123456', 'secret','http://example.com') }
|
11
|
+
|
12
|
+
it "has api_key" do
|
13
|
+
subject.api_key.should == '123456'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has api_secret" do
|
17
|
+
subject.api_secret.should == 'secret'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has base_uri" do
|
21
|
+
subject.base_uri.should == 'http://example.com'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has class base_uri" do
|
25
|
+
subject.class.base_uri.should == 'http://example.com'
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#execute" do
|
29
|
+
it "sends service request with params and gets and parses json result" do
|
30
|
+
described_class.should_receive(:post).with('/service.php', body: { a: :b, c: :d }) { '{"f": "g"}' }
|
31
|
+
subject.execute(a: :b).should == { 'f' => 'g' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe Imagga::ExtractCommand do
|
37
|
+
subject { described_class.new('123456', 'secret','http://example.com') }
|
38
|
+
|
39
|
+
it "has service_path" do
|
40
|
+
subject.service_path.should == '/colorsearchserver.php'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has options class defined" do
|
44
|
+
subject.options_class.should == Imagga::ExtractOptions
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe Imagga::RankCommand do
|
49
|
+
subject { described_class.new('123456', 'secret','http://example.com') }
|
50
|
+
|
51
|
+
it "has service_path" do
|
52
|
+
subject.service_path.should == '/colorsearchserver.php'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "has options class defined" do
|
56
|
+
subject.options_class.should == Imagga::RankOptions
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe Imagga::CropCommand do
|
61
|
+
subject { described_class.new('123456', 'secret','http://example.com') }
|
62
|
+
|
63
|
+
it "has service_path" do
|
64
|
+
subject.service_path.should == '/extractionrestserver.php'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "has options class defined" do
|
68
|
+
subject.options_class.should == Imagga::CropOptions
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Imagga::CoreClient do
|
4
|
+
|
5
|
+
subject { described_class.new(api_key: '123456', api_secret: 'secret', base_uri: 'http://example.com') }
|
6
|
+
|
7
|
+
it "has api_key" do
|
8
|
+
subject.api_key.should == '123456'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has api_secret" do
|
12
|
+
subject.api_secret.should == 'secret'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has base_uri" do
|
16
|
+
subject.base_uri.should == 'http://example.com'
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#extract" do
|
20
|
+
it "executes extract image info command" do
|
21
|
+
executes_command(Imagga::ExtractCommand, :extract)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#rank" do
|
26
|
+
it "executes rank image command" do
|
27
|
+
executes_command(Imagga::RankCommand, :rank)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#crop" do
|
32
|
+
it "executes crop image command" do
|
33
|
+
executes_command(Imagga::CropCommand, :crop)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def executes_command(command_class, method_name)
|
38
|
+
command = mock
|
39
|
+
command_class.should_receive(:new).with('123456', 'secret', 'http://example.com') { command }
|
40
|
+
command.should_receive(:execute).with(a: :b) { 'result' }
|
41
|
+
subject.send(method_name, a: :b).should == 'result'
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Imagga::CropInfo do
|
4
|
+
let(:crop_info) { JSON.parse(IO.read('./spec/fixtures/crop_response.txt')) }
|
5
|
+
subject { described_class.new(crop_info['smart_croppings'].first) }
|
6
|
+
|
7
|
+
it "has url" do
|
8
|
+
subject.url.should == 'http://www.stockpodium.com/stock-photo-7890736/couple-child-spending-time-together-image.jpg'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has croppings" do
|
12
|
+
subject.croppings.size.should == 3
|
13
|
+
subject.croppings.first.x2.should == 355
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Imagga::CropOptions do
|
4
|
+
subject { described_class.new('apikey', 'secret') }
|
5
|
+
|
6
|
+
describe "#options" do
|
7
|
+
it "builds simple options" do
|
8
|
+
subject.options(
|
9
|
+
urls: 'http://image',
|
10
|
+
resolutions: '100x40,50x100',
|
11
|
+
no_scaling: true
|
12
|
+
).should == {
|
13
|
+
api_key: "apikey",
|
14
|
+
method: "imagga.process.crop",
|
15
|
+
no_scaling: 1,
|
16
|
+
resolutions: "100x40,50x100",
|
17
|
+
sig: "dde5487ab116f710402d7821a241389a",
|
18
|
+
urls: "http://image",
|
19
|
+
v: "1.0"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -1,73 +1,38 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Imagga::ExtractOptions do
|
4
|
+
|
4
5
|
subject { described_class.new('apikey', 'secret') }
|
5
6
|
|
6
7
|
describe "#options" do
|
8
|
+
|
7
9
|
it "builds simple options" do
|
8
|
-
subject.options('http://image').should == {
|
9
|
-
urls:
|
10
|
-
method:
|
11
|
-
sig:
|
10
|
+
subject.options(urls: 'http://image').should == {
|
11
|
+
urls: 'http://image',
|
12
|
+
method: 'imagga.colorsearch.extract',
|
13
|
+
sig: '76e667179a6520da86e272a609bc7fab',
|
12
14
|
api_key: 'apikey',
|
13
|
-
v:
|
15
|
+
v: '1.0'
|
14
16
|
}
|
15
17
|
end
|
16
18
|
|
17
19
|
it "builds complex options" do
|
18
|
-
subject.options(
|
19
|
-
Imagga::Image.new(url: 'http://image1', id: '333'),
|
20
|
-
Imagga::Image.new(url: 'http://image2')
|
21
|
-
], extract_overall_colors: true, extract_object_colors: false).should == {
|
20
|
+
subject.options(
|
22
21
|
urls: 'http://image1,http://image2',
|
23
|
-
ids:
|
22
|
+
ids: '333,0',
|
23
|
+
extract_overall_colors: true,
|
24
|
+
extract_object_colors: false
|
25
|
+
).should == {
|
26
|
+
urls: 'http://image1,http://image2',
|
27
|
+
ids: '333,0',
|
24
28
|
method: 'imagga.colorsearch.extract',
|
25
29
|
extract_overall_colors: 1,
|
26
|
-
extract_object_colors:
|
27
|
-
sig:
|
30
|
+
extract_object_colors: 0,
|
31
|
+
sig: 'd66a0e3409ed08878ce7efae2827de87',
|
28
32
|
api_key: 'apikey',
|
29
33
|
v: '1.0'
|
30
34
|
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "#build_urls" do
|
35
|
-
it "builds string of urls based on single image url string" do
|
36
|
-
subject.build_urls('http://image').should == 'http://image'
|
37
|
-
end
|
38
|
-
|
39
|
-
it "builds string of urls based on image url string arrays" do
|
40
|
-
subject.build_urls(['http://image1', 'http://image2']).should == 'http://image1,http://image2'
|
41
|
-
end
|
42
|
-
|
43
|
-
it "builds string of urls based on single image object" do
|
44
|
-
subject.build_urls(Imagga::Image.new(url: 'http://image')).should == 'http://image'
|
45
|
-
end
|
46
|
-
|
47
|
-
it "builds string of urls based on image object array" do
|
48
|
-
subject.build_urls([
|
49
|
-
Imagga::Image.new(url: 'http://image1'),
|
50
|
-
Imagga::Image.new(url: 'http://image2')]).should == 'http://image1,http://image2'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe "#build_ids" do
|
55
|
-
it "returns 0 based on single image url string" do
|
56
|
-
subject.build_ids('http://image').should == nil
|
57
|
-
end
|
58
|
-
|
59
|
-
it "returns array of 0-s given image url string arrays" do
|
60
|
-
subject.build_ids(['http://image1', 'http://image2']).should == nil
|
61
|
-
end
|
62
|
-
|
63
|
-
it "builds string of ids based on single image object" do
|
64
|
-
subject.build_ids(Imagga::Image.new(url: 'http://image', id: '123')).should == '123'
|
65
|
-
end
|
66
35
|
|
67
|
-
it "builds string of ids based on image object array" do
|
68
|
-
subject.build_ids([
|
69
|
-
Imagga::Image.new(url: 'http://image1', id: '123'),
|
70
|
-
Imagga::Image.new(url: 'http://image2')]).should == '123,0'
|
71
36
|
end
|
72
37
|
end
|
73
38
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Imagga::ImageCrop do
|
4
|
+
subject { described_class.new(
|
5
|
+
'target_width' => 10,
|
6
|
+
'target_height' => 22,
|
7
|
+
'x1' => 33, 'y1' => 44,
|
8
|
+
'x2' => 55, 'y2' => 66
|
9
|
+
) }
|
10
|
+
|
11
|
+
it "has target_widht" do
|
12
|
+
subject.target_width.should == 10
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has target height" do
|
16
|
+
subject.target_height.should == 22
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has x1 and y1" do
|
20
|
+
subject.x1.should == 33
|
21
|
+
subject.y1.should == 44
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has x2 and y2" do
|
25
|
+
subject.x2.should == 55
|
26
|
+
subject.y2.should == 66
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#info" do
|
30
|
+
it 'returns infor string about the crop suggestions' do
|
31
|
+
subject.info.should == 'target: (10,22), crop: (33, 44) to (55, 66)'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Imagga::ImageOrUrlParametizer do
|
4
|
+
subject { described_class.new }
|
5
|
+
|
6
|
+
describe "#parametrize" do
|
7
|
+
it "builds string of urls based on single image url string" do
|
8
|
+
subject.parametrize('http://image').should == { urls: 'http://image' }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "builds string of urls based on image url string arrays" do
|
12
|
+
subject.parametrize(['http://image1', 'http://image2']).should == { urls: 'http://image1,http://image2' }
|
13
|
+
end
|
14
|
+
|
15
|
+
it "builds string of urls based on single image object" do
|
16
|
+
subject.parametrize(Imagga::Image.new(url: 'http://image', id: '99')).should == { urls: 'http://image', ids: '99' }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "builds string of urls based on image object array" do
|
20
|
+
subject.parametrize([
|
21
|
+
Imagga::Image.new(url: 'http://image1', id: '333'),
|
22
|
+
Imagga::Image.new(url: 'http://image2')]).should == { urls: 'http://image1,http://image2', ids: '333,0' }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#build_urls" do
|
27
|
+
it "builds string of urls based on single image url string" do
|
28
|
+
subject.build_urls('http://image').should == { urls: 'http://image' }
|
29
|
+
end
|
30
|
+
|
31
|
+
it "builds string of urls based on image url string arrays" do
|
32
|
+
subject.build_urls(['http://image1', 'http://image2']).should == { urls: 'http://image1,http://image2' }
|
33
|
+
end
|
34
|
+
|
35
|
+
it "builds string of urls based on single image object" do
|
36
|
+
subject.build_urls(Imagga::Image.new(url: 'http://image')).should == { urls: 'http://image' }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "builds string of urls based on image object array" do
|
40
|
+
subject.build_urls([
|
41
|
+
Imagga::Image.new(url: 'http://image1'),
|
42
|
+
Imagga::Image.new(url: 'http://image2')]).should == { urls: 'http://image1,http://image2' }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#build_comma_separated_string" do
|
47
|
+
it "returns 0 based on single image url string" do
|
48
|
+
subject.build_ids('http://image').should == { ids: nil }
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns array of 0-s given image url string arrays" do
|
52
|
+
subject.build_ids(['http://image1', 'http://image2']).should == { ids: nil }
|
53
|
+
end
|
54
|
+
|
55
|
+
it "builds string of ids based on single image object" do
|
56
|
+
subject.build_ids(Imagga::Image.new(url: 'http://image', id: '123')).should == { ids: '123' }
|
57
|
+
end
|
58
|
+
|
59
|
+
it "builds string of ids based on image object array" do
|
60
|
+
subject.build_ids([
|
61
|
+
Imagga::Image.new(url: 'http://image1', id: '123'),
|
62
|
+
Imagga::Image.new(url: 'http://image2')]).should == { ids: '123,0' }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|