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



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/phonelib/phone.rb', line 22

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

#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



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

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



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

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



110
111
112
# File 'lib/phonelib/phone.rb', line 110

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

#human_typeString

Return human representation of phone type

Returns:

  • (String)

    Human readable valid phone type



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

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



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

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



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

def impossible?
  !possible?
end

#invalid?Boolean

Returns whether a current parsed phone number is invalid

Returns:

  • (Boolean)

    parsed phone is invalid



122
123
124
# File 'lib/phonelib/phone.rb', line 122

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



170
171
172
# File 'lib/phonelib/phone.rb', line 170

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

#local_numberString

returns local number

Returns:

  • (String)

    local number



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/phonelib/phone.rb', line 140

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



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

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



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

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



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

def sanitized
  @sanitized ||=
      vanity_converted(@original).gsub(
          Phonelib.strict_check ? cr('^\+') : cr('[^0-9]+'),
          '')
end

#to_sObject

method returns string representation of parsed phone



36
37
38
# File 'lib/phonelib/phone.rb', line 36

def to_s
  valid? ? e164 : original
end

#typeSymbol

Returns first phone type that matched

Returns:

  • (Symbol)

    valid phone type



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

def type
  types.first
end

#typesArray

Returns all phone types that matched valid patterns

Returns:

  • (Array)

    all valid phone types



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

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



116
117
118
# File 'lib/phonelib/phone.rb', line 116

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



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

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



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

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



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

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