ruby-thumbor 1.3.0 → 4.0.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 +5 -5
- data/README.md +83 -0
- data/lib/ruby-thumbor.rb +2 -10
- data/lib/thumbor/cascade.rb +32 -27
- data/lib/thumbor/crypto_url.rb +154 -202
- data/lib/thumbor/version.rb +3 -1
- data/spec/spec_helper.rb +20 -5
- data/spec/thumbor/cascade_spec.rb +188 -380
- metadata +52 -58
- data/README.rdoc +0 -98
- data/spec/thumbor/crypto_url_spec.rb +0 -471
- data/spec/util/thumbor.rb +0 -7
|
@@ -1,512 +1,320 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'json'
|
|
3
5
|
require 'ruby-thumbor'
|
|
4
|
-
require 'util/thumbor'
|
|
5
6
|
|
|
6
7
|
describe Thumbor::Cascade do
|
|
7
8
|
let(:image_url) { 'my.domain.com/some/image/url.jpg' }
|
|
8
|
-
let(:image_md5) { 'f33af67e41168e80fcc5b00f8bd8061a' }
|
|
9
9
|
let(:key) { 'my-security-key' }
|
|
10
10
|
|
|
11
|
-
subject { Thumbor::Cascade.new image_url }
|
|
12
|
-
|
|
13
|
-
after(:each) do
|
|
14
|
-
Thumbor.key = nil
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#new' do
|
|
18
|
-
before do
|
|
19
|
-
Thumbor.key = key
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should create a new instance passing key and keep it" do
|
|
23
|
-
expect(subject.computed_key).to eq 'my-security-keym'
|
|
24
|
-
end
|
|
25
|
-
end
|
|
11
|
+
subject { Thumbor::Cascade.new key, image_url }
|
|
26
12
|
|
|
27
13
|
it 'should raise an error' do
|
|
28
|
-
expect{ subject.god_of_war_crop }.to raise_error(NoMethodError)
|
|
14
|
+
expect { subject.god_of_war_crop }.to raise_error(NoMethodError)
|
|
29
15
|
end
|
|
30
16
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
url = subject.url_for
|
|
35
|
-
expect(url).to eq image_md5
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should raise if no image passed" do
|
|
39
|
-
expect { Thumbor::Cascade.new.url_for }.to raise_error(RuntimeError)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
it "should return proper url for width-only" do
|
|
43
|
-
url = subject.width(300).url_for
|
|
44
|
-
expect(url).to eq '300x0/' << image_md5
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should return proper url for height-only" do
|
|
48
|
-
url = subject.height(300).url_for
|
|
49
|
-
expect(url).to eq '0x300/' << image_md5
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should return proper url for width and height" do
|
|
53
|
-
url = subject.width(200).height(300).url_for
|
|
54
|
-
expect(url).to eq '200x300/' << image_md5
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should return proper smart url" do
|
|
58
|
-
url = subject.width(200).height(300).smart(true).url_for
|
|
59
|
-
expect(url).to eq '200x300/smart/' << image_md5
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should return proper fit-in url" do
|
|
63
|
-
url = subject.width(200).height(300).fit_in(true).url_for
|
|
64
|
-
expect(url).to eq 'fit-in/200x300/' << image_md5
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "should return proper adaptive-fit-in url" do
|
|
68
|
-
url = subject.width(200).height(300).adaptive_fit_in(true).url_for
|
|
69
|
-
expect(url).to eq 'adaptive-fit-in/200x300/' << image_md5
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it "should return proper full-fit-in url" do
|
|
73
|
-
url = subject.width(200).height(300).full_fit_in(true).url_for
|
|
74
|
-
expect(url).to eq 'full-fit-in/200x300/' << image_md5
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should return proper adaptive-full-fit-in url" do
|
|
78
|
-
url = subject.width(200).height(300).adaptive_full_fit_in(true).url_for
|
|
79
|
-
expect(url).to eq 'adaptive-full-fit-in/200x300/' << image_md5
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
[:fit_in, :full_fit_in].each do |fit|
|
|
83
|
-
it "should raise error when using #{fit} without width or height" do
|
|
84
|
-
subject.send(fit, true)
|
|
85
|
-
expect{subject.url_for}.to raise_error(ArgumentError)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
17
|
+
it 'should respond to filter methods' do
|
|
18
|
+
expect(subject.respond_to?('quality_filter')).to be_truthy
|
|
19
|
+
end
|
|
88
20
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
21
|
+
describe '#generate' do
|
|
22
|
+
it 'should create an unsafe url' do
|
|
23
|
+
url = Thumbor::Cascade.new(nil, image_url).width(300).height(200).generate
|
|
24
|
+
expect(url).to eq '/unsafe/300x200/my.domain.com/some/image/url.jpg'
|
|
92
25
|
end
|
|
93
26
|
|
|
94
|
-
it
|
|
95
|
-
url = subject.
|
|
96
|
-
expect(url).to eq '
|
|
27
|
+
it 'should create an url with debug' do
|
|
28
|
+
url = subject.debug(true).height(200).generate
|
|
29
|
+
expect(url).to eq '/5_eX4HHQYk81HQVkc1gBIAvPbLo=/debug/0x200/my.domain.com/some/image/url.jpg'
|
|
97
30
|
end
|
|
98
31
|
|
|
99
|
-
it
|
|
100
|
-
url = subject.
|
|
101
|
-
expect(url).to eq '
|
|
32
|
+
it 'should create a new instance passing key and keep it' do
|
|
33
|
+
url = subject.width(300).height(200).generate
|
|
34
|
+
expect(url).to eq '/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg'
|
|
102
35
|
end
|
|
103
36
|
|
|
104
|
-
it
|
|
105
|
-
|
|
106
|
-
|
|
37
|
+
it 'should be able to change the Thumbor key' do
|
|
38
|
+
url1 = subject.width(300).height(200).generate
|
|
39
|
+
url2 = Thumbor::Cascade.new('another-thumbor-key', image_url).width(300).height(200).generate
|
|
40
|
+
expect(url1).not_to eq url2
|
|
107
41
|
end
|
|
108
42
|
|
|
109
|
-
it
|
|
110
|
-
url = subject.
|
|
111
|
-
expect(url).to eq '
|
|
43
|
+
it 'should create a new instance passing key and keep it' do
|
|
44
|
+
url = subject.width(300).height(200).meta(true).generate
|
|
45
|
+
expect(url).to eq '/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg'
|
|
112
46
|
end
|
|
113
47
|
|
|
114
|
-
it
|
|
115
|
-
url = subject.
|
|
116
|
-
expect(url).to eq '
|
|
48
|
+
it 'should create a new instance passing key and keep it' do
|
|
49
|
+
url = subject.width(300).height(200).meta(true).smart(true).generate
|
|
50
|
+
expect(url).to eq '/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg'
|
|
117
51
|
end
|
|
118
52
|
|
|
119
|
-
it
|
|
120
|
-
url = subject.
|
|
121
|
-
expect(url).to eq
|
|
53
|
+
it 'should create a new instance passing key and keep it' do
|
|
54
|
+
url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).generate
|
|
55
|
+
expect(url).to eq '/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg'
|
|
122
56
|
end
|
|
123
57
|
|
|
124
|
-
it
|
|
125
|
-
url = subject.
|
|
126
|
-
expect(url).to eq '
|
|
58
|
+
it 'should create a new instance passing key and keep it' do
|
|
59
|
+
url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).generate
|
|
60
|
+
expect(url).to eq '/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg'
|
|
127
61
|
end
|
|
128
62
|
|
|
129
|
-
it
|
|
130
|
-
url = subject.
|
|
131
|
-
expect(url).to eq
|
|
63
|
+
it 'should create a new instance passing key and keep it' do
|
|
64
|
+
url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).flop(true).generate
|
|
65
|
+
expect(url).to eq '/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg'
|
|
132
66
|
end
|
|
133
67
|
|
|
134
|
-
it
|
|
135
|
-
url = subject.
|
|
136
|
-
expect(url).to eq '
|
|
68
|
+
it 'should create a new instance passing key and keep it' do
|
|
69
|
+
url = subject.quality_filter(20).brightness_filter(10).generate
|
|
70
|
+
expect(url).to eq '/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg'
|
|
137
71
|
end
|
|
138
72
|
|
|
139
|
-
it
|
|
140
|
-
url = subject.
|
|
141
|
-
expect(url).to eq '
|
|
73
|
+
it 'should return just the image hash if no arguments passed' do
|
|
74
|
+
url = subject.generate
|
|
75
|
+
expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
|
|
142
76
|
end
|
|
143
77
|
|
|
144
|
-
it
|
|
145
|
-
|
|
146
|
-
expect(url).to eq '10x20:30x40/' << image_md5
|
|
78
|
+
it 'should raise if no image passed' do
|
|
79
|
+
expect { Thumbor::Cascade.new.generate }.to raise_error(RuntimeError)
|
|
147
80
|
end
|
|
148
81
|
|
|
149
|
-
it
|
|
150
|
-
url = subject.
|
|
151
|
-
expect(url).to eq '
|
|
82
|
+
it 'should return proper url for width-only' do
|
|
83
|
+
url = subject.width(300).generate
|
|
84
|
+
expect(url).to eq '/eFwrBWryxtRw9hDSbQPhi5iLpo8=/300x0/my.domain.com/some/image/url.jpg'
|
|
152
85
|
end
|
|
153
86
|
|
|
154
|
-
it
|
|
155
|
-
url = subject.
|
|
156
|
-
expect(url).to eq
|
|
87
|
+
it 'should return proper url for height-only' do
|
|
88
|
+
url = subject.height(300).generate
|
|
89
|
+
expect(url).to eq '/-VGIgp7g8cMKcfF2gFK9ZpmB_5w=/0x300/my.domain.com/some/image/url.jpg'
|
|
157
90
|
end
|
|
158
91
|
|
|
159
|
-
it
|
|
160
|
-
url = subject.
|
|
161
|
-
expect(url).to eq '
|
|
92
|
+
it 'should return proper url for width and height' do
|
|
93
|
+
url = subject.width(200).height(300).generate
|
|
94
|
+
expect(url).to eq '/TrM0qqfcivb6VxS3Hxlxn43W21k=/200x300/my.domain.com/some/image/url.jpg'
|
|
162
95
|
end
|
|
163
96
|
|
|
164
|
-
it
|
|
165
|
-
url = subject.
|
|
166
|
-
expect(url).to eq '
|
|
97
|
+
it 'should return proper smart url' do
|
|
98
|
+
url = subject.width(200).height(300).smart(true).generate
|
|
99
|
+
expect(url).to eq '/hdzhxXzK45DzNTru5urV6x6xxSs=/200x300/smart/my.domain.com/some/image/url.jpg'
|
|
167
100
|
end
|
|
168
101
|
|
|
169
|
-
it
|
|
170
|
-
url = subject.
|
|
171
|
-
expect(url).to eq '
|
|
102
|
+
it 'should return proper fit-in url' do
|
|
103
|
+
url = subject.width(200).height(300).fit_in(true).generate
|
|
104
|
+
expect(url).to eq '/LOv6ArMOJA2VRpfMQjjs4xSyZpM=/fit-in/200x300/my.domain.com/some/image/url.jpg'
|
|
172
105
|
end
|
|
173
106
|
|
|
174
|
-
it
|
|
175
|
-
url = subject.
|
|
176
|
-
expect(url).to eq '
|
|
107
|
+
it 'should return proper adaptive-fit-in url' do
|
|
108
|
+
url = subject.width(200).height(300).adaptive_fit_in(true).generate
|
|
109
|
+
expect(url).to eq '/V2xmSmQZm4i5-0Flx8iuRtawOkg=/adaptive-fit-in/200x300/my.domain.com/some/image/url.jpg'
|
|
177
110
|
end
|
|
178
111
|
|
|
179
|
-
it
|
|
180
|
-
url = subject.
|
|
181
|
-
expect(url).to eq '
|
|
112
|
+
it 'should return proper full-fit-in url' do
|
|
113
|
+
url = subject.width(200).height(300).full_fit_in(true).generate
|
|
114
|
+
expect(url).to eq '/geXhR7ZFxztQTsKzmkDxYCX-HHg=/full-fit-in/200x300/my.domain.com/some/image/url.jpg'
|
|
182
115
|
end
|
|
183
116
|
|
|
184
|
-
it
|
|
185
|
-
url = subject.
|
|
186
|
-
expect(url).to eq '
|
|
117
|
+
it 'should return proper adaptive-full-fit-in url' do
|
|
118
|
+
url = subject.width(200).height(300).adaptive_full_fit_in(true).generate
|
|
119
|
+
expect(url).to eq '/jlUfjdC-6rG6jmuHgFp6eKgPy2g=/adaptive-full-fit-in/200x300/my.domain.com/some/image/url.jpg'
|
|
187
120
|
end
|
|
188
121
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
122
|
+
%i[fit_in full_fit_in].each do |fit|
|
|
123
|
+
it "should raise error when using #{fit} without width or height" do
|
|
124
|
+
subject.send(fit, true)
|
|
125
|
+
expect { subject.generate }.to raise_error(ArgumentError)
|
|
126
|
+
end
|
|
192
127
|
end
|
|
193
128
|
|
|
194
|
-
it
|
|
195
|
-
url = subject.
|
|
196
|
-
expect(url).to eq '
|
|
129
|
+
it 'should return proper flip url if no width and height' do
|
|
130
|
+
url = subject.flip(true).generate
|
|
131
|
+
expect(url).to eq '/rlI4clPR-p-PR2QAxj5ZWiTfvH4=/-0x0/my.domain.com/some/image/url.jpg'
|
|
197
132
|
end
|
|
198
133
|
|
|
199
|
-
it
|
|
200
|
-
url = subject.
|
|
201
|
-
expect(url).to eq '
|
|
134
|
+
it 'should return proper flop url if no width and height' do
|
|
135
|
+
url = subject.flop(true).generate
|
|
136
|
+
expect(url).to eq '/-4dmGj-TwIEqTAL9_9yEqUM8cks=/0x-0/my.domain.com/some/image/url.jpg'
|
|
202
137
|
end
|
|
203
138
|
|
|
204
|
-
it
|
|
205
|
-
url = subject.
|
|
206
|
-
expect(url).to eq '
|
|
139
|
+
it 'should return proper flip-flop url if no width and height' do
|
|
140
|
+
url = subject.flip(true).flop(true).generate
|
|
141
|
+
expect(url).to eq '/FnMxpQMmxiMpdG219Dsj8pD_4Xc=/-0x-0/my.domain.com/some/image/url.jpg'
|
|
207
142
|
end
|
|
208
143
|
|
|
209
|
-
it
|
|
210
|
-
url = subject.
|
|
211
|
-
expect(url).to eq '
|
|
144
|
+
it 'should return proper flip url if width' do
|
|
145
|
+
url = subject.width(300).flip(true).generate
|
|
146
|
+
expect(url).to eq '/ccr2PoSYcTEGL4_Wzt4u3wWVRKU=/-300x0/my.domain.com/some/image/url.jpg'
|
|
212
147
|
end
|
|
213
148
|
|
|
214
|
-
it
|
|
215
|
-
url = subject.
|
|
216
|
-
expect(url).to eq '
|
|
149
|
+
it 'should return proper flop url if height' do
|
|
150
|
+
url = subject.height(300).flop(true).generate
|
|
151
|
+
expect(url).to eq '/R5K91tkyNgXO65F6E0txgA6C9lY=/0x-300/my.domain.com/some/image/url.jpg'
|
|
217
152
|
end
|
|
218
153
|
|
|
219
|
-
it
|
|
220
|
-
url = subject.
|
|
221
|
-
expect(url).to eq '
|
|
154
|
+
it 'should return horizontal align' do
|
|
155
|
+
url = subject.halign(:left).generate
|
|
156
|
+
expect(url).to eq '/GTJE3wUt3sURik0O9Nae8sfI928=/left/my.domain.com/some/image/url.jpg'
|
|
222
157
|
end
|
|
223
158
|
|
|
224
|
-
it
|
|
225
|
-
url = subject.
|
|
226
|
-
expect(url).to eq '
|
|
159
|
+
it 'should not return horizontal align if it is center' do
|
|
160
|
+
url = subject.halign(:center).generate
|
|
161
|
+
expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
|
|
227
162
|
end
|
|
228
163
|
|
|
229
|
-
it
|
|
230
|
-
url = subject.
|
|
231
|
-
expect(url).to eq '
|
|
164
|
+
it 'should return vertical align' do
|
|
165
|
+
url = subject.valign(:top).generate
|
|
166
|
+
expect(url).to eq '/1QQo5ihObuhgwl95--Z3g78vjiE=/top/my.domain.com/some/image/url.jpg'
|
|
232
167
|
end
|
|
233
168
|
|
|
234
|
-
it
|
|
235
|
-
|
|
169
|
+
it 'should not return vertical align if it is middle' do
|
|
170
|
+
url = subject.valign(:middle).generate
|
|
171
|
+
expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
|
|
236
172
|
end
|
|
237
173
|
|
|
238
|
-
it
|
|
239
|
-
url = subject.
|
|
240
|
-
expect(url).to eq '
|
|
174
|
+
it 'should return halign and valign properly' do
|
|
175
|
+
url = subject.halign(:left).valign(:top).generate
|
|
176
|
+
expect(url).to eq '/yA2rmtWv_uzHd9klz5OuMIZ5auI=/left/top/my.domain.com/some/image/url.jpg'
|
|
241
177
|
end
|
|
242
178
|
|
|
243
|
-
it
|
|
244
|
-
url = subject.
|
|
245
|
-
expect(url).to eq '
|
|
179
|
+
it 'should return meta properly' do
|
|
180
|
+
url = subject.meta(true).generate
|
|
181
|
+
expect(url).to eq '/WvIJFDJDePgIl5hZcLgtrzIPxfY=/meta/my.domain.com/some/image/url.jpg'
|
|
246
182
|
end
|
|
247
183
|
|
|
248
|
-
it
|
|
249
|
-
url = subject.
|
|
250
|
-
expect(url).to eq
|
|
184
|
+
it 'should return proper crop url when param is array' do
|
|
185
|
+
url = subject.crop([10, 20, 30, 40]).generate
|
|
186
|
+
expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
|
|
251
187
|
end
|
|
252
188
|
|
|
253
|
-
it
|
|
254
|
-
url = subject.
|
|
255
|
-
expect(url).to eq '
|
|
189
|
+
it 'should return proper crop url' do
|
|
190
|
+
url = subject.crop(10, 20, 30, 40).generate
|
|
191
|
+
expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
|
|
256
192
|
end
|
|
257
193
|
|
|
258
|
-
it
|
|
259
|
-
url = subject.
|
|
260
|
-
expect(url).to eq '
|
|
194
|
+
it 'should ignore crop if all zeros' do
|
|
195
|
+
url = subject.crop(0, 0, 0, 0).generate
|
|
196
|
+
expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
|
|
261
197
|
end
|
|
262
198
|
|
|
263
|
-
it
|
|
264
|
-
url = subject.
|
|
265
|
-
expect(url).to eq '
|
|
199
|
+
it 'should have smart after halign and valign' do
|
|
200
|
+
url = subject.halign(:left).valign(:top).smart(true).generate
|
|
201
|
+
expect(url).to eq '/KS6mVuzlGE3hJ75n3JUonfGgSFM=/left/top/smart/my.domain.com/some/image/url.jpg'
|
|
266
202
|
end
|
|
267
203
|
|
|
268
|
-
it
|
|
269
|
-
url = subject.
|
|
270
|
-
expect(url).to eq '
|
|
204
|
+
it 'should have quality filter' do
|
|
205
|
+
url = subject.quality_filter(20).generate
|
|
206
|
+
expect(url).to eq '/NyA-is4NojxiRqo0NcmJDhB6GTs=/filters:quality(20)/my.domain.com/some/image/url.jpg'
|
|
271
207
|
end
|
|
272
208
|
|
|
273
|
-
it
|
|
274
|
-
url = subject.
|
|
275
|
-
expect(url).to eq '
|
|
209
|
+
it 'should have brightness filter' do
|
|
210
|
+
url = subject.brightness_filter(30).generate
|
|
211
|
+
expect(url).to eq '/oXDmnGD7vQV-rXcj8kCl1tcS3jc=/filters:brightness(30)/my.domain.com/some/image/url.jpg'
|
|
276
212
|
end
|
|
277
|
-
end
|
|
278
213
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
214
|
+
it 'should have 2 filters' do
|
|
215
|
+
url = subject.brightness_filter(30).quality_filter(20).generate
|
|
216
|
+
expect(url).to eq '/SW9o4xQG1QAzE69WzEzarL_G3MI=/filters:brightness(30):quality(20)/my.domain.com/some/image/url.jpg'
|
|
282
217
|
end
|
|
283
218
|
|
|
284
|
-
it
|
|
285
|
-
url = subject.
|
|
286
|
-
expect(url).to eq '/
|
|
219
|
+
it 'should escape url args' do
|
|
220
|
+
url = subject.watermark_filter('http://my-server.com/image.png', 30).quality_filter(20).generate
|
|
221
|
+
expect(url).to eq '/4b9kwg0-zsojf7Ed01TPKPYOel4=/filters:watermark(http%3A%2F%2Fmy-server.com%2Fimage.png,30):quality(20)/my.domain.com/some/image/url.jpg'
|
|
287
222
|
end
|
|
288
223
|
|
|
289
|
-
it
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
Thumbor.key = 'another-thumbor-key'
|
|
293
|
-
url2 = thumbor.generate
|
|
294
|
-
expect(url1).not_to eq url2
|
|
224
|
+
it 'should have trim without params' do
|
|
225
|
+
url = subject.trim.generate
|
|
226
|
+
expect(url).to eq '/w23BC0dUiYBFrUnuoYJe8XROuyw=/trim/my.domain.com/some/image/url.jpg'
|
|
295
227
|
end
|
|
296
228
|
|
|
297
|
-
it
|
|
298
|
-
url = subject.
|
|
299
|
-
expect(url).to eq '/
|
|
229
|
+
it 'should have trim with direction param' do
|
|
230
|
+
url = subject.trim('bottom-right').generate
|
|
231
|
+
expect(url).to eq '/kXPwSmqEvPFQezgzBCv9BtPWmBY=/trim:bottom-right/my.domain.com/some/image/url.jpg'
|
|
300
232
|
end
|
|
301
233
|
|
|
302
|
-
it
|
|
303
|
-
url = subject.
|
|
304
|
-
expect(url).to eq '/
|
|
234
|
+
it 'should have trim with direction and tolerance param' do
|
|
235
|
+
url = subject.trim('bottom-right', 15).generate
|
|
236
|
+
expect(url).to eq '/TUCEIhtWfI1Uv9zjavCSl_i0A_8=/trim:bottom-right:15/my.domain.com/some/image/url.jpg'
|
|
305
237
|
end
|
|
306
238
|
|
|
307
|
-
it
|
|
308
|
-
url = subject.
|
|
309
|
-
expect(url).to eq '/
|
|
239
|
+
it 'should have the right crop when cropping horizontally and given a left center' do
|
|
240
|
+
url = subject.original_width(100).original_height(100).width(40).height(50).center(0, 50).generate
|
|
241
|
+
expect(url).to eq '/SZIT3w4Qgebv5DuVJ8G1IH1mkCU=/0x0:80x100/40x50/my.domain.com/some/image/url.jpg'
|
|
310
242
|
end
|
|
311
243
|
|
|
312
|
-
it
|
|
313
|
-
url = subject.
|
|
314
|
-
expect(url).to eq '/
|
|
244
|
+
it 'should have the right crop when cropping horizontally and given a right center' do
|
|
245
|
+
url = subject.original_width(100).original_height(100).width(40).height(50).center(100, 50).generate
|
|
246
|
+
expect(url).to eq '/NEtCYehaISE7qR3zFj15CxnZoCs=/20x0:100x100/40x50/my.domain.com/some/image/url.jpg'
|
|
315
247
|
end
|
|
316
248
|
|
|
317
|
-
it
|
|
318
|
-
url = subject.
|
|
319
|
-
expect(url).to eq '/
|
|
249
|
+
it 'should have the right crop when cropping horizontally and given the actual center' do
|
|
250
|
+
url = subject.original_width(100).original_height(100).width(40).height(50).center(50, 50).generate
|
|
251
|
+
expect(url).to eq '/JLH65vJTu6d-cXBmqe5hYoSD4ho=/10x0:90x100/40x50/my.domain.com/some/image/url.jpg'
|
|
320
252
|
end
|
|
321
253
|
|
|
322
|
-
it
|
|
323
|
-
url = subject.
|
|
324
|
-
expect(url).to eq '/
|
|
254
|
+
it 'should have the right crop when cropping vertically and given a top center' do
|
|
255
|
+
url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 0).generate
|
|
256
|
+
expect(url).to eq '/FIMZcLatW6bjgSRH9xTkEwUZAZ8=/0x0:100x80/50x40/my.domain.com/some/image/url.jpg'
|
|
325
257
|
end
|
|
326
|
-
end
|
|
327
258
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
259
|
+
it 'should have the right crop when cropping vertically and given a bottom center' do
|
|
260
|
+
url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 100).generate
|
|
261
|
+
expect(url).to eq '/9Ud0sVo6i9DLOjlKbQP_4JXgFmA=/0x20:100x100/50x40/my.domain.com/some/image/url.jpg'
|
|
331
262
|
end
|
|
332
263
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
url = subject.width(300).height(200).generate
|
|
337
|
-
expect(url).to eq '/qkLDiIbvtiks0Up9n5PACtmpOfX6dPXw4vP4kJU-jTfyF6y1GJBJyp7CHYh1H3R2/' << image_url
|
|
264
|
+
it 'should have the right crop when cropping vertically and given the actual center' do
|
|
265
|
+
url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 50).generate
|
|
266
|
+
expect(url).to eq '/WejLJn8djJLn7DkMUq3S0zZCvZE=/0x10:100x90/50x40/my.domain.com/some/image/url.jpg'
|
|
338
267
|
end
|
|
339
268
|
|
|
340
|
-
it
|
|
341
|
-
url = subject.width(
|
|
342
|
-
|
|
343
|
-
encrypted = url.split('/')[1]
|
|
344
|
-
|
|
345
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
346
|
-
|
|
347
|
-
expect(decrypted["horizontal_flip"]).to eq false
|
|
348
|
-
expect(decrypted["vertical_flip"]).to eq false
|
|
349
|
-
expect(decrypted["smart"]).to eq false
|
|
350
|
-
expect(decrypted["meta"]).to eq false
|
|
351
|
-
expect(decrypted["fit_in"]).to eq false
|
|
352
|
-
expect(decrypted["crop"]["left"]).to eq 0
|
|
353
|
-
expect(decrypted["crop"]["top"]).to eq 0
|
|
354
|
-
expect(decrypted["crop"]["right"]).to eq 0
|
|
355
|
-
expect(decrypted["crop"]["bottom"]).to eq 0
|
|
356
|
-
expect(decrypted["valign"]).to eq 'middle'
|
|
357
|
-
expect(decrypted["halign"]).to eq 'center'
|
|
358
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
359
|
-
expect(decrypted["width"]).to eq 300
|
|
360
|
-
expect(decrypted["height"]).to eq 200
|
|
361
|
-
|
|
269
|
+
it 'should have the no crop when not necessary' do
|
|
270
|
+
url = subject.original_width(100).original_height(100).width(50).height(50).center(50, 0).generate
|
|
271
|
+
expect(url).to eq '/trIjfr513nkGkCpKXK6qgox2jPA=/50x50/my.domain.com/some/image/url.jpg'
|
|
362
272
|
end
|
|
363
273
|
|
|
364
|
-
it
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
370
|
-
|
|
371
|
-
expect(decrypted["meta"]).to eq true
|
|
372
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
373
|
-
expect(decrypted["width"]).to eq 300
|
|
374
|
-
expect(decrypted["height"]).to eq 200
|
|
375
|
-
|
|
274
|
+
it 'should blow up with a bad center' do
|
|
275
|
+
expect do
|
|
276
|
+
subject.original_width(100).original_height(100).width(50).height(50).center(50).generate
|
|
277
|
+
end.to raise_error(RuntimeError)
|
|
376
278
|
end
|
|
377
279
|
|
|
378
|
-
it
|
|
379
|
-
url = subject.
|
|
380
|
-
|
|
381
|
-
encrypted = url.split('/')[1]
|
|
382
|
-
|
|
383
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
384
|
-
|
|
385
|
-
expect(decrypted["meta"]).to eq true
|
|
386
|
-
expect(decrypted["smart"]).to eq true
|
|
387
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
388
|
-
expect(decrypted["width"]).to eq 300
|
|
389
|
-
expect(decrypted["height"]).to eq 200
|
|
390
|
-
|
|
280
|
+
it 'should have no crop with a missing original_height' do
|
|
281
|
+
url = subject.original_width(100).width(50).height(40).center(50, 0).generate
|
|
282
|
+
expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
|
|
391
283
|
end
|
|
392
284
|
|
|
393
|
-
it
|
|
394
|
-
url = subject.width(
|
|
395
|
-
|
|
396
|
-
encrypted = url.split('/')[1]
|
|
397
|
-
|
|
398
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
399
|
-
|
|
400
|
-
expect(decrypted["fit_in"]).to eq true
|
|
401
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
402
|
-
expect(decrypted["width"]).to eq 300
|
|
403
|
-
expect(decrypted["height"]).to eq 200
|
|
404
|
-
|
|
285
|
+
it 'should have no crop with a missing original_width' do
|
|
286
|
+
url = subject.original_height(100).width(50).height(40).center(50, 0).generate
|
|
287
|
+
expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
|
|
405
288
|
end
|
|
406
289
|
|
|
407
|
-
it
|
|
408
|
-
url = subject.
|
|
409
|
-
|
|
410
|
-
encrypted = url.split('/')[1]
|
|
411
|
-
|
|
412
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
413
|
-
|
|
414
|
-
expect(decrypted["meta"]).to eq true
|
|
415
|
-
expect(decrypted["smart"]).to eq true
|
|
416
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
417
|
-
expect(decrypted["width"]).to eq 300
|
|
418
|
-
expect(decrypted["height"]).to eq 200
|
|
419
|
-
expect(decrypted["horizontal_flip"]).to eq true
|
|
420
|
-
|
|
290
|
+
it 'should have no crop with out a width and height' do
|
|
291
|
+
url = subject.original_width(100).original_height(100).center(50, 50).generate
|
|
292
|
+
expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
|
|
421
293
|
end
|
|
422
294
|
|
|
423
|
-
it
|
|
424
|
-
url = subject.
|
|
425
|
-
|
|
426
|
-
encrypted = url.split('/')[1]
|
|
427
|
-
|
|
428
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
429
|
-
|
|
430
|
-
expect(decrypted["meta"]).to eq true
|
|
431
|
-
expect(decrypted["smart"]).to eq true
|
|
432
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
433
|
-
expect(decrypted["width"]).to eq 300
|
|
434
|
-
expect(decrypted["height"]).to eq 200
|
|
435
|
-
expect(decrypted["horizontal_flip"]).to eq true
|
|
436
|
-
expect(decrypted["vertical_flip"]).to eq true
|
|
437
|
-
|
|
295
|
+
it 'should use the original width with a missing width' do
|
|
296
|
+
url = subject.original_width(100).original_height(100).height(80).center(50, 50).generate
|
|
297
|
+
expect(url).to eq '/02BNIIJ9NYNV9Q03JHPtlP0DIDg=/0x10:100x90/0x80/my.domain.com/some/image/url.jpg'
|
|
438
298
|
end
|
|
439
299
|
|
|
440
|
-
it
|
|
441
|
-
url = subject.
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
encrypted = url.split('/')[1]
|
|
445
|
-
|
|
446
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
447
|
-
|
|
448
|
-
expect(decrypted["meta"]).to eq true
|
|
449
|
-
expect(decrypted["smart"]).to eq true
|
|
450
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
451
|
-
expect(decrypted["width"]).to eq 300
|
|
452
|
-
expect(decrypted["height"]).to eq 200
|
|
453
|
-
expect(decrypted["horizontal_flip"]).to eq true
|
|
454
|
-
expect(decrypted["vertical_flip"]).to eq true
|
|
455
|
-
expect(decrypted["halign"]).to eq "left"
|
|
456
|
-
|
|
300
|
+
it 'should use the original height with a missing height' do
|
|
301
|
+
url = subject.original_width(100).original_height(100).width(80).center(50, 50).generate
|
|
302
|
+
expect(url).to eq '/0XL5BmMi3vlJQfw6aGOVW-M1vVI=/10x0:90x100/80x0/my.domain.com/some/image/url.jpg'
|
|
457
303
|
end
|
|
458
304
|
|
|
459
|
-
it
|
|
460
|
-
url = subject.
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
encrypted = url.split('/')[1]
|
|
464
|
-
|
|
465
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
466
|
-
|
|
467
|
-
expect(decrypted["meta"]).to eq true
|
|
468
|
-
expect(decrypted["smart"]).to eq true
|
|
469
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
470
|
-
expect(decrypted["width"]).to eq 300
|
|
471
|
-
expect(decrypted["height"]).to eq 200
|
|
472
|
-
expect(decrypted["horizontal_flip"]).to eq true
|
|
473
|
-
expect(decrypted["vertical_flip"]).to eq true
|
|
474
|
-
expect(decrypted["halign"]).to eq "left"
|
|
475
|
-
expect(decrypted["valign"]).to eq "top"
|
|
476
|
-
|
|
305
|
+
it 'should have the right crop with a negative width' do
|
|
306
|
+
url = subject.original_width(100).original_height(100).width(-50).height(40).center(50, 50).generate
|
|
307
|
+
expect(url).to eq '/IuRNPlFlpTVol45bDkOm2PGvneo=/0x10:100x90/-50x40/my.domain.com/some/image/url.jpg'
|
|
477
308
|
end
|
|
478
309
|
|
|
479
|
-
it
|
|
480
|
-
url = subject.width(
|
|
481
|
-
|
|
482
|
-
encrypted = url.split('/')[1]
|
|
483
|
-
|
|
484
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
485
|
-
|
|
486
|
-
expect(decrypted["horizontal_flip"]).to eq false
|
|
487
|
-
expect(decrypted["vertical_flip"]).to eq false
|
|
488
|
-
expect(decrypted["smart"]).to eq false
|
|
489
|
-
expect(decrypted["meta"]).to eq false
|
|
490
|
-
expect(decrypted["crop"]["left"]).to eq 10
|
|
491
|
-
expect(decrypted["crop"]["top"]).to eq 20
|
|
492
|
-
expect(decrypted["crop"]["right"]).to eq 30
|
|
493
|
-
expect(decrypted["crop"]["bottom"]).to eq 40
|
|
494
|
-
expect(decrypted["valign"]).to eq 'middle'
|
|
495
|
-
expect(decrypted["halign"]).to eq 'center'
|
|
496
|
-
expect(decrypted["image_hash"]).to eq image_md5
|
|
497
|
-
expect(decrypted["width"]).to eq 300
|
|
498
|
-
expect(decrypted["height"]).to eq 200
|
|
499
|
-
|
|
310
|
+
it 'should have the right crop with a negative height' do
|
|
311
|
+
url = subject.original_width(100).original_height(100).width(50).height(-40).center(50, 50).generate
|
|
312
|
+
expect(url).to eq '/-8IhWGEeXaY1uv945i9EHLVjwuk=/0x10:100x90/50x-40/my.domain.com/some/image/url.jpg'
|
|
500
313
|
end
|
|
501
314
|
|
|
502
|
-
it
|
|
503
|
-
url = subject.
|
|
504
|
-
|
|
505
|
-
encrypted = url.split('/')[1]
|
|
506
|
-
|
|
507
|
-
decrypted = decrypt_in_thumbor(encrypted)
|
|
508
|
-
|
|
509
|
-
expect(decrypted["filters"]).to eq "quality(20):brightness(10)"
|
|
315
|
+
it 'should have the right crop with a negative height and width' do
|
|
316
|
+
url = subject.original_width(100).original_height(100).width(-50).height(-40).center(50, 50).generate
|
|
317
|
+
expect(url).to eq '/lfjGLTTEaW_Rcvc1q0ZhfYup2jg=/0x10:100x90/-50x-40/my.domain.com/some/image/url.jpg'
|
|
510
318
|
end
|
|
511
319
|
end
|
|
512
320
|
end
|