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



27
28
29
30
31
32
33
34
35
36
37
38
# 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))
    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



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



48
49
50
51
52
# File 'lib/phonelib/phone.rb', line 48

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



95
96
97
# File 'lib/phonelib/phone.rb', line 95

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



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

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

#human_typeString

Return human representation of phone type

Returns:

  • (String)

    Human readable valid phone type



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

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



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

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



139
140
141
# File 'lib/phonelib/phone.rb', line 139

def impossible?
  !possible?
end

#invalid?Boolean

Returns whether a current parsed phone number is invalid

Returns:

  • (Boolean)

    parsed phone is invalid



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

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



175
176
177
# File 'lib/phonelib/phone.rb', line 175

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

#local_numberString

returns local number

Returns:

  • (String)

    local number



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

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



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

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



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

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



56
57
58
59
60
61
# File 'lib/phonelib/phone.rb', line 56

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



41
42
43
# File 'lib/phonelib/phone.rb', line 41

def to_s
  valid? ? e164 : original
end

#typeSymbol

Returns first phone type that matched

Returns:

  • (Symbol)

    valid phone type



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

def type
  types.first
end

#typesArray

Returns all phone types that matched valid patterns

Returns:

  • (Array)

    all valid phone types



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

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



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

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



101
102
103
104
105
# File 'lib/phonelib/phone.rb', line 101

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



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

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



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

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