phoney 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +0 -1
- data/lib/phoney/base.rb +5 -3
- data/lib/phoney/parser.rb +23 -3
- data/lib/phoney/utils.rb +1 -1
- data/lib/phoney/version.rb +2 -2
- data/phoney.gemspec +1 -1
- data/spec/phone_number_spec.rb +23 -204
- metadata +1 -1
data/README.rdoc
CHANGED
data/lib/phoney/base.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class PhoneNumber
|
2
|
-
attr_accessor :country_code, :area_code, :number
|
2
|
+
attr_accessor :country_code, :prefix_code, :area_code, :number
|
3
3
|
|
4
4
|
class << self
|
5
5
|
def default_region
|
@@ -44,10 +44,12 @@ class PhoneNumber
|
|
44
44
|
end
|
45
45
|
|
46
46
|
self.number = params[:number].to_s
|
47
|
+
# The rare case when some digits are in front of the area code
|
48
|
+
self.prefix_code = params[:prefix_code].to_s
|
47
49
|
# Can be empty, because some special numbers just don't have an area code (e.g. 911)
|
48
50
|
self.area_code = params[:area_code].to_s || self.class.default_area_code
|
49
51
|
self.country_code = params[:country_code].to_s || country_code || self.class.default_country_code
|
50
|
-
|
52
|
+
|
51
53
|
raise "Must enter number" if(self.number.nil? || self.number.empty?)
|
52
54
|
raise "Must enter country code or set default country code" if(self.country_code.nil? || self.country_code.empty?)
|
53
55
|
end
|
@@ -74,7 +76,7 @@ class PhoneNumber
|
|
74
76
|
if fmt.is_a?(Symbol)
|
75
77
|
case fmt
|
76
78
|
when :default
|
77
|
-
Parser::parse("+#{country_code} #{area_code} #{number}", country_code)
|
79
|
+
Parser::parse("+#{country_code} #{prefix_code}#{area_code} #{number}", country_code)
|
78
80
|
when :national
|
79
81
|
Parser::parse("#{area_code} #{number}", country_code)
|
80
82
|
when :local
|
data/lib/phoney/parser.rb
CHANGED
@@ -20,6 +20,7 @@ class PhoneNumber
|
|
20
20
|
|
21
21
|
region = Region.find(region_code) || PhoneNumber.default_region
|
22
22
|
country_code = region.country_code.to_s
|
23
|
+
prefix_code = nil
|
23
24
|
area_code = nil
|
24
25
|
|
25
26
|
dialout_prefix = get_dialout_prefix(phone_number, region)
|
@@ -69,6 +70,9 @@ class PhoneNumber
|
|
69
70
|
|
70
71
|
# now that know how to format the number, do the formatting work...
|
71
72
|
if(matching_rule)
|
73
|
+
if(matching_rule[:areacode_offset] > 0)
|
74
|
+
prefix_code = phone_number[0, matching_rule[:areacode_offset]]
|
75
|
+
end
|
72
76
|
area_code = phone_number[matching_rule[:areacode_offset], matching_rule[:areacode_length]]
|
73
77
|
number = phone_number[matching_rule[:areacode_offset]+matching_rule[:areacode_length]..-1]
|
74
78
|
phone_number = format(phone_number, matching_rule[:format].to_s)
|
@@ -115,10 +119,16 @@ class PhoneNumber
|
|
115
119
|
number.gsub!(/[^0-9]/,'') if number
|
116
120
|
|
117
121
|
# Finally...we can output our parts as a hash
|
118
|
-
{ :formatted_number => phone_number,
|
122
|
+
{ :formatted_number => phone_number,
|
123
|
+
:prefix_code => prefix_code,
|
124
|
+
:area_code => area_code,
|
125
|
+
:country_code => country_code,
|
126
|
+
:number => number }
|
119
127
|
end
|
120
128
|
|
121
|
-
|
129
|
+
private
|
130
|
+
# Returns the rule sets that we need to check for a given number and region.
|
131
|
+
# The rule_sets are filtered by the length of the number!
|
122
132
|
def get_rule_sets_for_region(string, region)
|
123
133
|
rule_sets = []
|
124
134
|
|
@@ -131,6 +141,8 @@ class PhoneNumber
|
|
131
141
|
rule_sets
|
132
142
|
end
|
133
143
|
|
144
|
+
# Given any number, find the rule in rule_sets that applies.
|
145
|
+
# Returns nil if no matching rule was found!
|
134
146
|
def find_matching_rule(number, rule_sets)
|
135
147
|
return nil if !number.match(/\A[0-9]+\Z/)
|
136
148
|
match = nil
|
@@ -154,11 +166,14 @@ class PhoneNumber
|
|
154
166
|
match
|
155
167
|
end
|
156
168
|
|
169
|
+
# According to the region, is this number input trying to dial out?
|
157
170
|
def dialing_out?(string, region=nil)
|
158
171
|
region ||= PhoneNumber.default_region
|
159
172
|
!get_dialout_prefix(string, region).empty?
|
160
173
|
end
|
161
|
-
|
174
|
+
|
175
|
+
# Get the dialout prefix from the given string.
|
176
|
+
# Returns an empty string if no dialout prefix was found.
|
162
177
|
def get_dialout_prefix(string, region=nil)
|
163
178
|
region ||= PhoneNumber.default_region
|
164
179
|
prefixes = region.dialout_prefixes
|
@@ -189,6 +204,8 @@ class PhoneNumber
|
|
189
204
|
dialout_prefix
|
190
205
|
end
|
191
206
|
|
207
|
+
# Get the national prefix from the given string.
|
208
|
+
# Returns an empty string if no national prefix was found.
|
192
209
|
def get_national_prefix(string, region=nil)
|
193
210
|
region ||= PhoneNumber.default_region
|
194
211
|
prefix = region.national_prefix
|
@@ -202,6 +219,9 @@ class PhoneNumber
|
|
202
219
|
national_prefix
|
203
220
|
end
|
204
221
|
|
222
|
+
# Get the dialout region by looking at the string.
|
223
|
+
# Returns a Region object if we're dialing outside a region that is supported.
|
224
|
+
# Otherwise returns nil.
|
205
225
|
def get_dialout_region(string, region)
|
206
226
|
region ||= PhoneNumber.default_region
|
207
227
|
dialout_prefix = get_dialout_prefix(string, region)
|
data/lib/phoney/utils.rb
CHANGED
@@ -44,7 +44,7 @@ class PhoneNumber
|
|
44
44
|
# Strips all non-numberpad characters from a string
|
45
45
|
# => For example: "+45 (123) 023 1.1.1" -> "+45123023111"
|
46
46
|
def normalize(string_with_number)
|
47
|
-
string_with_number.
|
47
|
+
string_with_number.gsub(/[^0-9+*#]/,'') unless string_with_number.nil?
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
data/lib/phoney/version.rb
CHANGED
data/phoney.gemspec
CHANGED
data/spec/phone_number_spec.rb
CHANGED
@@ -12,210 +12,29 @@ describe PhoneNumber do
|
|
12
12
|
pn.to_s.should == "+1 (704) 123-4567"
|
13
13
|
end
|
14
14
|
|
15
|
+
it "should extract the country, area, and number correctly" do
|
16
|
+
pn = PhoneNumber.new '7041234567'
|
17
|
+
|
18
|
+
pn.country_code.should == "1"
|
19
|
+
pn.area_code.should == "704"
|
20
|
+
pn.number.should == "1234567"
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
|
-
|
18
|
-
|
24
|
+
describe "using a number that has a prefix_code before the area code" do
|
25
|
+
before(:each) do
|
26
|
+
@pn = PhoneNumber.new("+55 12 34 5678-9012")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should have the correct prefix/area code assigned" do
|
30
|
+
@pn.prefix_code.should == "12"
|
31
|
+
@pn.area_code.should == "34"
|
32
|
+
@pn.number == "56789012"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should output the correct canonical format" do
|
36
|
+
@pn.to_s.should == "+55 (12 34) 5678-9012"
|
37
|
+
end
|
38
|
+
end
|
19
39
|
|
20
|
-
|
21
|
-
# PhoneNumber.default_country_code = nil
|
22
|
-
#
|
23
|
-
# assert_raise RuntimeError do
|
24
|
-
# pn = PhoneNumber.new '5125486', '91'
|
25
|
-
# end
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# def test_number_without_country_and_area_code_initialize
|
29
|
-
# PhoneNumber.default_country_code = nil
|
30
|
-
# PhoneNumber.default_area_code = nil
|
31
|
-
#
|
32
|
-
# assert_raise RuntimeError do
|
33
|
-
# pn = PhoneNumber.new '451588'
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# def test_number_with_default_area_code_initialize
|
38
|
-
# PhoneNumber.default_country_code = '385'
|
39
|
-
# PhoneNumber.default_area_code = '47'
|
40
|
-
#
|
41
|
-
# pn = PhoneNumber.new '451588'
|
42
|
-
# assert pn.number == '451588'
|
43
|
-
# assert pn.area_code == '47'
|
44
|
-
# assert pn.country_code == '385'
|
45
|
-
# end
|
46
|
-
#
|
47
|
-
# def test_number_with_default_country_code_initialize
|
48
|
-
# PhoneNumber.default_country_code = '386'
|
49
|
-
#
|
50
|
-
# pn = PhoneNumber.new '5125486', '91'
|
51
|
-
# assert pn.number == '5125486'
|
52
|
-
# assert pn.area_code == '91'
|
53
|
-
# assert pn.country_code == '386'
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# def test_number_with_country_code_initialize
|
57
|
-
# PhoneNumber.default_country_code = '387'
|
58
|
-
#
|
59
|
-
# pn = PhoneNumber.new '5125486', '91', '385'
|
60
|
-
# assert pn.number == '5125486'
|
61
|
-
# assert pn.area_code == '91'
|
62
|
-
# assert pn.country_code == '385'
|
63
|
-
# end
|
64
|
-
#
|
65
|
-
# def test_parse_empty
|
66
|
-
# assert_equal PhoneNumber.parse(''), nil
|
67
|
-
# assert_equal PhoneNumber.parse(nil), nil
|
68
|
-
# end
|
69
|
-
#
|
70
|
-
# def test_parse_long_without_special_characters
|
71
|
-
# pn = PhoneNumber.parse "+385915125486"
|
72
|
-
#
|
73
|
-
# assert_equal pn.number, '5125486'
|
74
|
-
# assert_equal pn.area_code, '91'
|
75
|
-
# assert_equal pn.country_code, '385'
|
76
|
-
# end
|
77
|
-
#
|
78
|
-
# def test_parse_zagreb_long_without_special_characters
|
79
|
-
# pn = PhoneNumber.parse "+38513668734"
|
80
|
-
#
|
81
|
-
# assert_equal pn.number, '3668734'
|
82
|
-
# assert_equal pn.area_code, '1'
|
83
|
-
# assert_equal pn.country_code, '385'
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# def test_parse_long_with_special_characters
|
87
|
-
# pn = PhoneNumber.parse "+ 385 (91) 512 / 5486 "
|
88
|
-
#
|
89
|
-
# assert pn.number == '5125486'
|
90
|
-
# assert pn.area_code == '91'
|
91
|
-
# assert pn.country_code == '385'
|
92
|
-
# end
|
93
|
-
#
|
94
|
-
# def test_parse_long_with_leading_zeros
|
95
|
-
# pn = PhoneNumber.parse "00385915125486"
|
96
|
-
#
|
97
|
-
# assert pn.number == '5125486'
|
98
|
-
# assert pn.area_code == '91'
|
99
|
-
# assert pn.country_code == '385'
|
100
|
-
# end
|
101
|
-
#
|
102
|
-
# def test_parse_zagreb_long_with_leading_zeros
|
103
|
-
# pn = PhoneNumber.parse "0038513668734"
|
104
|
-
#
|
105
|
-
# assert pn.number == '3668734'
|
106
|
-
# assert pn.area_code == '1'
|
107
|
-
# assert pn.country_code == '385'
|
108
|
-
# end
|
109
|
-
#
|
110
|
-
# def test_parse_short_without_special_characters_without_country
|
111
|
-
# PhoneNumber.default_country_code = nil
|
112
|
-
#
|
113
|
-
# assert_raise RuntimeError do
|
114
|
-
# pn = PhoneNumber.parse "0915125486"
|
115
|
-
# end
|
116
|
-
# end
|
117
|
-
#
|
118
|
-
# def test_parse_short_without_special_characters_with_country
|
119
|
-
# PhoneNumber.default_country_code = '385'
|
120
|
-
#
|
121
|
-
# pn = PhoneNumber.parse "044885047"
|
122
|
-
#
|
123
|
-
# assert_equal pn.number, '885047'
|
124
|
-
# assert_equal pn.area_code, '44'
|
125
|
-
# assert pn.country_code == '385'
|
126
|
-
# end
|
127
|
-
#
|
128
|
-
# def test_parse_zagreb_short_without_special_characters_with_country
|
129
|
-
# PhoneNumber.default_country_code = '385'
|
130
|
-
#
|
131
|
-
# pn = PhoneNumber.parse "013668734"
|
132
|
-
#
|
133
|
-
# assert_equal pn.number, '3668734'
|
134
|
-
# assert_equal pn.area_code, '1'
|
135
|
-
# assert_equal pn.country_code, '385'
|
136
|
-
# end
|
137
|
-
#
|
138
|
-
# def test_parse_short_with_special_characters_without_country
|
139
|
-
# PhoneNumber.default_country_code = nil
|
140
|
-
#
|
141
|
-
# assert_raise RuntimeError do
|
142
|
-
# pn = PhoneNumber.parse "091/512-5486"
|
143
|
-
# end
|
144
|
-
# end
|
145
|
-
#
|
146
|
-
# def test_parse_long_with_zero_in_brackets
|
147
|
-
# PhoneNumber.default_country_code = nil
|
148
|
-
#
|
149
|
-
# pn = PhoneNumber.parse '+385 (0)1 366 8111'
|
150
|
-
# assert_equal pn.country_code, '385'
|
151
|
-
# assert_equal pn.area_code, '1'
|
152
|
-
# assert_equal pn.number, '3668111'
|
153
|
-
# end
|
154
|
-
#
|
155
|
-
#
|
156
|
-
#
|
157
|
-
# def test_to_s
|
158
|
-
# PhoneNumber.default_country_code = nil
|
159
|
-
# pn = PhoneNumber.new '5125486', '91', '385'
|
160
|
-
# assert pn.to_s == '+385915125486'
|
161
|
-
# end
|
162
|
-
#
|
163
|
-
# def test_to_s_without_country_code
|
164
|
-
# PhoneNumber.default_country_code = '385'
|
165
|
-
# pn = PhoneNumber.new '5125486', '91'
|
166
|
-
# assert pn.format("0%a%n") == '0915125486'
|
167
|
-
# end
|
168
|
-
#
|
169
|
-
# def test_format_special_with_country_code
|
170
|
-
# PhoneNumber.default_country_code = nil
|
171
|
-
# pn = PhoneNumber.new '5125486', '91', '385'
|
172
|
-
# assert pn.format("+ %c (%a) %n") == '+ 385 (91) 5125486'
|
173
|
-
# end
|
174
|
-
#
|
175
|
-
# def test_format_special_without_country_code
|
176
|
-
# PhoneNumber.default_country_code = '385'
|
177
|
-
# pn = PhoneNumber.new '5125486', '91'
|
178
|
-
# assert_equal pn.format("%A/%f-%l"), '091/512-5486'
|
179
|
-
# end
|
180
|
-
#
|
181
|
-
# def test_format_with_symbol_specifier
|
182
|
-
# PhoneNumber.default_country_code = nil
|
183
|
-
# pn = PhoneNumber.new '5125486', '91', '385'
|
184
|
-
# assert_equal pn.format(:europe), '+385 (0) 91 512 5486'
|
185
|
-
# end
|
186
|
-
#
|
187
|
-
# def test_doesnt_validate
|
188
|
-
# assert_equal PhoneNumber.valid?('asdas'), false
|
189
|
-
# assert_equal PhoneNumber.valid?('385915125486'), false
|
190
|
-
# end
|
191
|
-
#
|
192
|
-
# def test_validates
|
193
|
-
# PhoneNumber.default_country_code = nil
|
194
|
-
# assert_equal PhoneNumber.valid?('00385915125486'), true
|
195
|
-
# assert_equal PhoneNumber.valid?('+385915125486'), true
|
196
|
-
# assert_equal PhoneNumber.valid?('+385 (91) 512 5486'), true
|
197
|
-
# assert_equal PhoneNumber.valid?('+38547451588'), true
|
198
|
-
#
|
199
|
-
# PhoneNumber.default_country_code = '385'
|
200
|
-
# assert_equal PhoneNumber.valid?('0915125486'), true
|
201
|
-
# assert_equal PhoneNumber.valid?('091/512-5486'), true
|
202
|
-
# assert_equal PhoneNumber.valid?('091/512-5486'), true
|
203
|
-
# assert_equal PhoneNumber.valid?('091 512 54 86'), true
|
204
|
-
# assert_equal PhoneNumber.valid?('091-512-54-86'), true
|
205
|
-
# assert_equal PhoneNumber.valid?('047/451-588'), true
|
206
|
-
# end
|
207
|
-
#
|
208
|
-
# def test_has_default_country_code
|
209
|
-
# PhoneNumber.default_country_code = '385'
|
210
|
-
#
|
211
|
-
# assert_equal PhoneNumber.parse('+38547451588').has_default_country_code?, true
|
212
|
-
# assert_equal PhoneNumber.parse('+38647451588').has_default_country_code?, false
|
213
|
-
# end
|
214
|
-
#
|
215
|
-
# def test_has_default_area_code
|
216
|
-
# PhoneNumber.default_country_code = '385'
|
217
|
-
# PhoneNumber.default_area_code = '47'
|
218
|
-
#
|
219
|
-
# assert_equal PhoneNumber.parse('047/451-588').has_default_area_code?, true
|
220
|
-
# assert_equal PhoneNumber.parse('032/336-1456').has_default_area_code?, false
|
221
|
-
# end
|
40
|
+
end
|