class NameSplitter::Splitter

Attributes

first_name[RW]
last_name[RW]
last_name_prefix[RW]
middle_name[RW]
name[R]
salutation[RW]
suffix[RW]
suffixes[RW]

Public Class Methods

call(fullname) click to toggle source
# File lib/name_splitter.rb, line 8
def self.call(fullname)
  new(fullname)
end
new(fullname = "") click to toggle source
# File lib/name_splitter.rb, line 12
def initialize(fullname = "")
  self.salutation = ""
  self.first_name = ""
  self.middle_name = ""
  self.last_name = ""
  self.suffix = ""
  self.name = fullname if fullname and !fullname.to_s.empty?
end

Public Instance Methods

last_name_check(last_name_arr) click to toggle source
# File lib/name_splitter.rb, line 53
def last_name_check(last_name_arr)
  #accepts either a string or an array
  if last_name_arr.class.name == "String"
    last_name_arr = last_name_arr.split(" ")
  end
  return false if last_name_arr.empty?
  self.suffix = last_name_arr.pop if contains_suffix(last_name_arr)
  self.last_name = last_name_arr.join(" ").gsub(/[.,]+/, "")
end
name=(fullname) click to toggle source
# File lib/name_splitter.rb, line 25
def name=(fullname)
  name_arr = fullname.to_s.split(" ")
  return if name_arr.empty?

  if contains_suffix(name_arr)
    self.suffix = name_arr.pop
  end

  if name_arr.length == 1
    self.first_name = name_arr.shift
    return
  end

  if is_first_element_a_last_name(name_arr)
    self.last_name = name_arr.shift.gsub(",","")
  end

  self.salutation = name_arr.shift(number_of_salutations(name_arr)).join(" ")

  if name_arr.length == 1 && last_name.empty?
    self.last_name = name_arr.shift
  else
    self.first_name = name_arr.shift(number_of_first_names(name_arr)).join(" ")
    self.middle_name = name_arr.shift(number_of_middle_names(name_arr)).join(" ")
    self.last_name_check(name_arr)
  end
end

Private Instance Methods

anded_names?(_name) click to toggle source
# File lib/name_splitter.rb, line 112
def anded_names?(_name)
  contains_an_and(_name)
end
contains_an_and(*name_arr) click to toggle source
# File lib/name_splitter.rb, line 116
def contains_an_and(*name_arr)
  name_arr.flatten.select { |_name| ["and", "&"].include?(_name.to_s.strip) }.any?
end
contains_last_name_prefix(name_arr) click to toggle source
# File lib/name_splitter.rb, line 125
def contains_last_name_prefix(name_arr)
  last_name_prefix.collect { |x| x.upcase }.include?(name_arr.first.upcase)
end
contains_salutation(_name) click to toggle source
# File lib/name_splitter.rb, line 120
def contains_salutation(_name)
  return false unless _name
  salutations.collect { |x| x.upcase }.include?(_name.gsub(/[.,;']+/, "").upcase)
end
contains_suffix(name_arr) click to toggle source
# File lib/name_splitter.rb, line 129
def contains_suffix(name_arr)
  raise "contains_suffix must receive an array" if !name_arr.class.name == "Array"
  return false if name_arr.length == 1
  suffixes.collect { |x| x.upcase }.include?(name_arr.last.gsub(/[.,;']+/, "").upcase)
end
is_first_element_a_last_name(name_arr) click to toggle source
# File lib/name_splitter.rb, line 108
def is_first_element_a_last_name(name_arr)
  name_arr[0].strip.match(/,/)
end
is_second_first_name?(_name) click to toggle source
# File lib/name_splitter.rb, line 103
def is_second_first_name?(_name)
  return false unless _name
  second_first_names.collect { |x| x.upcase }.include?(_name.upcase)
end
number_of_anded_names_before_last_names_if_any(name_arr) click to toggle source
# File lib/name_splitter.rb, line 95
def number_of_anded_names_before_last_names_if_any(name_arr)
  return 1 unless contains_an_and(name_arr)
  first_name_length = name_arr.length - (last_name.empty? ? 1 : 0)
  first_name_length -= 1 if contains_suffix(name_arr)
  first_name_length -= 1 if contains_last_name_prefix(name_arr)
  first_name_length
end
number_of_first_names(name_arr) click to toggle source
# File lib/name_splitter.rb, line 90
def number_of_first_names(name_arr)
  return 2 if is_second_first_name?(name_arr[1])
  number_of_anded_names_before_last_names_if_any(name_arr)
end
number_of_middle_names(name_arr) click to toggle source
# File lib/name_splitter.rb, line 65
def number_of_middle_names(name_arr)
  # if the first and last names have already been assigned, assume the
  # rest of the name is a middle name
  if !first_name.empty? && !last_name.empty?
    return name_arr.length
  end

  #checks whether the array of names passed in contains a likely middle name
  if (name_arr.length == 2 &&
    !(contains_suffix(name_arr) || contains_last_name_prefix(name_arr))) ||
  (name_arr.length == 3 &&
    !(contains_suffix(name_arr) && contains_last_name_prefix(name_arr))) ||
  name_arr.length > 3
    return 1
  end

  return 0
end
number_of_salutations(name_arr) click to toggle source
# File lib/name_splitter.rb, line 84
def number_of_salutations(name_arr)
  return 3 if contains_salutation(name_arr[0]) & anded_names?(name_arr[1]) & contains_salutation(name_arr[2])
  return 1 if contains_salutation(name_arr[0])
  return 0
end
salutations() click to toggle source
# File lib/name_splitter.rb, line 143
def salutations
  %w{Mr Mrs Ms Miss Dr Prof Rev Capt Sister Honorable Judge Chief}
end
second_first_names() click to toggle source
# File lib/name_splitter.rb, line 147
def second_first_names
  %w{Beth Catherine Louise}
end