Module: ParseNameFromEmail

Defined in:
lib/parse_name_from_email.rb,
lib/parse_name_from_email/batch.rb,
lib/parse_name_from_email/version.rb,
lib/parse_name_from_email/configuration.rb

Defined Under Namespace

Classes: Batch, Configuration

Constant Summary collapse

VERSION =
'1.0.4'.freeze

Class Method Summary collapse

Class Method Details

.configurationObject



9
10
11
# File 'lib/parse_name_from_email.rb', line 9

def configuration
  @configuration ||= Configuration.new
end

.configure {|configuration| ... } ⇒ Object

Yields:



17
18
19
# File 'lib/parse_name_from_email.rb', line 17

def configure
  yield(configuration)
end

.get_email_address(email) ⇒ Object

is rfc format? if true, return me only the email address



75
76
77
78
79
80
# File 'lib/parse_name_from_email.rb', line 75

def get_email_address(email)
  if valid_rfc_format?(email)
    email = email.split(/\</).last.to_s.delete('>')
  end
  email.strip
end

.get_email_name(email) ⇒ Object

split email by ‘@’ and get only email name



70
71
72
# File 'lib/parse_name_from_email.rb', line 70

def get_email_name(email)
  email.split('@').first
end

.get_name_if_rfc_format_of_email(email) ⇒ Object

if is rfc format of email, returns only name



83
84
85
86
# File 'lib/parse_name_from_email.rb', line 83

def get_name_if_rfc_format_of_email(email)
  name = email.split(/\</).first.to_s.strip if valid_rfc_format?(email)
  name
end

.make_human_readable(array) ⇒ Object

after regex join it with blank space and upcase first letters



99
100
101
102
# File 'lib/parse_name_from_email.rb', line 99

def make_human_readable(array)
  humanized_elements = array.map { |el| el.strip.humanize }
  humanized_elements.reject(&:empty?).reject{ |str| str =~ /\d/ }.join(' ')
end

.parse_emails_with_names_from(string_with_emails) ⇒ Object

parses string of multiple emails to hash of emails and generated names



22
23
24
25
26
27
# File 'lib/parse_name_from_email.rb', line 22

def parse_emails_with_names_from(string_with_emails)
  emails = Batch.split_emails_to_array(string_with_emails)
  result = {}
  emails.each { |email| result[get_email_address(email)] = parse_name_from(email) }
  result
end

.parse_name_from(email) ⇒ Object

main logic of parsing one email address



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/parse_name_from_email.rb', line 38

def parse_name_from(email)
  # if emails is in RFC format, return the name if not blank
  name_from_rfc = get_name_if_rfc_format_of_email(email)
  return name_from_rfc unless name_from_rfc.blank?

  # get part before '@'
  email_name = get_email_name(email)

  splitted_by_plus = split_plus_part(email_name) # get part before and after plus part

  # if friendly plus part, make result more readable
  if splitted_by_plus.size >= 2
    email_name = splitted_by_plus[0...-1].join(' ') # reject part after plus and overwrite it joined to string
    if configuration.friendly_plus_part
      plus_part = splitted_by_plus.last # last part is after plus and it should be gmail nickname
    end
  end

  splitted_email = split_to_words(email_name) # split email name by regex

  name = make_human_readable(splitted_email) # join email name with space

  # add part after plus
  if configuration.friendly_plus_part && !plus_part.blank?
    name += ' ' unless name.blank?
    name += "(#{plus_part})" unless plus_part.blank?
  end

  name # return result
end

.parse_names_from(string_with_emails) ⇒ Object

parses string of multiple emails to array of names



30
31
32
33
34
35
# File 'lib/parse_name_from_email.rb', line 30

def parse_names_from(string_with_emails)
  emails = Batch.split_emails_to_array(string_with_emails)
  result = []
  emails.each { |email| result << parse_name_from(email) }
  result
end

.resetObject



13
14
15
# File 'lib/parse_name_from_email.rb', line 13

def reset
  @configuration = Configuration.new
end

.split_plus_part(email) ⇒ Object

split email plus part



89
90
91
# File 'lib/parse_name_from_email.rb', line 89

def split_plus_part(email)
  email.split('+')
end

.split_to_words(email_name) ⇒ Object

split email by regex



94
95
96
# File 'lib/parse_name_from_email.rb', line 94

def split_to_words(email_name)
  email_name.split(configuration.regexp)
end

.valid_rfc_format?(email) ⇒ Boolean

match regexp if is valid rfc format

Returns:

  • (Boolean)


105
106
107
108
# File 'lib/parse_name_from_email.rb', line 105

def valid_rfc_format?(email)
  match = (email =~ Configuration.regex_for_validation_format_as_rfc)
  match.present?
end