Sha256: 2fc959c95cf4ec0dc4374e3e115f2e03ab32b3b20cdd12581f4a8a2567a7dcbd

Contents?: true

Size: 1.86 KB

Versions: 3

Compression:

Stored size: 1.86 KB

Contents

require 'shellwords'
require 'image_optim'

class ImageOptim
  class Worker
    class << self
      # List of avaliable workers
      def klasses
        @klasses ||= []
      end

      # Remember all classes inheriting from this one
      def inherited(base)
        klasses << base
      end

      # List of formats which worker can optimize
      def image_formats
        format_from_name = name.downcase[/gif|jpeg|png/]
        format_from_name ? [format_from_name.to_sym] : []
      end

      # Undercored class name
      def underscored_name
        @underscored_name ||= name.split('::').last.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
      end
    end

    include OptionHelpers

    # Binary name or path
    attr_reader :bin

    # Binary name or path
    attr_reader :nice

    # Configure (raises on extra options), find binary (raises if not found)
    def initialize(options = {})
      get_option!(options, :bin, default_bin)
      get_option!(options, :nice, 10){ |v| v.to_i }
      parse_options(options)
      raise "`#{bin}` not found" if `which #{bin.to_s.shellescape}`.empty?
      assert_options_empty!(options)
    end

    # Put first in list of workers
    def run_first?
    end

    # Priority in list of workers
    def run_priority
      run_first? ? 0 : 1
    end

    # Optimize file from src to dst, return boolean representing success status
    def optimize(src, dst)
      pid = fork do
        $stdout.reopen('/dev/null', 'w')
        $stderr.reopen('/dev/null', 'w')
        Process.setpriority(Process::PRIO_PROCESS, 0, nice)
        exec bin, *command_args(src, dst)
      end
      Process.wait pid
      if $?.signaled?
        raise SignalException.new($?.termsig)
      end
      $?.success? && dst.size? && dst.size < src.size
    end

    # Name of binary determined from class name
    def default_bin
      self.class.underscored_name
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
image_optim-0.4.2 lib/image_optim/worker.rb
image_optim-0.4.1 lib/image_optim/worker.rb
image_optim-0.4.0 lib/image_optim/worker.rb