image_optim 0.27.1 → 0.31.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.appveyor.yml +2 -0
  3. data/.github/workflows/check.yml +59 -0
  4. data/.pre-commit-hooks.yaml +9 -0
  5. data/.rubocop.yml +6 -3
  6. data/CHANGELOG.markdown +22 -0
  7. data/CONTRIBUTING.markdown +5 -2
  8. data/Gemfile +1 -7
  9. data/LICENSE.txt +1 -1
  10. data/README.markdown +21 -10
  11. data/Vagrantfile +1 -1
  12. data/image_optim.gemspec +7 -4
  13. data/lib/image_optim/bin_resolver/bin.rb +10 -9
  14. data/lib/image_optim/cache.rb +6 -0
  15. data/lib/image_optim/cmd.rb +45 -6
  16. data/lib/image_optim/config.rb +14 -8
  17. data/lib/image_optim/elapsed_time.rb +26 -0
  18. data/lib/image_optim/errors.rb +9 -0
  19. data/lib/image_optim/path.rb +1 -1
  20. data/lib/image_optim/runner/option_parser.rb +24 -18
  21. data/lib/image_optim/runner.rb +1 -1
  22. data/lib/image_optim/timer.rb +25 -0
  23. data/lib/image_optim/worker/advpng.rb +7 -7
  24. data/lib/image_optim/worker/gifsicle.rb +11 -11
  25. data/lib/image_optim/worker/jhead.rb +2 -2
  26. data/lib/image_optim/worker/jpegoptim.rb +13 -11
  27. data/lib/image_optim/worker/jpegrecompress.rb +17 -2
  28. data/lib/image_optim/worker/jpegtran.rb +4 -4
  29. data/lib/image_optim/worker/optipng.rb +7 -7
  30. data/lib/image_optim/worker/oxipng.rb +53 -0
  31. data/lib/image_optim/worker/pngcrush.rb +6 -6
  32. data/lib/image_optim/worker/pngout.rb +7 -7
  33. data/lib/image_optim/worker/pngquant.rb +10 -9
  34. data/lib/image_optim/worker/svgo.rb +2 -2
  35. data/lib/image_optim/worker.rb +32 -29
  36. data/lib/image_optim.rb +16 -10
  37. data/script/update_worker_options_in_readme +2 -2
  38. data/script/worker_analysis +16 -18
  39. data/spec/image_optim/bin_resolver_spec.rb +5 -5
  40. data/spec/image_optim/cache_path_spec.rb +7 -10
  41. data/spec/image_optim/cache_spec.rb +8 -8
  42. data/spec/image_optim/cmd_spec.rb +64 -6
  43. data/spec/image_optim/config_spec.rb +36 -20
  44. data/spec/image_optim/elapsed_time_spec.rb +14 -0
  45. data/spec/image_optim/handler_spec.rb +1 -1
  46. data/spec/image_optim/hash_helpers_spec.rb +18 -18
  47. data/spec/image_optim/option_definition_spec.rb +6 -6
  48. data/spec/image_optim/path_spec.rb +8 -11
  49. data/spec/image_optim/runner/option_parser_spec.rb +4 -4
  50. data/spec/image_optim/timer_spec.rb +32 -0
  51. data/spec/image_optim/worker/jpegrecompress_spec.rb +32 -0
  52. data/spec/image_optim/worker/optipng_spec.rb +11 -11
  53. data/spec/image_optim/worker/oxipng_spec.rb +89 -0
  54. data/spec/image_optim/worker/pngquant_spec.rb +5 -5
  55. data/spec/image_optim/worker_spec.rb +17 -17
  56. data/spec/image_optim_spec.rb +47 -10
  57. data/spec/images/invisiblepixels/generate +1 -1
  58. data/spec/spec_helper.rb +18 -17
  59. metadata +36 -15
  60. data/.travis.yml +0 -49
@@ -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).
@@ -216,7 +253,7 @@ describe ImageOptim do
216
253
 
217
254
  describe 'given block' do
218
255
  it 'optimizes images, yields path and result for each and '\
219
- 'returns array of yield results' do
256
+ 'returns array of yield results' do
220
257
  image_optim = ImageOptim.new
221
258
  results = test_images.map do |src|
222
259
  dst = double
@@ -17,7 +17,7 @@ IO.popen(%W[
17
17
  ].shelljoin, 'w') do |f|
18
18
  side.times do |a|
19
19
  side.times do |b|
20
- alpha = [0, 1, 0x7f, 0xff][(a / 8 + b / 8) % 4]
20
+ alpha = [0, 1, 0x7f, 0xff][((a / 8) + (b / 8)) % 4]
21
21
  f << [rand(256), rand(256), rand(256), alpha].pack('C*')
22
22
  end
23
23
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if ENV['CODECLIMATE']
3
+ if ENV['CC_TEST_REPORTER_ID']
4
4
  require 'simplecov'
5
5
  SimpleCov.start
6
6
  end
