Class: Phony::CountryCodes

Inherits:
Object
  • Object
show all
Defined in:
lib/phony/country_codes.rb

Overview

Handles determining the correct national code handler.

Constant Summary collapse

@@basic_cleaning_pattern =

Clean number of all non-numeric characters, initial zeros or (0.

/\A00?|\(0|\D/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#countriesObject (readonly)

Returns the value of attribute countries.



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

def countries
  @countries
end

#international_absolute_formatObject

Returns the value of attribute international_absolute_format.



10
11
12
# File 'lib/phony/country_codes.rb', line 10

def international_absolute_format
  @international_absolute_format
end

#international_relative_formatObject

Returns the value of attribute international_relative_format.



10
11
12
# File 'lib/phony/country_codes.rb', line 10

def international_relative_format
  @international_relative_format
end

#national_formatObject

Returns the value of attribute national_format.



10
11
12
# File 'lib/phony/country_codes.rb', line 10

def national_format
  @national_format
end

Class Method Details

.instanceObject

Singleton instance.



14
15
16
# File 'lib/phony/country_codes.rb', line 14

def self.instance
  @instance ||= new
end

Instance Method Details

#[](cc) ⇒ Object

Get the Country object for the given CC.



32
33
34
# File 'lib/phony/country_codes.rb', line 32

def [](cc)
  countries[cc.size][cc]
end

#add(country_code, country) ⇒ Object

Add the given country to the mapping under the given country code.



21
22
23
24
25
26
27
28
# File 'lib/phony/country_codes.rb', line 21

def add(country_code, country)
  country_code = country_code.to_s
  optimized_country_code_access = country_code.size

  @countries ||= {}
  @countries[optimized_country_code_access] ||= {}
  @countries[optimized_country_code_access][country_code] = country
end

#clean(number) ⇒ Object

Clean number of all non-numeric characters, initial zeros or (0 and return it.



41
42
43
# File 'lib/phony/country_codes.rb', line 41

def clean(number)
  clean! number && number.dup
end

#clean!(number) ⇒ Object

Clean number of all non-numeric characters, initial zeros or (0 and return a copy.



47
48
49
# File 'lib/phony/country_codes.rb', line 47

def clean!(number)
  number.gsub!(@@basic_cleaning_pattern, EMPTY_STRING) || number
end

#format(number, options = {}) ⇒ Object Also known as: formatted

Format the number.



88
89
90
91
# File 'lib/phony/country_codes.rb', line 88

def format(number, options = {})
  country, _, national_number = partial_split number
  country.format national_number, options
end

#normalize(number, options = {}) ⇒ Object

00 for the standard international call prefix. en.wikipedia.org/wiki/List_of_international_call_prefixes

We can’t know from what country that person was calling, so we can’t remove the intl’ call prefix.

We remove:

* 0 or 00 at the very beginning.
* (0) anywhere.
* Non-digits.


62
63
64
65
66
67
68
69
70
71
72
# File 'lib/phony/country_codes.rb', line 62

def normalize(number, options = {})
  country = if (cc = options[:cc])
              self[cc]
            else
              clean! number
              country, cc, number = partial_split number
              country
            end
  number = country.normalize number, cc: cc
  countrify! number, cc
end

#plausible?(number, hints = {}) ⇒ Boolean

Is this number plausible?

Returns:

  • (Boolean)


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/phony/country_codes.rb', line 96

def plausible?(number, hints = {})
  # Fail if it contains too many of certain phone specific markers:
  #   * more than 1 +
  #
  return false if number.count('+') > 1

  normalized = clean number

  # False if it fails the basic check.
  #
  return false unless (4..16).include?(normalized.size) # unless hints[:check_length] == false

  country, cc, rest = partial_split normalized

  # Was a country calling code given?
  #
  if (ccc = hints[:ccc])
    cc, ndc, *local = split ccc

    raise ArgumentError.new("The provided ccc option is too long and includes more than a cc ('#{cc}') and ndc ('#{ndc}'). It also includes '#{local.join}'.") unless local.size == 1 && local[0].empty?

    hints[:cc] = cc
    hints[:ndc] = ndc
  end

  # Country code plausible?
  #
  cc_needed = hints[:cc]
  return false if cc_needed && !(cc_needed === cc)

  # Country specific tests.
  #
  country.plausible? rest, hints
rescue ArgumentError
  raise
rescue StandardError
  false
end

#split(number) ⇒ Object

Splits this number into cc, ndc and locally split number parts.



76
77
78
79
80
81
82
83
84
# File 'lib/phony/country_codes.rb', line 76

def split(number)
  # Split the number into country, cc, and national part.
  country, cc, national_number = partial_split number

  # Split the national number into ndc and local part.
  _, ndc, *local = country.split national_number

  [cc, ndc, *local]
end

#vanity?(number) ⇒ Boolean

Is the given number a vanity number?

Returns:

  • (Boolean)


137
138
139
140
# File 'lib/phony/country_codes.rb', line 137

def vanity?(number)
  country, _, national = partial_split number
  country.vanity? national
end

#vanity_to_number(vanity_number) ⇒ Object

Converts a vanity number into a normalized E164 number.



144
145
146
147
# File 'lib/phony/country_codes.rb', line 144

def vanity_to_number(vanity_number)
  country, cc, national = partial_split vanity_number
  "#{cc}#{country.vanity_to_number(national)}"
end