image_optim 0.12.0 → 0.12.1

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDA2NmMyODM2ZTg1ZDUzMTA3NjBjYjIzYWIyZTEwODQyZmRmOGNmMQ==
4
+ MzhlYjg1NzA0MjUxYmM3MDhjNWVkZDcyYTAyZTM4MTAyMzUyZWU1ZQ==
5
5
  data.tar.gz: !binary |-
6
- MWZlMWVhNGE5MzNiOGE0YWZhODMxNWJiNzRkOGU4YTVmN2NlNWU5Yw==
6
+ MjE2MjNkNzk1NDIyY2NjM2VjZjc4OTkwNmQ5MGY4NWU5YmI4NmViZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZDcyMjNlNDFmNmE3ODQ5ZGEwMmE5MTk0OTc1NDkzY2FmNzY3ZjczMzA2NTEy
10
- ZDE2Y2NhODlkMjRiYzVjYTA2OTE2NTUzYzhmODU3YWE0ZWQxMmZjNzk5YTlj
11
- Y2JkM2ViYTMzMzVmNjNhMzFhZDQzYjU1ZjNlMWIyODdhYzFhMDE=
9
+ Yzg2ZDUyY2E3MTNhMTQzODgxOWU5M2ZkMWYxZDE1ZThkN2Q3ZTQyYTM3MThj
10
+ OTE0OWQwMDUyYjJlZTFlZjU3YWI1ZmI4NTJlZGU4OTdkZTYyM2YzOTY2NTU0
11
+ MjM1ZDQyMmQ1NGZhYTJiNGFlY2MyNThhNTdkYTAxMzExODkxYTM=
12
12
  data.tar.gz: !binary |-
13
- MTBhMzNjMTgzZGU2NTA5NTc3ZTA1OThlODU4Yzk3OGQ3ZDE1ZDM0OTM0MDg5
14
- ZGU4ODQwNGMyNjRhZDIwMjU5YzRlMjQ2NzZjM2I1MzhlZTNiYThmMTE5YWVk
15
- YzFkYjllN2I1MWEzNTJjOTNjMGMwZDUxZmNkNzBiYTQ3MzQ2YmE=
13
+ ZmM1ZDRjNzBkNjNjYmI3MmEwZDRjYWVhYThjMjQ1NjIxMTJjZTgzZDJiMmNl
14
+ OTQ4NjM2MjU3YTA4M2NlMGZjNDk3YTIyODYzM2RhZWM5YmVjOThjMGM2NjU3
15
+ YzFhMjJkMWEyNDFhOTllYjNjOWZhNTViMzQ1YWJhNmQ3M2NjYzg=
data/README.markdown CHANGED
@@ -188,6 +188,9 @@ image_optim.optimize_images_data(datas)
188
188
 
189
189
  `ImageOptim::Railtie` will automatically register sprockets preprocessor unless you set `config.assets.image_optim = false` or `config.assets.compress = false` (later for partial rails 3 compatibility).
190
190
 
