discourse_image_optim 0.24.5 → 0.26.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,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cc2adf558f317725968c909a3006b225510f968a
4
- data.tar.gz: ffc333b3c383ae0a524368fd9d1b5d9b6c2429ce
2
+ SHA256:
3
+ metadata.gz: d4cc5e84e0c8dff3c8fd0af654608b8ee958b3283463f7f945076964ae9d3eae
4
+ data.tar.gz: ca77fd28eac0fb79493ed19600eaae18fdb7ea244f9025fdc909e7791a32133e
5
5
  SHA512:
6
- metadata.gz: 9a31691f92f66fd43600947b371622d0e462e1d4ded44531a80b2bfda930a7b71dabd8bf879afb2d04f466e247a08a14189afe945ddef15e52b58ded2b1f3d51
7
- data.tar.gz: fb3740f4088ec4a90c4b7f85d61762f2d6d702eda56bb7b692965a18b723d120690e900a9880b75557bec6ceab317041cc50c461df21db4212f9faf2eb984b5a
6
+ metadata.gz: fcbd37ef3c8899889ebcf1912f0200f7bab98399779e32658b39d55af99da87f452dfec263e91d15a177e1700d566705891f455191758ebc23f9c68d47b96cfa
7
+ data.tar.gz: 0b1379b801324ee93c546c4672abec97385cd7e5c50624e8657c9049d4f4e06135d167783d46901385209aab8b0ae364dfaf40887a67f8931c8a3b6f36255352
data/.gitignore CHANGED
@@ -5,7 +5,6 @@
5
5
  /rdoc/
6
6
  /.yardoc/
7
7
  /coverage/
8
- /vendor/
9
8
 
10
9
  /Gemfile.lock
11
10
  Makefile
data/.rubocop.yml CHANGED
@@ -6,6 +6,33 @@ AllCops:
6
6
  Bundler/OrderedGems:
7
7
  Enabled: false
8
8
 
9
+ Layout/AccessModifierIndentation:
10
+ EnforcedStyle: outdent
11
+
12
+ Layout/CaseIndentation:
13
+ EnforcedStyle: end
14
+
15
+ Layout/DotPosition:
16
+ EnforcedStyle: trailing
17
+
18
+ Layout/IndentArray:
19
+ EnforcedStyle: consistent
20
+
21
+ Layout/IndentAssignment:
22
+ Enabled: false
23
+
24
+ Layout/IndentHash:
25
+ EnforcedStyle: consistent
26
+
27
+ Layout/IndentHeredoc:
28
+ Enabled: false
29
+
30
+ Layout/SpaceBeforeBlockBraces:
31
+ EnforcedStyle: no_space
32
+
33
+ Layout/SpaceInsideHashLiteralBraces:
34
+ EnforcedStyle: no_space
35
+
9
36
  Lint/AmbiguousBlockAssociation:
10
37
  Exclude:
11
38
  - spec/**/*_spec.rb
@@ -13,6 +40,9 @@ Lint/AmbiguousBlockAssociation:
13
40
  Lint/EndAlignment:
14
41
  EnforcedStyleAlignWith: variable
15
42
 
43
+ Lint/NestedPercentLiteral:
44
+ Enabled: false
45
+
16
46
  Lint/UnneededSplatExpansion:
17
47
  Enabled: false
18
48
 
@@ -41,18 +71,9 @@ Security/MarshalLoad:
41
71
  Exclude:
42
72
  - 'script/worker_analysis'
43
73
 
44
- Style/AccessModifierIndentation:
45
- EnforcedStyle: outdent
46
-
47
74
  Style/Alias:
48
75
  EnforcedStyle: prefer_alias_method
49
76
 
50
- Style/CaseIndentation:
51
- EnforcedStyle: end
52
-
53
- Style/DotPosition:
54
- EnforcedStyle: trailing
55
-
56
77
  Style/DoubleNegation:
57
78
  Enabled: false
58
79
 
@@ -60,33 +81,22 @@ Style/EmptyCaseCondition:
60
81
  Enabled: false
61
82
 
62
83
  Style/Encoding:
63
- EnforcedStyle: when_needed
84
+ Enabled: false
85
+
86
+ Style/FormatStringToken:
87
+ Enabled: false
64
88
 
65
89
  Style/HashSyntax:
66
90
  EnforcedStyle: hash_rockets
67
91
 
68
92
  Style/IfUnlessModifier:
69
- MaxLineLength: 40
70
-
71
- Style/IndentArray:
72
- EnforcedStyle: consistent
73
-
74
- Style/IndentAssignment:
75
- Enabled: false
76
-
77
- Style/IndentHash:
78
- EnforcedStyle: consistent
79
-
80
- Style/IndentHeredoc:
81
93
  Enabled: false
82
94
 
83
95
  Style/ParallelAssignment:
84
96
  Enabled: false
85
97
 
86
- Style/PercentLiteralDelimiters:
87
- PreferredDelimiters:
88
- '%w': '[]'
89
- '%W': '[]'
98
+ Style/RescueStandardError:
99
+ EnforcedStyle: implicit
90
100
 
91
101
  Style/Semicolon:
92
102
  AllowAsExpressionSeparator: true
@@ -94,17 +104,11 @@ Style/Semicolon:
94
104
  Style/SignalException:
95
105
  EnforcedStyle: semantic
96
106
 
