image_optim 0.22.0 → 0.22.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 +8 -8
- data/.gitignore +1 -0
- data/.rubocop.yml +17 -1
- data/.travis.yml +17 -8
- data/CHANGELOG.markdown +7 -0
- data/Gemfile +8 -1
- data/LICENSE.txt +1 -1
- data/README.markdown +1 -1
- data/Vagrantfile +1 -3
- data/image_optim.gemspec +2 -2
- data/lib/image_optim.rb +1 -1
- data/lib/image_optim/bin_resolver.rb +3 -5
- data/lib/image_optim/bin_resolver/bin.rb +8 -8
- data/lib/image_optim/config.rb +4 -5
- data/lib/image_optim/hash_helpers.rb +8 -8
- data/lib/image_optim/railtie.rb +33 -15
- data/lib/image_optim/worker/jhead.rb +3 -1
- data/lib/image_optim/worker/jpegrecompress.rb +1 -1
- data/script/update_worker_options_in_readme +4 -5
- data/script/worker_analysis +4 -4
- data/spec/image_optim/bin_resolver/simple_version_spec.rb +5 -5
- data/spec/image_optim/bin_resolver_spec.rb +1 -1
- data/spec/image_optim/railtie_spec.rb +1 -1
- data/spec/image_optim/runner/option_parser_spec.rb +10 -4
- data/spec/image_optim_spec.rb +5 -6
- metadata +4 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            !binary "U0hBMQ==":
         | 
| 3 3 | 
             
              metadata.gz: !binary |-
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                MDRiNGJkYTQ0MDcxZGIyODc5YWJkMGZkNGVkYmQzNzRmYTk4N2Y4OQ==
         | 
| 5 5 | 
             
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                 | 
| 6 | 
            +
                NDMyODhiNzkyZGIxZmVmNDdmODY3MWFkOTE0NWFkMTM5ZWY0YWY5OQ==
         | 
| 7 7 | 
             
            SHA512:
         | 
| 8 8 | 
             
              metadata.gz: !binary |-
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                 | 
| 11 | 
            -
                 | 
| 9 | 
            +
                NzdkYmVmNDRmYmYwODFmZjAyOWJhODBlZGE3NWEwZmJhNjllNjE5ZmJjM2Y2
         | 
| 10 | 
            +
                ZTk1NDZiOWViNTZjMTI2MDE3YjgwNWQ3N2Y0Y2ZjNWQ0ODJjMGU1MjQ3NDkx
         | 
| 11 | 
            +
                NTZjZjA4NjQ4MGM4YzNhMDkyYTQ3OTI3ZGYwZGMzMGRjNWU5ODQ=
         | 
| 12 12 | 
             
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
                 | 
| 15 | 
            -
                 | 
| 13 | 
            +
                MDMwNzg5MDM4NWRmNzM5ZjI0MDJmZTgwNzRiMjBlZDI1ZTNmOTMzZWUwNGE0
         | 
| 14 | 
            +
                ZTc0ZGIyNWVkMjExNTIyZGFkNTk1YWQ2MjU1NzU1ZjY3ZmZkNGUyNGVmZTk2
         | 
| 15 | 
            +
                ZGMyMDZjNGVlY2M1NmRmY2EyNWRjNTY5ZTBjNGRiMmI5YWYxOTE=
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            AllCops:
         | 
| 2 2 | 
             
              Exclude:
         | 
| 3 3 | 
             
                - '*.gemspec'
         | 
| 4 | 
            +
                - 'vendor/**/*'
         | 
| 4 5 |  | 
| 5 6 | 
             
            Lint/EndAlignment:
         | 
| 6 7 | 
             
              AlignWith: variable
         | 
| @@ -23,6 +24,9 @@ Metrics/PerceivedComplexity: | |
| 23 24 | 
             
            Style/AccessModifierIndentation:
         | 
| 24 25 | 
             
              EnforcedStyle: outdent
         | 
| 25 26 |  | 
| 27 | 
            +
            Style/Alias:
         | 
| 28 | 
            +
              EnforcedStyle: prefer_alias_method
         | 
| 29 | 
            +
             | 
| 26 30 | 
             
            Style/CaseIndentation:
         | 
| 27 31 | 
             
              IndentWhenRelativeTo: end
         | 
