letter_avatar.rb 1.29 KB
require "letter_avatar/version"
require "letter_avatar/configuration"
require "letter_avatar/avatar"
require "letter_avatar/avatar_helper"

module LetterAvatar
  extend LetterAvatar::Configuration

  class ExecutionError < StandardError; end

  def self.setup(&block)
    yield(self)
  end

  def self.resize(from, to, width, height)
    begin
      execute(
        # NOTE: ORDER is important!
        %W{
          convert
          #{from}
          -background transparent
          -gravity center
          -thumbnail #{width}x#{height}^
          -extent #{width}x#{height}
          -interpolate bicubic
          -unsharp 2x0.5+0.7+0
          -quality 98
          #{to}
        }.join(" ")
      )
      true
    rescue => e
      false
    end
  end

  def self.generate(username, size)
    Avatar.generate(username, size)
  end

  def self.execute(cmd)
    cmd = cmd.join(' ') if cmd.is_a?(Array)
    if Gem.win_platform?
      require "open3"
      _stdout_str, err = Open3.capture3(cmd.tr("'", '"'))
    else
      pid, _stdin, _stdout, stderr = POSIX::Spawn.popen4(cmd)
      Process.waitpid(pid)
      err = stderr.read
    end
    if err != nil && err.length > 0
      raise ExecutionError.new("letter_avatar execution error (when calling '#{cmd}'): '#{err.strip}'")
    else
      true
    end
  end

end