@@ -71,26 +71,27 @@ RSpec::Matchers.define :be_similar_to do |expected, max_difference|
71
71
  end
72
72
  failure_message do |actual|
73
73
  "expected #{actual} to have at most #{max_difference} difference from "\
74
- "#{expected}, got normalized root-mean-square error of #{@diff}"
74
+ "#{expected}, got normalized root-mean-square error of #{@diff}"
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.27.1
4
+ version: 0.31.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: 2020-09-29 00:00:00.000000000 Z
11
+ date: 2021-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -138,20 +138,28 @@ dependencies:
138
138
  requirements:
139
139
  - - "~>"
140
140
  - !ruby/object:Gem::Version
141
- version: '0.59'
142
- - - "!="
143
- - !ruby/object:Gem::Version
144
- version: 0.78.0
141
+ version: '1.0'
145
142
  type: :development
146
143
  prerelease: false
147
144
  version_requirements: !ruby/object:Gem::Requirement
148
145
  requirements:
149
146
  - - "~>"
150
147
  - !ruby/object:Gem::Version
151
- version: '0.59'
152
- - - "!="
148
+ version: '1.0'
149
+ - !ruby/object:Gem::Dependency
150
+ name: rubocop-rspec
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '2.0'
156
+ type: :development
157
+ prerelease: false
158
+ version_requirements: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
153
161
  - !ruby/object:Gem::Version
154
- version: 0.78.0
162
+ version: '2.0'
155
163
  description:
156
164
  email:
157
165
  executables:
@@ -160,9 +168,10 @@ extensions: []
160
168
  extra_rdoc_files: []
161
169
  files:
162
170
  - ".appveyor.yml"
171
+ - ".github/workflows/check.yml"
163
172
  - ".gitignore"
173
+ - ".pre-commit-hooks.yaml"
164
174
  - ".rubocop.yml"
165
- - ".travis.yml"
166
175
  - CHANGELOG.markdown
167
176
  - CONTRIBUTING.markdown
168
177
  - Gemfile
@@ -182,6 +191,8 @@ files:
182
191
  - lib/image_optim/cmd.rb
183
192
  - lib/image_optim/config.rb
184
193
  - lib/image_optim/configuration_error.rb
194
+ - lib/image_optim/elapsed_time.rb
195
+ - lib/image_optim/errors.rb
185
196
  - lib/image_optim/handler.rb
186
197
  - lib/image_optim/hash_helpers.rb
187
198
  - lib/image_optim/image_meta.rb
@@ -194,6 +205,7 @@ files:
194
205
  - lib/image_optim/runner/glob_helpers.rb
195
206
  - lib/image_optim/runner/option_parser.rb
196
207
  - lib/image_optim/space.rb
208
+ - lib/image_optim/timer.rb
197
209
  - lib/image_optim/true_false_nil.rb
198
210
  - lib/image_optim/worker.rb
199
211
  - lib/image_optim/worker/advpng.rb
@@ -204,6 +216,7 @@ files:
204
216
  - lib/image_optim/worker/jpegrecompress.rb
205
217
  - lib/image_optim/worker/jpegtran.rb
206
218
  - lib/image_optim/worker/optipng.rb
219
+ - lib/image_optim/worker/oxipng.rb
207
220
  - lib/image_optim/worker/pngcrush.rb
208
221
  - lib/image_optim/worker/pngout.rb
209
222
  - lib/image_optim/worker/pngquant.rb
@@ -220,6 +233,7 @@ files:
220
233
  - spec/image_optim/cache_spec.rb
221
234
  - spec/image_optim/cmd_spec.rb
222
235
  - spec/image_optim/config_spec.rb
236
+ - spec/image_optim/elapsed_time_spec.rb
223
237
  - spec/image_optim/handler_spec.rb
224
238
  - spec/image_optim/hash_helpers_spec.rb
225
239
  - spec/image_optim/image_meta_spec.rb
@@ -230,7 +244,10 @@ files:
230
244
  - spec/image_optim/runner/glob_helpers_spec.rb
231
245
  - spec/image_optim/runner/option_parser_spec.rb
232
246
  - spec/image_optim/space_spec.rb
247
+ - spec/image_optim/timer_spec.rb
248
+ - spec/image_optim/worker/jpegrecompress_spec.rb
233
249
  - spec/image_optim/worker/optipng_spec.rb
250
+ - spec/image_optim/worker/oxipng_spec.rb
234
251
  - spec/image_optim/worker/pngquant_spec.rb
235
252
  - spec/image_optim/worker_spec.rb
236
253
  - spec/image_optim_spec.rb
@@ -269,7 +286,7 @@ licenses:
269
286
  metadata:
270
287
  bug_tracker_uri: https://github.com/toy/image_optim/issues
271
288
  changelog_uri: https://github.com/toy/image_optim/blob/master/CHANGELOG.markdown
272
- documentation_uri: https://www.rubydoc.info/gems/image_optim/0.27.1
289
+ documentation_uri: https://www.rubydoc.info/gems/image_optim/0.31.0
273
290
  source_code_uri: https://github.com/toy/image_optim
