class ImageOptim::Runner

Handling optimization using image_optim binary

Public Class Methods

new(options) click to toggle source
# File lib/image_optim/runner.rb, line 46
def initialize(options)
  options = HashHelpers.deep_symbolise_keys(options)
  @recursive = options.delete(:recursive)
  @progress = options.delete(:show_progress) != false
  @exclude_dir_globs, @exclude_file_globs = %w[dir file].map do |type|
    glob = options.delete(:"exclude_#{type}_glob") || '.*'
    GlobHelpers.expand_braces(glob)
  end
  @image_optim = ImageOptim.new(options)
end

Public Instance Methods

run!(args) click to toggle source
# File lib/image_optim/runner.rb, line 57
def run!(args)
  to_optimize = find_to_optimize(args)
  unless to_optimize.empty?
    results = Results.new

    optimize_images!(to_optimize).each do |original, optimized|
      results.add(original, optimized)
    end

    results.print
  end

  !@warnings
end

Private Instance Methods

exclude?(dir, path, globs) click to toggle source

Check if any of globs matches either part of path relative from dir or just basename

# File lib/image_optim/runner.rb, line 125
def exclude?(dir, path, globs)
  relative_path = Pathname(path).relative_path_from(Pathname(dir)).to_s
  basename = File.basename(path)
  globs.any? do |glob|
    File.fnmatch(glob, relative_path, File::FNM_PATHNAME) ||
      File.fnmatch(glob, basename, File::FNM_PATHNAME)
  end
end
exclude_dir?(dir, path) click to toggle source
# File lib/image_optim/runner.rb, line 115
def exclude_dir?(dir, path)
  exclude?(dir, path, @exclude_dir_globs)
end
exclude_file?(dir, path) click to toggle source
# File lib/image_optim/runner.rb, line 119
def exclude_file?(dir, path)
  exclude?(dir, path, @exclude_file_globs)
end
find_to_optimize(paths) click to toggle source
# File lib/image_optim/runner.rb, line 79
def find_to_optimize(paths)
  to_optimize = []
  paths.each do |path|
    if File.file?(path)
      if @image_optim.optimizable?(path)
        to_optimize << path
      else
        warning "#{path} is not an image or there is no optimizer for it"
      end
    elsif File.directory?(path)
      if @recursive
        to_optimize += find_to_optimize_recursive(path)
      else
        warning "#{path} is a directory, use --recursive option"
      end
    else
      warning "#{path} is not a file or a directory or does not exist"
    end
  end
  to_optimize
end
find_to_optimize_recursive(dir) click to toggle source
# File lib/image_optim/runner.rb, line 101
def find_to_optimize_recursive(dir)
  to_optimize = []
  Find.find(dir) do |path|
    if File.file?(path)
      next if exclude_file?(dir, path)
      next unless @image_optim.optimizable?(path)
      to_optimize << path
    elsif File.directory?(path)
      Find.prune if dir != path && exclude_dir?(dir, path)
    end
  end
  to_optimize
end
optimize_images!(to_optimize, &block) click to toggle source
# File lib/image_optim/runner.rb, line 74
def optimize_images!(to_optimize, &block)
  to_optimize = to_optimize.with_progress('optimizing') if @progress
  @image_optim.optimize_images!(to_optimize, &block)
end
warning(message) click to toggle source
# File lib/image_optim/runner.rb, line 134
def warning(message)
  @warnings = true
  warn message
end