97
- Style/SpaceBeforeBlockBraces:
98
- EnforcedStyle: no_space
99
-
100
- Style/SpaceInsideHashLiteralBraces:
101
- EnforcedStyle: no_space
107
+ Style/SymbolArray:
108
+ Enabled: false
102
109
 
103
110
  Style/TrailingCommaInArguments:
104
111
  EnforcedStyleForMultiline: no_comma
105
112
 
106
113
  Style/TrailingCommaInLiteral:
107
114
  EnforcedStyleForMultiline: comma
108
-
109
- Style/SymbolArray:
110
- Enabled: false
data/.travis.yml CHANGED
@@ -10,30 +10,32 @@ rvm:
10
10
  - '1.9.3-p551'
11
11
  - '2.0.0-p648'
12
12
  - '2.1.10'
13
- - '2.2.7'
14
- - '2.3.4'
15
- - '2.4.1'
16
- - 'jruby-1.7.26'
13
+ - '2.2.8'
14
+ - '2.3.5'
15
+ - '2.4.2'
17
16
  - 'jruby-9.0.5.0'
18
- - 'jruby-9.1.5.0'
17
+ - 'jruby-9.1.9.0'
19
18
  script:
20
19
  - bundle exec image_optim --info
21
20
  - bundle exec rspec
22
21
  before_install:
22
+ - gem update --system
23
+ - gem update bundler
24
+ - nvm install stable
23
25
  - mkdir -p ~/bin
24
- - command -v svgo || npm install svgo
26
+ - command -v svgo || npm install -g svgo
25
27
  - command -v pngout || curl -L "http://static.jonof.id.au/dl/kenutils/pngout-20130221-linux.tar.gz" | tar -xz -C ~/bin --strip-components 2 --wildcards '*/x86_64/pngout'
26
28
  matrix:
27
29
  include:
28
30
  - env: CODECLIMATE=✓
29
- rvm: '2.4.1'
31
+ rvm: '2.4.2'
30
32
  after_success: bundle exec codeclimate-test-reporter
31
33
  - env: RUBOCOP=✓
32
- rvm: '2.4.1'
34
+ rvm: '2.4.2'
33
35
  script: bundle exec rubocop
34
36
  before_install:
35
37
  - env: CHECK_RUBIES=✓
36
- rvm: '2.4.1'
38
+ rvm: '2.4.2'
37
39
  script: bundle exec travis_check_rubies
38
40
  before_install:
39
41
  addons:
data/CHANGELOG.markdown CHANGED
@@ -2,8 +2,26 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## v0.26.1 (2017-12-14)
6
+
7
+ * Require `'date'` which is used in parsing pngout version [toy/image_optim_pack#14](https://github.com/toy/image_optim_pack/issues/14) [@toy](https://github.com/toy)
8
+
5
9
  * Add `timeout` option to workers [#21](https://github.com/toy/image_optim/issues/21)
6
- [@tgxworld](http://github.com/tgxworld)
10
+ [@tgxworld](http://github.com/tgxworld)
11
+
12
+ ## v0.26.0 (2017-11-13)
13
+
14
+ * Enable `jpegrescan` by default after removing its dependency on `File::Slurp` and fixing for windows [#153](https://github.com/toy/image_optim/issues/153) [@toy](https://github.com/toy)
15
+ * Extend description of `--verbose` flag [#152](https://github.com/toy/image_optim/issues/152) [@toy](https://github.com/toy)
16
+
17
+ ## v0.25.0 (2017-07-06)
18
+
19
+ * Fix error `uninitialized constant EXIFR::JPEG` (breaking change in [exifr v1.3.0](https://github.com/remvee/exifr/commit/e073a22d06c39f2c1c0e77f5b5fe71545b25e967)) [#150](https://github.com/toy/image_optim/pull/150) [@abemedia](https://github.com/abemedia)
20
+ * Add option to `pngquant` worker to limit maximum number of colors to use [#144](https://github.com/toy/image_optim/issues/144) [@toy](https://github.com/toy)
21
+
22
+ ## v0.24.3 (2017-05-04)
23
+
24
+ * Set mode of cache files to `0666 & ~umask`, related to [#147](https://github.com/toy/image_optim/issues/147) [@toy](https://github.com/toy)
7
25
 
8
26
  ## v0.24.2 (2017-02-18)
9
27
 
@@ -18,7 +36,7 @@
18
36
 
19
37
  ## v0.24.0 (2016-08-14)
20
38
 
21
- * Rails image assets optimization is extracted into [image\_optim\_rails gem](https://github.com/toy/image_optim_rails) [#127](https://github.com/toy/image_optim/issues/127) [@toy](https://github.com/toy)
39
+ * Rails image assets optimization is extracted into [image_optim_rails gem](https://github.com/toy/image_optim_rails) [#127](https://github.com/toy/image_optim/issues/127) [@toy](https://github.com/toy)
22
40
  * Add proper handling of `ImageOptim.respond_to?` [@toy](https://github.com/toy)
23
41
  * Fix an issue not working OptiPNG `interlace` option [#136](https://github.com/toy/image_optim/pull/136) [@mrk21](https://github.com/mrk21)
24
42
  * Minimize number of file system calls in default implementation of `optimized?` [#137](https://github.com/toy/image_optim/issues/137) [@toy](https://github.com/toy)
@@ -265,7 +283,7 @@
265
283
 
266
284
  * Warn if directly added files are not images or are not optimizable [@toy](https://github.com/toy)
267
285
  * Recursively scan directories for images [#4](https://github.com/toy/image_optim/issues/4) [@toy](https://github.com/toy)
268
- * Typo in bin/image_optim [#3](https://github.com/toy/image_optim/issues/3) [@fabiomcosta](https://github.com/fabiomcosta)
286
+ * Typo in bin/image_optim [#3](https://github.com/toy/image_optim/issues/3) [@fabiomcosta](https://github.com/fabiomcosta)
269
287
 
270
288
  ## v0.5.1 (2012-08-07)
271
289
 
data/Gemfile CHANGED
@@ -12,5 +12,4 @@ end
12
12
 
13
13
  if RUBY_VERSION >= '2.0'
14
14
  gem 'travis_check_rubies', '~> 0.2'
15
- gem 'rainbow', '!= 2.2.1' # TODO: remove when sickill/rainbow#44 is resolved
16
15
  end
data/README.markdown CHANGED
@@ -11,7 +11,7 @@
11
11
  Optimize (lossless compress, optionally lossy) images (jpeg, png, gif, svg) using external utilities:
12
12
 
13
13
  * [advpng](http://advancemame.sourceforge.net/doc-advpng.html) from [AdvanceCOMP](http://advancemame.sourceforge.net/comp-readme.html)
14
- (will use [zopfli](https://code.google.com/p/zopfli/) on default/maximum level 4)
14
+ (will use [zopfli](https://code.google.com/p/zopfli/) on default/maximum level 4)
15
15
  * [gifsicle](http://www.lcdf.org/gifsicle/)
16
16
  * [jhead](http://www.sentex.net/~mwandel/jhead/)
17
17
  * [jpegoptim](http://www.kokkonen.net/tjko/projects.html)
@@ -57,9 +57,11 @@ gem 'image_optim_pack'
57
57
  With version:
58
58
 
59
59
  <!---<update-version>-->
60
+
60
61
  ```ruby
61
- gem 'image_optim', '~> 0.24'
62
+ gem 'image_optim', '~> 0.26'
62
63
  ```
64
+
63
65
  <!---</update-version>-->
64
66
 
65
67
  If you want to check latest changes:
@@ -241,7 +243,7 @@ image_optim.optimize_images_data(datas)
241
243
 
242
244
  ### From rails
243
245
 
244
- Rails image assets optimization is extracted into [image\_optim\_rails gem](https://github.com/toy/image_optim_rails).
246
+ Rails image assets optimization is extracted into [image_optim_rails gem](https://github.com/toy/image_optim_rails).
245
247
 
246
248
  ## Configuration
247
249
 
@@ -263,79 +265,92 @@ optipng:
263
265
 
264
266
  ## Options
265
267
 
266
- * `:nice` — Nice level, priority of all used tools with higher value meaning lower priority, in range `-20..19`, negative values can be set only if run by root user *(defaults to `10`)*
267
- * `:threads` — Number of threads or disable *(defaults to number of processors)*
268
- * `:verbose` — Verbose output *(defaults to `false`)*
269
- * `:pack` — Require image\_optim\_pack or disable it, by default image\_optim\_pack will be used if available, will turn on `:skip-missing-workers` unless explicitly disabled *(defaults to `nil`)*
270
- * `:skip_missing_workers` — Skip workers with missing or problematic binaries *(defaults to `false`)*
271
- * `:allow_lossy` — Allow lossy workers and optimizations *(defaults to `false`)*
268
+ * `:nice` — Nice level, priority of all used tools with higher value meaning lower priority, in range `-20..19`, negative values can be set only if run by root user _(defaults to `10`)_
269
+ * `:threads` — Number of threads or disable _(defaults to number of processors)_
270
+ * `:verbose` — Verbose output _(defaults to `false`)_
271
+ * `:pack` — Require image_optim_pack or disable it, by default image_optim_pack will be used if available, will turn on `:skip-missing-workers` unless explicitly disabled _(defaults to `nil`)_
272
+ * `:skip_missing_workers` — Skip workers with missing or problematic binaries _(defaults to `false`)_
273
+ * `:allow_lossy` — Allow lossy workers and optimizations _(defaults to `false`)_
272
274
  * `:cache_dir` — Configure cache directory
273
275
  * `:cache_worker_digests` - Also cache worker digests along with original file digest and worker options: updating workers invalidates cache
274
- * `:timeout` — Number of seconds before workers are timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
276
+ * `:timeout` — Number of seconds before workers are timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
275
277
 
276
278
  Worker can be disabled by passing `false` instead of options hash or by setting option `:disable` to `true`.
277
279
 
278
280
  <!---<worker-options>-->
281
+
279
282
  <!-- markdown for worker options is generated by `script/update_worker_options_in_readme` -->
280
283
 
281
284
  ### advpng:
282
- * `:level` — Compression level: `0` - don't compress, `1` - fast, `2` - normal, `3` - extra, `4` - extreme *(defaults to `4`)*
283
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
285
+
286
+ * `:level` — Compression level: `0` - don't compress, `1` - fast, `2` - normal, `3` - extra, `4` - extreme _(defaults to `4`)_
287
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
284
288
 
285
289
  ### gifsicle:
290
+
286
291
  * `:interlace` — Interlace: `true` - interlace on, `false` - interlace off, `nil` - as is in original image (defaults to running two instances, one with interlace off and one with on)
287
- * `:level` — Compression level: `1` - light and fast, `2` - normal, `3` - heavy (slower) *(defaults to `3`)*
288
- * `:careful` — Avoid bugs with some software *(defaults to `false`)*
289
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
292
+ * `:level` — Compression level: `1` - light and fast, `2` - normal, `3` - heavy (slower) _(defaults to `3`)_
293
+ * `:careful` — Avoid bugs with some software _(defaults to `false`)_
294
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
290
295
 
291
296
  ### jhead:
292
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
297
+
298
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
293
299
 
294
300
  ### jpegoptim:
295
- * `:allow_lossy` — Allow limiting maximum quality *(defaults to `false`)*
296
- * `:strip` — List of extra markers to strip: `:comments`, `:exif`, `:iptc`, `:icc` or `:all` *(defaults to `:all`)*
297
- * `:max_quality` — Maximum image quality factor `0`..`100`, ignored in default/lossless mode *(defaults to `100`)*
298
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
301
+
302
+ * `:allow_lossy` — Allow limiting maximum quality _(defaults to `false`)_
303
+ * `:strip` — List of extra markers to strip: `:comments`, `:exif`, `:iptc`, `:icc` or `:all` _(defaults to `:all`)_
304
+ * `:max_quality` — Maximum image quality factor `0`..`100`, ignored in default/lossless mode _(defaults to `100`)_
305
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
299
306
 
300
307
  ### jpegrecompress:
301
- * `:allow_lossy` — Allow worker, it is always lossy *(defaults to `false`)*
302
- * `:quality` — JPEG quality preset: `0` - low, `1` - medium, `2` - high, `3` - veryhigh *(defaults to `3`)*
303
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
308
+
309
+ * `:allow_lossy` — Allow worker, it is always lossy _(defaults to `false`)_
310
+ * `:quality` — JPEG quality preset: `0` - low, `1` - medium, `2` - high, `3` - veryhigh _(defaults to `3`)_
311
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
304
312
 
305
313
  ### jpegtran:
306
- * `:copy_chunks` — Copy all chunks *(defaults to `false`)*
307
- * `:progressive` — Create progressive JPEG file *(defaults to `true`)*
308
- * `:jpegrescan` — Use jpegtran through jpegrescan, ignore progressive option *(defaults to `false`)*
309
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
314
+
315
+ * `:copy_chunks` — Copy all chunks _(defaults to `false`)_
316
+ * `:progressive` — Create progressive JPEG file _(defaults to `true`)_
317
+ * `:jpegrescan` — Use jpegtran through jpegrescan, ignore progressive option _(defaults to `false`)_
318
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
310
319
 
311
320
  ### optipng:
312
- * `:level` — Optimization level preset: `0` is least, `7` is best *(defaults to `6`)*
313
- * `:interlace` — Interlace: `true` - interlace on, `false` - interlace off, `nil` - as is in original image *(defaults to `false`)*
314
- * `:strip` — Remove all auxiliary chunks *(defaults to `true`)*
315
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
321
+
322
+ * `:level` — Optimization level preset: `0` is least, `7` is best _(defaults to `6`)_
323
+ * `:interlace` — Interlace: `true` - interlace on, `false` - interlace off, `nil` - as is in original image _(defaults to `false`)_
324
+ * `:strip` — Remove all auxiliary chunks _(defaults to `true`)_
325
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
316
326
 
317
327
  ### pngcrush:
318
- * `:chunks` — List of chunks to remove or `:alla` - all except tRNS/transparency or `:allb` - all except tRNS and gAMA/gamma *(defaults to `:alla`)*
319
- * `:fix` — Fix otherwise fatal conditions such as bad CRCs *(defaults to `false`)*
320
- * `:brute` — Brute force try all methods, very time-consuming and generally not worthwhile *(defaults to `false`)*
321
- * `:blacken` — Blacken fully transparent pixels *(defaults to `true`)*
322
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
328
+
329
+ * `:chunks` — List of chunks to remove or `:alla` - all except tRNS/transparency or `:allb` - all except tRNS and gAMA/gamma _(defaults to `:alla`)_
330
+ * `:fix` — Fix otherwise fatal conditions such as bad CRCs _(defaults to `false`)_
331
+ * `:brute` — Brute force try all methods, very time-consuming and generally not worthwhile _(defaults to `false`)_
332
+ * `:blacken` — Blacken fully transparent pixels _(defaults to `true`)_
333
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
323
334
 
324
335
  ### pngout:
325
- * `:copy_chunks` — Copy optional chunks *(defaults to `false`)*
326
- * `:strategy` — Strategy: `0` - xtreme, `1` - intense, `2` - longest Match, `3` - huffman Only, `4` - uncompressed *(defaults to `0`)*
327
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
336
+
337
+ * `:copy_chunks` — Copy optional chunks _(defaults to `false`)_
338
+ * `:strategy` — Strategy: `0` - xtreme, `1` - intense, `2` - longest Match, `3` - huffman Only, `4` - uncompressed _(defaults to `0`)_
339
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
328
340
 
329
341
  ### pngquant:
330
- * `:allow_lossy` — Allow quality option *(defaults to `false`)*
331
- * `: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`, `0..100` in lossy mode)*
332
- * `:speed` — speed/quality trade-off: `1` - slow, `3` - default, `11` - fast & rough *(defaults to `3`)*
333
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
342
+
343
+ * `:allow_lossy` — Allow quality option _(defaults to `false`)_
344
+ * `:max_colors` — Maximum number of colors to use _(defaults to `256`)_
345
+ * `: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`, `0..100` in lossy mode)_
346
+ * `:speed` — speed/quality trade-off: `1` - slow, `3` - default, `11` - fast & rough _(defaults to `3`)_
347
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
334
348
 
335
349
  ### svgo:
336
- * `:disable_plugins` — List of plugins to disable *(defaults to `[]`)*
337
- * `:enable_plugins` — List of plugins to enable *(defaults to `[]`)*
338
- * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. *(defaults to `0`)*
350
+
351
+ * `:disable_plugins` — List of plugins to disable _(defaults to `[]`)_
352
+ * `:enable_plugins` — List of plugins to enable _(defaults to `[]`)_
353
+ * `:timeout` — Number of seconds before worker is timed out. Must be greater than 0 to enable timeout. _(defaults to `0`)_
339
354
 
340
355
  <!---</worker-options>-->
341
356
 
@@ -345,10 +360,6 @@ Worker can be disabled by passing `false` instead of options hash or by setting
345
360
 
346
361
  If you would like to contribute - that is great and you are very welcome. Please check few notes in file [CONTRIBUTING.markdown](CONTRIBUTING.markdown).
347
362
 
348
- Financial contributions can be made via [gratipay](https://gratipay.com/toy/).
349
-
350
- [![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.1.2/dist/gratipay.png)](https://gratipay.com/toy/)
351
-
352
363
  ## ChangeLog
353
364
 
354
365
  In separate file [CHANGELOG.markdown](CHANGELOG.markdown).
data/bin/image_optim CHANGED
@@ -10,7 +10,7 @@ options = ImageOptim::Runner::OptionParser.parse!(args)
10
10
 
11
11
  begin
12
12
  if options[:verbose]
13
- $stderr.puts ImageOptim.full_version
13
+ $stderr << "#{ImageOptim.full_version}\n"
14
14
  end
15
15
 
16
16
  only_info = options.delete(:only_info)
data/image_optim.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'discourse_image_optim'
5
- s.version = '0.24.5'
5
+ s.version = '0.26.1'
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']
@@ -28,7 +28,7 @@ EOF
28
28
 
29
29
  s.add_development_dependency 'image_optim_pack', '~> 0.2', '>= 0.2.2'
30
30
  s.add_development_dependency 'rspec', '~> 3.0'
31
- if RUBY_VERSION >= '2.0'
32
- s.add_development_dependency 'rubocop', '~> 0.47'
31
+ if RUBY_VERSION >= '2.1'
32
+ s.add_development_dependency 'rubocop', '~> 0.52'
33
33
  end
34
34
  end
@@ -5,6 +5,7 @@ require 'image_optim/cmd'
5
5
  require 'image_optim/path'
6
6
  require 'shellwords'
7
7
  require 'digest/sha1'
8
+ require 'date'
8
9
 
9
10
  class ImageOptim
10
11
  class BinResolver
@@ -225,7 +225,9 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
225
225
  op.separator nil
226
226
  op.separator ' Common options:'
227
227
 
228
- op.on_tail('-v', '--verbose', 'Verbose output') do
228
+ op.on_tail('-v', '--verbose', 'Verbose output (show global and worker '\
229
+ 'config, binary resolution log, information about each tool invocation, '\
230
+ 'backtrace of exception)') do
229
231
  options[:verbose] = true
230
232
  end
231
233
 
@@ -1,5 +1,5 @@
1
1
  require 'image_optim/worker'
2
- require 'exifr'
2
+ require 'exifr/jpeg'
3
3
 
4
4
  class ImageOptim
5
5
  class Worker
@@ -14,7 +14,7 @@ class ImageOptim
14
14
  option(:progressive, true, 'Create progressive JPEG file'){ |v| !!v }
15
15
 
16
16
  JPEGRESCAN_OPTION =
17
- option(:jpegrescan, false, 'Use jpegtran through jpegrescan, '\
17
+ option(:jpegrescan, true, 'Use jpegtran through jpegrescan, '\
18
18
  'ignore progressive option'){ |v| !!v }
19
19
 
20
20
  TIMEOUT_OPTION = timeout_option
@@ -9,6 +9,11 @@ class ImageOptim
9
9
  ALLOW_LOSSY_OPTION =
10
10
  option(:allow_lossy, false, 'Allow quality option'){ |v| !!v }
11
11
 
12
+ MAX_COLORS_OPTION =
13
+ option(:max_colors, 256, 'Maximum number of colors to use') do |v|
14
+ OptionHelpers.limit_with_range(v.to_i, 2..256)
15
+ end
16
+
12
17
  QUALITY_OPTION =
13
18
  option(:quality, '`100..100`, `0..100` in lossy mode',
14
19
  NonNegativeIntegerRange, 'min..max - don\'t '\
@@ -51,6 +56,7 @@ class ImageOptim
51
56
  --speed=#{speed}
52
57
  --output=#{dst}
53
58
  --force
59
+ #{max_colors}
54
60
  --
55
61
  #{src}
56
62
  ]
@@ -143,7 +143,8 @@ class ImageOptim
143
143
  %W[
144
144
  env PATH=#{@image_optim.env_path.shellescape}
145
145
  nice -n #{@image_optim.nice}
146
- #{cmd_args.shelljoin} > #{Path::NULL} 2>&1
146
+ #{cmd_args.shelljoin}
147
+ > #{Path::NULL} 2>&1
147
148
  ].join(' ')
148
149
  else
149
150
  [
@@ -133,8 +133,10 @@ class Analyser
133
133
 
134
134
  # Delegate to worker with short id
135
135
  class WorkerVariant < DelegateClass(ImageOptim::Worker)
136
- attr_reader :name, :id, :cons_id
136
+ attr_reader :name, :id, :cons_id, :required
137
137
  def initialize(klass, image_optim, options)
138
+ @required = options.delete(:required)
139
+ @run_order = options.delete(:run_order)
138
140
  allow_consecutive_on = Array(options.delete(:allow_consecutive_on))
139
141
  @image_optim = image_optim
140
142
  @name = klass.bin_sym.to_s + options_string(options)
@@ -143,6 +145,10 @@ class Analyser
143
145
  @cons_id = [klass, allow_consecutive_on.map{ |key| [key, send(key)] }]
144
146
  end
145
147
 
148
+ def run_order
149
+ @run_order || super
150
+ end
151
+
146
152
  def etag
147
153
  [
148
154
  id,
@@ -155,7 +161,8 @@ class Analyser
155
161
 
156
162
  def bin_versions
157
163
  @bin_versions ||= used_bins.map do |name|
158
- @image_optim.resolve_bin!(name).to_s
164
+ bin = @image_optim.resolve_bin!(name)
165
+ "#{bin.name} #{bin.version}"
159
166
  end
160
167
  end
161
168
 
@@ -189,7 +196,7 @@ class Analyser
189
196
 
190
197
  dst_size = success ? dst.size : nil
191
198
  digest = (success ? dst : src).digest
192
- cache = digest.sub(/../, '\0/') + ".#{src.image_format}"
199
+ cache = digest.sub(/../, '\0/')
193
200
  result = new(worker.id, success, time, src.size, dst_size, cache)
194
201
  if success
195
202
  path = result.path
@@ -274,7 +281,9 @@ class Analyser
274
281
  end
275
282
 
276
283
  def run_workers(src, workers, last_result = nil, &block)
284
+ required_workers = workers.select(&:required)
277
285
  with_progress(workers, last_result) do |worker|
286
+ next if required_workers.any?{ |w| w.run_order < worker.run_order }
278
287
  worker_result, result_image = run_worker(src, worker)
279
288
 
280
289
  steps = (last_result ? last_result.steps : []) + [worker_result]
@@ -306,19 +315,12 @@ class Analyser
306
315
  def difference_with(other)
307
316
  run_cache[:difference][other.digest] ||=
308
317
  Cache.get(:difference, [@path.digest, other.digest].sort, nil) do
309
- images = [flatten_animation(@path), flatten_animation(other)]
310
-
311
- alpha_presence = images.map do |image|
312
- Cmd.capture("identify -format '%A' #{image.to_s.shellescape}")
313
- end
314
- if alpha_presence.uniq.length == 2
315
- images.map!{ |image| underlay_noise(image) }
316
- end
318
+ images = for_compare(@path, other)
317
319
 
318
320
  nrmse = Cmd.capture(%W[
319
321
  convert
320
- #{images[0]} -auto-orient
321
- #{images[1]} -auto-orient
322
+ #{images[0].image_format}:#{images[0]} -auto-orient
323
+ #{images[1].image_format}:#{images[1]} -auto-orient
322
324
  -metric RMSE
323
325
  -compare
324
326
  -format %[distortion]
@@ -331,16 +333,33 @@ class Analyser
331
333
  end
332
334
  end
333
335
 
336
+ def for_compare(*images)
337
+ images.map!{ |image| flatten_animation(image) }
338
+
339
+ alpha_presence = images.map do |image|
340
+ !!Cmd.capture(%W[
341
+ identify
342
+ -format %A
343
+ #{image.image_format}:#{image.to_s.shellescape}
344
+ ].shelljoin)[/true/i]
345
+ end
346
+ if alpha_presence.uniq.length != 1
347
+ images.map!{ |image| underlay_noise(image) }
348
+ end
349
+
350
+ images
351
+ end
352
+
334
353
  def flatten_animation(image)
335
354
  run_cache[:flatten][image.digest] ||= begin
336
355
  if image.image_format == :gif
337
356
  flattened = image.temp_path
338
357
  Cmd.run(*%W[
339
358
  convert
340
- #{image}
359
+ #{image.image_format}:#{image}
341
360
  -coalesce
342
361
  -append
343
- #{flattened}
362
+ #{image.image_format}:#{flattened}
344
363
  ]) || fail("failed flattening of #{image}")
345
364
  flattened
346
365
  else
@@ -354,12 +373,12 @@ class Analyser
354
373
  with_noise = image.temp_path
355
374
  Cmd.run(*%W[
356
375
  convert
357
- #{image}
376
+ #{image.image_format}:#{image}
358
377
  +noise Random
359
- #{image}
378
+ #{image.image_format}:#{image}
360
379
  -flatten
361
380
  -alpha off
362
- #{with_noise}
381
+ #{image.image_format}:#{with_noise}
363
382
  ]) || fail("failed underlaying noise to #{image}")
364
383
  with_noise
365
384
  end
@@ -455,25 +474,24 @@ class Analyser
455
474
  end
456
475
  end
457
476
 
458
- def initialize(option_variants)
459
- option_variants = HashHelpers.deep_symbolise_keys(option_variants)
477
+ def initialize(config)
478
+ config = HashHelpers.deep_symbolise_keys(config)
460
479
  image_optim = ImageOptim.new
461
480
 
462
481
  @workers_by_format = Hash.new{ |h, k| h[k] = [] }
463
482
  ImageOptim::Worker.klasses.each do |klass|
464
- worker_options_config = option_variants.delete(klass.bin_sym) || {}
465
- allow_consecutive_on = worker_options_config.delete(:allow_consecutive_on)
466
- worker_option_variants = case worker_options_config
467
- when Array
468
- worker_options_config
469
- when Hash
470
- worker_options_config.variants
471
- else
472
- fail "Array or Hash expected, got #{worker_options_config}"
483
+ worker_config = config.delete(klass.bin_sym)
484
+ next if worker_config == false
485
+ worker_config ||= {}
486
+
487
+ option_variants = worker_config.delete(:variants) || [{}]
488
+ option_variants = case option_variants
489
+ when Array then option_variants
490
+ when Hash then option_variants.variants
491
+ else fail "Array or Hash expected, got #{option_variants}"
473
492
  end
474
- worker_option_variants.each do |options|
475
- options = HashHelpers.deep_symbolise_keys(options)
476
- options[:allow_consecutive_on] = allow_consecutive_on
493
+ option_variants.each do |options|
494
+ options = HashHelpers.deep_symbolise_keys(options).merge(worker_config)
477
495
  worker = WorkerVariant.new(klass, image_optim, options)
478
496
  worker.image_formats.each do |format|
479
497
  @workers_by_format[format] << worker
@@ -483,7 +501,7 @@ class Analyser
483
501
 
484
502
  log_workers_by_format
485
503
 
486
- fail "unknown variants: #{option_variants}" unless option_variants.empty?
504
+ fail "unknown variants: #{config}" unless config.empty?
487
505
  end
488
506
 
489
507
  def analyse(paths)
@@ -553,7 +571,30 @@ private
553
571
  end
554
572
  end
555
573
 
556
- def option_variants
574
+ abort <<-HELP if ARGV.empty?
575
+ Specify paths for analysis.
576
+
577
+ Example of `.analysis_variants.yml`:
578
+ jhead:
579
+ required: true # don't skip this worker
580
+ jpegtran: # 3 worker variants
581
+ variants:
582
+ - jpegrescan: true
583
+ - progressive: true
584
+ - progressive: false
585
+ optipng: # 6 worker variants by combining options
586
+ variants:
587
+ level: [6, 7]
588
+ interlace: [true, false, nil]
589
+ gifsicle: # allow variants with different interlace to run consecutively
590
+ variants:
591
+ allow_consecutive_on: interlace
592
+ interlace: [true, false]
593
+ careful: [true, false]
594
+ # other workers will be used with default options
595
+ HELP
596
+
597
+ Analyser.new(begin
557
598
  path = '.analysis_variants.yml'
558
599
  case h = YAML.load_file(path)
559
600
  when Hash then h
@@ -563,27 +604,4 @@ def option_variants
563
604
  rescue Errno::ENOENT => e
564
605
  warn e
565
606
  {}
566
- end
567
-
568
- analyser = Analyser.new(option_variants)
569
-
570
- if ARGV.empty?
571
- abort <<-HELP
572
- Specify paths for analysis.
573
-
574
- Example of `.analysis_variants.yml`:
575
- jpegtran: # 3 worker variants
576
- - jpegrescan: true
577
- - progressive: true
578
- - progressive: false
579
- optipng: # 6 worker variants by combining options
580
- level: [6, 7]
581
- interlace: [true, false, nil]
582
- gifsicle: # allow variants with different interlace to run consecutively
583
- allow_consecutive_on: interlace
584
- interlace: [true, false]
585
- careful: [true, false]
586
- # other workers will be used with default options
587
- HELP
588
- end
589
- analyser.analyse(ARGV)
607
+ end).analyse(ARGV)
data/vendor/jpegrescan CHANGED
@@ -1,11 +1,19 @@
1
- #!/usr/bin/perl -ws
1
+ #!/usr/bin/env perl
2
2
  # jpegrescan by Loren Merritt
3
3
  # Last updated: 2008-11-29 / 2013-03-19
4
4
  # This code is public domain.
5
5
 
6
- use File::Slurp;
6
+ use warnings;
7
7
  use File::Temp qw/ tempfile /;
8
8
 
9
+ %switches = ();
10
+ while (@ARGV && $ARGV[0] =~ /^-.+/) {
11
+ for (shift @ARGV) {
12
+ m/^--$/ && last;
13
+ m/^-([svq])$/ && do { $switches{$1} = 1; next; };
14
+ die "Unknown switch: $_";
15
+ }
16
+ }
9
17
  @ARGV==2 or die "usage: jpegrescan in.jpg out.jpg
10
18
  tries various progressive scan orders
11
19
  switches:
@@ -15,26 +23,49 @@ switches:
15
23
  ";
16
24
  $fin = $ARGV[0];
17
25
  $fout = $ARGV[1];
18
- (undef, $ftmp) = tempfile(SUFFIX => ".scan");
19
- $jtmp = $fout;
20
- $verbose = $v;
21
- $quiet = $q;
22
- @strip = $s ? ("-copy","none") : ("-copy","all");
23
- undef $_ for $v,$q,$s;
26
+ (undef, $meta_tmp) = tempfile(SUFFIX => ".scan");
27
+ (undef, $baseline_tmp) = tempfile(SUFFIX => ".jpg");
28
+ $output_tmp = $fout;
29
+ $verbose = $switches{'v'};
30
+ $quiet = $switches{'q'};
31
+ @strip = $switches{'s'} ? ("-copy","none") : ("-copy","all");
24
32
  undef $/;
25
33
  $|=1;
26
34
 
35
+ sub read_file {
36
+ my ($path) = @_;
37
+ my $data;
38
+
39
+ open my $fh, '<', $path
40
+ or die "Could not open file $path: $!\n";
41
+ binmode $fh;
42
+ $data = <$fh>;
43
+ close $fh
44
+ or die "Could not close $path: $!\n";
45
+
46
+ return $data;
47
+ }
48
+
49
+ sub write_file {
50
+ my ($path, $data) = @_;
51
+
52
+ open my $fh, '>', $path
53
+ or die "Could not open file $path: $!\n";
54
+ binmode $fh;
55
+ print $fh $data;
56
+ close $fh
57
+ or die "Could not close $path: $!\n";
58
+ }
59
+
27
60
  # convert the input to baseline, just to make all the other conversions faster
28
61
  # FIXME there's still a bunch of redundant computation in separate calls to jpegtran
29
62
  open $OLDERR, ">&", STDERR;
30
- open STDERR, ">", $ftmp;
31
- open TRAN, "-|", "jpegtran", "-v", @strip, "-optimize", $fin or die;
32
- write_file($jtmp, <TRAN>);
33
- close TRAN;
63
+ open STDERR, ">", $meta_tmp;
64
+ system("jpegtran", "-v", @strip, "-optimize", "-outfile", $baseline_tmp, $fin) == 0 or die;
34
65
  open STDERR, ">&", $OLDERR;
35
66
 
36
- $type = read_file($ftmp);
37
- $type =~ /components=(\d+)/ or die;
67
+ $type = read_file($meta_tmp);
68
+ $type =~ /components=(\d+)/ or die "Could not find components=\d+ in $type";
38
69
  $rgb = $1==3 ? 1 : $1==1 ? 0 : die "not RGB nor gray\n";
39
70
 
40
71
  # FIXME optimize order for either progressive transfer or decoding speed
@@ -55,10 +86,9 @@ sub canonize {
55
86
  sub try {
56
87
  my $txt = canonize(shift);
57
88
  return $memo{$txt} if $memo{$txt};
58
- write_file($ftmp, $txt);
59
- open TRAN, "-|", "jpegtran", @strip, "-scans", $ftmp, $jtmp or die;
60
- $data = <TRAN>;
61
- close TRAN;
89
+ write_file($meta_tmp, $txt);
90
+ system("jpegtran", @strip, "-scans", $meta_tmp, "-outfile", $output_tmp, $baseline_tmp) == 0 or die;
91
+ $data = read_file($output_tmp);
62
92
  my $s = length $data;
63
93
  $s or die;
64
94
  $memo{$txt} = $s;
@@ -140,4 +170,4 @@ $old_size = -s $fin;
140
170
  if($size < $old_size) {
141
171
  write_file($fout, $data);
142
172
  }
143
- unlink $ftmp;
173
+ unlink $meta_tmp, $baseline_tmp;
@@ -0,0 +1,6 @@
1
+ @ECHO OFF
2
+ IF NOT "%~f0" == "~f0" GOTO :WinNT
3
+ @"perl" %1 %2 %3 %4 %5 %6 %7 %8 %9
4
+ GOTO :EOF
5
+ :WinNT
6
+ @"%~dpn0.exe" %*
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discourse_image_optim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.5
4
+ version: 0.26.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: 2017-05-15 00:00:00.000000000 Z
11
+ date: 2018-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -132,14 +132,14 @@ dependencies:
132
132
  requirements:
133
133
  - - "~>"
134
134
  - !ruby/object:Gem::Version
135
- version: '0.47'
135
+ version: '0.52'
136
136
  type: :development
137
137
  prerelease: false
138
138
  version_requirements: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - "~>"
141
141
  - !ruby/object:Gem::Version
142
- version: '0.47'
142
+ version: '0.52'
143
143
  description:
144
144
  email:
145
145
  executables:
@@ -250,6 +250,7 @@ files:
250
250
  - spec/images/vergroessert.jpg
251
251
  - spec/spec_helper.rb
252
252
  - vendor/jpegrescan
253
+ - vendor/jpegrescan.bat
253
254
  homepage: http://github.com/toy/discourse_image_optim
254
255
  licenses:
255
256
  - MIT
@@ -272,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
273
  version: '0'
273
274
  requirements: []
274
275
  rubyforge_project: discourse_image_optim
275
- rubygems_version: 2.6.11
276
+ rubygems_version: 2.7.6
276
277
  signing_key:
277
278
  specification_version: 4
278
279
  summary: Optimize (lossless compress, optionally lossy) images (jpeg, png, gif, svg)