191
+ You can provide options for image_optim used for preprocessor through config `config.assets.image_optim = {nice: 20, svgo: false}` (ruby1.8 style: `{:nice => 20, :svgo => false}`).
192
+ Check available options in [options section](#options).
193
+
191
194
  Image optimization can be time consuming, so depending on your deployment process you may prefer to optimize original asset files.
192
195
 
193
196
  ## Configuration
@@ -208,41 +211,47 @@ optipng:
208
211
 
209
212
  ## Options
210
213
 
211
- * `:nice` — Nice level *(defaults to 10)*
214
+ * `:nice` — Nice level *(defaults to `10`)*
212
215
  * `:threads` — Number of threads or disable *(defaults to number of processors)*
213
- * `:verbose` — Verbose output *(defaults to false)*
216
+ * `:verbose` — Verbose output *(defaults to `false`)*
214
217
 
215
- Worker can be disabled by passing false instead of options hash.
218
+ Worker can be disabled by passing `false` instead of options hash.
216
219
 
217
220
  <!---<worker-options>-->
218
221
 
219
- ### pngcrush
220
- * `:chunks` — List of chunks to remove or 'alla' - all except tRNS/transparency or 'allb' - all except tRNS and gAMA/gamma *(defaults to alla)*
221
- * `:fix` — Fix otherwise fatal conditions such as bad CRCs *(defaults to false)*
222
- * `:brute` — Brute force try all methods, very time-consuming and generally not worthwhile *(defaults to false)*
222
+ ### :pngcrush =>
223
+ * `:chunks` — List of chunks to remove or `:alla` - all except tRNS/transparency or `:allb` - all except tRNS and gAMA/gamma *(defaults to `:alla`)*
224
+ * `:fix` — Fix otherwise fatal conditions such as bad CRCs *(defaults to `false`)*
225
+ * `:brute` — Brute force try all methods, very time-consuming and generally not worthwhile *(defaults to `false`)*
226
+
227
+ ### :pngout =>
228
+ * `:copy_chunks` — Copy optional chunks *(defaults to `false`)*
229
+ * `:strategy` — Strategy: `0` - xtreme, `1` - intense, `2` - longest Match, `3` - huffman Only, `4` - uncompressed *(defaults to `0`)*
230
+
231
+ ### :optipng =>
232
+ * `:level` — Optimization level preset: `0` is least, `7` is best *(defaults to `6`)*
233
+ * `:interlace` — Interlace, `true` - interlace on, `false` - interlace off, `nil` - as is in original image *(defaults to `false`)*
223
234
 
224
- ### pngout
225
- * `:copy_chunks` — Copy optional chunks *(defaults to false)*
226
- * `:strategy` — Strategy: 0 - xtreme, 1 - intense, 2 - longest Match, 3 - huffman Only, 4 - uncompressed *(defaults to 0)*
235
+ ### :advpng =>
236
+ * `:level` — Compression level: `0` - don't compress, `1` - fast, `2` - normal, `3` - extra, `4` - extreme *(defaults to `4`)*
227
237
 
228
- ### optipng
229
- * `:level` Optimization level preset 0 is least, 7 is best *(defaults to 6)*
230
- * `:interlace` — Interlace, true - interlace on, false - interlace off, nil - as is in original image *(defaults to false)*
238
+ ### :jhead =>
239
+ Worker has no options
231
240
 
232
- ### advpng
233
- * `:level` — Compression level: 0 - don't compress, 1 - fast, 2 - normal, 3 - extra, 4 - extreme *(defaults to 4)*
241
+ ### :jpegoptim =>
242
+ * `:strip` — List of extra markers to strip: `:comments`, `:exif`, `:iptc`, `:icc` or `:all` *(defaults to `:all`)*
243
+ * `:max_quality` — Maximum image quality factor `0`..`100` *(defaults to `100`)*
234
244
 
235
- ### jpegoptim
236
- * `:strip` — List of extra markers to strip: comments, exif, iptc, icc or all *(defaults to all)*
237
- * `:max_quality` — Maximum image quality factor 0..100 *(defaults to 100)*
245
+ ### :jpegtran =>
246
+ * `:copy_chunks` — Copy all chunks *(defaults to `false`)*
247
+ * `:progressive` — Create progressive JPEG file *(defaults to `true`)*
248
+ * `:jpegrescan` — Use jpegtran through jpegrescan, ignore progressive option *(defaults to `false`)*
238
249
 
239
- ### jpegtran
240
- * `:copy_chunks` — Copy all chunks *(defaults to false)*
241
- * `:progressive` — Create progressive JPEG file *(defaults to true)*
242
- * `:jpegrescan` — Use jpegtran through jpegrescan, ignore progressive option *(defaults to false)*
250
+ ### :gifsicle =>
251
+ * `:interlace` — Turn interlacing on *(defaults to `false`)*
243
252
 
244
- ### gifsicle
245
- * `:interlace` Turn interlacing on *(defaults to false)*
253
+ ### :svgo =>
254
+ Worker has no options
246
255
 
247
256
  <!---</worker-options>-->
248
257
 
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.12.0'
5
+ s.version = '0.12.1'
6
6
  s.summary = %q{Optimize (lossless compress) images (jpeg, png, gif, svg) using external utilities (advpng, gifsicle, jpegoptim, jpegtran, optipng, pngcrush, pngout, svgo)}
7
7
  s.homepage = "http://github.com/toy/#{s.name}"
8
8
  s.authors = ['Ivan Kuchin']
data/lib/image_optim.rb CHANGED
@@ -36,13 +36,19 @@ class ImageOptim
36
36
  #
37
37
  # ImageOptim.new(:nice => 20)
38
38
  def initialize(options = {})
39
- @bin_resolver = BinResolver.new
40
-
41
39
  config = Config.new(options)
42
40
  @nice = config.nice
43
41
  @threads = config.threads
44
42
  @verbose = config.verbose
45
43
 
44
+ if verbose?
45
+ $stderr << config
46
+ $stderr << "Nice level: #{nice}\n"
47
+ $stderr << "Using threads: #{threads}\n"
48
+ end
49
+
50
+ @bin_resolver = BinResolver.new(self)
51
+
46
52
  @workers_by_format = {}
47
53
  Worker.klasses.each do |klass|
48
54
  if worker_options = config.for_worker(klass)
@@ -56,8 +62,6 @@ class ImageOptim
56
62
  @workers_by_format.values.each(&:sort!)
57
63
 
58
64
  config.assert_no_unused_options!
59
-
60
- puts config if verbose?
61
65
  end
62
66
 
63
67
  # Get workers for image
@@ -18,7 +18,8 @@ class ImageOptim
18
18
  end
19
19
 
20
20
  attr_reader :dir
21
- def initialize
21
+ def initialize(image_optim)
22
+ @image_optim = image_optim
22
23
  @bins = {}
23
24
  @lock = Mutex.new
24
25
  end
@@ -27,7 +28,10 @@ class ImageOptim
27
28
  name = name.to_sym
28
29
 
29
30
  resolving(name) do
30
- @bins[name] = resolve?(name) && Bin.new(name, version(name))
31
+ if bin = resolve?(name) && Bin.new(name, version(name))
32
+ $stderr << "Resolved #{bin}\n" if @image_optim.verbose?
33
+ end
34
+ @bins[name] = bin
31
35
  end
32
36
 
33
37
  if @bins[name]
@@ -75,7 +75,7 @@ class ImageOptim
75
75
  def threads
76
76
  threads = get!(:threads)
77
77
 
78
- threads = case threads
78
+ case threads
79
79
  when true, nil
80
80
  processor_count
81
81
  when false
@@ -83,8 +83,6 @@ class ImageOptim
83
83
  else
84
84
  threads.to_i
85
85
  end
86
-
87
- OptionHelpers.limit_with_range(threads, 1..16)
88
86
  end
89
87
 
90
88
  def verbose
@@ -3,12 +3,15 @@ require 'image_optim'
3
3
  class ImageOptim
4
4
  class Railtie < Rails::Railtie
5
5
  initializer 'image_optim.initializer' do |app|
6
- if app.config.assets.compress != false && app.config.assets.image_optim != false
7
- image_optim = if app.config.assets.image_optim == true
8
- ImageOptim.new
9
- else
10
- ImageOptim.new(app.config.assets.image_optim || {})
11
- end
6
+ if app.config.assets.compress != false && app.config.assets.image_optim != false && app.assets
7
+
8
+ options = if app.config.assets.image_optim == true
9
+ {}
10
+ else
11
+ app.config.assets.image_optim || {}
12
+ end
13
+
14
+ image_optim = ImageOptim.new(options)
12
15
 
13
16
  processor = proc do |context, data|
14
17
  image_optim.optimize_image_data(data) || data
@@ -18,6 +21,7 @@ class ImageOptim
18
21
  app.assets.register_preprocessor 'image/jpeg', :image_optim, &processor
19
22
  app.assets.register_preprocessor 'image/png', :image_optim, &processor
20
23
  app.assets.register_preprocessor 'image/svg+xml', :image_optim, &processor
24
+
21
25
  end
22
26
  end
23
27
  end
@@ -4,7 +4,7 @@ require 'image_optim/option_helpers'
4
4
  class ImageOptim
5
5
  class Worker
6
6
  class Advpng < Worker
7
- option(:level, 4, 'Compression level: 0 - don\'t compress, 1 - fast, 2 - normal, 3 - extra, 4 - extreme') do |v|
7
+ option(:level, 4, 'Compression level: `0` - don\'t compress, `1` - fast, `2` - normal, `3` - extra, `4` - extreme') do |v|
8
8
  OptionHelpers.limit_with_range(v.to_i, 0..4)
9
9
  end
10
10
 
@@ -4,7 +4,7 @@ require 'image_optim/option_helpers'
4
4
  class ImageOptim
5
5
  class Worker
6
6
  class Jpegoptim < Worker
7
- option(:strip, :all, Array, 'List of extra markers to strip: comments, exif, iptc, icc or all') do |v|
7
+ option(:strip, :all, Array, 'List of extra markers to strip: `:comments`, `:exif`, `:iptc`, `:icc` or `:all`') do |v|
8
8
  values = Array(v).map(&:to_s)
9
9
  known_values = %w[all comments exif iptc icc]
10
10
  unknown_values = values - known_values
@@ -12,7 +12,7 @@ class ImageOptim
12
12
  values & known_values
13
13
  end
14
14
 
15
- option(:max_quality, 100, 'Maximum image quality factor 0..100'){ |v| OptionHelpers.limit_with_range(v.to_i, 0..100) }
15
+ option(:max_quality, 100, 'Maximum image quality factor `0`..`100`'){ |v| OptionHelpers.limit_with_range(v.to_i, 0..100) }
16
16
 
17
17
  # Run first if max_quality < 100
18
18
  def run_order
@@ -5,9 +5,9 @@ require 'image_optim/true_false_nil'
5
5
  class ImageOptim
6
6
  class Worker
7
7
  class Optipng < Worker
8
- option(:level, 6, 'Optimization level preset 0 is least, 7 is best'){ |v| OptionHelpers.limit_with_range(v.to_i, 0..7) }
8
+ option(:level, 6, 'Optimization level preset: `0` is least, `7` is best'){ |v| OptionHelpers.limit_with_range(v.to_i, 0..7) }
9
9
 
10
- option(:interlace, false, TrueFalseNil, 'Interlace, true - interlace on, false - interlace off, nil - as is in original image') do |v|
10
+ option(:interlace, false, TrueFalseNil, 'Interlace, `true` - interlace on, `false` - interlace off, `nil` - as is in original image') do |v|
11
11
  v && true
12
12
  end
13
13
 
@@ -3,8 +3,8 @@ require 'image_optim/worker'
3
3
  class ImageOptim
4
4
  class Worker
5
5
  class Pngcrush < Worker
6
- option(:chunks, :alla, Array, 'List of chunks to remove or \'alla\' - all except tRNS/transparency or '\
7
- '\'allb\' - all except tRNS and gAMA/gamma'){ |v| Array(v).map(&:to_s) }
6
+ option(:chunks, :alla, Array, 'List of chunks to remove or `:alla` - all except tRNS/transparency or '\
7
+ '`:allb` - all except tRNS and gAMA/gamma'){ |v| Array(v).map(&:to_s) }
8
8
 
9
9
  option(:fix, false, 'Fix otherwise fatal conditions such as bad CRCs'){ |v| !!v }
10
10
 
@@ -6,7 +6,7 @@ class ImageOptim
6
6
  class Pngout < Worker
7
7
  option(:copy_chunks, false, 'Copy optional chunks'){ |v| !!v }
8
8
 
9
- option(:strategy, 0, 'Strategy: 0 - xtreme, 1 - intense, 2 - longest Match, 3 - huffman Only, 4 - uncompressed') do |v|
9
+ option(:strategy, 0, 'Strategy: `0` - xtreme, `1` - intense, `2` - longest Match, `3` - huffman Only, `4` - uncompressed') do |v|
10
10
  OptionHelpers.limit_with_range(v.to_i, 0..4)
11
11
  end
12
12
 
@@ -13,13 +13,15 @@ def worker_options
13
13
  io = StringIO.new
14
14
 
15
15
  ImageOptim::Worker.klasses.each_with_index do |klass, i|
16
- unless klass.option_definitions.empty?
17
- io.puts "### #{klass.bin_sym}"
16
+ io.puts "### :#{klass.bin_sym} =>"
17
+ if klass.option_definitions.empty?
18
+ io.puts 'Worker has no options'
19
+ else
18
20
  klass.option_definitions.each do |option_definition|
19
- io.puts "* `:#{option_definition.name}` — #{option_definition.description} *(defaults to #{option_definition.default})*"
21
+ io.puts "* `:#{option_definition.name}` — #{option_definition.description} *(defaults to `#{option_definition.default.inspect}`)*"
20
22
  end
21
- io.puts
22
23
  end
24
+ io.puts
23
25
  end
24
26
 
25
27
  io.string
@@ -10,9 +10,11 @@ ensure
10
10
  end
11
11
 
12
12
  describe ImageOptim::BinResolver do
13
+ let(:image_optim){ double(:image_optim, :verbose? => false) }
14
+ let(:resolver){ ImageOptim::BinResolver.new(image_optim) }
15
+
13
16
  it "should resolve bin in path" do
14
17
  with_env 'LS_BIN', nil do
15
- resolver = ImageOptim::BinResolver.new
16
18
  resolver.should_receive(:accessible?).with(:ls).once.and_return(true)
17
19
  FSPath.should_not_receive(:temp_dir)
18
20
 
@@ -29,7 +31,6 @@ describe ImageOptim::BinResolver do
29
31
  tmpdir = double(:tmpdir)
30
32
  symlink = double(:symlink)
31
33
 
32
- resolver = ImageOptim::BinResolver.new
33
34
  resolver.should_receive(:accessible?).with(:image_optim).once.and_return(true)
34
35
  FSPath.should_receive(:temp_dir).once.and_return(tmpdir)
35
36
  tmpdir.should_receive(:/).with(:image_optim).once.and_return(symlink)
@@ -52,7 +53,6 @@ describe ImageOptim::BinResolver do
52
53
 
53
54
  it "should raise on failure to resolve bin" do
54
55
  with_env 'SHOULD_NOT_EXIST_BIN', nil do
55
- resolver = ImageOptim::BinResolver.new
56
56
  resolver.should_receive(:accessible?).with(:should_not_exist).once.and_return(false)
57
57
  FSPath.should_not_receive(:temp_dir)
58
58
 
@@ -71,7 +71,6 @@ describe ImageOptim::BinResolver do
71
71
  tmpdir = double(:tmpdir)
72
72
  symlink = double(:symlink)
73
73
 
74
- resolver = ImageOptim::BinResolver.new
75
74
  resolver.should_receive(:accessible?).with(:should_not_exist).once.and_return(false)
76
75
  FSPath.should_receive(:temp_dir).once.and_return(tmpdir)
77
76
  tmpdir.should_receive(:/).with(:should_not_exist).once.and_return(symlink)
@@ -96,7 +95,6 @@ describe ImageOptim::BinResolver do
96
95
 
97
96
  it "should resolve bin only once" do
98
97
  with_env 'LS_BIN', nil do
99
- resolver = ImageOptim::BinResolver.new
100
98
  resolver.should_receive(:resolve?).once.with(:ls){ sleep 0.1; true }
101
99
 
102
100
  10.times.map do
@@ -109,7 +107,6 @@ describe ImageOptim::BinResolver do
109
107
 
110
108
  it "should raise on detection of problematic version" do
111
109
  with_env 'PNGCRUSH_BIN', nil do
112
- resolver = ImageOptim::BinResolver.new
113
110
  resolver.should_receive(:accessible?).with(:pngcrush).once.and_return(true)
114
111
  resolver.should_receive(:version).with(:pngcrush).once.and_return('1.7.60')
115
112
  FSPath.should_not_receive(:temp_dir)
@@ -51,9 +51,9 @@ class ImageOptim
51
51
  config.threads.should == 1
52
52
  end
53
53
 
54
- it "should convert value to number and limit to 1..16" do
54
+ it "should convert value to number" do
55
55
  config = Config.new({:threads => '616'})
56
- config.threads.should == 16
56
+ config.threads.should == 616
57
57
  end
58
58
  end
59
59
 
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.12.0
4
+ version: 0.12.1
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-03-02 00:00:00.000000000 Z
11
+ date: 2014-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath