image_optim 0.26.5 → 0.27.0

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: 47d63cf5bc17ca54df17e3f0208edba04654f50479d81f36eadbcccab100a7bb
4
- data.tar.gz: 6638bec36d88903a81bb5f94999b86fac22756cae0b1b98cc75a5ace2e794cd0
3
+ metadata.gz: 2761c4a4a3488017b46d04acf157daa592537169ea05fcbeaf865928b0457618
4
+ data.tar.gz: 89c7fbe11f6b99cf3f1e8c4f3336fd122c1b16afd71fd56b1d0cbd6ab88c52c1
5
5
  SHA512:
6
- metadata.gz: 581fbe170f547949f2c5e66e0a69256b2864c198297ce56a1e2ac7391ad80f9db35b496b9cb0a80883176c612e25601b4d06f4b099c0f55fb9bb6e1864440dba
7
- data.tar.gz: dd8ead30e38599997fe62af647141c35f8be0876f2e6266862e73a6545f7a5f503ecbd6f126d449214c7ae1b9302a67efd47fa0fad4da3debf9d50499fc12b13
6
+ metadata.gz: facf38c901cbbd1ba0b8222637845b2e96dc8491e4a55b20a779be53e9ff6e14e561b2ab056aa9182205dd96df20ed0b25c8d8b5a1b3ebe721344ef5384bc7fc
7
+ data.tar.gz: f2d2f1d4179cce616a1024445d8a30b15367a4a156a0a085fa0d8b177f38e44aaff930788b90de6e8226e7b4c022eb1877794aceee5e62cd7e7c1153554238e3
@@ -2,6 +2,7 @@ AllCops:
2
2
  Exclude:
3
3
  - '*.gemspec'
4
4
  - 'vendor/**/*'
5
+ NewCops: enable
5
6
 
6
7
  Bundler/OrderedGems:
7
8
  Enabled: false
@@ -9,6 +10,9 @@ Bundler/OrderedGems:
9
10
  Layout/AccessModifierIndentation:
10
11
  EnforcedStyle: outdent
11
12
 
13
+ Layout/AssignmentIndentation:
14
+ Enabled: false
15
+
12
16
  Layout/CaseIndentation:
13
17
  EnforcedStyle: end
14
18
 
@@ -18,18 +22,18 @@ Layout/DotPosition:
18
22
  Layout/EndAlignment:
19
23
  EnforcedStyleAlignWith: variable
20
24
 
21
- Layout/IndentFirstArrayElement:
25
+ Layout/FirstArrayElementIndentation:
22
26
  EnforcedStyle: consistent
23
27
 
24
- Layout/IndentAssignment:
25
- Enabled: false
26
-
27
- Layout/IndentFirstHashElement:
28
+ Layout/FirstHashElementIndentation:
28
29
  EnforcedStyle: consistent
29
30
 
30
- Layout/IndentHeredoc:
31
+ Layout/HeredocIndentation:
31
32
  Enabled: false
32
33
 
34
+ Layout/LineLength:
35
+ Max: 120
36
+
33
37
  Layout/RescueEnsureAlignment:
34
38
  Enabled: false
35
39
 
@@ -47,10 +51,10 @@ Lint/AmbiguousBlockAssociation:
47
51
  Lint/NestedPercentLiteral:
48
52
  Enabled: false
49
53
 
50
- Lint/UnneededRequireStatement:
54
+ Lint/RedundantRequireStatement:
51
55
  Enabled: false
52
56
 
53
- Lint/UnneededSplatExpansion:
57
+ Lint/RedundantSplatExpansion:
54
58
  Enabled: false
55
59
 
56
60
  Metrics/AbcSize:
@@ -68,19 +72,19 @@ Metrics/ClassLength:
68
72
  Metrics/CyclomaticComplexity:
69
73
  Max: 11
70
74
 
71
- Metrics/LineLength:
72
- Max: 120
73
-
74
75
  Metrics/MethodLength:
75
76
  Max: 25
76
77
 
77
78
  Metrics/PerceivedComplexity:
78
- Max: 8
79
+ Max: 10
79
80
 
80
81
  Security/MarshalLoad:
81
82
  Exclude:
82
83
  - 'script/worker_analysis'
83
84
 
85
+ Style/AccessorGrouping:
86
+ Enabled: false
87
+
84
88
  Style/Alias:
