image_optim 0.29.0 → 0.30.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -3
  3. data/CHANGELOG.markdown +4 -0
  4. data/README.markdown +2 -1
  5. data/Vagrantfile +1 -1
  6. data/image_optim.gemspec +1 -1
  7. data/lib/image_optim.rb +15 -3
  8. data/lib/image_optim/bin_resolver/bin.rb +7 -7
  9. data/lib/image_optim/cache.rb +6 -0
  10. data/lib/image_optim/cmd.rb +45 -6
  11. data/lib/image_optim/config.rb +9 -1
  12. data/lib/image_optim/elapsed_time.rb +26 -0
  13. data/lib/image_optim/errors.rb +9 -0
  14. data/lib/image_optim/runner/option_parser.rb +4 -0
  15. data/lib/image_optim/timer.rb +25 -0
  16. data/lib/image_optim/worker.rb +24 -12
  17. data/lib/image_optim/worker/advpng.rb +2 -2
  18. data/lib/image_optim/worker/gifsicle.rb +3 -3
  19. data/lib/image_optim/worker/jhead.rb +2 -2
  20. data/lib/image_optim/worker/jpegoptim.rb +2 -2
  21. data/lib/image_optim/worker/jpegrecompress.rb +2 -2
  22. data/lib/image_optim/worker/jpegtran.rb +3 -3
  23. data/lib/image_optim/worker/optipng.rb +2 -2
  24. data/lib/image_optim/worker/pngcrush.rb +2 -2
  25. data/lib/image_optim/worker/pngout.rb +2 -2
  26. data/lib/image_optim/worker/pngquant.rb +2 -2
  27. data/lib/image_optim/worker/svgo.rb +2 -2
  28. data/script/worker_analysis +4 -4
  29. data/spec/image_optim/bin_resolver_spec.rb +5 -5
  30. data/spec/image_optim/cache_path_spec.rb +3 -7
  31. data/spec/image_optim/cache_spec.rb +7 -7
  32. data/spec/image_optim/cmd_spec.rb +58 -6
  33. data/spec/image_optim/config_spec.rb +36 -20
  34. data/spec/image_optim/elapsed_time_spec.rb +14 -0
  35. data/spec/image_optim/hash_helpers_spec.rb +18 -18
  36. data/spec/image_optim/option_definition_spec.rb +6 -6
  37. data/spec/image_optim/path_spec.rb +4 -8
  38. data/spec/image_optim/runner/option_parser_spec.rb +4 -4
  39. data/spec/image_optim/timer_spec.rb +32 -0
  40. data/spec/image_optim/worker/jpegrecompress_spec.rb +2 -2
  41. data/spec/image_optim/worker/optipng_spec.rb +11 -11
  42. data/spec/image_optim/worker/pngquant_spec.rb +5 -5
  43. data/spec/image_optim/worker_spec.rb +17 -17
  44. data/spec/image_optim_spec.rb +46 -9
  45. data/spec/spec_helper.rb +16 -15
  46. metadata +11 -4
@@ -27,7 +27,7 @@ describe ImageOptim do
27
27
  ImageOptim::Worker.klasses.map do |klass|
28
28
  [klass.bin_sym, false]
29
29
  end
30
- ].merge(:skip_missing_workers => false)
30
+ ].merge(skip_missing_workers: false)
31
31
 
32
32
  ImageOptim::Worker.klasses.each do |worker_klass|
33
33
  describe "#{worker_klass.bin_sym} worker" do
@@ -36,7 +36,7 @@ describe ImageOptim do
36
36
 
37
37
  image_optim = ImageOptim.new(options)
38
38
  if Array(worker_klass.init(image_optim)).empty?
39
- image_optim = ImageOptim.new(options.merge(:allow_lossy => true))
39
+ image_optim = ImageOptim.new(options.merge(allow_lossy: true))
40
40
  end
41
41
 
