Class: Phonelib::Phone

Inherits:
Object
  • Object
show all
Includes:
PhoneAnalyzer, PhoneExtendedData, PhoneFormatter
Defined in:
lib/phonelib/phone.rb

Overview

class for parsed phone number, includes validation and formatting methods

Constant Summary

Constants included from PhoneExtendedData

Phonelib::PhoneExtendedData::EXT_KEYS

Constants included from PhoneAnalyzer

Phonelib::PhoneAnalyzer::NOT_FOR_CHECK

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from PhoneFormatter

#area_code, #country_code, #e164, #full_e164, #full_international, #full_national, #international, #method_missing, #national, #raw_national

Methods included from PhoneExtendedData

#carrier, #geo_name, #timezone, #valid_country_name

Methods included from PhoneAnalyzer

#analyze

Constructor Details

#initialize(phone, country = nil) ⇒ Phonelib::Phone

class initialization method

Parameters:

  • phone (String)

    Phone number for parsing

  • country (String|Symbol) (defaults to: nil)

    Country specification for parsing. Must be ISO code of country (2 letters) like ‘US’, ‘us’ or :us for United States



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/phonelib/phone.rb', line 25

def initialize(phone, country = nil)
  @original, @extension = separate_extension(phone.to_s)
  @extension.gsub!(/[^0-9]/, '') if @extension

  if sanitized.empty?
    @data = {}
  else
    @data = analyze(sanitized, passed_country(country))
    first = @data.values.first
    @national_number = first ? first[:national] : sanitized
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Phonelib::PhoneFormatter

Instance Attribute Details

#extensionString (readonly)

Returns phone extension passed for parsing after a number.

Returns:

  • (String)

    phone extension passed for parsing after a number



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

def extension
  @extension
end

#national_numberString (readonly)

Returns phone national number.

Returns:

  • (String)

    phone national number



12
13
14
# File 'lib/phonelib/phone.rb', line 12

def national_number
  @national_number
end

#originalString (readonly)

Returns original phone number passed for parsing.

Returns:

  • (String)

    original phone number passed for parsing



6
7
8
# File 'lib/phonelib/phone.rb', line 6

def original
  @original
end

Instance Method Details

#==(other) ⇒ Boolean

Compare a phone number against a string or other parsed number

Parameters:

Returns:

  • (Boolean)

    result of equality comparison



46
47
48
49
50
# File 'lib/phonelib/phone.rb', line 46

def ==(other)
  other = Phonelib.parse(other) unless other.is_a?(Phonelib::Phone)
  return (e164 == other.e164) if valid? && other.valid?
  original == other.original
end

#countriesArray

Returns all countries that matched valid patterns

Returns:

  • (Array)

    Possible ISO2 country codes array



93
94
95
# File 'lib/phonelib/phone.rb', line 93

def countries
  @data.map { |iso2, _data| iso2 }
end

#countryString

Returns first country that matched valid patterns

Returns:

  • (String)

    valid country ISO2 code or first matched country code



113
114
115
# File 'lib/phonelib/phone.rb', line 113

def country
  @country ||= valid_country || main_country(countries)
end

#human_typeString

Return human representation of phone type

Returns:

  • (String)

    Human readable valid phone type



87
88
89
# File 'lib/phonelib/phone.rb', line 87

def human_type
  Core::TYPES_DESC[type]
end

#human_typesArray

Returns human representation of all matched phone types

Returns:

  • (Array)

    Array of human readable valid phone types



81
82
83
# File 'lib/phonelib/phone.rb', line 81

def human_types
  types.map { |type| Core::TYPES_DESC[type] }
end

#impossible?Boolean

Returns whether a current parsed phone number is impossible

Returns:

  • (Boolean)

    parsed phone is impossible



137
138
139
# File 'lib/phonelib/phone.rb', line 137

def impossible?
  !possible?
end

#invalid?Boolean

Returns whether a current parsed phone number is invalid

Returns:

  • (Boolean)

    parsed phone is invalid



125
126
127
# File 'lib/phonelib/phone.rb', line 125

