image_vise 0.7.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b23604cb3ebdd9901fdde805b567a785d9ae1cd81f08575ef960ee14abc2681c
4
- data.tar.gz: b7a76ca5ffcd26c3ce574f95cf58cd9b2ed5e5b08779658f0ec58841ea5bcc94
3
+ metadata.gz: db4e835de55f61d43df27411213d6b121bd586c3cd3e25c09010d02afc58ba27
4
+ data.tar.gz: 5d5235feae9b5310f7c35f8ebbbc582efc7f191dfe686cc8dda2de8c3fe948f8
5
5
  SHA512:
6
- metadata.gz: 4cb5afb69d834571cfcd36e418e22860f2fc24c530c167281a9fde0c6e7ebee8968255db682ecb21e410bfdce2e68e1bdce8f659f929d0f4481b99737c1cba25
7
- data.tar.gz: 873b414d64a5091565f9693215e54f877811c4c3035fcf56a3998bdc654b54e1ef215f2b7c37bb789eb22b1ac992523cea34762153a47573acff738572615f18
6
+ metadata.gz: 5d1b4d6d6b62344c2cdc2073dca78ba16a485e9d7dca852f249313194d33c29df857460291db1531ff526adbcfb4353243aa2b777f482673916a607dc23c7608
7
+ data.tar.gz: 9909a197b5488f6e1c348e6fb57b5d12c43b22dc98e9841c9b0ee98c801f8073813ad979bf1af3860e2872f07a6ef23b30095014bb491eec5c0559b3dc790302
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ Gemfile.lock
6
6
  *.log
7
7
  pkg
8
8
  coverage
9
+ .ruby-version
data/.travis.yml CHANGED
@@ -1,13 +1,9 @@
1
+ language: ruby
1
2
  rvm:
2
- - 2.2.10
3
- - 2.3.7
4
- - 2.4.4
5
- - 2.5.1
6
- sudo: false
3
+ - 2.5
4
+ - 3.0.2
7
5
  cache: bundler
8
-
9
6
  env:
10
7
  global:
11
8
  - SKIP_INTERACTIVE=yes
12
- before_install: gem install bundler
13
9
  script: bundle exec rspec
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ ## 1.0.0
2
+ * Add support for Ruby 2.6 and newer (including Ruby 3.0)
3
+ * Minimum supported Ruby is now 2.5
4
+ * Remove `ks` dependency
5
+
6
+ ## 0.8.2
7
+ * Change format_parser required version to allow > 0.24
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 = URI.decode(uri_object.path)
66
- full_path = File.join(Mappe::ROOT, 'sites', partial_path)
67
- full_path_uri = URI('file://' + URI.encode(full_path))
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://' + URI.encode(File.expand_path(my_pic))
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
@@ -21,26 +21,26 @@ Gem::Specification.new do |spec|
21
21
  else
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) }
28
30
  spec.require_paths = ["lib"]
29
31
 
30
32
  spec.add_dependency 'patron', '~> 0.9'
31
- spec.add_dependency 'rmagick', '~> 2.15'
32
- spec.add_dependency 'ks'
33
+ spec.add_dependency 'rmagick', '~> 3'
33
34
  spec.add_dependency 'rack', '>= 1', '< 3'
34
- spec.add_dependency 'format_parser', '>= 0.14.0', '< 1.0'
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", "~> 1.7"
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
@@ -1,4 +1,3 @@
1
- require 'ks'
2
1
  require 'json'
3
2
  require 'patron'
4
3
  require 'rmagick'