42
42
  expect(test_images.any? do |original|
@@ -59,10 +59,10 @@ describe ImageOptim do
59
59
  rotated = images_dir / 'orient/original.jpg'
60
60
  rotate_images = images_dir.glob('orient/?.jpg')
61
61
 
62
- base_options = {:skip_missing_workers => false}
62
+ base_options = {skip_missing_workers: false}
63
63
  [
64
64
  ['lossless', base_options, 0],
65
- ['lossy', base_options.merge(:allow_lossy => true), 0.001],
65
+ ['lossy', base_options.merge(allow_lossy: true), 0.001],
66
66
  ].each do |type, options, max_difference|
67
67
  it "does it #{type}" do
68
68
  image_optim = ImageOptim.new(options)
@@ -95,8 +95,8 @@ describe ImageOptim do
95
95
  end
96
96
 
97
97
  {
98
- :png => "\211PNG\r\n\032\n",
99
- :jpeg => "\377\330",
98
+ png: "\211PNG\r\n\032\n",
99
+ jpeg: "\377\330",
100
100
  }.each do |type, data|
101
101
  it "ingores broken #{type}" do
102
102
  path = FSPath.temp_file_path
@@ -105,12 +105,49 @@ describe ImageOptim do
105
105
  expect(ImageOptim.optimize_image(path)).to be_nil
106
106
  end
107
107
  end
108
+
109
+ context 'using timeout' do
110
+ let(:timeout){ 123 }
111
+ let(:image_optim){ ImageOptim.new(isolated_options_base.merge(timeout: timeout)) }
112
+ let(:timer){ instance_double(ImageOptim::Timer) }
113
+ let(:workers){ Array.new(3){ instance_double(ImageOptim::Worker) } }
114
+ let(:path){ test_images.first }
115
+
116
+ before do
117
+ allow(ImageOptim::Timer).to receive(:new).with(timeout).and_return(timer)
118
+ allow(image_optim).to receive(:workers_for_image).and_return(workers)
119
+ end
120
+
121
+ it 'sends timeout to every worker' do
122
+ some_path = instance_of(ImageOptim::Path)
123
+
124
+ expect(workers[0]).to receive(:optimize).with(some_path, some_path, timeout: timer)
125
+ expect(workers[1]).to receive(:optimize).with(some_path, some_path, timeout: timer)
126
+ expect(workers[2]).to receive(:optimize).with(some_path, some_path, timeout: timer)
127
+
128
+ image_optim.optimize_image(path)
129
+ end
130
+
131
+ it 'returns nil if there was no success before worker times out' do
132
+ allow(workers[0]).to receive(:optimize).and_return(false)
133
+ allow(workers[1]).to receive(:optimize).and_raise(ImageOptim::Errors::TimeoutExceeded)
134
+
135
+ expect(image_optim.optimize_image(path)).to be_nil
136
+ end
137
+
138
+ it 'returns result if there was success before worker times out' do
139
+ allow(workers[0]).to receive(:optimize).and_return(true)
140
+ allow(workers[1]).to receive(:optimize).and_raise(ImageOptim::Errors::TimeoutExceeded)
141
+
142
+ expect(image_optim.optimize_image(path)).to be_an(ImageOptim::OptimizedPath)
143
+ end
144
+ end
108
145
  end
109
146
 
110
147
  describe '#optimize_image!' do
111
148
  it 'optimizes image and replaces original' do
112
149
  original = double
113
- optimized = double(:original_size => 12_345)
150
+ optimized = double(original_size: 12_345)
114
151
  optimized_wrap = double
115
152
  image_optim = ImageOptim.new
116
153
 
@@ -144,7 +181,7 @@ describe ImageOptim do
144
181
  describe '#optimize_image_data' do
145
182
  it 'create temp file, optimizes image and returns data' do
146
183
  data = double
147
- temp = double(:path => double)
184
+ temp = double(path: double)
148
185
  optimized = double
149
186
  optimized_data = double
150
187
  image_optim = ImageOptim.new
@@ -165,7 +202,7 @@ describe ImageOptim do
165
202
 
166
203
  it 'returns nil if optimization fails' do
167
204
  data = double
168
- temp = double(:path => double)
205
+ temp = double(path: double)
169
206
  image_optim = ImageOptim.new
170
207
 
171
208
  allow(ImageOptim::ImageMeta).to receive(:format_for_data).
data/spec/spec_helper.rb CHANGED
@@ -75,22 +75,23 @@ RSpec::Matchers.define :be_similar_to do |expected, max_difference|
75
75
  end
76
76
  end
77
77
 
78
- module CapabilityCheckHelpers
79
- def any_file_modes_allowed?
80
- Tempfile.open 'posix' do |f|
78
+ SkipConditions = Hash.new do |cache, name|
79
+ cache[name] = case name
80
+ when :any_file_mode_allowed
81
+ Tempfile.open('posix') do |f|
81
82
  File.chmod(0, f.path)
82
- return (File.stat(f.path).mode & 0o777).zero?
83
+ 'full file modes are not support' unless (File.stat(f.path).mode & 0o777).zero?
83
84
  end
84
- end
85
-
86
- def inodes_supported?
87
- !File.stat(__FILE__).ino.zero?
88
- end
89
-
90
- def signals_supported?
91
- Process.kill(0, 0)
92
- true
93
- rescue
94
- false
85
+ when :inodes_support
86
+ 'inodes are not supported' if File.stat(__FILE__).ino.zero?
87
+ when :signals_support
88
+ begin
89
+ Process.kill(0, 0)
90
+ nil
91
+ rescue
92
+ 'signals are not supported'
93
+ end
94
+ else
95
+ fail "Unknown check #{name}"
95
96
  end
96
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: image_optim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.0
4
+ version: 0.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kuchin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-28 00:00:00.000000000 Z
11
+ date: 2021-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -191,6 +191,8 @@ files:
191
191
  - lib/image_optim/cmd.rb
192
192
  - lib/image_optim/config.rb
193
193
  - lib/image_optim/configuration_error.rb
194
+ - lib/image_optim/elapsed_time.rb
195
+ - lib/image_optim/errors.rb
194
196
  - lib/image_optim/handler.rb
195
197
  - lib/image_optim/hash_helpers.rb
196
198
  - lib/image_optim/image_meta.rb
@@ -203,6 +205,7 @@ files:
203
205
  - lib/image_optim/runner/glob_helpers.rb
204
206
  - lib/image_optim/runner/option_parser.rb
205
207
  - lib/image_optim/space.rb
208
+ - lib/image_optim/timer.rb
206
209
  - lib/image_optim/true_false_nil.rb
207
210
  - lib/image_optim/worker.rb
208
211
  - lib/image_optim/worker/advpng.rb
@@ -229,6 +232,7 @@ files:
229
232
  - spec/image_optim/cache_spec.rb
230
233
  - spec/image_optim/cmd_spec.rb
231
234
  - spec/image_optim/config_spec.rb
235
+ - spec/image_optim/elapsed_time_spec.rb
232
236
  - spec/image_optim/handler_spec.rb
233
237
  - spec/image_optim/hash_helpers_spec.rb
234
238
  - spec/image_optim/image_meta_spec.rb
@@ -239,6 +243,7 @@ files:
239
243
  - spec/image_optim/runner/glob_helpers_spec.rb
240
244
  - spec/image_optim/runner/option_parser_spec.rb
241
245
  - spec/image_optim/space_spec.rb
246
+ - spec/image_optim/timer_spec.rb
242
247
  - spec/image_optim/worker/jpegrecompress_spec.rb
243
248
  - spec/image_optim/worker/optipng_spec.rb
244
249
  - spec/image_optim/worker/pngquant_spec.rb
@@ -279,7 +284,7 @@ licenses:
279
284
  metadata:
280
285
  bug_tracker_uri: https://github.com/toy/image_optim/issues
281
286
  changelog_uri: https://github.com/toy/image_optim/blob/master/CHANGELOG.markdown
282
- documentation_uri: https://www.rubydoc.info/gems/image_optim/0.29.0
287
+ documentation_uri: https://www.rubydoc.info/gems/image_optim/0.30.0
283
288
  source_code_uri: https://github.com/toy/image_optim
284
289
  post_install_message: |
285
290
  Rails image assets optimization is extracted into image_optim_rails gem
@@ -298,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
298
303
  - !ruby/object:Gem::Version
299
304
  version: '0'
300
305
  requirements: []
301
- rubygems_version: 3.1.5
306
+ rubygems_version: 3.2.16
302
307
  signing_key:
303
308
  specification_version: 4
304
309
  summary: Command line tool and ruby interface to optimize (lossless compress, optionally
@@ -313,6 +318,7 @@ test_files:
313
318
  - spec/image_optim/cache_spec.rb
314
319
  - spec/image_optim/cmd_spec.rb
315
320
  - spec/image_optim/config_spec.rb
321
+ - spec/image_optim/elapsed_time_spec.rb
316
322
  - spec/image_optim/handler_spec.rb
317
323
  - spec/image_optim/hash_helpers_spec.rb
318
324
  - spec/image_optim/image_meta_spec.rb
@@ -323,6 +329,7 @@ test_files:
323
329
  - spec/image_optim/runner/glob_helpers_spec.rb
324
330
  - spec/image_optim/runner/option_parser_spec.rb
325
331
  - spec/image_optim/space_spec.rb
332
+ - spec/image_optim/timer_spec.rb
326
333
  - spec/image_optim/worker/jpegrecompress_spec.rb
327
334
  - spec/image_optim/worker/optipng_spec.rb
328
335
  - spec/image_optim/worker/pngquant_spec.rb