def invalid?
  !valid?
end

#invalid_for_country?(country) ⇒ Boolean

Returns whether a current parsed phone number is invalid for specified country

Parameters:

  • country (String|Symbol)

    ISO code of country (2 letters) like ‘US’, ‘us’ or :us for United States

Returns:

  • (Boolean)

    parsed phone number is invalid



173
174
175
# File 'lib/phonelib/phone.rb', line 173

def invalid_for_country?(country)
  !valid_for_country?(country)
end

#local_numberString

returns local number

Returns:

  • (String)

    local number



143
144
145
146
147
148
149
150
151
152
153
# File 'lib/phonelib/phone.rb', line 143

def local_number
  return national unless possible?
  format_match, format_string = formatting_data

  if format_string =~ /^.*[0-9]+.*\$1/ && format_match
    format_string.gsub(/^.*\$2/, '$2')
      .gsub(/\$\d/) { |el| format_match[el[1].to_i] }
  else
    national
  end
end

#possible?Boolean

Returns whether a current parsed phone number is possible

Returns:

  • (Boolean)

    parsed phone is possible



131
132
133
# File 'lib/phonelib/phone.rb', line 131

def possible?
  @possible ||= @data.select { |_iso2, data| data[:possible].any? }.any?
end

#possible_typesArray

Returns all possible types that matched possible patterns

Returns:

  • (Array)

    all possible phone types



69
70
71
# File 'lib/phonelib/phone.rb', line 69

def possible_types
  @possible_types ||= @data.flat_map { |_iso2, data| data[:possible] }.uniq
end

#sanitizedString

method to get sanitized phone number (only numbers)

Returns:

  • (String)

    Sanitized phone number



54
55
56
57
58
59
# File 'lib/phonelib/phone.rb', line 54

def sanitized
  @sanitized ||=
      vanity_converted(@original).gsub(
          Phonelib.strict_check ? cr('^\+') : cr(Phonelib.sanitize_regex),
          '')
end

#to_sObject

method returns string representation of parsed phone



39
40
41
# File 'lib/phonelib/phone.rb', line 39

def to_s
  valid? ? e164 : original
end

#typeSymbol

Returns first phone type that matched

Returns:

  • (Symbol)

    valid phone type



75
76
77
# File 'lib/phonelib/phone.rb', line 75

def type
  types.first
end

#typesArray

Returns all phone types that matched valid patterns

Returns:

  • (Array)

    all valid phone types



63
64
65
# File 'lib/phonelib/phone.rb', line 63

def types
  @types ||= @data.flat_map { |_iso2, data| data[:valid] }.uniq
end

#valid?Boolean

Returns whether a current parsed phone number is valid

Returns:

  • (Boolean)

    parsed phone is valid



119
120
121
# File 'lib/phonelib/phone.rb', line 119

def valid?
  @valid ||= @data.select { |_iso2, data| data[:valid].any? }.any?
end

#valid_countriesArray

Return countries with valid patterns

Returns:

  • (Array)

    Valid ISO2 country codes array



99
100
101
102
103
# File 'lib/phonelib/phone.rb', line 99

def valid_countries
  @valid_countries ||= countries.select do |iso2|
    @data[iso2][:valid].any?
  end
end

#valid_countryString

Return valid country

Returns:

  • (String)

    valid ISO2 country code



107
108
109
# File 'lib/phonelib/phone.rb', line 107

def valid_country
  @valid_country ||= main_country(valid_countries)
end

#valid_for_country?(country) ⇒ Boolean

Returns whether a current parsed phone number is valid for specified country

Parameters:

  • country (String|Symbol)

    ISO code of country (2 letters) like ‘US’, ‘us’ or :us for United States

Returns:

  • (Boolean)

    parsed phone number is valid



160
161
162
163
164
165
166
# File 'lib/phonelib/phone.rb', line 160

def valid_for_country?(country)
  country = country.to_s.upcase
  tdata = analyze(sanitized, passed_country(country))
  tdata.find do |iso2, data|
    country == iso2 && data[:valid].any?
  end.is_a? Array
end