85
89
  EnforcedStyle: prefer_alias_method
86
90
 
@@ -99,15 +103,27 @@ Style/ExpandPathArguments:
99
103
  Style/FormatStringToken:
100
104
  Enabled: false
101
105
 
106
+ Style/HashEachMethods:
107
+ Enabled: true
108
+
102
109
  Style/HashSyntax:
103
110
  EnforcedStyle: hash_rockets
104
111
 
112
+ Style/HashTransformKeys:
113
+ Enabled: false
114
+
115
+ Style/HashTransformValues:
116
+ Enabled: false
117
+
105
118
  Style/IfUnlessModifier:
106
119
  Enabled: false
107
120
 
108
121
  Style/NumericPredicate:
109
122
  EnforcedStyle: comparison
110
123
 
124
+ Style/OptionalBooleanParameter:
125
+ Enabled: false
126
+
111
127
  Style/ParallelAssignment:
112
128
  Enabled: false
113
129
 
@@ -1,4 +1,5 @@
1
1
  sudo: false
2
+ dist: trusty
2
3
  language: ruby
3
4
  cache:
4
5
  bundler: true
@@ -6,38 +7,40 @@ cache:
6
7
  - $(npm root)
7
8
  - ~/bin
8
9
  rvm:
9
- - '1.8.7-p371'
10
+ - '1.8.7-p374'
10
11
  - '1.9.3-p551'
11
12
  - '2.0.0-p648'
12
13
  - '2.1.10'
13
14
  - '2.2.10'
14
15
  - '2.3.8'
15
- - '2.4.6'
16
- - '2.5.5'
17
- - '2.6.3'
18
- - 'jruby-9.1.9.0'
16
+ - '2.4.10'
17
+ - '2.5.8'
18
+ - '2.6.6'
19
+ - '2.7.1'
20
+ - 'jruby-9.2.11.1'
19
21
  script:
20
22
  - bundle exec image_optim --info
21
23
  - bundle exec rspec
22
24
  before_install:
25
+ - 'echo "gem: --no-ri --no-rdoc --no-document" > ~/.gemrc'
23
26
  - gem install rubygems-update || gem install rubygems-update --version '< 3'
24
- - gem update --system
27
+ - update_rubygems
25
28
  - gem install bundler || gem install bundler --version '< 2'
26
29
  - nvm install stable
27
30
  - mkdir -p ~/bin
28
31
  - command -v svgo || npm install -g svgo
29
- - command -v pngout || curl -L "http://static.jonof.id.au/dl/kenutils/pngout-20150319-linux.tar.gz" | tar -xz -C ~/bin --strip-components 2 --wildcards '*/x86_64/pngout'
32
+ - command -v pngout || curl -L "https://www.jonof.id.au/files/kenutils/pngout-20200115-linux.tar.gz" | tar -xz -C ~/bin --strip-components 2 --wildcards '*/amd64/pngout'
30
33
  matrix:
31
34
  include:
32
- - env: CODECLIMATE=✓
33
- rvm: '2.4.6'
35
+ - env: CODECLIMATE=1
36
+ rvm: '2.4.10'
34
37
  after_success: bundle exec codeclimate-test-reporter
35
- - env: RUBOCOP=✓
36
- rvm: '2.4.6'
38
+ - env: RUBOCOP=1
39
+ rvm: '2.4.10'
37
40
  script: bundle exec rubocop
38
41
  before_install: gem update --system && gem install bundler
39
- - env: CHECK_RUBIES=✓
40
- rvm: '2.4.6'
42
+ - env: CHECK_RUBIES=1
43
+ rvm: '2.4.10'
41
44
  script: bundle exec travis_check_rubies
42
45
  before_install: gem update --system && gem install bundler