| 28 32 |  | 
| @@ -41,6 +45,12 @@ Style/HashSyntax: | |
| 41 45 | 
             
            Style/IfUnlessModifier:
         | 
| 42 46 | 
             
              MaxLineLength: 40
         | 
| 43 47 |  | 
| 48 | 
            +
            Style/IndentArray:
         | 
| 49 | 
            +
              EnforcedStyle: consistent
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            Style/IndentAssignment:
         | 
| 52 | 
            +
              Enabled: false
         | 
| 53 | 
            +
             | 
| 44 54 | 
             
            Style/IndentHash:
         | 
| 45 55 | 
             
              EnforcedStyle: consistent
         | 
| 46 56 |  | 
| @@ -55,11 +65,17 @@ Style/PercentLiteralDelimiters: | |
| 55 65 | 
             
            Style/Semicolon:
         | 
| 56 66 | 
             
              AllowAsExpressionSeparator: true
         | 
| 57 67 |  | 
| 68 | 
            +
            Style/SignalException:
         | 
| 69 | 
            +
              EnforcedStyle: semantic
         | 
| 70 | 
            +
             | 
| 58 71 | 
             
            Style/SpaceBeforeBlockBraces:
         | 
| 59 72 | 
             
              EnforcedStyle: no_space
         | 
| 60 73 |  | 
| 61 74 | 
             
            Style/SpaceInsideHashLiteralBraces:
         | 
| 62 75 | 
             
              EnforcedStyle: no_space
         | 
| 63 76 |  | 
| 64 | 
            -
            Style/ | 
| 77 | 
            +
            Style/TrailingCommaInArguments:
         | 
| 78 | 
            +
              EnforcedStyleForMultiline: no_comma
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            Style/TrailingCommaInLiteral:
         | 
| 65 81 | 
             
              EnforcedStyleForMultiline: comma
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -1,9 +1,13 @@ | |
| 1 1 | 
             
            sudo: false
         | 
| 2 2 | 
             
            language: ruby
         | 
| 3 | 
            +
            cache:
         | 
| 4 | 
            +
              bundler: true
         | 
| 5 | 
            +
              directories:
         | 
| 6 | 
            +
              - $(npm root)
         | 
| 7 | 
            +
              - ~/bin
         | 
| 3 8 | 
             
            rvm:
         | 
| 4 | 
            -
              - 1.8 | 
| 5 | 
            -
              - 1.9 | 
| 6 | 
            -
              - 1.9.3
         | 
| 9 | 
            +
              - '1.8'
         | 
| 10 | 
            +
              - '1.9'
         | 
| 7 11 | 
             
              - '2.0'
         | 
| 8 12 | 
             
              - '2.1'
         | 
| 9 13 | 
             
              - '2.2'
         | 
| @@ -21,17 +25,22 @@ script: | |
| 21 25 | 
             
              ; fi
         | 
| 22 26 | 
             
            before_install:
         | 
| 23 27 | 
             
              if [ -z "$RUBOCOP" ]; then
         | 
| 24 | 
            -
                 | 
| 25 | 
            -
                 | 
| 26 | 
            -
                 | 
| 28 | 
            +
                command -v svgo || npm install svgo
         | 
| 29 | 
            +
                ;
         | 
| 30 | 
            +
                command -v pngout || (
         | 
| 31 | 
            +
                  mkdir -p ~/bin
         | 
| 32 | 
            +
                  && 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'
         | 
| 33 | 
            +
                )
         | 
| 27 34 | 
             
              ; fi
         | 
| 28 | 
            -
            env:
         | 
| 29 | 
            -
              - PATH=~/bin:$PATH
         | 
| 30 35 | 
             
            matrix:
         | 
| 31 36 | 
             
              fast_finish: true
         | 
| 32 37 | 
             
              include:
         | 
| 38 | 
            +
                - env: RAILS_VERSION='~> 3.2' SPROCKETS_VERSION='~> 2.0'
         | 
| 39 | 
            +
                  rvm: default
         | 
| 33 40 | 
             
                - env: RAILS_VERSION='~> 3.2'
         | 
| 34 41 | 
             
                  rvm: default
         | 
| 42 | 
            +
                - env: RAILS_VERSION='~> 4.0' SPROCKETS_RAILS_VERSION='~> 2.0'
         | 
