phony 1.9.0 → 2.19.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.textile +64 -112
- data/lib/phony/config.rb +91 -0
- data/lib/phony/countries/argentina.rb +355 -0
- data/lib/phony/countries/austria.rb +56 -22
- data/lib/phony/countries/bangladesh.rb +57 -0
- data/lib/phony/countries/belarus.rb +133 -0
- data/lib/phony/countries/brazil.rb +101 -95
- data/lib/phony/countries/cambodia.rb +131 -0
- data/lib/phony/countries/china.rb +13 -6
- data/lib/phony/countries/croatia.rb +23 -0
- data/lib/phony/countries/georgia.rb +94 -0
- data/lib/phony/countries/germany.rb +66 -42
- data/lib/phony/countries/guinea.rb +46 -0
- data/lib/phony/countries/india.rb +50 -0
- data/lib/phony/countries/indonesia.rb +55 -0
- data/lib/phony/countries/ireland.rb +35 -28
- data/lib/phony/countries/italy.rb +272 -166
- data/lib/phony/countries/japan.rb +468 -0
- data/lib/phony/countries/kyrgyzstan.rb +120 -0
- data/lib/phony/countries/latvia.rb +43 -0
- data/lib/phony/countries/libya.rb +116 -0
- data/lib/phony/countries/malaysia.rb +31 -7
- data/lib/phony/countries/moldova.rb +53 -0
- data/lib/phony/countries/montenegro.rb +30 -0
- data/lib/phony/countries/myanmar.rb +55 -0
- data/lib/phony/countries/namibia.rb +37 -0
- data/lib/phony/countries/nepal.rb +73 -0
- data/lib/phony/countries/netherlands.rb +17 -5
- data/lib/phony/countries/pakistan.rb +121 -0
- data/lib/phony/countries/paraguay.rb +147 -0
- data/lib/phony/countries/{russia_kazakhstan_abhasia_south_osetia.rb → russia_kazakhstan_abkhasia_south_ossetia.rb} +35 -24
- data/lib/phony/countries/saudi_arabia.rb +40 -0
- data/lib/phony/countries/serbia.rb +47 -0
- data/lib/phony/countries/somalia.rb +26 -0
- data/lib/phony/countries/south_korea.rb +19 -10
- data/lib/phony/countries/sweden.rb +58 -38
- data/lib/phony/countries/taiwan.rb +28 -0
- data/lib/phony/countries/tajikistan.rb +79 -0
- data/lib/phony/countries/turkmenistan.rb +76 -0
- data/lib/phony/countries/ukraine.rb +630 -0
- data/lib/phony/countries/united_kingdom.rb +639 -44
- data/lib/phony/countries/uruguay.rb +53 -0
- data/lib/phony/countries/vietnam.rb +133 -0
- data/lib/phony/countries/zimbabwe.rb +39 -0
- data/lib/phony/countries.rb +901 -301
- data/lib/phony/country.rb +177 -20
- data/lib/phony/country_codes.rb +119 -101
- data/lib/phony/dsl.rb +113 -68
- data/lib/phony/local_splitters/fixed.rb +25 -1
- data/lib/phony/local_splitters/regex.rb +16 -2
- data/lib/phony/national_code.rb +7 -7
- data/lib/phony/national_splitters/default.rb +35 -3
- data/lib/phony/national_splitters/dsl.rb +12 -7
- data/lib/phony/national_splitters/fixed.rb +7 -1
- data/lib/phony/national_splitters/none.rb +7 -3
- data/lib/phony/national_splitters/regex.rb +6 -0
- data/lib/phony/national_splitters/variable.rb +13 -9
- data/lib/phony/trunk_code.rb +57 -0
- data/lib/phony/vanity.rb +3 -3
- data/lib/phony.rb +239 -55
- data/spec/functional/config_spec.rb +44 -0
- data/spec/functional/plausibility_spec.rb +656 -0
- data/spec/lib/phony/countries_spec.rb +1207 -119
- data/spec/lib/phony/country_codes_spec.rb +99 -81
- data/spec/lib/phony/country_spec.rb +54 -14
- data/spec/lib/phony/dsl_spec.rb +2 -2
- data/spec/lib/phony/local_splitters/fixed_spec.rb +4 -4
- data/spec/lib/phony/local_splitters/regex_spec.rb +50 -2
- data/spec/lib/phony/national_code_spec.rb +34 -34
- data/spec/lib/phony/national_splitters/default_spec.rb +34 -0
- data/spec/lib/phony/national_splitters/fixed_spec.rb +12 -6
- data/spec/lib/phony/national_splitters/none_spec.rb +13 -3
- data/spec/lib/phony/national_splitters/regex_spec.rb +1 -1
- data/spec/lib/phony/national_splitters/variable_spec.rb +11 -5
- data/spec/lib/phony/trunk_code_spec.rb +85 -0
- data/spec/lib/phony/vanity_spec.rb +15 -19
- data/spec/lib/phony_spec.rb +59 -277
- metadata +67 -34
- data/lib/phony/validator.rb +0 -26
- data/lib/phony/validators.rb +0 -88
- data/spec/lib/phony/validations_spec.rb +0 -109
data/lib/phony/country.rb
CHANGED
@@ -1,51 +1,208 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Phony
|
2
|
-
|
4
|
+
|
3
5
|
#
|
4
6
|
#
|
5
7
|
class Country
|
6
8
|
|
7
9
|
attr_accessor :codes
|
8
|
-
|
9
|
-
|
10
|
+
|
11
|
+
@@international_absolute_format = '+%s%s%s%s%s'
|
12
|
+
@@international_relative_format = '00%s%s%s%s%s'
|
13
|
+
@@national_format = '%s%s%s%s'
|
14
|
+
|
15
|
+
@@default_space = ' '
|
16
|
+
@@default_local_space = ' '
|
17
|
+
@@default_parentheses = false
|
18
|
+
|
19
|
+
# TODO Doc.
|
10
20
|
#
|
11
21
|
def initialize *codes
|
12
22
|
@codes = codes
|
13
23
|
end
|
14
|
-
|
24
|
+
|
25
|
+
# DSL method.
|
26
|
+
#
|
15
27
|
# Chain two codes together.
|
16
28
|
#
|
17
|
-
def |
|
29
|
+
def | other
|
18
30
|
self.codes = self.codes + other.codes
|
19
31
|
self
|
20
32
|
end
|
21
|
-
|
33
|
+
|
34
|
+
# Options.
|
35
|
+
#
|
36
|
+
# TODO Rewrite.
|
37
|
+
#
|
38
|
+
def with cc, options = {}
|
39
|
+
@cc = cc
|
40
|
+
|
41
|
+
@invalid_ndcs = options[:invalid_ndcs]
|
42
|
+
|
43
|
+
@format = options[:format]
|
44
|
+
@space = options[:space]
|
45
|
+
@local_space = options[:local_space]
|
46
|
+
@parentheses = options[:parentheses]
|
47
|
+
end
|
48
|
+
|
22
49
|
# A number is split with the code handlers as given in the initializer.
|
23
50
|
#
|
24
51
|
# Note: If the ndc is nil, it will not return it.
|
25
52
|
#
|
53
|
+
# @return [Trunk, String (ndc), Array<String> (national pieces)]
|
54
|
+
#
|
26
55
|
def split national_number
|
27
|
-
|
28
|
-
|
29
|
-
|
56
|
+
_, trunk, ndc, *rest = internal_split national_number
|
57
|
+
[trunk, ndc, *rest]
|
58
|
+
end
|
59
|
+
#
|
60
|
+
#
|
61
|
+
# @return [Splitters::Local, Trunk, String (ndc), Array<String> (national pieces)]
|
62
|
+
#
|
63
|
+
def internal_split national_number
|
64
|
+
trunk = nil
|
65
|
+
@codes.each do |national_splitter|
|
66
|
+
new_trunk, ndc, *rest = national_splitter.split national_number
|
67
|
+
trunk ||= new_trunk
|
68
|
+
return [national_splitter.local_splitter, trunk, ndc, *rest] if rest && !rest.empty?
|
30
69
|
end
|
70
|
+
|
71
|
+
# Best effort.
|
72
|
+
[nil, trunk, national_number, []]
|
31
73
|
end
|
32
74
|
|
75
|
+
# Format the number, given the national part of it.
|
76
|
+
#
|
77
|
+
def format national_number, options = {}
|
78
|
+
type = options[:format] || @format
|
79
|
+
space = options[:spaces] || @space || @@default_space
|
80
|
+
local_space = options[:local_spaces] || @local_space || space || @@default_local_space
|
81
|
+
parentheses = options[:parentheses]
|
82
|
+
parentheses = @parentheses || @@default_parentheses if parentheses.nil?
|
83
|
+
use_trunk = options[:trunk]
|
84
|
+
|
85
|
+
trunk, ndc, *local_pieces = split national_number
|
86
|
+
|
87
|
+
local = format_local local_pieces, local_space
|
88
|
+
|
89
|
+
format_cc_ndc trunk, ndc, local, type, space, parentheses, use_trunk
|
90
|
+
end
|
91
|
+
def format_local local, local_space
|
92
|
+
if local.empty?
|
93
|
+
EMPTY_STRING
|
94
|
+
else
|
95
|
+
local.compact!
|
96
|
+
local.join local_space.to_s
|
97
|
+
end
|
98
|
+
end
|
99
|
+
def format_cc_ndc trunk, ndc, local, type, space, parentheses, use_trunk
|
100
|
+
# Note: We mark NDCs that are of type "none" with false (nil trips plausible?). This would result in false being printed.
|
101
|
+
# Therefore we set NDC to nil when formatting.
|
102
|
+
ndc = nil if ndc == false
|
103
|
+
case type
|
104
|
+
when String
|
105
|
+
trunk &&= trunk.format(space, use_trunk)
|
106
|
+
type % { :trunk => trunk, :cc => @cc, :ndc => ndc, :local => local }
|
107
|
+
when nil, :international_absolute, :international, :+
|
108
|
+
if ndc
|
109
|
+
format_with_ndc(@@international_absolute_format, @cc, format_ndc(ndc, parentheses), local, space)
|
110
|
+
else
|
111
|
+
format_without_ndc(@@international_absolute_format, @cc, local, space)
|
112
|
+
end
|
113
|
+
when :international_relative
|
114
|
+
if ndc
|
115
|
+
format_with_ndc(@@international_relative_format, @cc, format_ndc(ndc, parentheses), local, space)
|
116
|
+
else
|
117
|
+
format_without_ndc(@@international_relative_format, @cc, local, space)
|
118
|
+
end
|
119
|
+
when :national
|
120
|
+
trunk &&= trunk.format(space, use_trunk)
|
121
|
+
if ndc && !ndc.empty?
|
122
|
+
@@national_format % [trunk, format_ndc(ndc, parentheses), space, local]
|
123
|
+
else
|
124
|
+
@@national_format % [trunk, nil, nil, local]
|
125
|
+
end
|
126
|
+
when :local
|
127
|
+
local
|
128
|
+
end
|
129
|
+
end
|
130
|
+
def format_ndc ndc, parentheses
|
131
|
+
ndc = nil if ndc == false # TODO
|
132
|
+
parentheses ? "(#{ndc})" : ndc
|
133
|
+
end
|
134
|
+
def format_with_ndc format, cc, ndc, local, space
|
135
|
+
format % [cc, space, ndc, space, local]
|
136
|
+
end
|
137
|
+
def format_without_ndc format, cc, local, space
|
138
|
+
format % [cc, space, local, nil, nil]
|
139
|
+
end
|
140
|
+
|
141
|
+
# Cleans all non-numeric characters.
|
142
|
+
#
|
143
|
+
@@basic_cleaning_pattern = /\(0|\D/
|
144
|
+
# Clean number of all non-numeric characters and return a copy.
|
145
|
+
#
|
146
|
+
def clean number
|
147
|
+
clean! number && number.dup
|
148
|
+
end
|
149
|
+
# Clean number of all non-numeric characters and return it.
|
150
|
+
#
|
151
|
+
def clean! number
|
152
|
+
number.gsub!(@@basic_cleaning_pattern, EMPTY_STRING) || number
|
153
|
+
end
|
154
|
+
|
33
155
|
# Removes 0s from partially normalized numbers
|
34
156
|
# such as 410443643533.
|
35
|
-
#
|
157
|
+
#
|
36
158
|
# Example:
|
37
159
|
# 410443643533 -> 41443643533
|
38
160
|
#
|
39
161
|
# In some cases it doesn't, like Italy.
|
40
162
|
#
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
163
|
+
# Note: Options such as CC
|
164
|
+
#
|
165
|
+
def normalize national_number, options = {}
|
166
|
+
clean! national_number
|
167
|
+
normalized = @codes.reduce national_number do |number, code|
|
168
|
+
result = code.normalize number, options
|
169
|
+
break result if result
|
170
|
+
number
|
45
171
|
end
|
46
|
-
|
172
|
+
normalized
|
47
173
|
end
|
48
|
-
|
174
|
+
|
175
|
+
# Tests for plausibility of this national number.
|
176
|
+
#
|
177
|
+
def plausible? rest, hints = {}
|
178
|
+
local, _, ndc, *rest = internal_split rest
|
179
|
+
|
180
|
+
# Element based checking.
|
181
|
+
#
|
182
|
+
# Note: ndc == false means the country has none.
|
183
|
+
#
|
184
|
+
return false if ndc.nil?
|
185
|
+
return false if ndc && ndc.empty?
|
186
|
+
return false if @invalid_ndcs && @invalid_ndcs === ndc
|
187
|
+
|
188
|
+
# # A valid range for the rest is 0 or 3+ total digits.
|
189
|
+
# #
|
190
|
+
# return false if (1..2) === rest_size
|
191
|
+
|
192
|
+
# National destination code plausible?
|
193
|
+
#
|
194
|
+
ndc_needed = hints[:ndc]
|
195
|
+
return false if ndc_needed && !(ndc_needed === ndc)
|
196
|
+
|
197
|
+
# If there is no local part, we can assume it's not a plausible number.
|
198
|
+
# (Or, not defined correctly in Phony yet)
|
199
|
+
return false unless local
|
200
|
+
|
201
|
+
# Local code specific checks.
|
202
|
+
#
|
203
|
+
return local.plausible? rest, hints
|
204
|
+
end
|
205
|
+
|
49
206
|
# Is this national number a vanity number?
|
50
207
|
#
|
51
208
|
def vanity? national_number
|
@@ -54,10 +211,10 @@ module Phony
|
|
54
211
|
#
|
55
212
|
#
|
56
213
|
def vanity_to_number vanity_number
|
57
|
-
|
214
|
+
_, ndc, *rest = split vanity_number
|
58
215
|
"#{ndc}#{Vanity.replace(rest.join)}"
|
59
216
|
end
|
60
|
-
|
217
|
+
|
61
218
|
end
|
62
|
-
|
63
|
-
end
|
219
|
+
|
220
|
+
end
|
data/lib/phony/country_codes.rb
CHANGED
@@ -1,145 +1,163 @@
|
|
1
1
|
module Phony
|
2
2
|
|
3
|
-
EMPTY_STRING = ''
|
3
|
+
EMPTY_STRING = '' unless defined?(EMPTY_STRING)
|
4
4
|
|
5
5
|
# Handles determining the correct national code handler.
|
6
6
|
#
|
7
7
|
class CountryCodes
|
8
8
|
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :countries
|
10
10
|
attr_accessor :international_absolute_format, :international_relative_format, :national_format
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@
|
12
|
+
# Singleton instance.
|
13
|
+
#
|
14
|
+
def self.instance
|
15
|
+
@instance ||= new
|
16
|
+
end
|
17
|
+
|
18
|
+
# Add the given country to the mapping under the
|
19
|
+
# given country code.
|
20
|
+
#
|
21
|
+
def add country_code, country
|
22
|
+
country_code = country_code.to_s
|
23
|
+
optimized_country_code_access = country_code.size
|
16
24
|
|
17
|
-
@
|
18
|
-
@
|
25
|
+
@countries ||= {}
|
26
|
+
@countries[optimized_country_code_access] ||= {}
|
27
|
+
@countries[optimized_country_code_access][country_code] = country
|
19
28
|
end
|
20
29
|
|
21
|
-
|
22
|
-
|
30
|
+
# Get the Country object for the given CC.
|
31
|
+
#
|
32
|
+
def [] cc
|
33
|
+
countries[cc.size][cc]
|
23
34
|
end
|
24
35
|
|
25
|
-
|
36
|
+
# Clean number of all non-numeric characters, initial zeros or (0.
|
37
|
+
#
|
38
|
+
@@basic_cleaning_pattern = /\A00?|\(0|\D/
|
39
|
+
# Clean number of all non-numeric characters, initial zeros or (0 and return it.
|
40
|
+
#
|
26
41
|
def clean number
|
27
42
|
clean! number && number.dup
|
28
43
|
end
|
44
|
+
# Clean number of all non-numeric characters, initial zeros or (0 and return a copy.
|
45
|
+
#
|
29
46
|
def clean! number
|
30
|
-
|
31
|
-
#
|
32
|
-
number.gsub!(@@basic_normalizing_pattern, EMPTY_STRING) || number
|
47
|
+
number.gsub!(@@basic_cleaning_pattern, EMPTY_STRING) || number
|
33
48
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
49
|
+
|
50
|
+
# 00 for the standard international call prefix.
|
51
|
+
# http://en.wikipedia.org/wiki/List_of_international_call_prefixes
|
52
|
+
#
|
53
|
+
# We can't know from what country that person was calling, so we
|
54
|
+
# can't remove the intl' call prefix.
|
55
|
+
#
|
56
|
+
# We remove:
|
57
|
+
# * 0 or 00 at the very beginning.
|
58
|
+
# * (0) anywhere.
|
59
|
+
# * Non-digits.
|
60
|
+
#
|
61
|
+
def normalize number, options = {}
|
62
|
+
country = if cc = options[:cc]
|
63
|
+
self[cc]
|
64
|
+
else
|
65
|
+
clean! number
|
66
|
+
country, cc, number = partial_split number
|
67
|
+
country
|
68
|
+
end
|
69
|
+
number = country.normalize number, cc: cc
|
70
|
+
countrify! number, cc
|
38
71
|
end
|
39
72
|
|
40
73
|
# Splits this number into cc, ndc and locally split number parts.
|
41
74
|
#
|
42
75
|
def split number
|
43
|
-
|
44
|
-
|
76
|
+
# Split the number into country, cc, and national part.
|
77
|
+
country, cc, national_number = partial_split number
|
78
|
+
|
79
|
+
# Split the national number into ndc and local part.
|
80
|
+
_, ndc, *local = country.split national_number
|
81
|
+
|
82
|
+
[cc, ndc, *local]
|
45
83
|
end
|
46
84
|
|
47
|
-
|
48
|
-
format_cc_ndc_local options[:format], options[:spaces] || @default_space, *split(number)
|
49
|
-
end
|
50
|
-
# Formats country code and national destination code.
|
85
|
+
# Format the number.
|
51
86
|
#
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
cc_ndc = cc_ndc.slice 0...cc_ndc.rindex(space.to_s)
|
56
|
-
EMPTY_STRING
|
57
|
-
else
|
58
|
-
format_local(space, parts) unless parts.empty?
|
59
|
-
end
|
60
|
-
cc_ndc.empty?? local : "#{cc_ndc}#{space}#{local}"
|
61
|
-
end
|
62
|
-
#
|
63
|
-
# TODO This method needs an overhaul.
|
64
|
-
#
|
65
|
-
def format_cc_ndc format, space, cc, zero, ndc
|
66
|
-
case format
|
67
|
-
when nil, :international_absolute, :international, :+
|
68
|
-
ndc ?
|
69
|
-
@international_absolute_format % [cc, space, ndc] :
|
70
|
-
@international_absolute_format % [cc, nil, nil]
|
71
|
-
when :international_relative
|
72
|
-
ndc ?
|
73
|
-
@international_relative_format % [cc, space, ndc] :
|
74
|
-
@international_relative_format % [cc, nil, nil]
|
75
|
-
when :national
|
76
|
-
ndc && !ndc.empty? ?
|
77
|
-
@national_format % [zero, ndc] :
|
78
|
-
@national_format % [zero, nil]
|
79
|
-
when :local
|
80
|
-
EMPTY_STRING
|
81
|
-
end
|
82
|
-
end
|
83
|
-
def format_local space, parts_ary
|
84
|
-
parts_ary.compact!
|
85
|
-
parts_ary.join space.to_s
|
87
|
+
def format number, options = {}
|
88
|
+
country, _, national_number = partial_split number
|
89
|
+
country.format national_number, options
|
86
90
|
end
|
91
|
+
alias formatted format
|
87
92
|
|
93
|
+
# Is this number plausible?
|
88
94
|
#
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
95
|
+
def plausible? number, hints = {}
|
96
|
+
normalized = clean number
|
97
|
+
|
98
|
+
# False if it fails the basic check.
|
99
|
+
#
|
100
|
+
return false unless (4..16) === normalized.size # unless hints[:check_length] == false
|
101
|
+
|
102
|
+
country, cc, rest = partial_split normalized
|
103
|
+
|
104
|
+
# Country code plausible?
|
105
|
+
#
|
106
|
+
cc_needed = hints[:cc]
|
107
|
+
return false if cc_needed && !(cc_needed === cc)
|
102
108
|
|
109
|
+
# Country specific tests.
|
110
|
+
#
|
111
|
+
country.plausible? rest, hints
|
112
|
+
rescue StandardError
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
|
103
116
|
# Is the given number a vanity number?
|
104
117
|
#
|
105
118
|
def vanity? number
|
106
|
-
|
107
|
-
|
119
|
+
country, _, national = partial_split number
|
120
|
+
country.vanity? national
|
108
121
|
end
|
109
122
|
# Converts a vanity number into a normalized E164 number.
|
110
123
|
#
|
111
124
|
def vanity_to_number vanity_number
|
112
|
-
|
113
|
-
"#{cc}#{
|
125
|
+
country, cc, national = partial_split vanity_number
|
126
|
+
"#{cc}#{country.vanity_to_number(national)}"
|
114
127
|
end
|
115
128
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
129
|
+
private
|
130
|
+
|
131
|
+
# Return a country for the number.
|
132
|
+
#
|
133
|
+
def country_for number
|
134
|
+
country, _ = partial_split number
|
135
|
+
country
|
136
|
+
end
|
137
|
+
|
138
|
+
# Split off the country and the cc, and also return the national number part.
|
139
|
+
#
|
140
|
+
def partial_split number
|
141
|
+
cc = ''
|
142
|
+
1.upto(3) do |i|
|
143
|
+
cc << number.slice!(0..0)
|
144
|
+
country = countries[i][cc]
|
145
|
+
return [country, cc, number] if country
|
146
|
+
end
|
147
|
+
# This line is never reached as CCs are in prefix code.
|
148
|
+
end
|
149
|
+
|
150
|
+
# Adds the country code to the front
|
151
|
+
# if it does not already start with it.
|
152
|
+
#
|
153
|
+
# Note: This won't be correct in some cases, but it is the best we can do.
|
154
|
+
#
|
155
|
+
def countrify number, cc
|
156
|
+
countrify!(number, cc) || number
|
157
|
+
end
|
158
|
+
def countrify! number, cc
|
159
|
+
number.sub!(/\A/, cc) # @countrify_regex, @cc
|
122
160
|
end
|
123
|
-
# This line is never reached as CCs are in prefix code.
|
124
|
-
end
|
125
|
-
|
126
|
-
# # TODO
|
127
|
-
# #
|
128
|
-
# def self.with_cc cc
|
129
|
-
# mapping[cc.size][cc.to_s]
|
130
|
-
# end
|
131
|
-
|
132
|
-
# Add the given country to the mapping under the
|
133
|
-
# given country code.
|
134
|
-
#
|
135
|
-
def add country_code, country
|
136
|
-
country_code = country_code.to_s
|
137
|
-
optimized_country_code_access = country_code.size
|
138
|
-
|
139
|
-
@splitter_mapping ||= {}
|
140
|
-
@splitter_mapping[optimized_country_code_access] ||= {}
|
141
|
-
@splitter_mapping[optimized_country_code_access][country_code] = country
|
142
|
-
end
|
143
161
|
|
144
162
|
end
|
145
163
|
|