image_optim_rails 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0a27fab3ec29968a0f1461aa69f5d1f3238d2a05
4
+ data.tar.gz: 14e3da57b4023c649e9ed3a4874ab5621174c545
5
+ SHA512:
6
+ metadata.gz: ff3b6c95266bbb357df1faab872a7427af1eea240f5d29eeedfd99b8f9b0fbcea8efd01049643c266b6a7822b3c6898ca8c1c8cb97007bd463cee098e4b6b6fe
7
+ data.tar.gz: 5a0cc79969ee1ea39c78246e6a9b7f66b6846985749f6e7ffb39a275ed8fc8cd1f14469abee011dd841221e04c33b9b824b4067ddd7d184ef1fe0d5a5d80670e
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /pkg/
2
+ /*.gem
3
+
4
+ /doc/
5
+ /rdoc/
6
+ /.yardoc/
7
+ /coverage/
8
+
9
+ Makefile
10
+ *.o
11
+ *.bundle
12
+ /tmp/
13
+
14
+ /Gemfile.lock
data/.rubocop.yml ADDED
@@ -0,0 +1,75 @@
1
+ AllCops:
2
+ Exclude:
3
+ - '*.gemspec'
4
+ - 'vendor/**/*'
5
+
6
+ Lint/EndAlignment:
7
+ AlignWith: variable
8
+
9
+ Metrics/AbcSize:
10
+ Max: 30
11
+
12
+ Metrics/MethodLength:
13
+ Max: 25
14
+
15
+ Style/AccessModifierIndentation:
16
+ EnforcedStyle: outdent
17
+
18
+ Style/Alias:
19
+ EnforcedStyle: prefer_alias_method
20
+
21
+ Style/CaseIndentation:
22
+ IndentWhenRelativeTo: end
23
+
24
+ Style/DotPosition:
25
+ EnforcedStyle: trailing
26
+
27
+ Style/DoubleNegation:
28
+ Enabled: false
29
+
30
+ Style/EmptyCaseCondition:
31
+ Enabled: false
32
+
33
+ Style/Encoding:
34
+ EnforcedStyle: when_needed
35
+
36
+ Style/HashSyntax:
37
+ EnforcedStyle: hash_rockets
38
+
39
+ Style/IfUnlessModifier:
40
+ MaxLineLength: 40
41
+
42
+ Style/IndentArray:
43
+ EnforcedStyle: consistent
44
+
45
+ Style/IndentAssignment:
46
+ Enabled: false
47
+
48
+ Style/IndentHash:
49
+ EnforcedStyle: consistent
50
+
51
+ Style/ParallelAssignment:
52
+ Enabled: false
53
+
54
+ Style/PercentLiteralDelimiters:
55
+ PreferredDelimiters:
56
+ '%w': '[]'
57
+ '%W': '[]'
58
+
59
+ Style/Semicolon:
60
+ AllowAsExpressionSeparator: true
61
+
62
+ Style/SignalException:
63
+ EnforcedStyle: semantic
64
+
65
+ Style/SpaceBeforeBlockBraces:
66
+ EnforcedStyle: no_space
67
+
68
+ Style/SpaceInsideHashLiteralBraces:
69
+ EnforcedStyle: no_space
70
+
71
+ Style/TrailingCommaInArguments:
72
+ EnforcedStyleForMultiline: no_comma
73
+
74
+ Style/TrailingCommaInLiteral:
75
+ EnforcedStyleForMultiline: comma
data/.travis.yml ADDED
@@ -0,0 +1,43 @@
1
+ sudo: false
2
+ language: ruby
3
+ cache:
4
+ bundler: true
5
+ directories:
6
+ - $(npm root)
7
+ - ~/bin
8
+ script: |
9
+ (
10
+ set -ex
11
+ if [ -n "$RUBOCOP" ]; then
12
+ bundle exec rubocop
13
+ else
14
+ bundle exec image_optim --info
15
+ bundle exec rspec
16
+ fi
17
+ )
18
+ before_install: |
19
+ (
20
+ set -ex
21
+ if [ -z "$RUBOCOP" ]; then
22
+ command -v svgo || npm install svgo
23
+ command -v pngout || {
24
+ mkdir -p ~/bin
25
+ 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
+ }
27
+ fi
28
+ )
29
+ matrix:
30
+ fast_finish: true
31
+ include:
32
+ - env: RAILS_VERSION='~> 3.2'
33
+ rvm: default
34
+ - env: RAILS_VERSION='~> 4.0' SPROCKETS_RAILS_VERSION='~> 2.0'
35
+ rvm: '2'
36
+ - env: RAILS_VERSION='~> 4.0'
37
+ rvm: '2'
38
+ - env: RAILS_VERSION='~> 5.0' SPROCKETS_RAILS_VERSION='~> 2.0'
39
+ rvm: '2.2.2'
40
+ - env: RAILS_VERSION='~> 5.0'
41
+ rvm: '2.2.2'
42
+ - env: RUBOCOP=true
43
+ rvm: '2.2.2'
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ %w[
6
+ rails
7
+ sprockets
8
+ sprockets-rails
9
+ ].each do |gem_name|
10
+ version = ENV[gem_name.tr('-', '_').upcase + '_VERSION']
11
+ gem gem_name, version if version
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013-2016 Ivan Kuchin
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,45 @@
1
+ [![Gem Version](https://img.shields.io/gem/v/image_optim_rails.svg?style=flat)](https://rubygems.org/gems/image_optim_rails)
2
+ [![Build Status](https://img.shields.io/travis/toy/image_optim_rails/master.svg?style=flat)](https://travis-ci.org/toy/image_optim_rails)
3
+ [![Code Climate](https://img.shields.io/codeclimate/github/toy/image_optim_rails.svg?style=flat)](https://codeclimate.com/github/toy/image_optim_rails)
4
+ [![Dependency Status](https://img.shields.io/gemnasium/toy/image_optim_rails.svg?style=flat)](https://gemnasium.com/toy/image_optim_rails)
5
+ [![Inch CI](https://inch-ci.org/github/toy/image_optim_rails.svg?branch=master&style=flat)](https://inch-ci.org/github/toy/image_optim_rails)
6
+
7
+ # image\_optim\_rails
8
+
9
+ Optimize rails image assets using image_optim gem.
10
+
11
+ Options and instructions for getting binaries can be found in [image_optim readme](https://github.com/toy/image_optim).
12
+
13
+ ## Installation
14
+
15
+ Add to your `Gemfile`:
16
+
17
+ ```ruby
18
+ gem 'image_optim'
19
+ ```
20
+
21
+ With [`image_optim_pack`](https://github.com/toy/image_optim_pack):
22
+
23
+ ```ruby
24
+ gem 'image_optim'
25
+ gem 'image_optim_pack'
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ `ImageOptim::Railtie` will automatically register sprockets preprocessor unless you set `config.assets.image_optim = false` or `config.assets.compress = false` (later for partial rails 3 compatibility).
31
+
32
+ You can provide options for image_optim used for preprocessor through config:
33
+
34
+ ```ruby
35
+ config.assets.image_optim.nice = 20
36
+ config.assets.image_optim.svgo = false
37
+ ```
38
+
39
+ Check available options in [options section of image_optim](https://github.com/toy/image_optim#options).
40
+
41
+ Image optimization can be time consuming, so depending on your deployment process you may prefer to optimize original asset files.
42
+
43
+ ## Copyright
44
+
45
+ Copyright (c) 2013-2016 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'image_optim_rails'
5
+ s.version = '0.1.0'
6
+ s.summary = %q{Optimize image assets using image_optim}
7
+ s.homepage = "http://github.com/toy/#{s.name}"
8
+ s.authors = ['Ivan Kuchin']
9
+ s.license = 'MIT'
10
+
11
+ s.rubyforge_project = s.name
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = %w[lib]
17
+
18
+ s.add_dependency 'image_optim', '~> 0.24.0'
19
+ s.add_dependency 'rails'
20
+ s.add_dependency 'sprockets'
21
+
22
+ s.add_development_dependency 'image_optim_pack', '~> 0.2', '>= 0.2.2'
23
+ s.add_development_dependency 'rspec', '~> 3.0'
24
+ if RUBY_VERSION >= '2.0'
25
+ s.add_development_dependency 'rubocop', '~> 0.37'
26
+ end
27
+ end
@@ -0,0 +1,66 @@
1
+ require 'image_optim'
2
+
3
+ class ImageOptim
4
+ # Adds image_optim as preprocessor for gif, jpeg, png and svg images
5
+ class Railtie < Rails::Railtie
6
+ MIME_TYPES = %w[
7
+ image/gif
8
+ image/jpeg
9
+ image/png
10
+ image/svg+xml
11
+ ].freeze
12
+
13
+ config.before_configuration do |app|
14
+ worker_names = ImageOptim::Worker.klasses.map(&:bin_sym)
15
+ app.config.assets.image_optim =
16
+ ActiveSupport::OrderedOptions.new do |hash, key|
17
+ if worker_names.include?(key.to_sym)
18
+ hash[key] = ActiveSupport::OrderedOptions.new
19
+ end
20
+ end
21
+ end
22
+
23
+ initializer 'image_optim.initializer' do |app|
24
+ next if app.config.assets.compress == false
25
+ next if app.config.assets.image_optim == false
26
+
27
+ @image_optim = ImageOptim.new(options(app))
28
+
29
+ register_preprocessor(app) do |*args|
30
+ if args[1] # context and data arguments in sprockets 2
31
+ optimize_image_data(args[1])
32
+ else
33
+ input = args[0]
34
+ {
35
+ :data => optimize_image_data(input[:data]),
36
+ :charset => nil, # no gzipped version with rails/sprockets#228
37
+ }
38
+ end
39
+ end
40
+ end
41
+
42
+ def options(app)
43
+ if app.config.assets.image_optim == true
44
+ {}
45
+ else
46
+ app.config.assets.image_optim || {}
47
+ end
48
+ end
49
+
50
+ def optimize_image_data(data)
51
+ @image_optim.optimize_image_data(data) || data
52
+ end
53
+
54
+ def register_preprocessor(app, &processor)
55
+ MIME_TYPES.each do |mime_type|
56
+ if app.assets
57
+ app.assets.register_preprocessor mime_type, :image_optim, &processor
58
+ else
59
+ app.config.assets.configure do |env|
60
+ env.register_preprocessor mime_type, :image_optim, &processor
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1 @@
1
+ require 'image_optim/railtie'
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+ require 'rails/all'
3
+ require 'image_optim/railtie'
4
+
5
+ describe 'ImageOptim::Railtie' do
6
+ def init_rails_app
7
+ Class.new(Rails::Application) do
8
+ # Rails 4 requires application class to have name
9
+ define_singleton_method :name do
10
+ 'Dummy'
11
+ end
12
+
13
+ config.active_support.deprecation = :stderr
14
+ config.eager_load = false
15
+
16
+ config.logger = Logger.new('/dev/null')
17
+
18
+ config.assets.tap do |assets|
19
+ assets.enabled = true
20
+ assets.version = '1.0'
21
+ assets.cache_store = :null_store
22
+
23
+ # grab images from image_optim gem
24
+ image_optim_root = Gem.loaded_specs['image_optim'].gem_dir
25
+ assets.paths = [FSPath.new(image_optim_root) / 'spec/images']
26
+
27
+ assets.delete(:compress)
28
+ end
29
+
30
+ yield config if block_given?
31
+ end.initialize!
32
+ end
33
+
34
+ after do
35
+ Rails.application = nil
36
+ end
37
+
38
+ describe 'initialization' do
39
+ it 'initializes by default' do
40
+ expect(ImageOptim).to receive(:new)
41
+ init_rails_app
42
+ end
43
+
44
+ it 'initializes if config.assets.image_optim is nil' do
45
+ expect(ImageOptim).to receive(:new)
46
+ init_rails_app do |config|
47
+ config.assets.image_optim = nil
48
+ end
49
+ end
50
+
51
+ it 'does not initialize if config.assets.image_optim is false' do
52
+ expect(ImageOptim).not_to receive(:new)
53
+ init_rails_app do |config|
54
+ config.assets.image_optim = false
55
+ end
56
+ end
57
+
58
+ it 'does not initialize if config.assets.compress is false' do
59
+ expect(ImageOptim).not_to receive(:new)
60
+ init_rails_app do |config|
61
+ config.assets.compress = false
62
+ end
63
+ end
64
+
65
+ describe 'options' do
66
+ it 'initializes with empty hash by default' do
67
+ expect(ImageOptim).to receive(:new).with({})
68
+ init_rails_app
69
+ end
70
+
71
+ it 'initializes with empty hash if config.assets.image_optim is true' do
72
+ expect(ImageOptim).to receive(:new).with({})
73
+ init_rails_app do |config|
74
+ config.assets.image_optim = true
75
+ end
76
+ end
77
+
78
+ it 'initializes with empty hash if config.assets.image_optim is nil' do
79
+ expect(ImageOptim).to receive(:new).with({})
80
+ init_rails_app do |config|
81
+ config.assets.image_optim = nil
82
+ end
83
+ end
84
+
85
+ it 'initializes with hash assigned to config.assets.image_optim' do
86
+ hash = double
87
+ expect(ImageOptim).to receive(:new).with(hash)
88
+ init_rails_app do |config|
89
+ config.assets.image_optim = hash
90
+ end
91
+ end
92
+
93
+ it 'is possible to set individual options' do
94
+ hash = {:config_paths => 'config/image_optim.yml'}
95
+ expect(ImageOptim).to receive(:new).with(hash)
96
+ init_rails_app do |config|
97
+ config.assets.image_optim.config_paths = 'config/image_optim.yml'
98
+ end
99
+ end
100
+
101
+ it 'is possible to set individual worker options' do
102
+ hash = {:advpng => {:level => 3}}
103
+ expect(ImageOptim).to receive(:new).with(hash)
104
+ init_rails_app do |config|
105
+ expect(config.assets.image_optim.advpng).to eq({})
106
+ config.assets.image_optim.advpng.level = 3
107
+ end
108
+ end
109
+
110
+ it 'is not possible to set unknown worker options' do
111
+ expect(ImageOptim).to receive(:new).with({})
112
+ init_rails_app do |config|
113
+ expect(config.assets.image_optim.unknown).to eq(nil)
114
+ expect do
115
+ config.assets.image_optim.unknown.level = 3
116
+ end.to raise_error(NoMethodError)
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ describe 'optimizing assets' do
123
+ before do
124
+ stub_const('Path', ImageOptim::Path)
125
+ end
126
+
127
+ %w[
128
+ icecream.gif
129
+ lena.jpg
130
+ rails.png
131
+ test.svg
132
+ ].each do |asset_name|
133
+ it "optimizes #{asset_name}" do
134
+ asset = init_rails_app.assets.find_asset(asset_name)
135
+
136
+ asset_data = asset.source
137
+ original = Path.convert(asset.pathname)
138
+
139
+ expect(asset_data).to be_smaller_than(original)
140
+
141
+ Path.temp_file_path %W[spec .#{original.image_format}] do |temp|
142
+ temp.binwrite(asset_data)
143
+
144
+ expect(temp).to be_similar_to(original, 0)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,70 @@
1
+ require 'image_optim/pack'
2
+ require 'image_optim/path'
3
+
4
+ ENV['PATH'] = [
5
+ ImageOptim::Pack.path,
6
+ ENV['PATH'],
7
+ ].compact.join File::PATH_SEPARATOR
8
+
9
+ RSpec.configure do |c|
10
+ c.before do
11
+ stub_const('ImageOptim::Config::GLOBAL_PATH', ImageOptim::Path::NULL)
12
+ stub_const('ImageOptim::Config::LOCAL_PATH', ImageOptim::Path::NULL)
13
+ ImageOptim.class_eval{ def pack; end }
14
+ end
15
+
16
+ c.order = :random
17
+ end
18
+
19
+ def flatten_animation(image)
20
+ if image.image_format == :gif
21
+ flattened = image.temp_path
22
+ command = %W[
23
+ convert
24
+ #{image.to_s.shellescape}
25
+ -coalesce
26
+ -append
27
+ #{flattened.to_s.shellescape}
28
+ ].join(' ')
29
+ expect(ImageOptim::Cmd.run(command)).to be_truthy
30
+ flattened
31
+ else
32
+ image
33
+ end
34
+ end
35
+
36
+ def mepp(image_a, image_b)
37
+ coalesce_a = flatten_animation(image_a)
38
+ coalesce_b = flatten_animation(image_b)
39
+ command = %W[
40
+ compare
41
+ -metric MEPP
42
+ -alpha Background
43
+ #{coalesce_a.to_s.shellescape}
44
+ #{coalesce_b.to_s.shellescape}
45
+ #{ImageOptim::Path::NULL}
46
+ 2>&1
47
+ ].join(' ')
48
+ output = ImageOptim::Cmd.capture(command)
49
+ if [0, 1].include?($CHILD_STATUS.exitstatus)
50
+ num_r = '\d+(?:\.\d+(?:[eE][-+]?\d+)?)?'
51
+ output[/\((#{num_r}), #{num_r}\)/, 1].to_f
52
+ else
53
+ fail "compare #{image_a} with #{image_b} failed with `#{output}`"
54
+ end
55
+ end
56
+
57
+ RSpec::Matchers.define :be_smaller_than do |expected|
58
+ match{ |actual| actual.size < expected.size }
59
+ end
60
+
61
+ RSpec::Matchers.define :be_similar_to do |expected, max_difference|
62
+ match do |actual|
63
+ @diff = mepp(actual, expected)
64
+ @diff <= max_difference
65
+ end
66
+ failure_message do |actual|
67
+ "expected #{actual} to have at most #{max_difference} difference from "\
68
+ "#{expected}, got normalized root-mean-square error of #{@diff}"
69
+ end
70
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: image_optim_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Kuchin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: image_optim
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.24.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.24.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sprockets
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: image_optim_pack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.2.2
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '0.2'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.2.2
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rubocop
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.37'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.37'
103
+ description:
104
+ email:
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - ".gitignore"
110
+ - ".rubocop.yml"
111
+ - ".travis.yml"
112
+ - Gemfile
113
+ - LICENSE.txt
114
+ - README.markdown
115
+ - image_optim_rails.gemspec
116
+ - lib/image_optim/railtie.rb
117
+ - lib/image_optim_rails.rb
118
+ - spec/image_optim/railtie_spec.rb
119
+ - spec/spec_helper.rb
120
+ homepage: http://github.com/toy/image_optim_rails
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project: image_optim_rails
140
+ rubygems_version: 2.6.4
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Optimize image assets using image_optim
144
+ test_files:
145
+ - spec/image_optim/railtie_spec.rb
146
+ - spec/spec_helper.rb