| 43 | 
            +
                  rvm: default
         | 
| 35 44 | 
             
                - env: RAILS_VERSION='~> 4.0'
         | 
| 36 45 | 
             
                  rvm: default
         | 
| 37 46 | 
             
                - env: RUBOCOP=true
         | 
    
        data/CHANGELOG.markdown
    CHANGED
    
    | @@ -2,6 +2,13 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            ## unreleased
         | 
| 4 4 |  | 
| 5 | 
            +
            ## v0.22.1 (2016-02-21)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Fix missing old (1.x) `pngquant` version as it was output to stderr [#123](https://github.com/toy/image_optim/issues/123) [@toy](https://github.com/toy)
         | 
| 8 | 
            +
            * Fix capturing wrong version of `pngcrush` when it complains about different png.h and png.c [#122](https://github.com/toy/image_optim/issues/122) [@toy](https://github.com/toy)
         | 
| 9 | 
            +
            * Add support for `sprockets-rails` 3.x, kudos to [@iggant](https://github.com/iggant) and [@valff](https://github.com/valff) for initial PRs [#120](https://github.com/toy/image_optim/pull/120) [#121](https://github.com/toy/image_optim/pull/121) [#126](https://github.com/toy/image_optim/pull/126) [@toy](https://github.com/toy)
         | 
| 10 | 
            +
            * Use rubocop ~> 0.37 [@toy](https://github.com/toy)
         | 
| 11 | 
            +
             | 
| 5 12 | 
             
            ## v0.22.0 (2015-11-21)
         | 
| 6 13 |  | 
| 7 14 | 
             
            * Unify getting description of option default value using `default_description` [@toy](https://github.com/toy)
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -6,4 +6,11 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9') | |
| 6 6 | 
             
              gem 'codeclimate-test-reporter', :group => :test, :require => nil
         | 
| 7 7 | 
             
            end
         | 
| 8 8 |  | 
| 9 | 
            -
             | 
| 9 | 
            +
            %w[
         | 
| 10 | 
            +
              rails
         | 
| 11 | 
            +
              sprockets
         | 
| 12 | 
            +
              sprockets-rails
         | 
| 13 | 
            +
            ].each do |gem_name|
         | 
| 14 | 
            +
              version = ENV[gem_name.tr('-', '_').upcase + '_VERSION']
         | 
| 15 | 
            +
              gem gem_name, version if version
         | 
| 16 | 
            +
            end
         | 
    
        data/LICENSE.txt
    CHANGED
    
    
    
        data/README.markdown
    CHANGED
    
    
    
        data/Vagrantfile
    CHANGED
    
    
    
        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.22. | 
| 5 | 
            +
              s.version     = '0.22.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']
         | 
| @@ -24,6 +24,6 @@ Gem::Specification.new do |s| | |
| 24 24 | 
             
              s.add_development_dependency 'image_optim_pack', '~> 0.2'
         | 
| 25 25 | 
             
              s.add_development_dependency 'rspec', '~> 3.0'
         | 
| 26 26 | 
             
              if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9.3')
         | 
| 27 | 
            -
                s.add_development_dependency 'rubocop', '~> 0. | 
| 27 | 
            +
                s.add_development_dependency 'rubocop', '~> 0.37'
         | 
| 28 28 | 
             
              end
         | 
| 29 29 | 
             
            end
         | 
    
        data/lib/image_optim.rb
    CHANGED
    
    
| @@ -44,11 +44,9 @@ class ImageOptim | |
| 44 44 | 
             
                    bin.check! if bin
         | 
| 45 45 | 
             
                  end
         | 
| 46 46 |  | 
| 47 | 
            -
                   | 
| 48 | 
            -
             | 
| 49 | 
            -
                   | 
| 50 | 
            -
                    fail BinNotFound, "`#{name}` not found"
         | 
| 51 | 
            -
                  end
         | 
| 47 | 
            +
                  fail BinNotFound, "`#{name}` not found" unless @bins[name]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  @bins[name].check_fail!
         | 
| 52 50 |  | 
| 53 51 | 
             
                  @bins[name]
         | 
| 54 52 | 
             
                end
         | 
| @@ -29,7 +29,7 @@ class ImageOptim | |
| 29 29 | 
             
                          'broken pngs'],
         | 
| 30 30 | 
             
                    [:pngcrush, is == '1.7.80', 'loses one color in indexed images'],
         | 
| 31 31 | 
             
                    [:pngquant, is < '2.0', 'is not supported'],
         | 
| 32 | 
            -
                  ]
         | 
| 32 | 
            +
                  ].freeze
         | 
