image_optim 0.19.1 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MjM5MmFhN2E0NDJiNjFlOGYxODBhNWVjNzRmNjU5NjM1NWQxZmZjMA==
4
+ ZjNhMTRkY2JmMWRjOTY1NmZiYjI3Yjk3M2U1MTM5YzJkMjMzNWFkMw==
5
5
  data.tar.gz: !binary |-
6
- MDM3NjNhNjdiYmMwNjY2YmMwMDY5MjMzZjRkNWJmMDA3NGEzYTM0Yg==
6
+ ZjI1MTQ3ZTdkMmNkNjE3ZDdhYzQyZDlmMmYzYzQwMDNjNTUxODY3Yg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- M2Y1NGU4MjFiYTZjNWE4MmZkNTRkM2Q4NmMzZWE2ODgwZmRlMjc0NTA3NTlk
10
- MDg1MjIzMzM1YzU0NzVjYjA3OTFiNWU0ODYzMWM0MjcxYWUwYzcwYmJkZjI3
11
- MDM4YjZmMTdiYWIyODE4OGM4NDA1Yjc2NzI1MDdhZmU4YmEzNWQ=
9
+ ZTBiM2M5NmNjY2JhYWExMDNjZDQ3MjlkMmE1MDkxMmNhMGE1OGYwYzkzOTBm
10
+ ZTcwZTU4ZTFiZDg1ZjBlNjAyNGRlY2MzMzExYzRkNTgzZGNmMjQ1NzcxMzkw
11
+ YTY0NDJjYTA3NjJjN2Q1ODgwOGEzYzQ3M2I1ZmM3ZmEzNjIwYzA=
12
12
  data.tar.gz: !binary |-
13
- MGJlOGE1OGNmN2MxZmZkYTU5NzgzZGFmZjRlNWZkNTA4ODg2ZDJhZDViMzMw
14
- NTEwZTliN2Y1ZDgzMTkyYTlmYzU1Y2Q0MzllZGE2NTZhYzYwNzdiYjViNTJm
15
- MTRjZmI3MGNhNmZlNDQxZjIzMDRiZGMzYjI3YzdmMzAzODU4NTA=
13
+ YzZiYmUzYmJkODI2Yzg5MTUwN2U1ZjI0MzYxMzM1Y2RjMzVmYTEyMzY3Nzcz
14
+ M2NjODVjMGU2YmM5ZmZlYzM0NmQ5MDA0OTNhYmI2YmJlZDk3MDE4YTU0MWFk
15
+ YTk0YWJiNmFkNmZmOWU3Yzc5YzRjNzY0MDBkZDM5ODU0NjcyMjM=
data/.rubocop.yml CHANGED
@@ -5,6 +5,9 @@ AllCops:
5
5
  Lint/EndAlignment:
6
6
  AlignWith: variable
7
7
 
8
+ Metrics/AbcSize:
9
+ Max: 30
10
+
8
11
  Metrics/ClassLength:
9
12
  Max: 150
10
13
 
data/.travis.yml CHANGED
@@ -3,8 +3,9 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- - 2.0.0
7
- - 2.1.0
6
+ - '2.0'
7
+ - '2.1'
8
+ - '2.2'
8
9
  - jruby-18mode
9
10
  - jruby-19mode
10
11
  - ree
@@ -25,6 +26,12 @@ env:
25
26
  - PATH=~/bin:$PATH
26
27
  matrix:
27
28
  fast_finish: true
29
+ allow_failures:
30
+ - rvm: '2.2'
28
31
  include:
29
32
  - env: RUBOCOP=true
30
33
  rvm: default
