image_optim 0.31.1 → 0.31.2

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
2
  SHA256:
3
- metadata.gz: 481b027ab78658543ea138ff4d7547a609dca8b31eea02f8cb003318f10c67eb
4
- data.tar.gz: e11f9f69a28e6a3e7a0028579cb36e78b5dd1457943a884f8071d6de17e7031e
3
+ metadata.gz: 7197f37a1a5cd0a61248ccd4ef6b08f2c05ff8f084866da48f76b038bac4e4ec
4
+ data.tar.gz: 7be50ee48142fd8775022855624a7ea642436b11d8ca260f322742a7814d513a
5
5
  SHA512:
6
- metadata.gz: 961044af3b8ef65acbdc6bbce6a278e8aefe246a1ea53a6eceea5bb025f02c7adeecf457843fd2244a5bc21fa0f303094a16f4947cda41fc9ac7372dbcce5f46
7
- data.tar.gz: ea8dcb08f8fffd1aad10506bdb3ab2bdf0043f30d08b68e2cb0d2195562492d6477619e3bdcf830a9bec9ead04adfe36b195b136fba61a1e7d4f96835c61c854
6
+ metadata.gz: 02dbbb2520b6250fc2a5262c2c0524a42519e3a969683efe95b384f0e0cc5b4247638e74e5766ce016ccc462f3646f3ab7e7bf363299b1f6e79894b59af69df2
7
+ data.tar.gz: 6673410e57ba7e01f0f146678f2b74e8bbdcd97ccccb320679f24acb860ea46be229b2184383ee59e5a7bac6a4977f506e113a68bf53f975c1b296e9e28310d1
@@ -19,7 +19,10 @@ jobs:
19
19
  - '2.6'
20
20
  - '2.7'
21
21
  - '3.0'
22
+ - '3.1'
22
23
  - jruby-9.2
24
+ - jruby-9.3
25
+ - jruby-9.4
23
26
  fail-fast: false
24
27
  steps:
25
28
  - uses: actions/checkout@v2
@@ -28,7 +31,6 @@ jobs:
28
31
  ruby-version: "${{ matrix.ruby }}"
29
32
  bundler-cache: true
30
33
  - run: sudo npm install -g svgo
31
- - run: curl -L "https://www.jonof.id.au/files/kenutils/pngout-20200115-linux.tar.gz" | sudo tar -xz -C /usr/local/bin --strip-components 2 --wildcards '*/amd64/pngout'
32
34
  - run: curl -L "https://github.com/shssoichiro/oxipng/releases/download/v4.0.3/oxipng-4.0.3-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /usr/local/bin --strip-components 1 --wildcards '*oxipng'
33
35
  - run: bundle exec image_optim --info
34
36
  - run: bundle exec rspec
@@ -40,6 +42,7 @@ jobs:
40
42
  - '2.6'
41
43
  - '2.7'
42
44
  - '3.0'
45
+ - '3.1'
43
46
  fail-fast: false
44
47
  steps:
45
48
  - uses: actions/checkout@v2
@@ -70,20 +73,10 @@ jobs:
70
73
  - uses: actions/checkout@v2
71
74
  - uses: ruby/setup-ruby@v1
72
75
  with:
73
- ruby-version: '3.0'
76
+ ruby-version: '3.1'
74
77
  bundler-cache: true
75
78
  - run: sudo npm install -g svgo
76
- - run: curl -L "https://www.jonof.id.au/files/kenutils/pngout-20200115-linux.tar.gz" | sudo tar -xz -C /usr/local/bin --strip-components 2 --wildcards '*/amd64/pngout'
77
79
  - run: curl -L "https://github.com/shssoichiro/oxipng/releases/download/v4.0.3/oxipng-4.0.3-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /usr/local/bin --strip-components 1 --wildcards '*oxipng'
78
80
  - uses: paambaati/codeclimate-action@v2.7.5
79
81
  with:
80
82
  coverageCommand: bundle exec rspec
81
- rubocop:
82
- runs-on: ubuntu-latest
83
- steps:
84
- - uses: actions/checkout@v2
85
- - uses: ruby/setup-ruby@v1
86
- with:
87
- ruby-version: '3.0'
88
- bundler-cache: true
89
- - run: bundle exec rubocop
@@ -0,0 +1,30 @@
1
+ name: codeql
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: '43 20 * * 0'
7
+
8
+ jobs:
9
+ analyze:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ actions: read
13
+ contents: read
14
+ security-events: write
15
+
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ language: [ 'ruby' ]
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+
24
+ - uses: github/codeql-action/init@v1
25
+ with:
26
+ languages: ${{ matrix.language }}
27
+
28
+ - uses: github/codeql-action/autobuild@v1
29
+
30
+ - uses: github/codeql-action/analyze@v1
@@ -0,0 +1,16 @@
1
+ name: rubocop
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: 45 4 * * 2
7
+ jobs:
8
+ rubocop:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: '3.1'
15
+ bundler-cache: true
16
+ - run: bundle exec rubocop
data/.rubocop.yml CHANGED
@@ -142,6 +142,9 @@ Style/Semicolon:
142
142
  Style/SignalException:
143
143
  EnforcedStyle: semantic
144
144
 
145
+ Style/SlicingWithRange:
146
+ Enabled: false
147
+
145
148
  Style/SymbolArray:
146
149
  Enabled: false
147
150
 
