class RussianPost::Captcha::Patterns

Attributes

patterns[R]

Public Class Methods

built_in() click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 8
def built_in
  @builtin_patterns ||= RussianPost::Captcha::Patterns.new(File.expand_path('characters.dat', File.dirname(__FILE__)))
end
new(file) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 14
def initialize(file)
  @patterns = load_patterns(file)
end

Public Instance Methods

add(pattern) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 22
def add(pattern)
  @patterns << pattern
end
each(&block) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 18
def each(&block)
  @patterns.each(&block)
end
find(image, x, y) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 26
def find(image, x, y)
  each do |pattern|
    return pattern if pattern.match?(image, x, y)
  end

  return false
end

Private Instance Methods

deserialize(data) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 47
def deserialize(data)
  raw_data = Marshal.load(data)

  raw_data.inject([]) do |result, data|
    character, patterns = data

    result += patterns.map { |points| RussianPost::Captcha::Pattern.new(points, character) }
  end
end
load_patterns(file) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 61
def load_patterns(file)
  raise "Specified patterns file not exists (#{file})" unless File.exists?(file)

  deserialize(File.open(file, 'rb') { |file| file.read })
end
save_patterns(file, patterns) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 57
def save_patterns(file, patterns)
  File.open(file, 'wb') { |file| file.write(serialize(patterns)) }
end
serialize(patterns) click to toggle source
# File lib/russian_post/captcha/patterns.rb, line 36
def serialize(patterns)
  array_hash = Hash.new{ |hash, key| hash[key] = []}

  data = patterns.inject(array_hash) do |result, pattern|
    result[pattern.character] << pattern.points
    result
  end

  Marshal.dump(data)
end