274
291
  post_install_message: |
275
292
  Rails image assets optimization is extracted into image_optim_rails gem
@@ -281,20 +298,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
281
298
  requirements:
282
299
  - - ">="
283
300
  - !ruby/object:Gem::Version
284
- version: '0'
301
+ version: 1.9.3
285
302
  required_rubygems_version: !ruby/object:Gem::Requirement
286
303
  requirements:
287
304
  - - ">="
288
305
  - !ruby/object:Gem::Version
289
306
  version: '0'
290
307
  requirements: []
291
- rubygems_version: 3.1.4
308
+ rubygems_version: 3.2.28
292
309
  signing_key:
293
310
  specification_version: 4
294
311
  summary: Command line tool and ruby interface to optimize (lossless compress, optionally
295
312
  lossy) jpeg, png, gif and svg images using external utilities (advpng, gifsicle,
296
- jhead, jpeg-recompress, jpegoptim, jpegrescan, jpegtran, optipng, pngcrush, pngout,
297
- pngquant, svgo)
313
+ jhead, jpeg-recompress, jpegoptim, jpegrescan, jpegtran, optipng, oxipng, pngcrush,
314
+ pngout, pngquant, svgo)
298
315
  test_files:
299
316
  - spec/image_optim/bin_resolver/comparable_condition_spec.rb
300
317
  - spec/image_optim/bin_resolver/simple_version_spec.rb
@@ -303,6 +320,7 @@ test_files:
303
320
  - spec/image_optim/cache_spec.rb
304
321
  - spec/image_optim/cmd_spec.rb
305
322
  - spec/image_optim/config_spec.rb
323
+ - spec/image_optim/elapsed_time_spec.rb
306
324
  - spec/image_optim/handler_spec.rb
307
325
  - spec/image_optim/hash_helpers_spec.rb
308
326
  - spec/image_optim/image_meta_spec.rb
@@ -313,7 +331,10 @@ test_files:
313
331
  - spec/image_optim/runner/glob_helpers_spec.rb
314
332
  - spec/image_optim/runner/option_parser_spec.rb
315
333
  - spec/image_optim/space_spec.rb
334
+ - spec/image_optim/timer_spec.rb
335
+ - spec/image_optim/worker/jpegrecompress_spec.rb
316
336
  - spec/image_optim/worker/optipng_spec.rb
337
+ - spec/image_optim/worker/oxipng_spec.rb
317
338
  - spec/image_optim/worker/pngquant_spec.rb
318
339
  - spec/image_optim/worker_spec.rb
319
340
  - spec/image_optim_spec.rb
data/.travis.yml DELETED
@@ -1,49 +0,0 @@
1
- sudo: false
2
- dist: trusty
3
- language: ruby
4
- cache:
5
- bundler: true
6
- directories:
7
- - $(npm root)
8
- - ~/bin
9
- rvm:
10
- - '1.8.7-p374'
11
- - '1.9.3-p551'
12
- - '2.0.0-p648'
13
- - '2.1.10'
14
- - '2.2.10'
15
- - '2.3.8'
16
- - '2.4.10'
17
- - '2.5.8'
18
- - '2.6.6'
19
- - '2.7.1'
20
- - 'jruby-9.2.11.1'
21
- script:
22
- - bundle exec image_optim --info
23
- - bundle exec rspec
24
- before_install:
25
- - 'echo "gem: --no-ri --no-rdoc --no-document" > ~/.gemrc'
26
- - gem install rubygems-update || gem install rubygems-update --version '< 3'
27
- - update_rubygems
28
- - gem install bundler || gem install bundler --version '< 2'
29
- - nvm install stable
30
- - mkdir -p ~/bin
31
- - command -v svgo || npm install -g svgo
32
- - command -v pngout || curl -L "https://www.jonof.id.au/files/kenutils/pngout-20200115-linux.tar.gz" | tar -xz -C ~/bin --strip-components 2 --wildcards '*/amd64/pngout'
33
- matrix:
34
- include:
35
- - env: CODECLIMATE=1
36
- rvm: '2.4.10'
37
- after_success: bundle exec codeclimate-test-reporter
38
- - env: RUBOCOP=1
39
- rvm: '2.4.10'
40
- script: bundle exec rubocop
41
- before_install: gem update --system && gem install bundler
42
- - env: CHECK_RUBIES=1
43
- rvm: '2.4.10'
44
- script: bundle exec travis_check_rubies
45
- before_install: gem update --system && gem install bundler
46
- addons:
47
- code_climate:
48
- repo_token:
49
- secure: FDikT3JnOJHOAFSaKwVPB1VOphU0sSzAnzQ+YjSt9XFE+9uFQHth/j4rFoVoqALhCj+47trv6spwkbcSjGCVzm+87OI80GkLCCzNjDOz2W4sP9JWItVgS1VoWW+ioPxpLgpguTb3wutwKOUMEAf+40EX657ZiHumM7nNHrF+RCU=