43
46
  addons:
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## v0.27.0 (2020-08-27)
6
+
7
+ * Use `.tmp` as the extension for temporary file if it needs to be created for atomic replacement [#178](https://github.com/toy/image_optim/issues/178) [@toy](https://github.com/toy)
8
+ * Don't create a temporary file in destination directory for atomic replacement if temporary directory is on same device as destination [#178](https://github.com/toy/image_optim/issues/178) [@toy](https://github.com/toy)
9
+
5
10
  ## v0.26.5 (2019-07-14)
6
11
 
7
12
  * Remove deprecated `rubyforge_project` attribute from gemspec [rubygems/rubygems#2436](https://github.com/rubygems/rubygems/pull/2436) [@toy](https://github.com/toy)
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2019 Ivan Kuchin
1
+ Copyright (c) 2012-2020 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
@@ -60,7 +60,7 @@ With version:
60
60
 
61
61
  <!---<update-version>-->
62
62
  ```ruby
63
- gem 'image_optim', '~> 0.26'
63
+ gem 'image_optim', '~> 0.27'
64
64
  ```
65
65
  <!---</update-version>-->
66
66
 
@@ -277,6 +277,10 @@ optipng:
277
277
  level: 5
278
278
  ```
279
279
 
280
+ ### Temporary directory
281
+
282
+ `image_optim` uses standard ruby library for creating temporary files. Temporary directory can be changed using one of `TMPDIR`, `TMP` or `TEMP` environment variables.
283
+
280
284
  ## Options
281
285
 
282
286
  * `: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`)*
@@ -357,4 +361,4 @@ In separate file [CHANGELOG.markdown](CHANGELOG.markdown).
357
361
 
358
362
  ## Copyright
359
363
 
360
- Copyright (c) 2012-2019 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.
364
+ Copyright (c) 2012-2020 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.
@@ -2,9 +2,9 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'image_optim'
5
- s.version = '0.26.5'
5
+ s.version = '0.27.0'
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, pngcrush, pngout, pngquant, svgo)}
7
- s.homepage = "http://github.com/toy/#{s.name}"
7
+ s.homepage = "https://github.com/toy/#{s.name}"
8
8
  s.authors = ['Ivan Kuchin']
9
9
  s.license = 'MIT'
10
10
 
@@ -34,6 +34,6 @@ EOF
34
34
  s.add_development_dependency 'image_optim_pack', '~> 0.2', '>= 0.2.2'
35
35
  s.add_development_dependency 'rspec', '~> 3.0'
36
36
  if RUBY_VERSION >= '2.2' && !Gem.win_platform? && !defined?(JRUBY_VERSION)
37
- s.add_development_dependency 'rubocop', '~> 0.59'
37
+ s.add_development_dependency 'rubocop', '~> 0.59', '!= 0.78.0'
38
38
  end
39
39
  end
@@ -17,6 +17,7 @@ class ImageOptim
17
17
  class BadVersion < Error; end
18
18
 
19
19
  attr_reader :name, :path, :version
20
+
20
21
  def initialize(name, path)
21
22
  @name = name.to_sym
22
23
  @path = path.to_s
@@ -26,6 +26,7 @@ class ImageOptim
26
26
  end
27
27
 
28
28
  attr_reader :method, :args
29
+
29
30
  def initialize(method, *args)
30
31
  @method, @args = method.to_sym, args
31
32
 
@@ -7,8 +7,11 @@ class ImageOptim
7
7
  class CachePath < Path
8
8
  # Atomic replace dst with self
9
9
  def replace(dst)
10
- dst = self.class.new(dst)
11
- dst.temp_path(dst.dirname) do |temp|
10
+ dst = self.class.convert(dst)
11
+ tmpdir = [dirname, Path.new(Dir.tmpdir)].find do |dir|
12
+ dir.same_dev?(dst.dirname)
13
+ end
14
+ dst.temp_path_with_tmp_ext(tmpdir || dst.dirname) do |temp|
12
15
  copy(temp)
13
16
  dst.copy_metadata(temp)
14
17
  temp.rename(dst.to_s)
@@ -7,7 +7,7 @@ class ImageOptim
7
7
  class OptimizedPath < DelegateClass(Path)
8
8
  def initialize(path, original_or_size = nil)
9
9
  path = Path.convert(path)
10
- __setobj__(path)
10
+ super(path)
11
11
  if original_or_size.is_a?(Integer)
12
12
  @original = path
13
13
  @original_size = original_or_size
@@ -50,11 +50,16 @@ class ImageOptim
50
50
 
51
51
  # Atomic replace dst with self
52
52
  def replace(dst)
53
- dst = self.class.new(dst)
54
- dst.temp_path(dst.dirname) do |temp|
55
- move(temp)
56
- dst.copy_metadata(temp)
57
- temp.rename(dst.to_s)
53
+ dst = self.class.convert(dst)
54
+ if same_dev?(dst.dirname)
55
+ dst.copy_metadata(self)
56
+ rename(dst.to_s)
57
+ else
58
+ dst.temp_path_with_tmp_ext(dst.dirname) do |temp|
59
+ move(temp)
60
+ dst.copy_metadata(temp)
61
+ temp.rename(dst.to_s)
62
+ end
58
63
  end
59
64
  end
60
65
 
@@ -68,5 +73,15 @@ class ImageOptim
68
73
  def self.convert(path)
69
74
  path.is_a?(self) ? path : new(path)
70
75
  end
76
+
77
+ protected
78
+
79
+ def same_dev?(other)
80
+ stat.dev == other.stat.dev
81
+ end
82
+
83
+ def temp_path_with_tmp_ext(*args, &block)
84
+ self.class.temp_file_path([basename.to_s, '.tmp'], *args, &block)
85
+ end
71
86
  end
72
87
  end
@@ -18,6 +18,7 @@ class ImageOptim
18
18
 
19
19
  # Remember all classes inheriting from this one
20
20
  def inherited(base)
21
+ super
21
22
  @klasses << base
22
23
  end
23
24
 
@@ -36,6 +37,7 @@ class ImageOptim
36
37
 
37
38
  def option(name, default, type, description = nil, &proc)
38
39
  attr_reader name
40
+
39
41
  OptionDefinition.new(name, default, type, description, &proc).
40
42
  tap{ |option_definition| option_definitions << option_definition }
41
43
  end
@@ -137,13 +137,14 @@ class Analyser
137
137
  # Delegate to worker with short id
138
138
  class WorkerVariant < DelegateClass(ImageOptim::Worker)
139
139
  attr_reader :name, :id, :cons_id, :required
140
+
140
141
  def initialize(klass, image_optim, options)
141
142
  @required = options.delete(:required)
142
143
  @run_order = options.delete(:run_order)
143
144
  allow_consecutive_on = Array(options.delete(:allow_consecutive_on))
144
145
  @image_optim = image_optim
145
146
  @name = klass.bin_sym.to_s + options_string(options)
146
- __setobj__(klass.new(image_optim, options))
147
+ super(klass.new(image_optim, options))
147
148
  @id = klass.bin_sym.to_s + options_string(self.options)
148
149
  @cons_id = [klass, allow_consecutive_on.map{ |key| [key, send(key)] }]
149
150
  end
@@ -452,6 +453,7 @@ class Analyser
452
453
  attr_reader :name
453
454
  attr_reader :success_count
454
455
  attr_reader :time, :avg_time
456
+
455
457
  def initialize(name, steps)
456
458
  @name = name
457
459
  @success_count = steps.count(&:success)
@@ -465,6 +467,7 @@ class Analyser
465
467
  end
466
468
 
467
469
  attr_reader :name, :results, :ids2names
470
+
468
471
  def initialize(name, results, ids2names)
469
472
  @name = name.to_s
470
473
  @results = results
@@ -15,45 +15,69 @@ describe ImageOptim::CachePath do
15
15
  let(:src){ CachePath.temp_file_path }
16
16
  let(:dst){ CachePath.temp_file_path }
17
17
 
18
- it 'moves data to destination' do
19
- src.write('src')
18
+ shared_examples 'replaces file' do
19
+ it 'moves data to destination' do
20
+ src.write('src')
20
21
 
21
- src.replace(dst)
22
+ src.replace(dst)
22
23
 
23
- expect(dst.read).to eq('src')
24
- end
24
+ expect(dst.read).to eq('src')
25
+ end
25
26
 
26
- it 'does not remove original file' do
27
- src.replace(dst)
27
+ it 'does not remove original file' do
28
+ src.replace(dst)
28
29
 
29
- expect(src).to exist
30
- end
30
+ expect(src).to exist
31
+ end
31
32
 
32
- it 'preserves attributes of destination file' do
33
- skip 'full file modes are not support' unless any_file_modes_allowed?
34
- mode = 0o666
33
+ it 'preserves attributes of destination file' do
34
+ skip 'full file modes are not support' unless any_file_modes_allowed?
35
+ mode = 0o666
35
36
 
36
- dst.chmod(mode)
37
+ dst.chmod(mode)
37
38
 
38
- src.replace(dst)
39
+ src.replace(dst)
39
40
 
40
- got = dst.stat.mode & 0o777
41
- expect(got).to eq(mode), format('expected %04o, got %04o', mode, got)
42
- end
41
+ got = dst.stat.mode & 0o777
42
+ expect(got).to eq(mode), format('expected %04o, got %04o', mode, got)
43
+ end
44
+
45
+ it 'does not preserve mtime of destination file' do
46
+ time = src.mtime
47
+
48
+ dst.utime(time - 1000, time - 1000)
43
49
 
44
- it 'does not preserve mtime of destination file' do
45
- time = src.mtime
50
+ src.replace(dst)
46
51
 
47
- dst.utime(time - 1000, time - 1000)
52
+ expect(dst.mtime).to be >= time
53
+ end
48
54
 
49
- src.replace(dst)
55
+ it 'changes inode of destination' do
56
+ skip 'inodes are not supported' unless inodes_supported?
57
+ expect{ src.replace(dst) }.to change{ dst.stat.ino }
58
+ end
50
59
 
51
- expect(dst.mtime).to be >= time
60
+ it 'is using temporary file with .tmp extension' do
61
+ expect(src).to receive(:copy).with(having_attributes(:extname => '.tmp'))
62
+
63
+ src.replace(dst)
64
+ end
52
65
  end
53
66
 
54
- it 'changes inode of destination' do
55
- skip 'inodes are not supported' unless inodes_supported?
56
- expect{ src.replace(dst) }.to change{ dst.stat.ino }
67
+ context 'when src and dst are on same device' do
68
+ before do
69
+ allow_any_instance_of(File::Stat).to receive(:dev).and_return(0)
70
+ end
71
+
72
+ include_examples 'replaces file'
73
+ end
74
+
75
+ context 'when src and dst are on different devices' do
76
+ before do
77
+ allow_any_instance_of(File::Stat).to receive(:dev, &:__id__)
78
+ end
79
+
80
+ include_examples 'replaces file'
57
81
  end
58
82
  end
59
83
  end
@@ -64,6 +64,7 @@ describe ImageOptim::Cache do
64
64
  end
65
65
  end
66
66
 
67
+ # rubocop:disable Style/RedundantFetchBlock
67
68
  shared_examples 'an enabled cache' do
68
69
  context 'when cached file does not exist' do
69
70
  describe :fetch do
@@ -116,6 +117,7 @@ describe ImageOptim::Cache do
116
117
  end
117
118
  end
118
119
  end
120
+ # rubocop:enable Style/RedundantFetchBlock
119
121
 
120
122
  context 'when cache is enabled (without worker digests)' do
121
123
  let(:image_optim) do
@@ -61,45 +61,69 @@ describe ImageOptim::Path do
61
61
  let(:src){ Path.temp_file_path }
62
62
  let(:dst){ Path.temp_file_path }
63
63
 
64
- it 'moves data to destination' do
65
- src.write('src')
64
+ shared_examples 'replaces file' do
65
+ it 'moves data to destination' do
66
+ src.write('src')
66
67
 
67
- src.replace(dst)
68
+ src.replace(dst)
68
69
 
69
- expect(dst.read).to eq('src')
70
- end
70
+ expect(dst.read).to eq('src')
71
+ end
71
72
 
72
- it 'removes original file' do
73
- src.replace(dst)
73
+ it 'removes original file' do
74
+ src.replace(dst)
74
75
 
75
- expect(src).to_not exist
76
- end
76
+ expect(src).to_not exist
77
+ end
77
78
 
78
- it 'preserves attributes of destination file' do
79
- skip 'full file modes are not support' unless any_file_modes_allowed?
80
- mode = 0o666
79
+ it 'preserves attributes of destination file' do
80
+ skip 'full file modes are not support' unless any_file_modes_allowed?
81
+ mode = 0o666
81
82
 
82
- dst.chmod(mode)
83
+ dst.chmod(mode)
83
84
 
84
- src.replace(dst)
85
+ src.replace(dst)
85
86
 
86
- got = dst.stat.mode & 0o777
87
- expect(got).to eq(mode), format('expected %04o, got %04o', mode, got)
88
- end
87
+ got = dst.stat.mode & 0o777
88
+ expect(got).to eq(mode), format('expected %04o, got %04o', mode, got)
89
+ end
90
+
91
+ it 'does not preserve mtime of destination file' do
92
+ time = src.mtime
93
+
94
+ dst.utime(time - 1000, time - 1000)
95
+
96
+ src.replace(dst)
89
97
 
90
- it 'does not preserve mtime of destination file' do
91
- time = src.mtime
98
+ expect(dst.mtime).to be >= time
99
+ end
92
100
 
93
- dst.utime(time - 1000, time - 1000)
101
+ it 'changes inode of destination' do
102
+ skip 'inodes are not supported' unless inodes_supported?
103
+ expect{ src.replace(dst) }.to change{ dst.stat.ino }
104
+ end
105
+ end
94
106
 
95
- src.replace(dst)
107
+ context 'when src and dst are on same device' do
108
+ before do
109
+ allow_any_instance_of(File::Stat).to receive(:dev).and_return(0)
110
+ end
96
111
 
97
- expect(dst.mtime).to be >= time
112
+ include_examples 'replaces file'
98
113
  end
99
114
 
100
- it 'changes inode of destination' do
101
- skip 'inodes are not supported' unless inodes_supported?
102
- expect{ src.replace(dst) }.to change{ dst.stat.ino }
115
+ context 'when src and dst are on different devices' do
116
+ before do
117
+ allow_any_instance_of(File::Stat).to receive(:dev, &:__id__)
118
+ end
119
+
120
+ include_examples 'replaces file'
121
+
122
+ it 'is using temporary file with .tmp extension' do
123
+ expect(src).to receive(:move).with(having_attributes(:extname => '.tmp'))
124
+
125
+ src.replace(dst)
126
+ end
103
127
  end
104
128
  end
105
129
  end
@@ -17,8 +17,8 @@ palettes.each do |palette|
17
17
  rgb:-
18
18
  PNG24:#{palette}.png
19
19
  ].shelljoin, 'w') do |f|
20
- (side * side).times do |i|
21
- color = i * palette / (side * side) * 0x10000 / palette
20
+ (side**2).times do |i|
21
+ color = i * palette / (side**2) * 0x10000 / palette
22
22
  f << [color / 0x100, color % 0x100, 0].pack('C*')
23
23
  end
24
24
  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.26.5
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kuchin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-14 00:00:00.000000000 Z
11
+ date: 2020-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fspath
@@ -139,6 +139,9 @@ dependencies:
139
139
  - - "~>"
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0.59'
142
+ - - "!="
143
+ - !ruby/object:Gem::Version
144
+ version: 0.78.0
142
145
  type: :development
143
146
  prerelease: false
144
147
  version_requirements: !ruby/object:Gem::Requirement
@@ -146,8 +149,11 @@ dependencies:
146
149
  - - "~>"
147
150
  - !ruby/object:Gem::Version
148
151
  version: '0.59'
149
- description:
150
- email:
152
+ - - "!="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.78.0
155
+ description:
156
+ email:
151
157
  executables:
152
158
  - image_optim
153
159
  extensions: []
@@ -257,13 +263,13 @@ files:
257
263
  - spec/spec_helper.rb
258
264
  - vendor/jpegrescan
259
265
  - vendor/jpegrescan.bat
260
- homepage: http://github.com/toy/image_optim
266
+ homepage: https://github.com/toy/image_optim
261
267
  licenses:
262
268
  - MIT
263
269
  metadata:
264
270
  bug_tracker_uri: https://github.com/toy/image_optim/issues
265
271
  changelog_uri: https://github.com/toy/image_optim/blob/master/CHANGELOG.markdown
266
- documentation_uri: https://www.rubydoc.info/gems/image_optim/0.26.5
272
+ documentation_uri: https://www.rubydoc.info/gems/image_optim/0.27.0
267
273
  source_code_uri: https://github.com/toy/image_optim
268
274
  post_install_message: |
269
275
  Rails image assets optimization is extracted into image_optim_rails gem
@@ -282,8 +288,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
282
288
  - !ruby/object:Gem::Version
283
289
  version: '0'
284
290
  requirements: []
285
- rubygems_version: 3.0.3
286
- signing_key:
291
+ rubygems_version: 3.1.4
292
+ signing_key:
287
293
  specification_version: 4
288
294
  summary: Command line tool and ruby interface to optimize (lossless compress, optionally
289
295
  lossy) jpeg, png, gif and svg images using external utilities (advpng, gifsicle,