class AddressLineDivider::AddressParser

Public Class Methods

new() click to toggle source
# File lib/address_line_divider/address_parser.rb, line 5
def initialize
  @path = AddressLineDivider.configuration.streets_file_path
end

Public Instance Methods

parse(address_line) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 9
def parse(address_line)
  street = search_street_on_file(address_line)
  result = [street, street_no(address_line, street)] if street
  result ||= parse_using_regex(address_line)

  return if invalid_result(address_line, result)

  result
end

Private Instance Methods

invalid_result(address_line, result) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 32
def invalid_result(address_line, result)
  result.nil? ||
    result.any? { |r| r.nil? || r.strip.empty? } ||
    squish(result.join(" ")) != squish(address_line)
end
last_number(address_line) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 38
def last_number(address_line)
  squish(address_line).split(" ").select do |substr|
    substr =~ /[[:digit:]]/
  end.last
end
parse_using_regex(address_line) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 21
def parse_using_regex(address_line)
  last_number = last_number(address_line)
  return unless last_number

  last_number_index = address_line.index(last_number)
  street_name = address_line[0..last_number_index - 1].strip
  street_no = address_line[last_number_index..-1].strip

  [street_name, street_no]
end
search_street_on_file(address_line) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 48
def search_street_on_file(address_line)
  return false if @path.nil?

  IO.foreach(@path) do |street_name|
    street_name.chop!
    return street_name if Regexp.new(/^#{street_name}/).match?(address_line)
  end

  false
end
squish(string) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 44
def squish(string)
  string.gsub("  ", " ").strip
end
street_no(address_line, street) click to toggle source
# File lib/address_line_divider/address_parser.rb, line 59
def street_no(address_line, street)
  address_line.gsub(street, "").strip
end