image_vise 0.8.2 → 1.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 +4 -4
- data/.travis.yml +3 -4
- data/CHANGELOG.md +5 -0
- data/DEVELOPMENT.md +3 -3
- data/README.md +1 -1
- data/image_vise.gemspec +3 -3
- data/lib/image_vise.rb +0 -1
- data/lib/image_vise/fetchers/fetcher_file.rb +13 -1
- data/lib/image_vise/image_request.rb +1 -1
- data/lib/image_vise/operators/background_fill.rb +1 -1
- data/lib/image_vise/operators/crop.rb +1 -1
- data/lib/image_vise/operators/expire_after.rb +1 -1
- data/lib/image_vise/operators/fit_crop.rb +1 -1
- data/lib/image_vise/operators/force_jpg_out.rb +1 -1
- data/lib/image_vise/operators/geom.rb +1 -1
- data/lib/image_vise/operators/sharpen.rb +1 -1
- data/lib/image_vise/pipeline.rb +8 -3
- data/lib/image_vise/version.rb +1 -1
- data/lib/image_vise/writers/jpeg_writer.rb +1 -1
- data/spec/image_vise/fetcher_file_spec.rb +6 -6
- data/spec/image_vise/render_engine_spec.rb +18 -18
- data/spec/spec_helper.rb +0 -1
- metadata +11 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db4e835de55f61d43df27411213d6b121bd586c3cd3e25c09010d02afc58ba27
|
4
|
+
data.tar.gz: 5d5235feae9b5310f7c35f8ebbbc582efc7f191dfe686cc8dda2de8c3fe948f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d1b4d6d6b62344c2cdc2073dca78ba16a485e9d7dca852f249313194d33c29df857460291db1531ff526adbcfb4353243aa2b777f482673916a607dc23c7608
|
7
|
+
data.tar.gz: 9909a197b5488f6e1c348e6fb57b5d12c43b22dc98e9841c9b0ee98c801f8073813ad979bf1af3860e2872f07a6ef23b30095014bb491eec5c0559b3dc790302
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/DEVELOPMENT.md
CHANGED
@@ -62,9 +62,9 @@ path access using the glob whitelist)
|
|
62
62
|
class PicFetcher < ImageVise::FetcherFile
|
63
63
|
def self.fetch_uri_to_tempfile(uri_object)
|
64
64
|
# Convert an internal "pic://sites/uploads/abcdef.jpg" to a full path URL
|
65
|
-
partial_path =
|
66
|
-
|
67
|
-
full_path_uri = URI(
|
65
|
+
partial_path = decode_file_uri_path(uri_object.path)
|
66
|
+
full_filesystem_path = File.join(Mappe::ROOT, 'sites', partial_path)
|
67
|
+
full_path_uri = URI(file_url_for(full_filesystem_path))
|
68
68
|
super(full_path_uri)
|
69
69
|
end
|
70
70
|
ImageVise.register_fetcher 'pic', self
|
data/README.md
CHANGED
@@ -95,7 +95,7 @@ end
|
|
95
95
|
|
96
96
|
If you want to grab a local file, compose a `file://` URL (mind the endcoding!)
|
97
97
|
|
98
|
-
src_url = 'file://' +
|
98
|
+
src_url = 'file://' + ImageVise::FetcherFile.encode_file_uri_path(File.expand_path(my_pic))
|
99
99
|
|
100
100
|
Note that you need to permit certain glob patterns as sources before this will work, see below.
|
101
101
|
|
data/image_vise.gemspec
CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
23
23
|
end
|
24
24
|
|
25
|
+
spec.required_ruby_version = ">= 2.5"
|
26
|
+
|
25
27
|
spec.files = `git ls-files -z`.split("\x0")
|
26
28
|
spec.bindir = "exe"
|
27
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -29,18 +31,16 @@ Gem::Specification.new do |spec|
|
|
29
31
|
|
30
32
|
spec.add_dependency 'patron', '~> 0.9'
|
31
33
|
spec.add_dependency 'rmagick', '~> 3'
|
32
|
-
spec.add_dependency 'ks'
|
33
34
|
spec.add_dependency 'rack', '>= 1', '< 3'
|
34
35
|
spec.add_dependency 'format_parser', '~> 0.25'
|
35
36
|
spec.add_dependency 'measurometer', '~> 1'
|
36
37
|
|
37
38
|
spec.add_development_dependency 'magic_bytes', '~> 1'
|
38
|
-
spec.add_development_dependency "bundler"
|
39
39
|
spec.add_development_dependency "rake", "~> 12.2"
|
40
40
|
spec.add_development_dependency "rack-test"
|
41
41
|
spec.add_development_dependency "rspec", "~> 3"
|
42
|
-
spec.add_development_dependency "addressable"
|
43
42
|
spec.add_development_dependency "strenv"
|
44
43
|
spec.add_development_dependency "simplecov"
|
45
44
|
spec.add_development_dependency "pry"
|
45
|
+
spec.add_development_dependency "webrick"
|
46
46
|
end
|
data/lib/image_vise.rb
CHANGED
@@ -21,8 +21,20 @@ class ImageVise::FetcherFile
|
|
21
21
|
raise e
|
22
22
|
end
|
23
23
|
|
24
|
+
def self.decode_file_uri_path(path_with_percent_encoded_components)
|
25
|
+
path_with_percent_encoded_components.split('/').map { |component| URI.decode_www_form_component(component) }.join('/')
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.file_url_for(path)
|
29
|
+
"file://#{encode_file_uri_path(path)}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.encode_file_uri_path(path)
|
33
|
+
path.split('/').map { |component| URI.encode_www_form_component(component) }.join('/')
|
34
|
+
end
|
35
|
+
|
24
36
|
def self.uri_to_path(uri)
|
25
|
-
File.expand_path(
|
37
|
+
File.expand_path(decode_file_uri_path(uri.path))
|
26
38
|
end
|
27
39
|
|
28
40
|
def self.verify_filesystem_access!(path_on_filesystem)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'openssl'
|
2
2
|
|
3
|
-
class ImageVise::ImageRequest <
|
3
|
+
class ImageVise::ImageRequest < Struct.new(:src_url, :pipeline, keyword_init: true)
|
4
4
|
class InvalidRequest < ArgumentError; end
|
5
5
|
class SignatureError < InvalidRequest; end
|
6
6
|
class URLError < InvalidRequest; end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# Can handle most 'word' colors and hex color codes but not RGB values.
|
3
3
|
#
|
4
4
|
# The corresponding Pipeline method is `background_fill`.
|
5
|
-
class ImageVise::BackgroundFill <
|
5
|
+
class ImageVise::BackgroundFill < Struct.new(:color, keyword_init: true)
|
6
6
|
def initialize(*)
|
7
7
|
super
|
8
8
|
self.color = color.to_s
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# of ImageMagick gravity parameters (see GRAVITY_PARAMS)
|
3
3
|
#
|
4
4
|
# The corresponding Pipeline method is `crop`.
|
5
|
-
class ImageVise::Crop <
|
5
|
+
class ImageVise::Crop < Struct.new(:width, :height, :gravity, keyword_init: true)
|
6
6
|
GRAVITY_PARAMS = {
|
7
7
|
'nw' => Magick::NorthWestGravity,
|
8
8
|
'n' => Magick::NorthGravity,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Overrides the cache lifetime set in the output headers of the RenderEngine.
|
2
2
|
# Can be used to permit the requester to set the caching lifetime, instead
|
3
3
|
# of it being a configuration variable in the service performing the rendering
|
4
|
-
class ImageVise::ExpireAfter <
|
4
|
+
class ImageVise::ExpireAfter < Struct.new(:seconds, keyword_init: true)
|
5
5
|
def initialize(seconds:)
|
6
6
|
unless seconds.is_a?(Integer) && seconds > 0
|
7
7
|
raise ArgumentError, "the :seconds parameter must be an Integer and must be above 0, but was %s" % seconds.inspect
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# gravity parameter defines the crop gravity (on corners, sides, or in the middle).
|
4
4
|
#
|
5
5
|
# The corresponding Pipeline method is `fit_crop`.
|
6
|
-
class ImageVise::FitCrop <
|
6
|
+
class ImageVise::FitCrop < Struct.new(:width, :height, :gravity, keyword_init: true)
|
7
7
|
GRAVITY_PARAMS = {
|
8
8
|
'nw' => Magick::NorthWestGravity,
|
9
9
|
'n' => Magick::NorthGravity,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Forces the output format to be JPEG and specifies the quality factor to use when saving
|
2
2
|
#
|
3
3
|
# The corresponding Pipeline method is `force_jpg_out`.
|
4
|
-
class ImageVise::ForceJPGOut <
|
4
|
+
class ImageVise::ForceJPGOut < Struct.new(:quality, keyword_init: true)
|
5
5
|
def initialize(quality:)
|
6
6
|
unless (0..100).cover?(quality)
|
7
7
|
raise ArgumentError, "the :quality setting must be within 0..100, but was %d" % quality
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Applies a transformation using an ImageMagick geometry string
|
2
2
|
#
|
3
3
|
# The corresponding Pipeline method is `geom`.
|
4
|
-
class ImageVise::Geom <
|
4
|
+
class ImageVise::Geom < Struct.new(:geometry_string, keyword_init: true)
|
5
5
|
def initialize(*)
|
6
6
|
super
|
7
7
|
self.geometry_string = geometry_string.to_s
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Applies a sharpening filter to the image.
|
2
2
|
#
|
3
3
|
# The corresponding Pipeline method is `sharpen`.
|
4
|
-
class ImageVise::Sharpen <
|
4
|
+
class ImageVise::Sharpen < Struct.new(:radius, :sigma, keyword_init: true)
|
5
5
|
def initialize(*)
|
6
6
|
super
|
7
7
|
self.radius = radius.to_f
|
data/lib/image_vise/pipeline.rb
CHANGED
@@ -27,11 +27,16 @@ class ImageVise::Pipeline
|
|
27
27
|
@ops.empty?
|
28
28
|
end
|
29
29
|
|
30
|
-
def method_missing(method_name,
|
30
|
+
def method_missing(method_name, args = {}, &blk)
|
31
31
|
operator_builder = ImageVise.operator_from(method_name)
|
32
|
-
|
32
|
+
|
33
|
+
if args.empty? # TODO: remove conditional after dropping Ruby 2.6 support
|
34
|
+
self << operator_builder.new
|
35
|
+
else
|
36
|
+
self << operator_builder.new(**args)
|
37
|
+
end
|
33
38
|
end
|
34
|
-
|
39
|
+
|
35
40
|
def respond_to_missing?(method_name, *a)
|
36
41
|
ImageVise.defined_operators.include?(method_name.to_s)
|
37
42
|
end
|
data/lib/image_vise/version.rb
CHANGED
@@ -8,13 +8,13 @@ describe ImageVise::FetcherFile do
|
|
8
8
|
it 'is registered as a fetcher for file://' do
|
9
9
|
expect(ImageVise.fetcher_for('file')).to eq(ImageVise::FetcherFile)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it 'returns a Tempfile containing this test suite' do
|
13
13
|
path = File.expand_path(__FILE__)
|
14
14
|
ruby_files_in_this_directory = __dir__ + '/*.rb'
|
15
15
|
ImageVise.allow_filesystem_source! ruby_files_in_this_directory
|
16
|
-
|
17
|
-
uri = URI('file://' +
|
16
|
+
|
17
|
+
uri = URI('file://' + ImageVise::FetcherFile.encode_file_uri_path(path))
|
18
18
|
fetched = ImageVise::FetcherFile.fetch_uri_to_tempfile(uri)
|
19
19
|
|
20
20
|
expect(fetched).to be_kind_of(Tempfile)
|
@@ -27,7 +27,7 @@ describe ImageVise::FetcherFile do
|
|
27
27
|
|
28
28
|
ImageVise.deny_filesystem_sources!
|
29
29
|
|
30
|
-
uri = URI('file://' +
|
30
|
+
uri = URI('file://' + ImageVise::FetcherFile.encode_file_uri_path(path))
|
31
31
|
expect {
|
32
32
|
ImageVise::FetcherFile.fetch_uri_to_tempfile(uri)
|
33
33
|
}.to raise_error(ImageVise::FetcherFile::AccessError)
|
@@ -40,7 +40,7 @@ describe ImageVise::FetcherFile do
|
|
40
40
|
ImageVise.deny_filesystem_sources!
|
41
41
|
ImageVise.allow_filesystem_source! text_files_in_this_directory
|
42
42
|
|
43
|
-
uri = URI('file://' +
|
43
|
+
uri = URI('file://' + ImageVise::FetcherFile.encode_file_uri_path(path))
|
44
44
|
expect {
|
45
45
|
ImageVise::FetcherFile.fetch_uri_to_tempfile(uri)
|
46
46
|
}.to raise_error(ImageVise::FetcherFile::AccessError)
|
@@ -51,7 +51,7 @@ describe ImageVise::FetcherFile do
|
|
51
51
|
ruby_files_in_this_directory = __dir__ + '/*.rb'
|
52
52
|
ImageVise.allow_filesystem_source! ruby_files_in_this_directory
|
53
53
|
|
54
|
-
uri = URI('file://' +
|
54
|
+
uri = URI('file://' + ImageVise::FetcherFile.encode_file_uri_path(path))
|
55
55
|
expect(ImageVise::FetcherFile).to receive(:maximum_source_file_size_bytes).and_return(1)
|
56
56
|
|
57
57
|
expect {
|
@@ -33,7 +33,7 @@ describe ImageVise::RenderEngine do
|
|
33
33
|
|
34
34
|
context 'when requesting an image' do
|
35
35
|
before :each do
|
36
|
-
parsed_url =
|
36
|
+
parsed_url = URI.parse(public_url)
|
37
37
|
ImageVise.add_allowed_host!(parsed_url.host)
|
38
38
|
end
|
39
39
|
|
@@ -43,7 +43,7 @@ describe ImageVise::RenderEngine do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'halts with 400 when the requested image cannot be opened by ImageMagick' do
|
46
|
-
uri =
|
46
|
+
uri = URI.parse(public_url)
|
47
47
|
ImageVise.add_allowed_host!(uri.host)
|
48
48
|
ImageVise.add_secret_key!('l33tness')
|
49
49
|
uri.path = '/___nonexistent_image.jpg'
|
@@ -76,7 +76,7 @@ describe ImageVise::RenderEngine do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'responds with 403 when upstream returns it, and includes the URL in the error message' do
|
79
|
-
uri =
|
79
|
+
uri = URI.parse(public_url)
|
80
80
|
ImageVise.add_allowed_host!(uri.host)
|
81
81
|
ImageVise.add_secret_key!('l33tness')
|
82
82
|
uri.path = '/forbidden'
|
@@ -93,7 +93,7 @@ describe ImageVise::RenderEngine do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'replays upstream error response codes that are selected to be replayed to the requester' do
|
96
|
-
uri =
|
96
|
+
uri = URI.parse(public_url)
|
97
97
|
ImageVise.add_allowed_host!(uri.host)
|
98
98
|
ImageVise.add_secret_key!('l33tness')
|
99
99
|
|
@@ -118,7 +118,7 @@ describe ImageVise::RenderEngine do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
it 'sets very far caching headers and an ETag, and returns a 304 if any ETag is set' do
|
121
|
-
uri =
|
121
|
+
uri = URI.parse(public_url)
|
122
122
|
ImageVise.add_allowed_host!(uri.host)
|
123
123
|
ImageVise.add_secret_key!('l33tness')
|
124
124
|
|
@@ -142,7 +142,7 @@ describe ImageVise::RenderEngine do
|
|
142
142
|
end
|
143
143
|
|
144
144
|
it 'allows for setting a custom cache lifetime' do
|
145
|
-
uri =
|
145
|
+
uri = URI.parse(public_url)
|
146
146
|
ImageVise.add_allowed_host!(uri.host)
|
147
147
|
ImageVise.add_secret_key!('l33tness')
|
148
148
|
|
@@ -158,7 +158,7 @@ describe ImageVise::RenderEngine do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it 'uses the correct default cache lifetime if one is not specified' do
|
161
|
-
uri =
|
161
|
+
uri = URI.parse(public_url)
|
162
162
|
ImageVise.add_allowed_host!(uri.host)
|
163
163
|
ImageVise.add_secret_key!('l33tness')
|
164
164
|
|
@@ -173,7 +173,7 @@ describe ImageVise::RenderEngine do
|
|
173
173
|
end
|
174
174
|
|
175
175
|
it 'responds with an image that passes through all the processing steps' do
|
176
|
-
uri =
|
176
|
+
uri = URI.parse(public_url)
|
177
177
|
ImageVise.add_allowed_host!(uri.host)
|
178
178
|
ImageVise.add_secret_key!('l33tness')
|
179
179
|
|
@@ -216,7 +216,7 @@ describe ImageVise::RenderEngine do
|
|
216
216
|
end
|
217
217
|
|
218
218
|
it 'calls all of the internal methods during execution' do
|
219
|
-
uri =
|
219
|
+
uri = URI.parse(public_url)
|
220
220
|
ImageVise.add_allowed_host!(uri.host)
|
221
221
|
ImageVise.add_secret_key!('l33tness')
|
222
222
|
|
@@ -249,7 +249,7 @@ describe ImageVise::RenderEngine do
|
|
249
249
|
it 'URI-decodes the path in a file:// URL for a file with a Unicode path' do
|
250
250
|
utf8_file_path = File.dirname(test_image_path) + '/картинка.jpg'
|
251
251
|
FileUtils.cp_r(test_image_path, utf8_file_path)
|
252
|
-
uri = 'file://' +
|
252
|
+
uri = 'file://' + ImageVise::FetcherFile.encode_file_uri_path(utf8_file_path)
|
253
253
|
|
254
254
|
ImageVise.allow_filesystem_source!(File.dirname(test_image_path) + '/*.*')
|
255
255
|
ImageVise.add_secret_key!('l33tness')
|
@@ -264,7 +264,7 @@ describe ImageVise::RenderEngine do
|
|
264
264
|
end
|
265
265
|
|
266
266
|
it 'forbids a request with an extra GET param' do
|
267
|
-
uri = 'file://' +
|
267
|
+
uri = 'file://' + ImageVise::FetcherFile.encode_file_uri_path(test_image_path)
|
268
268
|
|
269
269
|
p = ImageVise::Pipeline.new.fit_crop(width: 10, height: 10, gravity: 'c')
|
270
270
|
image_request = ImageVise::ImageRequest.new(src_url: uri.to_s, pipeline: p)
|
@@ -275,7 +275,7 @@ describe ImageVise::RenderEngine do
|
|
275
275
|
end
|
276
276
|
|
277
277
|
it 'returns the processed JPEG image as a PNG if it had to get an alpha channel during processing' do
|
278
|
-
uri =
|
278
|
+
uri = URI.parse(public_url)
|
279
279
|
ImageVise.add_allowed_host!(uri.host)
|
280
280
|
ImageVise.add_secret_key!('l33tness')
|
281
281
|
|
@@ -292,7 +292,7 @@ describe ImageVise::RenderEngine do
|
|
292
292
|
end
|
293
293
|
|
294
294
|
it 'permits a PSD file by default' do
|
295
|
-
uri =
|
295
|
+
uri = URI.parse(public_url_psd)
|
296
296
|
ImageVise.add_allowed_host!(uri.host)
|
297
297
|
ImageVise.add_secret_key!('l33tness')
|
298
298
|
|
@@ -304,7 +304,7 @@ describe ImageVise::RenderEngine do
|
|
304
304
|
end
|
305
305
|
|
306
306
|
it 'destroys all the loaded PSD layers' do
|
307
|
-
uri =
|
307
|
+
uri = URI.parse(public_url_psd_multilayer)
|
308
308
|
ImageVise.add_allowed_host!(uri.host)
|
309
309
|
ImageVise.add_secret_key!('l33tness')
|
310
310
|
|
@@ -324,7 +324,7 @@ describe ImageVise::RenderEngine do
|
|
324
324
|
end
|
325
325
|
|
326
326
|
it 'outputs a converted TIFF file as a PNG' do
|
327
|
-
uri =
|
327
|
+
uri = URI.parse(public_url_tif)
|
328
328
|
ImageVise.add_allowed_host!(uri.host)
|
329
329
|
ImageVise.add_secret_key!('l33tness')
|
330
330
|
|
@@ -341,7 +341,7 @@ describe ImageVise::RenderEngine do
|
|
341
341
|
end
|
342
342
|
|
343
343
|
it 'processes a 1.5mb PSD with a forced conversion to JPEG' do
|
344
|
-
uri =
|
344
|
+
uri = URI.parse(public_url_psd)
|
345
345
|
ImageVise.add_allowed_host!(uri.host)
|
346
346
|
ImageVise.add_secret_key!('1337ness')
|
347
347
|
|
@@ -357,7 +357,7 @@ describe ImageVise::RenderEngine do
|
|
357
357
|
end
|
358
358
|
|
359
359
|
it 'sets a customized Expires: cache lifetime set via the pipeline' do
|
360
|
-
uri =
|
360
|
+
uri = URI.parse(public_url_psd)
|
361
361
|
ImageVise.add_allowed_host!(uri.host)
|
362
362
|
ImageVise.add_secret_key!('1337ness')
|
363
363
|
|
@@ -370,7 +370,7 @@ describe ImageVise::RenderEngine do
|
|
370
370
|
end
|
371
371
|
|
372
372
|
it 'converts a PNG into a JPG applying a background fill' do
|
373
|
-
uri =
|
373
|
+
uri = URI.parse(public_url_png_transparency)
|
374
374
|
ImageVise.add_allowed_host!(uri.host)
|
375
375
|
ImageVise.add_secret_key!('h00ray')
|
376
376
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_vise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: patron
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: ks
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rack
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,20 +100,6 @@ dependencies:
|
|
114
100
|
- - "~>"
|
115
101
|
- !ruby/object:Gem::Version
|
116
102
|
version: '1'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: bundler
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - ">="
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '0'
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - ">="
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '0'
|
131
103
|
- !ruby/object:Gem::Dependency
|
132
104
|
name: rake
|
133
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,7 +143,7 @@ dependencies:
|
|
171
143
|
- !ruby/object:Gem::Version
|
172
144
|
version: '3'
|
173
145
|
- !ruby/object:Gem::Dependency
|
174
|
-
name:
|
146
|
+
name: strenv
|
175
147
|
requirement: !ruby/object:Gem::Requirement
|
176
148
|
requirements:
|
177
149
|
- - ">="
|
@@ -185,7 +157,7 @@ dependencies:
|
|
185
157
|
- !ruby/object:Gem::Version
|
186
158
|
version: '0'
|
187
159
|
- !ruby/object:Gem::Dependency
|
188
|
-
name:
|
160
|
+
name: simplecov
|
189
161
|
requirement: !ruby/object:Gem::Requirement
|
190
162
|
requirements:
|
191
163
|
- - ">="
|
@@ -199,7 +171,7 @@ dependencies:
|
|
199
171
|
- !ruby/object:Gem::Version
|
200
172
|
version: '0'
|
201
173
|
- !ruby/object:Gem::Dependency
|
202
|
-
name:
|
174
|
+
name: pry
|
203
175
|
requirement: !ruby/object:Gem::Requirement
|
204
176
|
requirements:
|
205
177
|
- - ">="
|
@@ -213,7 +185,7 @@ dependencies:
|
|
213
185
|
- !ruby/object:Gem::Version
|
214
186
|
version: '0'
|
215
187
|
- !ruby/object:Gem::Dependency
|
216
|
-
name:
|
188
|
+
name: webrick
|
217
189
|
requirement: !ruby/object:Gem::Requirement
|
218
190
|
requirements:
|
219
191
|
- - ">="
|
@@ -303,7 +275,7 @@ licenses:
|
|
303
275
|
- MIT
|
304
276
|
metadata:
|
305
277
|
allowed_push_host: https://rubygems.org
|
306
|
-
post_install_message:
|
278
|
+
post_install_message:
|
307
279
|
rdoc_options: []
|
308
280
|
require_paths:
|
309
281
|
- lib
|
@@ -311,15 +283,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
311
283
|
requirements:
|
312
284
|
- - ">="
|
313
285
|
- !ruby/object:Gem::Version
|
314
|
-
version: '
|
286
|
+
version: '2.5'
|
315
287
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
316
288
|
requirements:
|
317
289
|
- - ">="
|
318
290
|
- !ruby/object:Gem::Version
|
319
291
|
version: '0'
|
320
292
|
requirements: []
|
321
|
-
rubygems_version: 3.
|
322
|
-
signing_key:
|
293
|
+
rubygems_version: 3.2.22
|
294
|
+
signing_key:
|
323
295
|
specification_version: 4
|
324
296
|
summary: Runtime thumbnailing proxy
|
325
297
|
test_files: []
|