34
+ addons:
35
+ code_climate:
36
+ repo_token:
37
+ secure: FDikT3JnOJHOAFSaKwVPB1VOphU0sSzAnzQ+YjSt9XFE+9uFQHth/j4rFoVoqALhCj+47trv6spwkbcSjGCVzm+87OI80GkLCCzNjDOz2W4sP9JWItVgS1VoWW+ioPxpLgpguTb3wutwKOUMEAf+40EX657ZiHumM7nNHrF+RCU=
data/CHANGELOG.markdown CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## v0.20.0 (2014-12-15)
6
+
7
+ * Ignore and show warning for lossy options `jpegoptim#max_quality` and `pngquant#quality` in default/lossless mode [#71](https://github.com/toy/image_optim/issues/71) [@toy](https://github.com/toy)
8
+ * Add `:blacken` option to `pngcrush` worker, to blacken fully transparent pixels, on by default [@toy](https://github.com/toy)
9
+ * Command line option `--no-progress` to disable showing progress of optimizing images [@toy](https://github.com/toy)
10
+
5
11
  ## v0.19.1 (2014-11-22)
6
12
 
7
13
  * Blacklist pngcrush 1.7.80 as it loses one color in indexed images [@toy](https://github.com/toy)
data/Gemfile CHANGED
@@ -1,3 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9')
6
+ gem 'codeclimate-test-reporter', :group => :test, :require => nil
7
+ end
data/README.markdown CHANGED
@@ -1,6 +1,7 @@
1
1
  [![Gem Version](https://img.shields.io/gem/v/image_optim.svg?style=flat)](https://rubygems.org/gems/image_optim)
2
2
  [![Build Status](https://img.shields.io/travis/toy/image_optim/master.svg?style=flat)](https://travis-ci.org/toy/image_optim)
3
3
  [![Code Climate](https://img.shields.io/codeclimate/github/toy/image_optim.svg?style=flat)](https://codeclimate.com/github/toy/image_optim)
4
+ [![Code Climate Coverage](https://img.shields.io/codeclimate/coverage/github/toy/image_optim.svg?style=flat)](https://codeclimate.com/github/toy/image_optim)
4
5
  [![Dependency Status](https://img.shields.io/gemnasium/toy/image_optim.svg?style=flat)](https://gemnasium.com/toy/image_optim)
5
6
  [![Inch CI](http://inch-ci.org/github/toy/image_optim.svg?branch=master&style=flat)](http://inch-ci.org/github/toy/image_optim)
6
7
 
@@ -289,7 +290,7 @@ Worker has no options
289
290
 
290
291
  ### :jpegoptim =>
291
292
  * `:strip` — List of extra markers to strip: `:comments`, `:exif`, `:iptc`, `:icc` or `:all` *(defaults to `:all`)*
292
- * `:max_quality` — Maximum image quality factor `0`..`100` *(defaults to `100`)*
293
+ * `:max_quality` — Maximum image quality factor `0`..`100`, ignored in default/lossless mode *(defaults to `100`)*
293
294
 
294
295
  ### :jpegrecompress =>
295
296
  * `:quality` — JPEG quality preset: `0` - low, `1` - medium, `2` - high, `3` - veryhigh *(defaults to `3`)*
@@ -307,13 +308,14 @@ Worker has no options
307
308
  * `:chunks` — List of chunks to remove or `:alla` - all except tRNS/transparency or `:allb` - all except tRNS and gAMA/gamma *(defaults to `:alla`)*
308
309
  * `:fix` — Fix otherwise fatal conditions such as bad CRCs *(defaults to `false`)*
309
310
  * `:brute` — Brute force try all methods, very time-consuming and generally not worthwhile *(defaults to `false`)*
311
+ * `:blacken` — Blacken fully transparent pixels *(defaults to `true`)*
310
312
 
311
313
  ### :pngout =>
312
314
  * `:copy_chunks` — Copy optional chunks *(defaults to `false`)*
313
315
  * `:strategy` — Strategy: `0` - xtreme, `1` - intense, `2` - longest Match, `3` - huffman Only, `4` - uncompressed *(defaults to `0`)*
314
316
 
315
317
  ### :pngquant =>
316
- * `:quality` — min..max - don't save below min, use less colors below max (both in range `0..100`; in yaml - `!ruby/range 0..100`) *(defaults to `100..100`)*
318
+ * `:quality` — min..max - don't save below min, use less colors below max (both in range `0..100`; in yaml - `!ruby/range 0..100`), ignored in default/lossless mode *(defaults to `100..100`)*
317
319
  * `:speed` — speed/quality trade-off: `1` - slow, `3` - default, `11` - fast & rough *(defaults to `3`)*
318
320
 
319
321
  ### :svgo =>
data/image_optim.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'image_optim'
5
- s.version = '0.19.1'
5
+ s.version = '0.20.0'
6
6
  s.summary = %q{Optimize (lossless compress, optionally lossy) images (jpeg, png, gif, svg) using external utilities (advpng, gifsicle, jhead, jpeg-recompress, jpegoptim, jpegrescan, jpegtran, optipng, pngcrush, pngout, pngquant, svgo)}
7
7
  s.homepage = "http://github.com/toy/#{s.name}"
8
8
  s.authors = ['Ivan Kuchin']
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_development_dependency 'image_optim_pack', '~> 0.2'
25
25
  s.add_development_dependency 'rspec', '~> 3.0'
26
26
  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9.3')
27
- s.add_development_dependency 'rubocop', '~> 0.26.0'
27
+ s.add_development_dependency 'rubocop', '~> 0.27'
28
28
  end
29
29
  s.add_development_dependency 'haml', '~> 4.0'
30
30
  end
data/lib/image_optim.rb CHANGED
@@ -58,23 +58,18 @@ class ImageOptim
58
58
  # ImageOptim.new(:nice => 20)
59
59
  def initialize(options = {})
60
60
  config = Config.new(options)
61
- @nice = config.nice
62
- @threads = config.threads
63
61
  @verbose = config.verbose
64
- @pack = config.pack
65
- @skip_missing_workers = config.skip_missing_workers
66
- @allow_lossy = config.allow_lossy
67
-
68
- if verbose
69
- $stderr << "config:\n"
70
- config.to_s.each_line do |line|
71
- $stderr << " #{line}"
72
- end
73
- $stderr << "nice: #{nice}\n"
74
- $stderr << "threads: #{threads}\n"
75
- $stderr << "pack: #{pack}\n"
76
- $stderr << "skip_missing_workers: #{skip_missing_workers}\n"
77
- $stderr << "allow_lossy: #{allow_lossy}\n"
62
+ $stderr << "config:\n#{config.to_s.gsub(/^/, ' ')}" if verbose
63
+
64
+ %w[
65
+ nice
66
+ threads
67
+ pack
68
+ skip_missing_workers
69
+ allow_lossy
70
+ ].each do |name|
71
+ instance_variable_set(:"@#{name}", config.send(name))
72
+ $stderr << "#{name}: #{send(name)}\n" if verbose
78
73
  end
79
74
 
80
75
  @bin_resolver = BinResolver.new(self)
@@ -33,8 +33,9 @@ class ImageOptim
33
33
 
34
34
  WARN_CHECKS = [
35
35
  [:advpng, is < '1.17', 'does not use zopfli'],
36
- [:pngquant, is < '2.1', 'may be lossy even with quality `100-`'],
37
36
  [:gifsicle, is < '1.85', 'does not support removing extension blocks'],
37
+ [:pngcrush, is < '1.7.38', 'does not have blacken flag'],
38
+ [:pngquant, is < '2.1', 'may be lossy even with quality `100-`'],
38
39
  ]
39
40
 
40
41
  # Fail if version will not work properly
@@ -193,9 +193,9 @@ class ImageOptim
193
193
  when /mswin|mingw/
194
194
  require 'win32ole'
195
195
  WIN32OLE.
196
- connect('winmgmts://').
197
- ExecQuery('select NumberOfLogicalProcessors from Win32_Processor').
198
- to_enum.first.NumberOfLogicalProcessors
196
+ connect('winmgmts://').
197
+ ExecQuery('select NumberOfLogicalProcessors from Win32_Processor').
198
+ to_enum.first.NumberOfLogicalProcessors
199
199
  else
200
200
  warn "Unknown architecture (#{host_os}) assuming one processor."
201
201
  1
@@ -14,5 +14,19 @@ class ImageOptim
14
14
  @description = description.to_s
15
15
  @default, @type, @proc = default, type, proc
16
16
  end
17
+
18
+ # Get value for worker from options
19
+ def value(worker, options)
20
+ value = options.key?(name) ? options[name] : default
21
+ if proc
22
+ if proc.arity == 2
23
+ worker.instance_exec(value, self, &proc)
24
+ else
25
+ worker.instance_exec(value, &proc)
26
+ end
27
+ else
28
+ value
29
+ end
30
+ end
17
31
  end
18
32
  end
@@ -14,13 +14,15 @@ class ImageOptim
14
14
  app.assets
15
15
  end
16
16
 
17
- def register_preprocessor(app)
18
- options = if app.config.assets.image_optim == true
17
+ def options
18
+ if app.config.assets.image_optim == true
19
19
  {}
20
20
  else
21
21
  app.config.assets.image_optim || {}
22
22
  end
23
+ end
23
24
 
25
+ def register_preprocessor(app)
24
26
  image_optim = ImageOptim.new(options)
25
27
 
26
28
  processor = proc do |_context, data|
@@ -46,6 +46,7 @@ class ImageOptim
46
46
  def initialize(options)
47
47
  options = HashHelpers.deep_symbolise_keys(options)
48
48
  @recursive = options.delete(:recursive)
49
+ @progress = options.delete(:show_progress) != false
49
50
  @exclude_dir_globs, @exclude_file_globs = %w[dir file].map do |type|
50
51
  glob = options.delete(:"exclude_#{type}_glob") || '.*'
51
52
  GlobHelpers.expand_braces(glob)
@@ -71,8 +72,8 @@ class ImageOptim
71
72
  private
72
73
 
73
74
  def optimize_images!(to_optimize, &block)
74
- @image_optim.
75
- optimize_images!(to_optimize.with_progress('optimizing'), &block)
75
+ to_optimize = to_optimize.with_progress('optimizing') if @progress
76
+ @image_optim.optimize_images!(to_optimize, &block)
76
77
  end
77
78
 
78
79
  def find_to_optimize(paths)
@@ -124,6 +124,10 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
124
124
 
125
125
  op.separator nil
126
126
 
127
+ op.on('--no-progress', 'Disable showing progress') do |show_progress|
128
+ options[:show_progress] = show_progress
129
+ end
130
+
127
131
  op.on('--[no-]threads N', Integer, 'Number of threads or disable '\
128
132
  '(defaults to number of processors)') do |threads|
129
133
  options[:threads] = threads
@@ -27,18 +27,7 @@ class ImageOptim
27
27
  end
28
28
  @image_optim = image_optim
29
29
  @allow_lossy = !!options.delete(:allow_lossy)
30
- self.class.option_definitions.each do |option_definition|
31
- value = if options.key?(option_definition.name)
32
- options[option_definition.name]
33
- else
34
- option_definition.default
35
- end
36
- if option_definition.proc
37
- value = option_definition.proc[value]
38
- end
39
- instance_variable_set("@#{option_definition.name}", value)
40
- end
41
-
30
+ parse_options(options)
42
31
  assert_no_unknown_options!(options)
43
32
  end
44
33
 
@@ -100,6 +89,13 @@ class ImageOptim
100
89
 
101
90
  private
102
91
 
92
+ def parse_options(options)
93
+ self.class.option_definitions.each do |option_definition|
94
+ value = option_definition.value(self, options)
95
+ instance_variable_set("@#{option_definition.name}", value)
96
+ end
97
+ end
98
+
103
99
  def assert_no_unknown_options!(options)
104
100
  known_keys = self.class.option_definitions.map(&:name)
105
101
  unknown_options = options.reject{ |key, _value| known_keys.include?(key) }
@@ -21,7 +21,8 @@ class ImageOptim
21
21
 
22
22
  # Underscored class name symbol
23
23
  def bin_sym
24
- @underscored_name ||= name.
24
+ @underscored_name ||=
25
+ name.
25
26
  split('::').last. # get last part
26
27
  gsub(/([a-z])([A-Z])/, '\1_\2').downcase. # convert AbcDef to abc_def
27
28
  to_sym
@@ -33,8 +34,8 @@ class ImageOptim
33
34
 
34
35
  def option(name, default, type, description = nil, &proc)
35
36
  attr_reader name
36
- option_definitions <<
37
- OptionDefinition.new(name, default, type, description, &proc)
37
+ OptionDefinition.new(name, default, type, description, &proc).
38
+ tap{ |option_definition| option_definitions << option_definition }
38
39
  end
39
40
 
40
41
  # Create hash with format mapped to list of workers sorted by run order
@@ -23,8 +23,16 @@ class ImageOptim
23
23
 
24
24
  MAX_QUALITY_OPTION =
25
25
  option(:max_quality, 100, 'Maximum image quality factor '\
26
- '`0`..`100`') do |v|
27
- OptionHelpers.limit_with_range(v.to_i, 0..100)
26
+ '`0`..`100`, ignored in default/lossless mode') do |v, opt_def|
27
+ if allow_lossy
28
+ OptionHelpers.limit_with_range(v.to_i, 0..100)
29
+ else
30
+ if v != opt_def.default
31
+ warn "#{self.class.bin_sym} #{opt_def.name} #{v} ignored " \
32
+ 'in lossless mode'
33
+ end
34
+ opt_def.default
35
+ end
28
36
  end
29
37
 
30
38
  # Run first [-1] if max_quality < 100 otherwise with normal priority
@@ -19,25 +19,35 @@ class ImageOptim
19
19
  option(:brute, false, 'Brute force try all methods, '\
20
20
  'very time-consuming and generally not worthwhile'){ |v| !!v }
21
21
 
22
+ BLACKEN_OPTION =
23
+ option(:blacken, true, 'Blacken fully transparent pixels'){ |v| !!v }
24
+
22
25
  # Always run first [-1]
23
26
  def run_order
24
27
  -1
25
28
  end
26
29
 
27
30
  def optimize(src, dst)
28
- args = %W[
31
+ flags = %w[
29
32
  -reduce
30
33
  -cc
31
34
  -q
35
+ ]
36
+ chunks.each do |chunk|
37
+ flags.push '-rem', chunk
38
+ end
39
+ flags.push '-fix' if fix
40
+ flags.push '-brute' if brute
41
+ if resolve_bin!(:pngcrush).version >= '1.7.38'
42
+ flags.push '-blacken' if blacken
43
+ end
44
+
45
+ args = flags + %W[
32
46
  --
33
47
  #{src}
34
48
  #{dst}
35
49
  ]
36
- chunks.each do |chunk|
37
- args.unshift '-rem', chunk
38
- end
39
- args.unshift '-fix' if fix
40
- args.unshift '-brute' if brute
50
+
41
51
  execute(:pngcrush, *args) && optimized?(src, dst)
42
52
  end
43
53
  end
@@ -9,9 +9,18 @@ class ImageOptim
9
9
  QUALITY_OPTION =
10
10
  option(:quality, 100..100, NonNegativeIntegerRange, 'min..max - don\'t '\
11
11
  'save below min, use less colors below max (both in range `0..100`; '\
12
- 'in yaml - `!ruby/range 0..100`)') do |v|
13
- min = OptionHelpers.limit_with_range(v.begin, 0..100)
14
- min..OptionHelpers.limit_with_range(v.end, min..100)
12
+ 'in yaml - `!ruby/range 0..100`), ignored in default/lossless '\
13
+ 'mode') do |v, opt_def|
14
+ if allow_lossy
15
+ min = OptionHelpers.limit_with_range(v.begin, 0..100)
16
+ min..OptionHelpers.limit_with_range(v.end, min..100)
17
+ else
18
+ if v != opt_def.default
19
+ warn "#{self.class.bin_sym} #{opt_def.name} #{v} ignored " \
20
+ 'in lossless mode'
21
+ end
22
+ opt_def.default
23
+ end
15
24
  end
16
25
 
17
26
  SPEED_OPTION =
@@ -381,13 +381,24 @@ class Analyser
381
381
  @avg_ratio = results.sum(&:ratio) / results.length
382
382
  @avg_difference = results.sum(&:difference) / results.length
383
383
  @max_difference = results.map(&:difference).max
384
- @warn_level = case
384
+ @time = results.sum(&:time)
385
+
386
+ @warn_level = calculate_warn_level
387
+ @speed = calculate_speed
388
+ end
389
+
390
+ private
391
+
392
+ def calculate_warn_level
393
+ case
385
394
  when max_difference >= 0.1 then 'high'
386
395
  when max_difference >= 0.01 then 'medium'
387
396
  when max_difference >= 0.001 then 'low'
388
397
  end
389
- @time = results.sum(&:time)
390
- @speed = case
398
+ end
399
+
400
+ def calculate_speed
401
+ case
391
402
  when time > 0 then (original_size - optimized_size) / time
392
403
  when original_size == optimized_size then 0
393
404
  else 1.0 / 0.0
@@ -73,5 +73,4 @@ describe ImageOptim::HashHelpers do
73
73
 
74
74
  expect(HashHelpers.deep_merge(merge_a, merge_b)).to eq(merge_result)
75
75
  end
76
-
77
76
  end
@@ -156,4 +156,35 @@ describe ImageOptim::Worker do
156
156
  end
157
157
  end
158
158
  end
159
+
160
+ describe :option do
161
+ it 'runs option block in context of worker' do
162
+ # don't add Abc to list of wokers
163
+ allow(ImageOptim::Worker).to receive(:inherited)
164
+
165
+ stub_const('Abc', Class.new(Worker) do
166
+ option(:test, 1, 'Test context') do |_v|
167
+ some_instance_method
168
+ end
169
+ end)
170
+
171
+ expect_any_instance_of(Abc).
172
+ to receive(:some_instance_method).and_return(20)
173
+ expect(Abc.new(ImageOptim.new).test).to eq(20)
174
+ end
175
+
176
+ it 'returns instance of OptionDefinition' do
177
+ # don't add Abc to list of wokers
178
+ allow(ImageOptim::Worker).to receive(:inherited)
179
+
180
+ definition = nil
181
+ Class.new(Worker) do
182
+ definition = option(:test, 1, 'Test'){ |v| v }
183
+ end
184
+
185
+ expect(definition).to be_an(ImageOptim::OptionDefinition)
186
+ expect(definition.name).to eq(:test)
187
+ expect(definition.default).to eq(1)
188
+ end
189
+ end
159
190
  end
@@ -75,6 +75,7 @@ describe ImageOptim do
75
75
  nrmse_command = %W[
76
76
  compare
77
77
  -metric RMSE
78
+ -alpha Background
78
79
  #{coalesce_a.to_s.shellescape}
79
80
  #{coalesce_b.to_s.shellescape}
80
81
  /dev/null
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Dir.chdir(File.dirname(__FILE__))
4
+
5
+ require 'shellwords'
6
+
7
+ side = 64
8
+
9
+ IO.popen(%W[
10
+ convert
11
+ -depth 8
12
+ -size #{side}x#{side}
13
+ -strip
14
+ rgba:-
15
+ PNG32:image.png
16
+ ].shelljoin, 'w') do |f|
17
+ side.times do |a|
18
+ side.times do |b|
19
+ alpha = [0, 1, 0x7f, 0xff][(a / 8 + b / 8) % 4]
20
+ f << [rand(256), rand(256), rand(256), alpha].pack('C*')
21
+ end
22
+ end
23
+ end
24
+ system 'image_optim --pngcrush-blacken=n image.png'
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,12 @@
1
+ if ENV['CODECLIMATE_REPO_TOKEN']
2
+ begin
3
+ require 'codeclimate-test-reporter'
4
+ CodeClimate::TestReporter.start
5
+ rescue LoadError => e
6
+ $stderr.puts "Got following while loading codeclimate-test-reporter: #{e}"
7
+ end
8
+ end
9
+
1
10
  RSpec.configure do |c|
2
11
  c.alias_example_to :they
3
12
  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.19.1
4
+ version: 0.20.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: 2014-11-22 00:00:00.000000000 Z
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -126,14 +126,14 @@ dependencies:
126
126
  requirements:
127
127
  - - ~>
128
128
  - !ruby/object:Gem::Version
129
- version: 0.26.0
129
+ version: '0.27'
130
130
  type: :development
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - ~>
135
135
  - !ruby/object:Gem::Version
136
- version: 0.26.0
136
+ version: '0.27'
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: haml
139
139
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +220,8 @@ files:
220
220
  - spec/images/decompressed.jpeg
221
221
  - spec/images/icecream.gif
222
222
  - spec/images/image.jpg
223
+ - spec/images/invisiblepixels/generate
224
+ - spec/images/invisiblepixels/image.png
223
225
  - spec/images/lena.jpg
224
226
  - spec/images/orient/0.jpg
225
227
  - spec/images/orient/1.jpg
@@ -260,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
262
  version: '0'
261
263
  requirements: []
262
264
  rubyforge_project: image_optim
263
- rubygems_version: 2.4.3
265
+ rubygems_version: 2.4.5
264
266
  signing_key:
265
267
  specification_version: 4
266
268
  summary: Optimize (lossless compress, optionally lossy) images (jpeg, png, gif, svg)
@@ -284,6 +286,8 @@ test_files:
284
286
  - spec/images/decompressed.jpeg
285
287
  - spec/images/icecream.gif
286
288
  - spec/images/image.jpg
289
+ - spec/images/invisiblepixels/generate
290
+ - spec/images/invisiblepixels/image.png
287
291
  - spec/images/lena.jpg
288
292
  - spec/images/orient/0.jpg
289
293
  - spec/images/orient/1.jpg
@@ -303,3 +307,4 @@ test_files:
303
307
  - spec/images/transparency2.png
304
308
  - spec/images/vergroessert.jpg
305
309
  - spec/spec_helper.rb
310
+ has_rdoc: