phoney 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/lib/phoney.rb +4 -1
- data/lib/phoney/parser.rb +21 -12
- data/lib/phoney/region.rb +10 -0
- data/lib/phoney/version.rb +1 -1
- data/phoney.gemspec +1 -1
- data/spec/parser/br_spec.rb +2 -0
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -78,7 +78,7 @@ When given a symbol you can let the parser guess the best format and pass in one
|
|
78
78
|
== TODOs
|
79
79
|
|
80
80
|
- More test specs for different countries
|
81
|
-
-
|
81
|
+
- Correctly handle numbers that have some digits BEFORE the area_code!
|
82
82
|
|
83
83
|
== Licence
|
84
84
|
|
data/lib/phoney.rb
CHANGED
@@ -2,4 +2,7 @@ require File.join(File.dirname(__FILE__), 'phoney', 'version')
|
|
2
2
|
require File.join(File.dirname(__FILE__), 'phoney', 'utils')
|
3
3
|
require File.join(File.dirname(__FILE__), 'phoney', 'region')
|
4
4
|
require File.join(File.dirname(__FILE__), 'phoney', 'parser')
|
5
|
-
require File.join(File.dirname(__FILE__), 'phoney', 'base')
|
5
|
+
require File.join(File.dirname(__FILE__), 'phoney', 'base')
|
6
|
+
|
7
|
+
# Load our region file when we require the library
|
8
|
+
PhoneNumber::Region.load
|
data/lib/phoney/parser.rb
CHANGED
@@ -26,22 +26,28 @@ class PhoneNumber
|
|
26
26
|
national_prefix = get_national_prefix(phone_number, region)
|
27
27
|
dialout_region = get_dialout_region(phone_number, region)
|
28
28
|
dialout_country = ''
|
29
|
-
|
29
|
+
|
30
|
+
# No dialout prefix without a dialout region, and no dialout region without a prefix
|
31
|
+
if((dialout_region && dialout_prefix.empty?) || (!dialout_region && !dialout_prefix.empty?))
|
32
|
+
rule_sets = []
|
33
|
+
else
|
34
|
+
rule_sets = get_rule_sets_for_region(phone_number, dialout_region || region)
|
35
|
+
end
|
30
36
|
|
31
37
|
# build our total prefix
|
32
38
|
if dialout_region
|
33
|
-
prefix
|
34
|
-
country_code
|
39
|
+
prefix = dialout_prefix.delete(' ') + dialout_region.country_code.to_s
|
40
|
+
country_code = dialout_region.country_code.to_s
|
35
41
|
dialout_country = country_code
|
36
42
|
else
|
37
43
|
prefix = national_prefix
|
38
|
-
prefix += dialout_prefix unless(dialout_prefix.empty?)
|
44
|
+
prefix += dialout_prefix.delete(' ') unless(dialout_prefix.empty?)
|
39
45
|
end
|
40
46
|
|
41
47
|
# strip the total prefix from the beginning of the number
|
42
48
|
phone_number = phone_number[prefix.length..-1]
|
43
49
|
number = phone_number
|
44
|
-
|
50
|
+
|
45
51
|
prefered_type = 0 # for sorting the priority
|
46
52
|
|
47
53
|
# if we're dialing out or using the national prefix
|
@@ -54,7 +60,7 @@ class PhoneNumber
|
|
54
60
|
rule_sets.each do |rule_set|
|
55
61
|
rule_set[:rules] = rule_set[:rules].sort_by do |rule|
|
56
62
|
# [ prefered rule type ASC, total_digits ASC ]
|
57
|
-
[ (rule[:type]==prefered_type) ? -1 : rule[:type], rule[:total_digits] ]
|
63
|
+
[ (rule[:type]==prefered_type) ? -1 : rule[:type], rule[:total_digits], rule[:index] ]
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
@@ -105,14 +111,16 @@ class PhoneNumber
|
|
105
111
|
# strip possible whitespace
|
106
112
|
phone_number.rstrip!
|
107
113
|
phone_number.lstrip!
|
114
|
+
# remove possible non-numeric characters from the (invalid) number
|
115
|
+
number.gsub!(/[^0-9]/,'') if number
|
108
116
|
|
109
117
|
# Finally...we can output our parts as a hash
|
110
|
-
{ :formatted_number => phone_number, :area_code => area_code, :country_code => country_code, :number =>
|
118
|
+
{ :formatted_number => phone_number, :area_code => area_code, :country_code => country_code, :number => number }
|
111
119
|
end
|
112
120
|
|
113
|
-
private
|
121
|
+
# private
|
114
122
|
def get_rule_sets_for_region(string, region)
|
115
|
-
rule_sets
|
123
|
+
rule_sets = []
|
116
124
|
|
117
125
|
if(region && region.rule_sets)
|
118
126
|
rule_sets = region.rule_sets.select do |rule_set|
|
@@ -123,14 +131,15 @@ class PhoneNumber
|
|
123
131
|
rule_sets
|
124
132
|
end
|
125
133
|
|
126
|
-
def find_matching_rule(
|
134
|
+
def find_matching_rule(number, rule_sets)
|
135
|
+
return nil if !number.match(/\A[0-9]+\Z/)
|
127
136
|
match = nil
|
128
137
|
|
129
138
|
# go through all our given rules
|
130
139
|
for rule_set in rule_sets do
|
131
140
|
digits = rule_set[:digits]
|
132
|
-
prefix =
|
133
|
-
rules = rule_set[:rules].select { |rule| rule[:total_digits] >=
|
141
|
+
prefix = number[0,digits].to_i
|
142
|
+
rules = rule_set[:rules].select { |rule| rule[:total_digits] >= number.length }
|
134
143
|
|
135
144
|
rules.each do |rule|
|
136
145
|
if(prefix >= rule[:min] && prefix <= rule[:max])
|
data/lib/phoney/region.rb
CHANGED
@@ -50,6 +50,16 @@ class PhoneNumber
|
|
50
50
|
@dialout_prefixes = hash[:dialout_prefixes]
|
51
51
|
|
52
52
|
@rule_sets = hash[:rule_sets]
|
53
|
+
|
54
|
+
if(@rule_sets)
|
55
|
+
for rule_set in @rule_sets do
|
56
|
+
if(rule_set[:rules])
|
57
|
+
rule_set[:rules].each_with_index do |rule,index|
|
58
|
+
rule.merge!(:index => index)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
53
63
|
end
|
54
64
|
|
55
65
|
def to_s
|
data/lib/phoney/version.rb
CHANGED
data/phoney.gemspec
CHANGED
data/spec/parser/br_spec.rb
CHANGED
@@ -8,6 +8,8 @@ describe PhoneNumber::Parser do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should format a [:br] (Brazil) phone number" do
|
11
|
+
PhoneNumber::Parser.parse("03001234567").should == "0300 123-4567"
|
12
|
+
|
11
13
|
PhoneNumber::Parser.parse("123").should == "123"
|
12
14
|
PhoneNumber::Parser.parse("1234").should == "123-4"
|
13
15
|
PhoneNumber::Parser.parse("12345").should == "123-45"
|