| 33 33 |  | 
| 34 34 | 
             
                  WARN_CHECKS = [
         | 
| 35 35 | 
             
                    [:advpng, is < '1.17', 'does not use zopfli'],
         | 
| @@ -37,7 +37,7 @@ class ImageOptim | |
| 37 37 | 
             
                    [:pngcrush, is < '1.7.38', 'does not have blacken flag'],
         | 
| 38 38 | 
             
                    [:pngquant, is < '2.1', 'may be lossy even with quality `100-`'],
         | 
| 39 39 | 
             
                    [:optipng, is < '0.7', 'does not support -strip option'],
         | 
| 40 | 
            -
                  ]
         | 
| 40 | 
            +
                  ].freeze
         | 
| 41 41 |  | 
| 42 42 | 
             
                  # Fail if version will not work properly
         | 
| 43 43 | 
             
                  def check_fail!
         | 
| @@ -72,16 +72,16 @@ class ImageOptim | |
| 72 72 | 
             
                  # Getting version of bin, will fail for an unknown name
         | 
| 73 73 | 
             
                  def version_string
         | 
| 74 74 | 
             
                    case name
         | 
| 75 | 
            -
                    when :advpng, :gifsicle, :jpegoptim, :optipng | 
| 76 | 
            -
                      capture("#{escaped_path} --version 2> /dev/null")[/\d+(\.\d+) | 
| 77 | 
            -
                    when :svgo
         | 
| 78 | 
            -
                      capture("#{escaped_path} --version 2>&1")[/\d+(\.\d+) | 
| 75 | 
            +
                    when :advpng, :gifsicle, :jpegoptim, :optipng
         | 
| 76 | 
            +
                      capture("#{escaped_path} --version 2> /dev/null")[/\d+(\.\d+)+/]
         | 
| 77 | 
            +
                    when :svgo, :pngquant
         | 
| 78 | 
            +
                      capture("#{escaped_path} --version 2>&1")[/\d+(\.\d+)+/]
         | 
| 79 79 | 
             
                    when :jhead, :'jpeg-recompress'
         | 
| 80 | 
            -
                      capture("#{escaped_path} -V 2> /dev/null")[/\d+(\.\d+) | 
| 80 | 
            +
                      capture("#{escaped_path} -V 2> /dev/null")[/\d+(\.\d+)+/]
         | 
| 81 81 | 
             
                    when :jpegtran
         | 
| 82 82 | 
             
                      capture("#{escaped_path} -v - 2>&1")[/version (\d+\S*)/, 1]
         | 
| 83 83 | 
             
                    when :pngcrush
         | 
| 84 | 
            -
                      capture("#{escaped_path} -version 2>&1")[ | 
| 84 | 
            +
                      capture("#{escaped_path} -version 2>&1")[/pngcrush (\d+(\.\d+)+)/, 1]
         | 
| 85 85 | 
             
                    when :pngout
         | 
| 86 86 | 
             
                      date_regexp = /[A-Z][a-z]{2} (?: |\d)\d \d{4}/
         | 
| 87 87 | 
             
                      date_str = capture("#{escaped_path} 2>&1")[date_regexp]
         | 
    
        data/lib/image_optim/config.rb
    CHANGED
    
    | @@ -18,7 +18,7 @@ class ImageOptim | |
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 20 | 
             
                # Local config path at `./.image_optim.yml`
         | 
| 21 | 
            -
                LOCAL_PATH = './.image_optim.yml'
         | 
| 21 | 
            +
                LOCAL_PATH = './.image_optim.yml'.freeze
         | 
| 22 22 |  | 
| 23 23 | 
             
                class << self
         | 
| 24 24 | 
             
                  # Read options at path: expand path (warn on failure), return {} if file
         | 
| @@ -192,10 +192,9 @@ class ImageOptim | |
| 192 192 | 
             
                    Cmd.capture 'sysctl -n hw.ncpu'
         | 
| 193 193 | 
             
                  when /mswin|mingw/
         | 
| 194 194 | 
             
                    require 'win32ole'
         | 
| 195 | 
            -
                     | 
| 196 | 
            -
                    connect('winmgmts://').
         | 
| 197 | 
            -
                     | 
| 198 | 
            -
                    to_enum.first.NumberOfLogicalProcessors
         | 
| 195 | 
            +
                    query = 'select NumberOfLogicalProcessors from Win32_Processor'
         | 
| 196 | 
            +
                    result = WIN32OLE.connect('winmgmts://').ExecQuery(query)
         | 
| 197 | 
            +
                    result.to_enum.first.NumberOfLogicalProcessors
         | 
| 199 198 | 
             
                  else
         | 
| 200 199 | 
             
                    warn "Unknown architecture (#{host_os}) assuming one processor."
         | 
| 201 200 | 
             
                    1
         | 
| @@ -16,11 +16,11 @@ class ImageOptim | |
| 16 16 |  | 
| 17 17 | 
             
                  # Returns a new hash with recursive merge of all keys
         | 
| 18 18 | 
             
                  def deep_merge(a, b)
         | 
| 19 | 
            -
                    a.merge(b) do | | 
| 20 | 
            -
                      if  | 
| 21 | 
            -
                        deep_merge( | 
| 19 | 
            +
                    a.merge(b) do |_key, value_a, value_b|
         | 
| 20 | 
            +
                      if value_a.is_a?(Hash) && value_b.is_a?(Hash)
         | 
| 21 | 
            +
                        deep_merge(value_a, value_b)
         | 
| 22 22 | 
             
                      else
         | 
| 23 | 
            -
                         | 
| 23 | 
            +
                        value_b
         | 
| 24 24 | 
             
                      end
         | 
| 25 25 | 
             
                    end
         | 
| 26 26 | 
             
                  end
         | 
| @@ -31,11 +31,11 @@ class ImageOptim | |
| 31 31 | 
             
                  # provided block
         | 
| 32 32 | 
             
                  def deep_transform_keys(hash, &block)
         | 
| 33 33 | 
             
                    new_hash = {}
         | 
| 34 | 
            -
                    hash.each do | | 
| 35 | 
            -
                      new_hash[ | 
| 36 | 
            -
                        deep_transform_keys( | 
| 34 | 
            +
                    hash.each do |key, value|
         | 
| 35 | 
            +
                      new_hash[yield key] = if value.is_a?(Hash)
         | 
| 36 | 
            +
                        deep_transform_keys(value, &block)
         | 
| 37 37 | 
             
                      else
         | 
| 38 | 
            -
                         | 
| 38 | 
            +
                        value
         | 
| 39 39 | 
             
                      end
         | 
| 40 40 | 
             
                    end
         | 
| 41 41 | 
             
                    new_hash
         | 
    
        data/lib/image_optim/railtie.rb
    CHANGED
    
    | @@ -3,6 +3,13 @@ require 'image_optim' | |
| 3 3 | 
             
            class ImageOptim
         | 
| 4 4 | 
             
              # Adds image_optim as preprocessor for gif, jpeg, png and svg images
         | 
| 5 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 | 
            +
             | 
| 6 13 | 
             
                config.before_configuration do |app|
         | 
| 7 14 | 
             
                  worker_names = ImageOptim::Worker.klasses.map(&:bin_sym)
         | 
| 8 15 | 
             
                  app.config.assets.image_optim =
         | 
| @@ -14,14 +21,22 @@ class ImageOptim | |
| 14 21 | 
             
                end
         | 
| 15 22 |  | 
| 16 23 | 
             
                initializer 'image_optim.initializer' do |app|
         | 
| 17 | 
            -
                   | 
| 18 | 
            -
             | 
| 24 | 
            +
                  next if app.config.assets.compress == false
         | 
| 25 | 
            +
                  next if app.config.assets.image_optim == false
         | 
| 19 26 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
                  return if app.config.assets.compress == false
         | 
| 22 | 
            -
                  return if app.config.assets.image_optim == false
         | 
| 27 | 
            +
                  @image_optim = ImageOptim.new(options(app))
         | 
| 23 28 |  | 
| 24 | 
            -
                  app | 
| 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
         | 
| 25 40 | 
             
                end
         | 
| 26 41 |  | 
| 27 42 | 
             
                def options(app)
         | 
| @@ -32,17 +47,20 @@ class ImageOptim | |
| 32 47 | 
             
                  end
         | 
| 33 48 | 
             
                end
         | 
| 34 49 |  | 
| 35 | 
            -
                def  | 
| 36 | 
            -
                  image_optim | 
| 50 | 
            +
                def optimize_image_data(data)
         | 
| 51 | 
            +
                  @image_optim.optimize_image_data(data) || data
         | 
| 52 | 
            +
                end
         | 
| 37 53 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 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
         | 
| 40 63 | 
             
                  end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                  app.assets.register_preprocessor 'image/gif', :image_optim, &processor
         | 
| 43 | 
            -
                  app.assets.register_preprocessor 'image/jpeg', :image_optim, &processor
         | 
| 44 | 
            -
                  app.assets.register_preprocessor 'image/png', :image_optim, &processor
         | 
| 45 | 
            -
                  app.assets.register_preprocessor 'image/svg+xml', :image_optim, &processor
         | 
| 46 64 | 
             
                end
         | 
| 47 65 | 
             
              end
         | 
| 48 66 | 
             
            end
         | 
| @@ -7,6 +7,8 @@ class ImageOptim | |
| 7 7 | 
             
                #
         | 
| 8 8 | 
             
                # Jhead internally uses jpegtran which should be on path
         | 
| 9 9 | 
             
                class Jhead < Worker
         | 
| 10 | 
            +
                  ORIENTED = 2..8 # not top-left
         | 
| 11 | 
            +
             | 
| 10 12 | 
             
                  # Works on jpegs
         | 
| 11 13 | 
             
                  def image_formats
         | 
| 12 14 | 
             
                    [:jpeg]
         | 
| @@ -36,7 +38,7 @@ class ImageOptim | |
| 36 38 |  | 
| 37 39 | 
             
                  def oriented?(image)
         | 
| 38 40 | 
             
                    exif = EXIFR::JPEG.new(image.to_s)
         | 
| 39 | 
            -
                     | 
| 41 | 
            +
                    ORIENTED.include?(exif.orientation.to_i)
         | 
| 40 42 | 
             
                  end
         | 
| 41 43 | 
             
                end
         | 
| 42 44 | 
             
              end
         | 
| @@ -10,7 +10,7 @@ class ImageOptim | |
| 10 10 | 
             
                    super if options[:allow_lossy]
         | 
| 11 11 | 
             
                  end
         | 
| 12 12 |  | 
| 13 | 
            -
                  QUALITY_NAMES = [:low, :medium, :high, :veryhigh]
         | 
| 13 | 
            +
                  QUALITY_NAMES = [:low, :medium, :high, :veryhigh].freeze
         | 
| 14 14 |  | 
| 15 15 | 
             
                  quality_names_desc = QUALITY_NAMES.each_with_index.map do |name, i|
         | 
| 16 16 | 
             
                    "`#{i}` - #{name}"
         | 
| @@ -6,10 +6,8 @@ require 'bundler/setup' | |
| 6 6 | 
             
            require 'image_optim'
         | 
| 7 7 |  | 
| 8 8 | 
             
            README_FILE = File.expand_path('../../README.markdown', __FILE__)
         | 
| 9 | 
            -
            BEGIN_MARKER = '<!---<worker-options>-->'
         | 
| 10 | 
            -
            END_MARKER = '<!---</worker-options>-->'
         | 
| 11 | 
            -
            GENERATED_NOTE = '<!-- markdown for worker options is generated by '\
         | 
| 12 | 
            -
                "`#{Pathname($PROGRAM_NAME).cleanpath}` -->"
         | 
| 9 | 
            +
            BEGIN_MARKER = '<!---<worker-options>-->'.freeze
         | 
| 10 | 
            +
            END_MARKER = '<!---</worker-options>-->'.freeze
         | 
| 13 11 |  | 
| 14 12 | 
             
            def write_worker_options(io, klass)
         | 
| 15 13 | 
             
              io.puts "### #{klass.bin_sym}:"
         | 
| @@ -29,7 +27,8 @@ end | |
| 29 27 |  | 
| 30 28 | 
             
            def write_marked(io)
         | 
| 31 29 | 
             
              io.puts BEGIN_MARKER
         | 
| 32 | 
            -
              io.puts  | 
| 30 | 
            +
              io.puts '<!-- markdown for worker options is generated by '\
         | 
| 31 | 
            +
                "`#{Pathname($PROGRAM_NAME).cleanpath}` -->"
         | 
| 33 32 | 
             
              io.puts
         | 
| 34 33 |  | 
| 35 34 | 
             
              ImageOptim::Worker.klasses.sort_by(&:name).each do |klass|
         | 
    
        data/script/worker_analysis
    CHANGED
    
    | @@ -12,7 +12,7 @@ require 'digest' | |
| 12 12 | 
             
            require 'erb'
         | 
| 13 13 | 
             
            require 'ostruct'
         | 
| 14 14 |  | 
| 15 | 
            -
            DIR = 'tmp'
         | 
| 15 | 
            +
            DIR = 'tmp'.freeze
         | 
| 16 16 | 
             
            Pathname(DIR).mkpath
         | 
| 17 17 |  | 
| 18 18 | 
             
            Array.class_eval do
         | 
| @@ -127,8 +127,8 @@ class Analyser | |
| 127 127 | 
             
                    entry[0]
         | 
| 128 128 | 
             
                  end
         | 
| 129 129 |  | 
| 130 | 
            -
                  def set!(key, etag, & | 
| 131 | 
            -
                    value =  | 
| 130 | 
            +
                  def set!(key, etag, &_block)
         | 
| 131 | 
            +
                    value = yield
         | 
| 132 132 | 
             
                    DB[Marshal.dump(key)] = Marshal.dump([value, etag])
         | 
| 133 133 | 
             
                    value
         | 
| 134 134 | 
             
                  end
         | 
| @@ -284,7 +284,7 @@ class Analyser | |
| 284 284 | 
             
                    chain_result = ChainResult.new(src.format, steps)
         | 
| 285 285 | 
             
                    chain_result.difference = difference_with(result_image)
         | 
| 286 286 |  | 
| 287 | 
            -
                     | 
| 287 | 
            +
                    yield chain_result
         | 
| 288 288 |  | 
| 289 289 | 
             
                    workers_left = workers.reject do |w|
         | 
| 290 290 | 
             
                      w.cons_id == worker.cons_id || w.run_order < worker.run_order
         | 
| @@ -32,26 +32,26 @@ describe ImageOptim::BinResolver::SimpleVersion do | |
| 32 32 | 
             
                  1.0.0.0
         | 
| 33 33 | 
             
                ].each do |variation|
         | 
| 34 34 | 
             
                  it "normalizes #{variation}" do
         | 
| 35 | 
            -
                    expect(v | 
| 35 | 
            +
                    expect(v(variation)).to eq(1)
         | 
| 36 36 | 
             
                  end
         | 
| 37 37 | 
             
                end
         | 
| 38 38 | 
             
              end
         | 
| 39 39 |  | 
| 40 40 | 
             
              describe 'conversion' do
         | 
| 41 41 | 
             
                it 'converts Integer' do
         | 
| 42 | 
            -
                  expect(v | 
| 42 | 
            +
                  expect(v(117)).to eq('117')
         | 
| 43 43 | 
             
                end
         | 
| 44 44 |  | 
| 45 45 | 
             
                it 'converts Float' do
         | 
| 46 | 
            -
                  expect(v | 
| 46 | 
            +
                  expect(v(1.17)).to eq('1.17')
         | 
| 47 47 | 
             
                end
         | 
| 48 48 |  | 
| 49 49 | 
             
                it 'converts String' do
         | 
| 50 | 
            -
                  expect(v | 
| 50 | 
            +
                  expect(v('1.17')).to eq('1.17')
         | 
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 53 | 
             
                it 'converts self' do
         | 
| 54 | 
            -
                  expect(v(v | 
| 54 | 
            +
                  expect(v(v(1.17))).to eq('1.17')
         | 
| 55 55 | 
             
                end
         | 
| 56 56 | 
             
              end
         | 
| 57 57 | 
             
            end
         | 
| @@ -6,6 +6,12 @@ describe ImageOptim::Runner::OptionParser do | |
| 6 6 | 
             
                stub_const('OptionParser', ImageOptim::Runner::OptionParser)
         | 
| 7 7 | 
             
              end
         | 
| 8 8 |  | 
| 9 | 
            +
              def exit_with_status(status)
         | 
| 10 | 
            +
                raise_error(SystemExit) do |e|
         | 
| 11 | 
            +
                  expect(e.status).to eq(status)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 9 15 | 
             
              describe :parse! do
         | 
| 10 16 | 
             
                it 'returns empty hash for arguments without options' do
         | 
| 11 17 | 
             
                  args = %w[foo bar]
         | 
| @@ -65,8 +71,8 @@ describe ImageOptim::Runner::OptionParser do | |
| 65 71 |  | 
| 66 72 | 
             
                    expect do
         | 
| 67 73 | 
             
                      OptionParser.parse!(%w[--help])
         | 
| 68 | 
            -
                    end.to  | 
| 69 | 
            -
             | 
| 74 | 
            +
                    end.to exit_with_status(0) &
         | 
| 75 | 
            +
                           output("#{help}\n").to_stdout
         | 
| 70 76 | 
             
                  end
         | 
| 71 77 | 
             
                end
         | 
| 72 78 |  | 
| @@ -80,8 +86,8 @@ describe ImageOptim::Runner::OptionParser do | |
| 80 86 |  | 
| 81 87 | 
             
                    expect do
         | 
| 82 88 | 
             
                      OptionParser.parse!(%w[--unknown-option])
         | 
| 83 | 
            -
                    end.to  | 
| 84 | 
            -
             | 
| 89 | 
            +
                    end.to exit_with_status(1) &
         | 
| 90 | 
            +
                           output("invalid option: --unknown-option\n\n#{help}\n").to_stderr
         | 
| 85 91 | 
             
                  end
         | 
| 86 92 | 
             
                end
         | 
| 87 93 | 
             
              end
         | 
    
        data/spec/image_optim_spec.rb
    CHANGED
    
    | @@ -28,16 +28,15 @@ describe ImageOptim do | |
| 28 28 | 
             
                allow(ImageOptim::Config).to receive(:local).and_return({})
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| 31 | 
            -
               | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 31 | 
            +
              isolated_options_base = {:skip_missing_workers => false}
         | 
| 32 | 
            +
              ImageOptim::Worker.klasses.each do |klass|
         | 
| 33 | 
            +
                isolated_options_base[klass.bin_sym] = false
         | 
| 34 | 
            +
              end
         | 
| 34 35 |  | 
| 35 36 | 
             
              ImageOptim::Worker.klasses.each do |worker_klass|
         | 
| 36 37 | 
             
                describe "#{worker_klass.bin_sym} worker" do
         | 
| 37 38 | 
             
                  it 'optimizes at least one test image' do
         | 
| 38 | 
            -
                    options =  | 
| 39 | 
            -
                    options.merge!(worker_klass.bin_sym => true)
         | 
| 40 | 
            -
                    options.merge!(:skip_missing_workers => false)
         | 
| 39 | 
            +
                    options = isolated_options_base.merge(worker_klass.bin_sym => true)
         | 
| 41 40 |  | 
| 42 41 | 
             
                    image_optim = ImageOptim.new(options)
         | 
| 43 42 | 
             
                    if Array(worker_klass.init(image_optim)).empty?
         | 
    
        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.22. | 
| 4 | 
            +
              version: 0.22.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:  | 
| 11 | 
            +
            date: 2016-02-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: fspath
         | 
| @@ -126,14 +126,14 @@ dependencies: | |
| 126 126 | 
             
                requirements:
         | 
| 127 127 | 
             
                - - ~>
         | 
| 128 128 | 
             
                  - !ruby/object:Gem::Version
         | 
| 129 | 
            -
                    version: '0. | 
| 129 | 
            +
                    version: '0.37'
         | 
| 130 130 | 
             
              type: :development
         | 
| 131 131 | 
             
              prerelease: false
         | 
| 132 132 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 133 133 | 
             
                requirements:
         | 
| 134 134 | 
             
                - - ~>
         | 
| 135 135 | 
             
                  - !ruby/object:Gem::Version
         | 
| 136 | 
            -
                    version: '0. | 
| 136 | 
            +
                    version: '0.37'
         | 
| 137 137 | 
             
            description: 
         | 
| 138 138 | 
             
            email: 
         | 
| 139 139 | 
             
            executables:
         |