@@ -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(URI.decode(uri.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 < Ks.strict(:src_url, :pipeline)
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 < Ks.strict(:color)
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 < Ks.strict(:width, :height, :gravity)
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 < Ks.strict(:seconds)
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 < Ks.strict(:width, :height, :gravity)
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 < Ks.strict(:quality)
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 < Ks.strict(:geometry_string)
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 < Ks.strict(:radius, :sigma)
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
@@ -27,11 +27,16 @@ class ImageVise::Pipeline
27
27
  @ops.empty?
28
28
  end
29
29
 
30
- def method_missing(method_name, *a, &blk)
30
+ def method_missing(method_name, args = {}, &blk)
31
31
  operator_builder = ImageVise.operator_from(method_name)
32
- self << operator_builder.new(*a)
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
@@ -13,7 +13,8 @@
13
13
  end
14
14
 
15
15
  DEFAULT_HEADERS = {
16
- 'Allow' => "GET"
16
+ 'Allow' => 'GET',
17
+ 'X-Content-Type-Options' => 'nosniff',
17
18
  }.freeze
18
19
 
19
20
  # Headers for error responses that denote an invalid or
@@ -1,3 +1,3 @@
1
1
  class ImageVise
2
- VERSION = '0.7.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -1,4 +1,4 @@
1
- class ImageVise::JPGWriter < Ks.strict(:quality)
1
+ class ImageVise::JPGWriter < Struct.new(:quality, keyword_init: true)
2
2
  JPG_EXT = 'jpg'
3
3
 
4
4
  def write_image!(magick_image, _, render_to_path)
@@ -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://' + URI.encode(path))
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://' + URI.encode(path))
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://' + URI.encode(path))
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://' + URI.encode(path))
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 = Addressable::URI.parse(public_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 = Addressable::URI.parse(public_url)
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 = Addressable::URI.parse(public_url)
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 = Addressable::URI.parse(public_url)
96
+ uri = URI.parse(public_url)
97
97
  ImageVise.add_allowed_host!(uri.host)
98
98
  ImageVise.add_secret_key!('l33tness')
99
99
 
@@ -110,13 +110,15 @@ describe ImageVise::RenderEngine do
110
110
  expect(last_response.headers['Cache-Control']).to match(/public/)
111
111
 
112
112
  expect(last_response.headers['Content-Type']).to eq('application/json')
113
+ expect(last_response['X-Content-Type-Options']).to eq('nosniff')
114
+
113
115
  parsed = JSON.load(last_response.body)
114
116
  expect(parsed['errors'].to_s).to include("Unfortunate upstream response")
115
117
  end
116
118
  end
117
119
 
118
120
  it 'sets very far caching headers and an ETag, and returns a 304 if any ETag is set' do
119
- uri = Addressable::URI.parse(public_url)
121
+ uri = URI.parse(public_url)
120
122
  ImageVise.add_allowed_host!(uri.host)
121
123
  ImageVise.add_secret_key!('l33tness')
122
124
 
@@ -140,7 +142,7 @@ describe ImageVise::RenderEngine do
140
142
  end
141
143
 
142
144
  it 'allows for setting a custom cache lifetime' do
143
- uri = Addressable::URI.parse(public_url)
145
+ uri = URI.parse(public_url)
144
146
  ImageVise.add_allowed_host!(uri.host)
145
147
  ImageVise.add_secret_key!('l33tness')
146
148
 
@@ -156,7 +158,7 @@ describe ImageVise::RenderEngine do
156
158
  end
157
159
 
158
160
  it 'uses the correct default cache lifetime if one is not specified' do
159
- uri = Addressable::URI.parse(public_url)
161
+ uri = URI.parse(public_url)
160
162
  ImageVise.add_allowed_host!(uri.host)
161
163
  ImageVise.add_secret_key!('l33tness')
162
164
 
@@ -171,7 +173,7 @@ describe ImageVise::RenderEngine do
171
173
  end
172
174
 
173
175
  it 'responds with an image that passes through all the processing steps' do
174
- uri = Addressable::URI.parse(public_url)
176
+ uri = URI.parse(public_url)
175
177
  ImageVise.add_allowed_host!(uri.host)
176
178
  ImageVise.add_secret_key!('l33tness')
177
179
 
@@ -182,6 +184,8 @@ describe ImageVise::RenderEngine do
182
184
  expect(last_response.status).to eq(200)
183
185
 
184
186
  expect(last_response.headers['Content-Type']).to eq('image/jpeg')
187
+ expect(last_response['X-Content-Type-Options']).to eq('nosniff')
188
+
185
189
  expect(last_response.headers).to have_key('Content-Length')
186
190
  parsed_image = Magick::Image.from_blob(last_response.body)[0]
187
191
  expect(parsed_image.columns).to eq(10)
@@ -212,7 +216,7 @@ describe ImageVise::RenderEngine do
212
216
  end
213
217
 
214
218
  it 'calls all of the internal methods during execution' do
215
- uri = Addressable::URI.parse(public_url)
219
+ uri = URI.parse(public_url)
216
220
  ImageVise.add_allowed_host!(uri.host)
217
221
  ImageVise.add_secret_key!('l33tness')
218
222
 
@@ -245,7 +249,7 @@ describe ImageVise::RenderEngine do
245
249
  it 'URI-decodes the path in a file:// URL for a file with a Unicode path' do
246
250
  utf8_file_path = File.dirname(test_image_path) + '/картинка.jpg'
247
251
  FileUtils.cp_r(test_image_path, utf8_file_path)
248
- uri = 'file://' + URI.encode(utf8_file_path)
252
+ uri = 'file://' + ImageVise::FetcherFile.encode_file_uri_path(utf8_file_path)
249
253
 
250
254
  ImageVise.allow_filesystem_source!(File.dirname(test_image_path) + '/*.*')
251
255
  ImageVise.add_secret_key!('l33tness')
@@ -260,7 +264,7 @@ describe ImageVise::RenderEngine do
260
264
  end
261
265
 
262
266
  it 'forbids a request with an extra GET param' do
263
- uri = 'file://' + URI.encode(test_image_path)
267
+ uri = 'file://' + ImageVise::FetcherFile.encode_file_uri_path(test_image_path)
264
268
 
265
269
  p = ImageVise::Pipeline.new.fit_crop(width: 10, height: 10, gravity: 'c')
266
270
  image_request = ImageVise::ImageRequest.new(src_url: uri.to_s, pipeline: p)
@@ -271,7 +275,7 @@ describe ImageVise::RenderEngine do
271
275
  end
272
276
 
273
277
  it 'returns the processed JPEG image as a PNG if it had to get an alpha channel during processing' do
274
- uri = Addressable::URI.parse(public_url)
278
+ uri = URI.parse(public_url)
275
279
  ImageVise.add_allowed_host!(uri.host)
276
280
  ImageVise.add_secret_key!('l33tness')
277
281
 
@@ -288,7 +292,7 @@ describe ImageVise::RenderEngine do
288
292
  end
289
293
 
290
294
  it 'permits a PSD file by default' do
291
- uri = Addressable::URI.parse(public_url_psd)
295
+ uri = URI.parse(public_url_psd)
292
296
  ImageVise.add_allowed_host!(uri.host)
293
297
  ImageVise.add_secret_key!('l33tness')
294
298
 
@@ -300,7 +304,7 @@ describe ImageVise::RenderEngine do
300
304
  end
301
305
 
302
306
  it 'destroys all the loaded PSD layers' do
303
- uri = Addressable::URI.parse(public_url_psd_multilayer)
307
+ uri = URI.parse(public_url_psd_multilayer)
304
308
  ImageVise.add_allowed_host!(uri.host)
305
309
  ImageVise.add_secret_key!('l33tness')
306
310
 
@@ -320,7 +324,7 @@ describe ImageVise::RenderEngine do
320
324
  end
321
325
 
322
326
  it 'outputs a converted TIFF file as a PNG' do
323
- uri = Addressable::URI.parse(public_url_tif)
327
+ uri = URI.parse(public_url_tif)
324
328
  ImageVise.add_allowed_host!(uri.host)
325
329
  ImageVise.add_secret_key!('l33tness')
326
330
 
@@ -337,7 +341,7 @@ describe ImageVise::RenderEngine do
337
341
  end
338
342
 
339
343
  it 'processes a 1.5mb PSD with a forced conversion to JPEG' do
340
- uri = Addressable::URI.parse(public_url_psd)
344
+ uri = URI.parse(public_url_psd)
341
345
  ImageVise.add_allowed_host!(uri.host)
342
346
  ImageVise.add_secret_key!('1337ness')
343
347
 
@@ -353,7 +357,7 @@ describe ImageVise::RenderEngine do
353
357
  end
354
358
 
355
359
  it 'sets a customized Expires: cache lifetime set via the pipeline' do
356
- uri = Addressable::URI.parse(public_url_psd)
360
+ uri = URI.parse(public_url_psd)
357
361
  ImageVise.add_allowed_host!(uri.host)
358
362
  ImageVise.add_secret_key!('1337ness')
359
363
 
@@ -366,7 +370,7 @@ describe ImageVise::RenderEngine do
366
370
  end
367
371
 
368
372
  it 'converts a PNG into a JPG applying a background fill' do
369
- uri = Addressable::URI.parse(public_url_png_transparency)
373
+ uri = URI.parse(public_url_png_transparency)
370
374
  ImageVise.add_allowed_host!(uri.host)
371
375
  ImageVise.add_secret_key!('h00ray')
372
376
 
data/spec/spec_helper.rb CHANGED
@@ -8,7 +8,6 @@ Bundler.require
8
8
 
9
9
  require 'tmpdir'
10
10
  require 'securerandom'
11
- require 'addressable/uri'
12
11
  require 'strenv'
13
12
  require 'pry'
14
13
  require 'magic_bytes'
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.7.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: 2018-06-18 00:00:00.000000000 Z
11
+ date: 2021-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: patron
@@ -30,28 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.15'
33
+ version: '3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.15'
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'
40
+ version: '3'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rack
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -76,22 +62,16 @@ dependencies:
76
62
  name: format_parser
77
63
  requirement: !ruby/object:Gem::Requirement
78
64
  requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: 0.14.0
82
- - - "<"
65
+ - - "~>"
83
66
  - !ruby/object:Gem::Version
84
- version: '1.0'
67
+ version: '0.25'
85
68
  type: :runtime
86
69
  prerelease: false
87
70
  version_requirements: !ruby/object:Gem::Requirement
88
71
  requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: 0.14.0
92
- - - "<"
72
+ - - "~>"
93
73
  - !ruby/object:Gem::Version
94
- version: '1.0'
74
+ version: '0.25'
95
75
  - !ruby/object:Gem::Dependency
96
76
  name: measurometer
97
77
  requirement: !ruby/object:Gem::Requirement
@@ -120,20 +100,6 @@ dependencies:
120
100
  - - "~>"
121
101
  - !ruby/object:Gem::Version
122
102
  version: '1'
123
- - !ruby/object:Gem::Dependency
124
- name: bundler
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '1.7'
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: '1.7'
137
103
  - !ruby/object:Gem::Dependency
138
104
  name: rake
139
105
  requirement: !ruby/object:Gem::Requirement
@@ -177,7 +143,7 @@ dependencies:
177
143
  - !ruby/object:Gem::Version
178
144
  version: '3'
179
145
  - !ruby/object:Gem::Dependency
180
- name: addressable
146
+ name: strenv
181
147
  requirement: !ruby/object:Gem::Requirement
182
148
  requirements:
183
149
  - - ">="
@@ -191,7 +157,7 @@ dependencies:
191
157
  - !ruby/object:Gem::Version
192
158
  version: '0'
193
159
  - !ruby/object:Gem::Dependency
194
- name: strenv
160
+ name: simplecov
195
161
  requirement: !ruby/object:Gem::Requirement
196
162
  requirements:
197
163
  - - ">="
@@ -205,7 +171,7 @@ dependencies:
205
171
  - !ruby/object:Gem::Version
206
172
  version: '0'
207
173
  - !ruby/object:Gem::Dependency
208
- name: simplecov
174
+ name: pry
209
175
  requirement: !ruby/object:Gem::Requirement
210
176
  requirements:
211
177
  - - ">="
@@ -219,7 +185,7 @@ dependencies:
219
185
  - !ruby/object:Gem::Version
220
186
  version: '0'
221
187
  - !ruby/object:Gem::Dependency
222
- name: pry
188
+ name: webrick
223
189
  requirement: !ruby/object:Gem::Requirement
224
190
  requirements:
225
191
  - - ">="
@@ -241,6 +207,7 @@ extra_rdoc_files: []
241
207
  files:
242
208
  - ".gitignore"
243
209
  - ".travis.yml"
210
+ - CHANGELOG.md
244
211
  - DEVELOPMENT.md
245
212
  - Gemfile
246
213
  - LICENSE.txt
@@ -308,7 +275,7 @@ licenses:
308
275
  - MIT
309
276
  metadata:
310
277
  allowed_push_host: https://rubygems.org
311
- post_install_message:
278
+ post_install_message:
312
279
  rdoc_options: []
313
280
  require_paths:
314
281
  - lib
@@ -316,16 +283,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
316
283
  requirements:
317
284
  - - ">="
318
285
  - !ruby/object:Gem::Version
319
- version: '0'
286
+ version: '2.5'
320
287
  required_rubygems_version: !ruby/object:Gem::Requirement
321
288
  requirements:
322
289
  - - ">="
323
290
  - !ruby/object:Gem::Version
324
291
  version: '0'
325
292
  requirements: []
326
- rubyforge_project:
327
- rubygems_version: 2.7.3
328
- signing_key:
293
+ rubygems_version: 3.2.22
294
+ signing_key:
329
295
  specification_version: 4
330
296
  summary: Runtime thumbnailing proxy
331
297
  test_files: []