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, #timezones, #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



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/phonelib/phone.rb', line 27

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

  if sanitized.empty?
    @data = {}
  else
    @data = analyze(sanitized, passed_country(country))
    # the national number must come from the country #country reports:
    # another entry can be a possible-only match, and mixing entries makes
    # e164 splice one country's code onto another's number (issue #355)
    @national_number = country_data ? country_data[: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



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

def extension
  @extension
end

#national_numberString (readonly)

Returns phone national number.

Returns:

  • (String)

    phone national number



14
15
16
# File 'lib/phonelib/phone.rb', line 14

def national_number
  @national_number
end

#originalString (readonly)

Returns original phone number passed for parsing.

Returns:

  • (String)

    original phone number passed for parsing



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

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



50
51
52
53
54
# File 'lib/phonelib/phone.rb', line 50

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



97
98
99
# File 'lib/phonelib/phone.rb', line 97

def countries
  @countries ||= @data.keys
end

#countryString

Returns first country that matched valid patterns

Returns:

  • (String)

    valid country ISO2 code or first matched country code



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

def country
  return @country if defined?(@country)

  @country = valid_country || main_country(countries)
end

#human_typeString

Return human representation of phone type

Returns:

  • (String)

    Human readable valid phone type



91
92
93
# File 'lib/phonelib/phone.rb', line 91

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



85
86
87
# File 'lib/phonelib/phone.rb', line 85

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



149
150
151
# File 'lib/phonelib/phone.rb', line 149

def impossible?
  !possible?
end

#invalid?Boolean

Returns whether a current parsed phone number is invalid

Returns:

  • (Boolean)

    parsed phone is invalid



135
136
137
# File 'lib/phonelib/phone.rb', line 135

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



185
186
187
# File 'lib/phonelib/phone.rb', line 185

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

#local_numberString

returns local number

Returns:

  • (String)

    local number



155
156
157
158
159
160
161
162
163
164
165
# File 'lib/phonelib/phone.rb', line 155

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



141
142
143
144
145
# File 'lib/phonelib/phone.rb', line 141

def possible?
  return @possible if defined?(@possible)

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

#possible_typesArray

Returns all possible types that matched possible patterns

Returns:

  • (Array)

    all possible phone types



73
74
75
# File 'lib/phonelib/phone.rb', line 73

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



58
59
60
61
62
63
# File 'lib/phonelib/phone.rb', line 58

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



43
44
45
# File 'lib/phonelib/phone.rb', line 43

def to_s
  valid? ? e164 : original
end

#typeSymbol

Returns first phone type that matched

Returns:

  • (Symbol)

    valid phone type



79
80
81
# File 'lib/phonelib/phone.rb', line 79

def type
  types.first
end

#typesArray

Returns all phone types that matched valid patterns

Returns:

  • (Array)

    all valid phone types



67
68
69
# File 'lib/phonelib/phone.rb', line 67

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



127
128
129
130
131
# File 'lib/phonelib/phone.rb', line 127

def valid?
  return @valid if defined?(@valid)

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

#valid_countriesArray

Return countries with valid patterns

Returns:

  • (Array)

    Valid ISO2 country codes array



103
104
105
106
107
# File 'lib/phonelib/phone.rb', line 103

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



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

def valid_country
  return @valid_country if defined?(@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



172
173
174
175
176
177
178
# File 'lib/phonelib/phone.rb', line 172

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