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