data/CHANGELOG.markdown CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## v0.31.2 (2022-11-27)
6
+
7
+ * Support jruby 9.4 [@toy](https://github.com/toy)
8
+
5
9
  ## v0.31.1 (2021-10-21)
6
10
 
7
11
  * Allow image_size 3 [@toy](https://github.com/toy)
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2021 Ivan Kuchin
1
+ Copyright (c) 2012-2022 Ivan Kuchin
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.markdown CHANGED
@@ -1,5 +1,7 @@
1
1
  [![Gem Version](https://img.shields.io/gem/v/image_optim?logo=rubygems)](https://rubygems.org/gems/image_optim)
2
2
  [![Build Status](https://img.shields.io/github/workflow/status/toy/image_optim/check/master?logo=github)](https://github.com/toy/image_optim/actions/workflows/check.yml)
3
+ [![Rubocop](https://img.shields.io/github/workflow/status/toy/image_optim/rubocop/master?label=rubocop&logo=rubocop)](https://github.com/toy/image_optim/actions/workflows/rubocop.yml)
4
+ [![CodeQL](https://img.shields.io/github/workflow/status/toy/image_optim/codeql/master?label=codeql&logo=github)](https://github.com/toy/image_optim/actions/workflows/codeql.yml)
3
5
  [![Code Climate](https://img.shields.io/codeclimate/maintainability/toy/image_optim?logo=codeclimate)](https://codeclimate.com/github/toy/image_optim)
4
6
  [![Code Climate Coverage](https://img.shields.io/codeclimate/coverage/toy/image_optim?logo=codeclimate)](https://codeclimate.com/github/toy/image_optim)
5
7
  [![Depfu](https://img.shields.io/depfu/toy/image_optim)](https://depfu.com/github/toy/image_optim)
@@ -27,7 +29,7 @@ Based on [ImageOptim.app](http://imageoptim.com/).
27
29
 
28
30
  Documentation for [latest gem version](http://rubydoc.info/gems/image_optim/frames) and [master branch](http://rubydoc.info/github/toy/image_optim/master/frames).
29
31
 
30
- A test application with latest `image_optim` and `image_optim_pack` is available on heroku: https://iopack.herokuapp.com/.
32
+ A test application with latest `image_optim` and `image_optim_pack` is available on render: https://iopack.onrender.com/.
31
33
 
32
34
  ## Gem installation
33
35
 
@@ -70,6 +72,18 @@ If you want to check latest changes:
70
72
  gem 'image_optim', :git => 'git://github.com/toy/image_optim.git'
71
73
  ```
72
74
 
75
+ ## Docker
76
+
77
+ This gem is also be available as [docker image](https://github.com/toy/image_optim_pack/pkgs/container/image_optim) containing most binaries:
78
+
79
+ ```bash
80
+ docker run --rm ghcr.io/toy/image_optim --version # image_optim version
81
+ docker run --rm ghcr.io/toy/image_optim --info # image_optim info including bin versions
82
+ docker run --rm -v "$PWD":/here -w /here ghcr.io/toy/image_optim image-in-this-folder.jpg
83
+ ```
84
+
85
+ See [image_optim_pack repository](https://github.com/toy/image_optim_pack) for [Dockerfile](https://github.com/toy/image_optim_pack/blob/master/Dockerfile) and [instructions](https://github.com/toy/image_optim_pack#docker).
86
+
73
87
  ## Binaries location
74
88
 
75
89
  Simplest way for `image_optim` to locate binaries is to install them in common location present in `PATH` (see [Binaries installation](#binaries-installation)).
@@ -100,7 +114,7 @@ Besides permanently setting environment variables in `~/.profile`, `~/.bash_prof
100
114
 
101
115
  ### Binaries pack
102
116
 
103
- Easiest way to get latest versions of most binaries for `image_optim` for Linux, Mac OS X, FreeBSD and OpenBSD is by installing [`image_optim_pack`](https://github.com/toy/image_optim_pack) gem.
117
+ Easiest way to get latest versions of most binaries for `image_optim` for Linux and Mac OS X is by installing [`image_optim_pack`](https://github.com/toy/image_optim_pack) gem.
104
118
 
105
119
  Check installation instructions in [Gem installation](#gem-installation) section.
106
120
 
@@ -163,7 +177,7 @@ sudo port install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush png
163
177
  ### OS X: Brew
164
178
 
165
179
  ```bash
166
- brew install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush pngquant jonof/kenutils/pngout
180
+ brew install advancecomp gifsicle jhead jpegoptim jpeg optipng oxipng pngcrush pngquant jonof/kenutils/pngout
167
181
  ```
168
182
 
169
183
  ### oxipng installation (optional)
@@ -337,6 +351,11 @@ Worker has no options
337
351
  * `:interlace` — Interlace: `true` - interlace on, `false` - interlace off, `nil` - as is in original image *(defaults to `false`)*
338
352
  * `:strip` — Remove all auxiliary chunks *(defaults to `true`)*
339
353
 
354
+ ### oxipng:
355
+ * `:level` — Optimization level preset: `0` is least, `6` is best *(defaults to `3`)*
356
+ * `:interlace` — Interlace: `true` - interlace on, `false` - interlace off, `nil` - as is in original image *(defaults to `false`)*
357
+ * `:strip` — Remove all auxiliary chunks *(defaults to `true`)*
358
+
340
359
  ### pngcrush:
341
360
  * `:chunks` — List of chunks to remove or `:alla` - all except tRNS/transparency or `:allb` - all except tRNS and gAMA/gamma *(defaults to `:alla`)*
342
361
  * `:fix` — Fix otherwise fatal conditions such as bad CRCs *(defaults to `false`)*
@@ -371,4 +390,4 @@ In separate file [CHANGELOG.markdown](CHANGELOG.markdown).
371
390
 
372
391
  ## Copyright
373
392
 
374
- Copyright (c) 2012-2021 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.
393
+ Copyright (c) 2012-2022 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.
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.31.1'
5
+ s.version = '0.31.2'
6
6
  s.summary = %q{Command line tool and ruby interface to optimize (lossless compress, optionally lossy) jpeg, png, gif and svg images using external utilities (advpng, gifsicle, jhead, jpeg-recompress, jpegoptim, jpegrescan, jpegtran, optipng, oxipng, pngcrush, pngout, pngquant, svgo)}
7
7
  s.homepage = "https://github.com/toy/#{s.name}"
8
8
  s.authors = ['Ivan Kuchin']
@@ -35,8 +35,8 @@ EOF
35
35
 
36
36
  s.add_development_dependency 'image_optim_pack', '~> 0.2', '>= 0.2.2'
37
37
  s.add_development_dependency 'rspec', '~> 3.0'
38
- if RUBY_VERSION >= '2.4' && !Gem.win_platform? && !defined?(JRUBY_VERSION)
39
- s.add_development_dependency 'rubocop', '~> 1.0'
38
+ if RUBY_VERSION >= '2.5' && !Gem.win_platform? && !defined?(JRUBY_VERSION)
39
+ s.add_development_dependency 'rubocop', '~> 1.22', '!= 1.22.2'
40
40
  s.add_development_dependency 'rubocop-rspec', '~> 2.0'
41
41
  end
42
42
  end
@@ -61,7 +61,7 @@ class ImageOptim
61
61
  [
62
62
  dir,
63
63
  pack_path,
64
- ENV['PATH'],
64
+ ENV.fetch('PATH', nil),
65
65
  VENDOR_PATH,
66
66
  ].compact.join(File::PATH_SEPARATOR)
67
67
  end
@@ -109,12 +109,12 @@ class ImageOptim
109
109
  # dir as name
110
110
  def symlink_custom_bin!(name)
111
111
  env_name = "#{name}_bin".upcase
112
- path = ENV[env_name]
112
+ path = ENV.fetch(env_name, nil)
113
113
  return unless path
114
114
 
115
115
  path = File.expand_path(path)
116
116
  desc = "`#{path}` specified in #{env_name}"
117
- fail "#{desc} doesn\'t exist" unless File.exist?(path)
117
+ fail "#{desc} doesn't exist" unless File.exist?(path)
118
118
  fail "#{desc} is not a file" unless File.file?(path)
119
119
  fail "#{desc} is not executable" unless File.executable?(path)
120
120
 
@@ -15,7 +15,7 @@ class ImageOptim
15
15
 
16
16
  # Global config path at `$XDG_CONFIG_HOME/image_optim.yml` (by default
17
17
  # `~/.config/image_optim.yml`)
18
- GLOBAL_PATH = File.join(ENV['XDG_CONFIG_HOME'] || '~/.config', 'image_optim.yml')
18
+ GLOBAL_PATH = File.join(ENV.fetch('XDG_CONFIG_HOME', '~/.config'), 'image_optim.yml')
19
19
 
20
20
  # Local config path at `./.image_optim.yml`
21
21
  LOCAL_PATH = './.image_optim.yml'
@@ -185,7 +185,7 @@ class ImageOptim
185
185
  when false
186
186
  {disable: true}
187
187
  else
188
- fail ConfigurationError, "Got #{worker_options.inspect} for "\
188
+ fail ConfigurationError, "Got #{worker_options.inspect} for " \
189
189
  "#{klass.name} options"
190
190
  end
191
191
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'image_optim/path'
4
4
 
5
+ require 'delegate'
6
+
5
7
  class ImageOptim
6
8
  # Holds optimized image with reference to original and its size
7
9
  class OptimizedPath < DelegateClass(Path)
@@ -96,29 +96,29 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
96
96
  |
97
97
  TEXT
98
98
 
99
- op.on('--config-paths PATH1,PATH2', Array, 'Config paths to use instead of '\
99
+ op.on('--config-paths PATH1,PATH2', Array, 'Config paths to use instead of ' \
100
100
  'default ones') do |paths|
101
101
  options[:config_paths] = paths
102
102
  end
103
103
 
104
104
  op.separator nil
105
105
 
106
- op.on('-r', '-R', '--recursive', 'Recursively scan directories '\
106
+ op.on('-r', '-R', '--recursive', 'Recursively scan directories ' \
107
107
  'for images') do |recursive|
108
108
  options[:recursive] = recursive
109
109
  end
110
110
 
111
- op.on("--exclude-dir 'GLOB'", 'Glob for excluding directories '\
111
+ op.on("--exclude-dir 'GLOB'", 'Glob for excluding directories ' \
112
112
  '(defaults to .*)') do |glob|
113
113
  options[:exclude_dir_glob] = glob
114
114
  end
115
115
 
116
- op.on("--exclude-file 'GLOB'", 'Glob for excluding files '\
116
+ op.on("--exclude-file 'GLOB'", 'Glob for excluding files ' \
117
117
  '(defaults to .*)') do |glob|
118
118
  options[:exclude_file_glob] = glob
119
119
  end
120
120
 
121
- op.on("--exclude 'GLOB'", 'Set glob for excluding both directories and '\
121
+ op.on("--exclude 'GLOB'", 'Set glob for excluding both directories and ' \
122
122
  'files') do |glob|
123
123
  options[:exclude_file_glob] = options[:exclude_dir_glob] = glob
124
124
  end
@@ -129,19 +129,19 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
129
129
  options[:show_progress] = show_progress
130
130
  end
131
131
 
132
- op.on('--[no-]threads N', Integer, 'Number of threads or disable '\
132
+ op.on('--[no-]threads N', Integer, 'Number of threads or disable ' \
133
133
  '(defaults to number of processors)') do |threads|
134
134
  options[:threads] = threads
135
135
  end
136
136
 
137
- op.on('--[no-]nice N', Integer, 'Nice level, priority of all used tools '\
138
- 'with higher value meaning lower priority, in range -20..19, negative '\
137
+ op.on('--[no-]nice N', Integer, 'Nice level, priority of all used tools ' \
138
+ 'with higher value meaning lower priority, in range -20..19, negative ' \
139
139
  'values can be set only if run by root user (defaults to 10)') do |nice|
140
140
  options[:nice] = nice
141
141
  end
142
142
 
143
- op.on('--[no-]pack', 'Require image_optim_pack or disable it, '\
144
- 'by default image_optim_pack will be used if available, '\
143
+ op.on('--[no-]pack', 'Require image_optim_pack or disable it, ' \
144
+ 'by default image_optim_pack will be used if available, ' \
145
145
  'will turn on skip-missing-workers unless explicitly disabled') do |pack|
146
146
  options[:pack] = pack
147
147
  end
@@ -149,12 +149,12 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
149
149
  op.separator nil
150
150
  op.separator ' Caching:'
151
151
 
152
- op.on('--cache-dir DIR', 'Cache optimized images '\
152
+ op.on('--cache-dir DIR', 'Cache optimized images ' \
153
153
  'into the specified directory') do |cache_dir|
154
154
  options[:cache_dir] = cache_dir
155
155
  end
156
156
 
157
- op.on('--cache-worker-digests', 'Cache worker digests '\
157
+ op.on('--cache-worker-digests', 'Cache worker digests ' \
158
158
  '(updating workers invalidates cache)') do |cache_worker_digests|
159
159
  options[:cache_worker_digests] = cache_worker_digests
160
160
  end
@@ -162,7 +162,7 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
162
162
  op.separator nil
163
163
  op.separator ' Disabling workers:'
164
164
 
165
- op.on('--[no-]skip-missing-workers', 'Skip workers with missing or '\
165
+ op.on('--[no-]skip-missing-workers', 'Skip workers with missing or ' \
166
166
  'problematic binaries') do |skip|
167
167
  options[:skip_missing_workers] = skip
168
168
  end
@@ -177,7 +177,7 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
177
177
  op.separator nil
178
178
  op.separator ' Worker options:'
179
179
 
180
- op.on('--allow-lossy', 'Allow lossy workers and '\
180
+ op.on('--allow-lossy', 'Allow lossy workers and ' \
181
181
  'optimizations') do |allow_lossy|
182
182
  options[:allow_lossy] = allow_lossy
183
183
  end
@@ -229,8 +229,8 @@ ImageOptim::Runner::OptionParser::DEFINE = proc do |op, options|
229
229
  op.separator nil
230
230
  op.separator ' Common options:'
231
231
 
232
- op.on_tail('-v', '--verbose', 'Verbose output (show global and worker '\
233
- 'config, binary resolution log, information about each tool invocation, '\
232
+ op.on_tail('-v', '--verbose', 'Verbose output (show global and worker ' \
233
+ 'config, binary resolution log, information about each tool invocation, ' \
234
234
  'backtrace of exception)') do
235
235
  options[:verbose] = true
236
236
  end
@@ -8,11 +8,11 @@ class ImageOptim
8
8
  # http://advancemame.sourceforge.net/doc-advpng.html
9
9
  class Advpng < Worker
10
10
  LEVEL_OPTION =
11
- option(:level, 4, 'Compression level: '\
12
- '`0` - don\'t compress, '\
13
- '`1` - fast, '\
14
- '`2` - normal, '\
15
- '`3` - extra, '\
11
+ option(:level, 4, 'Compression level: ' \
12
+ '`0` - don\'t compress, ' \
13
+ '`1` - fast, ' \
14
+ '`2` - normal, ' \
15
+ '`3` - extra, ' \
16
16
  '`4` - extreme') do |v|
17
17
  OptionHelpers.limit_with_range(v.to_i, 0..4)
18
18
  end
@@ -17,19 +17,19 @@ class ImageOptim
17
17
  end
18
18
 
19
19
  INTERLACE_OPTION =
20
- option(:interlace, false, TrueFalseNil, 'Interlace: '\
21
- '`true` - interlace on, '\
22
- '`false` - interlace off, '\
23
- '`nil` - as is in original image '\
24
- '(defaults to running two instances, one with interlace off and '\
20
+ option(:interlace, false, TrueFalseNil, 'Interlace: ' \
21
+ '`true` - interlace on, ' \
22
+ '`false` - interlace off, ' \
23
+ '`nil` - as is in original image ' \
24
+ '(defaults to running two instances, one with interlace off and ' \
25
25
  'one with on)') do |v|
26
26
  TrueFalseNil.convert(v)
27
27
  end
28
28
 
29
29
  LEVEL_OPTION =
30
- option(:level, 3, 'Compression level: '\
31
- '`1` - light and fast, '\
32
- '`2` - normal, '\
30
+ option(:level, 3, 'Compression level: ' \
31
+ '`1` - light and fast, ' \
32
+ '`2` - normal, ' \
33
33
  '`3` - heavy (slower)') do |v|
34
34
  OptionHelpers.limit_with_range(v.to_i, 1..3)
35
35
  end
@@ -11,13 +11,13 @@ class ImageOptim
11
11
  option(:allow_lossy, false, 'Allow limiting maximum quality'){ |v| !!v }
12
12
 
13
13
  STRIP_OPTION =
14
- option(:strip, :all, Array, 'List of markers to strip: '\
15
- '`:com`, '\
16
- '`:exif`, '\
17
- '`:iptc`, '\
18
- '`:icc`, '\
19
- '`:xmp`, '\
20
- '`:none` or '\
14
+ option(:strip, :all, Array, 'List of markers to strip: ' \
15
+ '`:com`, ' \
16
+ '`:exif`, ' \
17
+ '`:iptc`, ' \
18
+ '`:icc`, ' \
19
+ '`:xmp`, ' \
20
+ '`:none` or ' \
21
21
  '`:all`') do |v|
22
22
  values = Array(v).map(&:to_s)
23
23
  known_values = %w[com exif iptc icc xmp none all]
@@ -29,7 +29,7 @@ class ImageOptim
29
29
  end
30
30
 
31
31
  MAX_QUALITY_OPTION =
32
- option(:max_quality, 100, 'Maximum image quality factor '\
32
+ option(:max_quality, 100, 'Maximum image quality factor ' \
33
33
  '`0`..`100`, ignored in default/lossless mode') do |v, opt_def|
34
34
  if allow_lossy
35
35
  OptionHelpers.limit_with_range(v.to_i, 0..100)
@@ -27,10 +27,10 @@ class ImageOptim
27
27
  end
28
28
 
29
29
  METHOD_OPTION =
30
- option(:method, 'ssim', 'Comparison Metric: '\
31
- '`mpe` - Mean pixel error, '\
32
- '`ssim` - Structural similarity, '\
33
- '`ms-ssim` - Multi-scale structural similarity (slow!), '\
30
+ option(:method, 'ssim', 'Comparison Metric: ' \
31
+ '`mpe` - Mean pixel error, ' \
32
+ '`ssim` - Structural similarity, ' \
33
+ '`ms-ssim` - Multi-scale structural similarity (slow!), ' \
34
34
  '`smallfry` - Linear-weighted BBCQ-like (may be patented)') do |v, opt_def|
35
35
  if %w[mpe ssim ms-ssim smallfry].include? v
36
36
  v
@@ -16,7 +16,7 @@ class ImageOptim
16
16
  option(:progressive, true, 'Create progressive JPEG file'){ |v| !!v }
17
17
 
18
18
  JPEGRESCAN_OPTION =
19
- option(:jpegrescan, true, 'Use jpegtran through jpegrescan, '\
19
+ option(:jpegrescan, true, 'Use jpegtran through jpegrescan, ' \
20
20
  'ignore progressive option'){ |v| !!v }
21
21
 
22
22
  def used_bins
@@ -9,16 +9,16 @@ class ImageOptim
9
9
  # http://optipng.sourceforge.net/
10
10
  class Optipng < Worker
11
11
  LEVEL_OPTION =
12
- option(:level, 6, 'Optimization level preset: '\
13
- '`0` is least, '\
12
+ option(:level, 6, 'Optimization level preset: ' \
13
+ '`0` is least, ' \
14
14
  '`7` is best') do |v|
15
15
  OptionHelpers.limit_with_range(v.to_i, 0..7)
16
16
  end
17
17
 
18
18
  INTERLACE_OPTION =
19
- option(:interlace, false, TrueFalseNil, 'Interlace: '\
20
- '`true` - interlace on, '\
21
- '`false` - interlace off, '\
19
+ option(:interlace, false, TrueFalseNil, 'Interlace: ' \
20
+ '`true` - interlace on, ' \
21
+ '`false` - interlace off, ' \
22
22
  '`nil` - as is in original image') do |v|
23
23
  TrueFalseNil.convert(v)
24
24
  end
@@ -9,16 +9,16 @@ class ImageOptim
9
9
  # https://github.com/shssoichiro/oxipng
10
10
  class Oxipng < Worker
11
11
  LEVEL_OPTION =
12
- option(:level, 3, 'Optimization level preset: '\
13
- '`0` is least, '\
12
+ option(:level, 3, 'Optimization level preset: ' \
13
+ '`0` is least, ' \
14
14
  '`6` is best') do |v|
15
15
  OptionHelpers.limit_with_range(v.to_i, 0..6)
16
16
  end
17
17
 
18
18
  INTERLACE_OPTION =
19
- option(:interlace, false, TrueFalseNil, 'Interlace: '\
20
- '`true` - interlace on, '\
21
- '`false` - interlace off, '\
19
+ option(:interlace, false, TrueFalseNil, 'Interlace: ' \
20
+ '`true` - interlace on, ' \
21
+ '`false` - interlace off, ' \
22
22
  '`nil` - as is in original image') do |v|
23
23
  TrueFalseNil.convert(v)
24
24
  end
@@ -7,18 +7,18 @@ class ImageOptim
7
7
  # http://pmt.sourceforge.net/pngcrush/
8
8
  class Pngcrush < Worker
9
9
  CHUNKS_OPTION =
10
- option(:chunks, :alla, Array, 'List of chunks to remove or '\
11
- '`:alla` - all except tRNS/transparency or '\
10
+ option(:chunks, :alla, Array, 'List of chunks to remove or ' \
11
+ '`:alla` - all except tRNS/transparency or ' \
12
12
  '`:allb` - all except tRNS and gAMA/gamma') do |v|
13
13
  Array(v).map(&:to_s)
14
14
  end
15
15
 
16
16
  FIX_OPTION =
17
- option(:fix, false, 'Fix otherwise fatal conditions '\
17
+ option(:fix, false, 'Fix otherwise fatal conditions ' \
18
18
  'such as bad CRCs'){ |v| !!v }
19
19
 
20
20
  BRUTE_OPTION =
21
- option(:brute, false, 'Brute force try all methods, '\
21
+ option(:brute, false, 'Brute force try all methods, ' \
22
22
  'very time-consuming and generally not worthwhile'){ |v| !!v }
23
23
 
24
24
  BLACKEN_OPTION =
@@ -11,11 +11,11 @@ class ImageOptim
11
11
  option(:copy_chunks, false, 'Copy optional chunks'){ |v| !!v }
12
12
 
13
13
  STRATEGY_OPTION =
14
- option(:strategy, 0, 'Strategy: '\
15
- '`0` - xtreme, '\
16
- '`1` - intense, '\
17
- '`2` - longest Match, '\
18
- '`3` - huffman Only, '\
14
+ option(:strategy, 0, 'Strategy: ' \
15
+ '`0` - xtreme, ' \
16
+ '`1` - intense, ' \
17
+ '`2` - longest Match, ' \
18
+ '`3` - huffman Only, ' \
19
19
  '`4` - uncompressed') do |v|
20
20
  OptionHelpers.limit_with_range(v.to_i, 0..4)
21
21
  end
@@ -18,9 +18,9 @@ class ImageOptim
18
18
 
19
19
  QUALITY_OPTION =
20
20
  option(:quality, '`100..100`, `0..100` in lossy mode',
21
- NonNegativeIntegerRange, 'min..max - don\'t '\
22
- 'save below min, use less colors below max (both in range `0..100`; '\
23
- 'in yaml - `!ruby/range 0..100`), ignored in default/lossless '\
21
+ NonNegativeIntegerRange, 'min..max - don\'t ' \
22
+ 'save below min, use less colors below max (both in range `0..100`; ' \
23
+ 'in yaml - `!ruby/range 0..100`), ignored in default/lossless ' \
24
24
  'mode') do |v, opt_def|
25
25
  if allow_lossy
26
26
  if v == opt_def.default
@@ -39,9 +39,9 @@ class ImageOptim
39
39
  end
40
40
 
41
41
  SPEED_OPTION =
42
- option(:speed, 3, 'speed/quality trade-off: '\
43
- '`1` - slow, '\
44
- '`3` - default, '\
42
+ option(:speed, 3, 'speed/quality trade-off: ' \
43
+ '`1` - slow, ' \
44
+ '`3` - default, ' \
45
45
  '`11` - fast & rough') do |v|
46
46
  OptionHelpers.limit_with_range(v.to_i, 1..11)
47
47
  end
@@ -104,7 +104,7 @@ class ImageOptim
104
104
  unknown_options = options.reject{ |key, _value| known_keys.include?(key) }
105
105
  return if unknown_options.empty?
106
106
 
107
- fail ConfigurationError, "unknown options #{unknown_options.inspect} "\
107
+ fail ConfigurationError, "unknown options #{unknown_options.inspect} " \
108
108
  "for #{self}"
109
109
  end
110
110
 
@@ -117,8 +117,8 @@ class ImageOptim
117
117
 
118
118
  def wrap_resolver_error_message(message)
119
119
  name = self.class.bin_sym
120
- "#{name} worker: #{message}; please provide proper binary or "\
121
- "disable this worker (--no-#{name} argument or "\
120
+ "#{name} worker: #{message}; please provide proper binary or " \
121
+ "disable this worker (--no-#{name} argument or " \
122
122
  "`:#{name} => false` through options)"
123
123
  end
124
124
 
@@ -28,7 +28,7 @@ end
28
28
 
29
29
  def write_marked(io)
30
30
  io.puts BEGIN_MARKER
31
- io.puts '<!-- markdown for worker options is generated by '\
31
+ io.puts '<!-- markdown for worker options is generated by ' \
32
32
  "`#{Pathname($PROGRAM_NAME).cleanpath}` -->"
33
33
  io.puts
34
34
 
@@ -52,9 +52,7 @@ end
52
52
 
53
53
  readme = File.read(README_FILE)
54
54
  if (readme = update_readme(readme))
55
- File.open(README_FILE, 'w') do |f|
56
- f.write readme
57
- end
55
+ File.write(README_FILE, readme)
58
56
  else
59
57
  abort 'Did not update worker options'
60
58
  end
@@ -11,7 +11,6 @@ require 'shellwords'
11
11
  require 'gdbm'
12
12
  require 'digest'
13
13
  require 'erb'
14
- require 'ostruct'
15
14
 
16
15
  DIR = 'tmp'
17
16
  Pathname(DIR).mkpath
@@ -172,7 +171,7 @@ class Analyser
172
171
 
173
172
  def source_digest
174
173
  @source_digest ||= begin
175
- source_path = __getobj__.method(:optimize).source_location[0]
174
+ source_path = __getobj__.class.instance_method(:optimize).source_location[0]
176
175
  Digest::SHA256.file(source_path).hexdigest
177
176
  end
178
177
  end
@@ -515,7 +514,7 @@ class Analyser
515
514
  def analyse(paths)
516
515
  results = collect_results(paths)
517
516
 
518
- template = ERB.new(template_path.read, nil, '>')
517
+ template = ERB.new(template_path.read, trim_mode: '>')
519
518
  by_format = results.group_by(&:format)
520
519
  formats = by_format.keys.sort
521
520
  basenames = Hash[formats.map do |format|
@@ -524,13 +523,10 @@ class Analyser
524
523
  formats.each do |format|
525
524
  stats = Stats.new('all', by_format[format], worker_ids2names)
526
525
  path = FSPath("#{DIR}/#{basenames[format]}")
527
- model = {
528
- stats_format: format,
529
- stats: stats,
530
- format_links: basenames,
531
- template_dir: template_path.dirname.relative_path_from(path.dirname),
532
- }
533
- html = template.result(OpenStruct.new(model).instance_eval{ binding })
526
+ stats_format = format
527
+ format_links = basenames
528
+ template_dir = template_path.dirname.relative_path_from(path.dirname)
529
+ html = template.result(binding)
534
530
  path.write(html)
535
531
  puts "Created #{path}"
536
532
  end
@@ -8,6 +8,7 @@ require 'image_optim/path'
8
8
  describe ImageOptim::BinResolver do
9
9
  def stub_env(key, value)
10
10
  allow(ENV).to receive(:[]).with(key).and_return(value)
11
+ allow(ENV).to receive(:fetch).with(key, nil).and_return(value)
11
12
  end
12
13
 
13
14
  before do
@@ -17,6 +18,7 @@ describe ImageOptim::BinResolver do
17
18
  stub_const('Cmd', ImageOptim::Cmd)
18
19
 
19
20
  allow(ENV).to receive(:[]).and_call_original
21
+ allow(ENV).to receive(:fetch).and_call_original
20
22
  end
21
23
 
22
24
  let(:image_optim){ double(:image_optim, verbose: false, pack: false) }
@@ -87,7 +89,7 @@ describe ImageOptim::BinResolver do
87
89
  expect(resolver.env_path).to eq([
88
90
  'temp_dir',
89
91
  'pack_path',
90
- ENV['PATH'],
92
+ ENV.fetch('PATH', nil),
91
93
  BinResolver::VENDOR_PATH,
92
94
  ].join(File::PATH_SEPARATOR))
93
95
  end
@@ -105,7 +107,7 @@ describe ImageOptim::BinResolver do
105
107
  expect(resolver.resolve!(:ls)).to eq(bin)
106
108
  end
107
109
  expect(resolver.env_path).to eq([
108
- ENV['PATH'],
110
+ ENV.fetch('PATH', nil),
109
111
  BinResolver::VENDOR_PATH,
110
112
  ].join(File::PATH_SEPARATOR))
111
113
  end
@@ -122,7 +124,7 @@ describe ImageOptim::BinResolver do
122
124
  end.to raise_error BinResolver::BinNotFound
123
125
  end
124
126
  expect(resolver.env_path).to eq([
125
- ENV['PATH'],
127
+ ENV.fetch('PATH', nil),
126
128
  BinResolver::VENDOR_PATH,
127
129
  ].join(File::PATH_SEPARATOR))
128
130
  end
@@ -162,7 +164,7 @@ describe ImageOptim::BinResolver do
162
164
  end
163
165
  expect(resolver.env_path).to eq([
164
166
  tmpdir,
165
- ENV['PATH'],
167
+ ENV.fetch('PATH', nil),
166
168
  BinResolver::VENDOR_PATH,
167
169
  ].join(File::PATH_SEPARATOR))
168
170
 
@@ -187,7 +189,7 @@ describe ImageOptim::BinResolver do
187
189
 
188
190
  after do
189
191
  expect(resolver.env_path).to eq([
190
- ENV['PATH'],
192
+ ENV.fetch('PATH', nil),
191
193
  BinResolver::VENDOR_PATH,
192
194
  ].join(File::PATH_SEPARATOR))
193
195
  end
@@ -15,7 +15,7 @@ describe ImageOptim::Cache do
15
15
 
16
16
  let(:cache_dir) do
17
17
  dir = '/somewhere/cache'
18
- allow(FileUtils).to receive(:mkpath).with(Regexp.new(Regexp.escape(dir)))
18
+ allow(FileUtils).to receive(:mkpath).with(Regexp.new(Regexp.escape(dir)), any_args)
19
19
  allow(FileUtils).to receive(:touch)
20
20
  allow(FSPath).to receive(:temp_file_path) do
21
21
  tmp_file
@@ -8,7 +8,7 @@ describe ImageOptim::Handler do
8
8
  stub_const('Handler', ImageOptim::Handler)
9
9
  end
10
10
 
11
- it 'uses original as source for first conversion '\
11
+ it 'uses original as source for first conversion ' \
12
12
  'and two temp files for further conversions' do
13
13
  original = double(:original)
14
14
  allow(original).to receive(:respond_to?).with(:temp_path).and_return(true)
@@ -252,7 +252,7 @@ describe ImageOptim do
252
252
  end
253
253
 
254
254
  describe 'given block' do
255
- it 'optimizes images, yields path and result for each and '\
255
+ it 'optimizes images, yields path and result for each and ' \
256
256
  'returns array of yield results' do
257
257
  image_optim = ImageOptim.new
258
258
  results = test_images.map do |src|
data/spec/spec_helper.rb CHANGED
@@ -10,7 +10,7 @@ require 'image_optim/path'
10
10
 
11
11
  ENV['PATH'] = [
12
12
  ImageOptim::Pack.path,
13
- ENV['PATH'],
13
+ ENV.fetch('PATH', nil),
14
14
  ].compact.join File::PATH_SEPARATOR
15
15
 
16
16
  RSpec.configure do |c|
@@ -72,7 +72,7 @@ RSpec::Matchers.define :be_similar_to do |expected, max_difference|
72
72
  @diff <= max_difference
73
73
  end
74
74
  failure_message do |actual|
75
- "expected #{actual} to have at most #{max_difference} difference from "\
75
+ "expected #{actual} to have at most #{max_difference} difference from " \
76
76
  "#{expected}, got mean error per pixel of #{@diff}"
77
77
  end
78
78
  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.31.1
4
+ version: 0.31.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kuchin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-20 00:00:00.000000000 Z
11
+ date: 2022-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -138,14 +138,20 @@ dependencies:
138
138
  requirements:
139
139
  - - "~>"
140
140
  - !ruby/object:Gem::Version
141
- version: '1.0'
141
+ version: '1.22'
142
+ - - "!="
143
+ - !ruby/object:Gem::Version
144
+ version: 1.22.2
142
145
  type: :development
143
146
  prerelease: false
144
147
  version_requirements: !ruby/object:Gem::Requirement
145
148
  requirements:
146
149
  - - "~>"
147
150
  - !ruby/object:Gem::Version
148
- version: '1.0'
151
+ version: '1.22'
152
+ - - "!="
153
+ - !ruby/object:Gem::Version
154
+ version: 1.22.2
149
155
  - !ruby/object:Gem::Dependency
150
156
  name: rubocop-rspec
151
157
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +174,8 @@ extensions: []
168
174
  extra_rdoc_files: []
169
175
  files:
170
176
  - ".github/workflows/check.yml"
177
+ - ".github/workflows/codeql.yml"
178
+ - ".github/workflows/rubocop.yml"
171
179
  - ".gitignore"
172
180
  - ".pre-commit-hooks.yaml"
173
181
  - ".rubocop.yml"
@@ -176,7 +184,6 @@ files:
176
184
  - Gemfile
177
185
  - LICENSE.txt
178
186
  - README.markdown
179
- - Vagrantfile
180
187
  - bin/image_optim
181
188
  - image_optim.gemspec
182
189
  - lib/image_optim.rb
@@ -285,7 +292,7 @@ licenses:
285
292
  metadata:
286
293
  bug_tracker_uri: https://github.com/toy/image_optim/issues
287
294
  changelog_uri: https://github.com/toy/image_optim/blob/master/CHANGELOG.markdown
288
- documentation_uri: https://www.rubydoc.info/gems/image_optim/0.31.1
295
+ documentation_uri: https://www.rubydoc.info/gems/image_optim/0.31.2
289
296
  source_code_uri: https://github.com/toy/image_optim
290
297
  post_install_message: |
291
298
  Rails image assets optimization is extracted into image_optim_rails gem
@@ -304,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
311
  - !ruby/object:Gem::Version
305
312
  version: '0'
306
313
  requirements: []
307
- rubygems_version: 3.2.29
314
+ rubygems_version: 3.3.26
308
315
  signing_key:
309
316
  specification_version: 4
310
317
  summary: Command line tool and ruby interface to optimize (lossless compress, optionally
data/Vagrantfile DELETED
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Vagrant.configure('2') do |config|
4
- config.vm.box = 'ubuntu/precise64'
5
-
6
- config.vm.provision 'shell', inline: <<-SH
7
- set -e
8
-
9
- cd /vagrant
10
-
11
- echo 'apt-get update...'
12
- apt-get update > /dev/null
13
-
14
- echo 'Install git, imagemagick, ruby1.9.1-dev...'
15
- apt-get install -y git npm imagemagick ruby1.9.1-dev > /dev/null
16
-
17
- echo 'Install node, npm...'
18
- curl -sL https://deb.nodesource.com/setup | sudo bash - > /dev/null
19
- sudo apt-get install -y nodejs > /dev/null
20
-
21
- echo 'Update rubygems...'
22
- REALLY_GEM_UPDATE_SYSTEM=x gem update --system > /dev/null
23
-
24
- echo 'Install bundler...'
25
- gem install bundler > /dev/null
26
-
27
- echo 'Install svgo...'
28
- npm install -g -q svgo > /dev/null
29
-
30
- echo 'Install pngout...'
31
- curl -s \
32
- 'http://static.jonof.id.au/dl/kenutils/pngout-20130221-linux.tar.gz' | \
33
- tar -xz -C /usr/local/bin --strip-components 2 \
34
- --wildcards '*/x86_64/pngout'
35
-
36
- echo 'Bundle...'
37
- bundle install --jobs=3 --quiet
38
- bundle list
39
- SH
40
- end