phony 1.3.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/lib/countries.rb +29 -24
  2. data/lib/phony.rb +52 -46
  3. data/spec/lib/phony_spec.rb +43 -37
  4. metadata +2 -2
@@ -1,16 +1,16 @@
1
1
  # All countries, ordered by country code.
2
2
  #
3
+ # Definitions are in the format:
4
+ # NDC >> National | NDC >> National | # ...
5
+ #
6
+ # As soon as a NDC matches, it goes on to the National part. Then breaks off.
7
+ # If the NDC does not match, it go on to the next (|, or "or") NDC.
8
+ #
3
9
  # Available matching/splitting methods:
4
- # * fixed: Always splits off a fixed length ndc. (Always use last in a | chain)
5
10
  # * none: Does not have a national destination code, e.g. Denmark, Iceland.
6
11
  # * one_of: Matches one of the following numbers. Splits if it does.
7
- # Options:
8
- # * max_length: Will try to match up to length max_length, then stop.
9
- # (Only use one_of with this option when last in a | chain)
10
12
  # * match: Try to match the regex, and if it matches, splits it off.
11
- # Options:
12
- # * on_fail_take: If it does not match, take n digits, then stop.
13
- # (When you use this option, match must be last in a | chain)
13
+ # * fixed: Always splits off a fixed length ndc. (Always use last in a | chain)
14
14
  #
15
15
  # For the national number part, there are two:
16
16
  # * split: Use this number group splitting.
@@ -24,8 +24,9 @@ Phony.define do
24
24
  country '1', fixed(3) >> split(3,4) # USA, Canada, etc.
25
25
  country '7', fixed(3) >> split(3,2,2) # Kazakhstan (Republic of) & Russian Federation
26
26
 
27
- country '20', one_of('800') >> split(7) | # Egypt
28
- one_of('2', '3', :max_length => 2) >> split(8) # Cairo/Giza, Alexandria
27
+ country '20', one_of('800') >> split(7) | # Egypt
28
+ one_of('2', '3') >> split(8) | # Cairo/Giza, Alexandria
29
+ fixed(2) >> split(8)
29
30
  # :mobile? => /^10|11|12|14|16|17|18|19*$/, :service? => /^800.*$/
30
31
  country '27', fixed(2) >> split(3,4) # South Africa
31
32
 
@@ -55,13 +56,15 @@ Phony.define do
55
56
  country '48', fixed(3) >> split(3,3) # Poland
56
57
  # country '49', Phony::Countries::Germany
57
58
 
58
- country '51', one_of('103', '105') >> split(3,3) | # Peru
59
- one_of('1', '9', :max_length => 2) >> split(4,4) # Lima and mobile.
59
+ country '51', one_of('103', '105') >> split(3,3) | # Peru
60
+ one_of('1', '9') >> split(4,4) | # Lima and mobile.
61
+ fixed(2) >> split(4,4)
60
62
  country '52', match(/^(0\d{2})\d+$/) >> split(2,2,2,2) | # Mexico
61
63
  match(/^(33|55|81)\d+$/) >> split(2,2,2,2) |
62
64
  match(/^(\d{3})\d+$/) >> split(3,2,2)
63
- country '53', match(/^(5\d{3})\d+$/) >> split(4) | # Cuba. Mobile.
64
- match(/^(7|21|22|23|4[1-8]|3[1-3])/, :on_fail_take => 3) >> split(7)
65
+ country '53', match(/^(5\d{3})\d+$/) >> split(4) | # Cuba. Mobile.
66
+ match(/^(7|21|22|23|4[1-8]|3[1-3])/) >> split(7) | #
67
+ fixed(3) >> split(7)
65
68
  country '54', fixed(2) >> split(3,2,2) # TODO Argentine Republic
66
69
  brazilian_service = /^(100|128|190|191|192|193|194|197|198|199)\d+$/
67
70
  country '55', match(brazilian_service) >> split(3,3) | # Brazil (Federative Republic of)
@@ -106,8 +109,6 @@ Phony.define do
106
109
  country '218', fixed(2) >> split(3,2,2) # Lybia
107
110
  country '219', fixed(2) >> split(3,2,2) # -
108
111
 
109
- # TODO From here on.
110
-
111
112
  country '220', fixed(2) >> split(3,2,2) # Gambia
112
113
  country '221', fixed(2) >> split(3,2,2) # Senegal
113
114
  country '222', fixed(2) >> split(3,2,2) # Mauritania
@@ -186,18 +187,20 @@ Phony.define do
186
187
  country '299', fixed(2) >> split(3,2,2) # Greenland
187
188
 
188
189
  country '350', fixed(2) >> split(3,2,2) # Gibraltar
189
- country '351', one_of('700', '800') >> split(3,3) | # Portugal
190
- match(/^(9\d)\d+$/) >> split(3,4) | # mobile
191
- one_of('21', '22', :max_length => 3) >> split(3,4) # Lisboa & Porto
190
+ country '351', one_of('700', '800') >> split(3,3) | # Portugal
191
+ match(/^(9\d)\d+$/) >> split(3,4) | # mobile
192
+ one_of('21', '22') >> split(3,4) | # Lisboa & Porto
193
+ fixed(3) >> split(3,4)
192
194
  country '352', fixed(2) >> split(3,2,2) # Luxembourg
193
195
  country '353', fixed(2) >> split(3,2,2) # Ireland (0-3-4)
194
196
  country '354', none >> split(3,4) # Iceland
195
197
  country '355', fixed(2) >> split(3,2,2) # Albania
196
198
  country '356', fixed(2) >> split(3,2,2) # Malta
197
199
  country '357', fixed(2) >> split(3,2,2) # Cyprus
198
- country '358', match(/^([6-8]00)\d+$/) >> split(3,3) | # Finland
199
- match(/^(4\d|50)\d+$/) >> split(3,2,2) |
200
- one_of('2','3','5','6','8','9', :max_length => 2) >> split(3,3)
200
+ country '358', match(/^([6-8]00)\d+$/) >> split(3,3) | # Finland
201
+ match(/^(4\d|50)\d+$/) >> split(3,2,2) |
202
+ one_of('2','3','5','6','8','9') >> split(3,3) |
203
+ fixed(2) >> split(3,3)
201
204
  country '359', fixed(2) >> split(3,2,2) # Bulgaria
202
205
 
203
206
  country '370', one_of('700', '800') >> split(2,3) | # Lithuania
@@ -220,15 +223,17 @@ Phony.define do
220
223
  country '382', fixed(2) >> split(3,2,2) # -
221
224
  country '383', fixed(2) >> split(3,2,2) # -
222
225
  country '384', fixed(2) >> split(3,2,2) # -
223
- country '385', one_of('1', :max_length => 2) >> split(3,5) # Croatia
226
+ country '385', one_of('1') >> split(3,5) | # Croatia
227
+ fixed(2) >> split(3,5)
224
228
  country '386', fixed(2) >> split(3,2,2) # Slovenia
225
229
  country '387', fixed(2) >> split(3,2,2) # Bosnia and Herzegovina
226
230
  country '388', fixed(2) >> split(3,2,2) # Group of countries, shared code
227
231
  country '389', fixed(2) >> split(3,2,2) # The Former Yugoslav Republic of Macedonia
228
232
 
229
233
  country '420', fixed(3) >> split(3,3) # Czech Republic
230
- country '421', match(/^(9\d\d).+$/) >> split(7) | # Slovak Republic
231
- one_of('2', :max_length => 2) >> split(8) # Bratislava
234
+ country '421', match(/^(9\d\d).+$/) >> split(6) | # Slovak Republic
235
+ one_of('2') >> split(8) | # Bratislava
236
+ fixed(2) >> split(7)
232
237
  country '422', fixed(2) >> split(3,2,2) # Spare code
233
238
  country '423', none >> split(3,2,2) # Liechtenstein (Principality of)
234
239
  country '424', fixed(2) >> split(3,2,2) # -
@@ -44,57 +44,63 @@ module Phony
44
44
  #
45
45
  @codes = CountryCodes.instance
46
46
 
47
- # Normalizes the given number.
48
- #
49
- # Useful before inserting the number into a database.
50
- #
51
- def self.normalize phone_number
52
- normalize! phone_number.dup
53
- end
54
- def self.normalize! phone_number
55
- @codes.normalize phone_number
56
- end
47
+ class << self
57
48
 
58
- # Splits the phone number into pieces according to the country codes.
59
- #
60
- def self.split phone_number
61
- split! phone_number.dup
62
- end
63
- def self.split! phone_number
64
- @codes.split phone_number
65
- end
49
+ # Normalizes the given number.
50
+ #
51
+ # Useful before inserting the number into a database.
52
+ #
53
+ def normalize phone_number
54
+ normalize! phone_number.dup
55
+ end
56
+ def normalize! phone_number
57
+ @codes.normalize phone_number
58
+ end
66
59
 
67
- # Formats a E164 number according to local customs.
68
- #
69
- def self.formatted phone_number, options = {}
70
- formatted! phone_number.dup, options
71
- end
72
- def self.formatted! phone_number, options = {}
73
- @codes.formatted phone_number, options
74
- end
60
+ # Splits the phone number into pieces according to the country codes.
61
+ #
62
+ def split phone_number
63
+ split! phone_number.dup
64
+ end
65
+ def split! phone_number
66
+ @codes.split phone_number
67
+ end
75
68
 
76
- # def self.service? number
77
- # @codes.service? number.dup
78
- # end
79
- # def self.mobile? number
80
- # @codes.mobile? number.dup
81
- # end
82
- # def self.landline? number
83
- # @codes.landline? number.dup
84
- # end
69
+ # Formats a E164 number according to local customs.
70
+ #
71
+ def format phone_number, options = {}
72
+ formatted! phone_number.dup, options
73
+ end
74
+ def format! phone_number, options = {}
75
+ @codes.formatted phone_number, options
76
+ end
77
+ alias formatted format
78
+ alias formatted! format!
85
79
 
86
- # Returns true if there is a character in the number
87
- # after the first four numbers.
88
- #
89
- def self.vanity? phone_number
90
- @codes.vanity? phone_number.dup
91
- end
80
+ # def service? number
81
+ # @codes.service? number.dup
82
+ # end
83
+ # def mobile? number
84
+ # @codes.mobile? number.dup
85
+ # end
86
+ # def landline? number
87
+ # @codes.landline? number.dup
88
+ # end
89
+
90
+ # Returns true if there is a character in the number
91
+ # after the first four numbers.
92
+ #
93
+ def vanity? phone_number
94
+ @codes.vanity? phone_number.dup
95
+ end
96
+
97
+ # Converts any character in the vanity_number to its numeric representation.
98
+ # Does not check if the passed number is a valid vanity_number, simply does replacement.
99
+ #
100
+ def vanity_to_number vanity_number
101
+ @codes.vanity_to_number vanity_number.dup
102
+ end
92
103
 
93
- # Converts any character in the vanity_number to its numeric representation.
94
- # Does not check if the passed number is a valid vanity_number, simply does replacement.
95
- #
96
- def self.vanity_to_number vanity_number
97
- @codes.vanity_to_number vanity_number.dup
98
104
  end
99
105
 
100
106
  end
@@ -9,10 +9,10 @@ describe Phony do
9
9
  it "should normalize an already normalized number" do
10
10
  Phony.normalize('41443643533').should == '41443643533'
11
11
  end
12
- it "should normalize a formatted number" do
12
+ it "should normalize a format number" do
13
13
  Phony.normalize('+41 44 364 35 33').should == '41443643533'
14
14
  end
15
- it "should normalize a formatted number" do
15
+ it "should normalize a format number" do
16
16
  Phony.normalize('+41 44 364 35 33').should == '41443643533'
17
17
  end
18
18
  it "should normalize a service number" do
@@ -42,105 +42,111 @@ describe Phony do
42
42
  end
43
43
  end
44
44
 
45
- describe "formatted" do
45
+ describe 'formatted' do
46
+ it 'is an alias of format' do
47
+ Phony.formatted('41443643532').should == '+41 44 364 35 32'
48
+ end
49
+ end
50
+
51
+ describe "format" do
46
52
  describe "default" do
47
53
  it "should format swiss numbers" do
48
- Phony.formatted('41443643532').should == '+41 44 364 35 32'
54
+ Phony.format('41443643532').should == '+41 44 364 35 32'
49
55
  end
50
56
  # TODO
51
57
  #
52
58
  it "should format swiss service numbers" do
53
- Phony.formatted('41800112233').should == '+41 800 112 233'
59
+ Phony.format('41800112233').should == '+41 800 112 233'
54
60
  end
55
61
  it "should format austrian numbers" do
56
- Phony.formatted('43198110').should == '+43 1 98110'
62
+ Phony.format('43198110').should == '+43 1 98110'
57
63
  end
58
64
  it "should format american numbers" do
59
- Phony.formatted('18705551122').should == '+1 870 555 1122'
65
+ Phony.format('18705551122').should == '+1 870 555 1122'
60
66
  end
61
67
  end
62
68
  describe "international" do
63
69
  it "should format north american numbers" do
64
- Phony.formatted('18091231234', :format => :international).should == '+1 809 123 1234'
70
+ Phony.format('18091231234', :format => :international).should == '+1 809 123 1234'
65
71
  end
66
72
  it "should format austrian numbers" do
67
- Phony.formatted('43198110', :format => :international).should == '+43 1 98110'
73
+ Phony.format('43198110', :format => :international).should == '+43 1 98110'
68
74
  end
69
75
  it "should format austrian numbers" do
70
- Phony.formatted('43198110', :format => :international_absolute).should == '+43 1 98110'
76
+ Phony.format('43198110', :format => :international_absolute).should == '+43 1 98110'
71
77
  end
72
78
  it "should format french numbers" do
73
- Phony.formatted('33142278186', :format => :+).should == '+33 1 42 27 81 86'
79
+ Phony.format('33142278186', :format => :+).should == '+33 1 42 27 81 86'
74
80
  end
75
81
  it "should format austrian numbers" do
76
- Phony.formatted('43198110', :format => :international_relative).should == '0043 1 98110'
82
+ Phony.format('43198110', :format => :international_relative).should == '0043 1 98110'
77
83
  end
78
84
  it 'should format liechtensteiner numbers' do
79
- Phony.formatted('4233841148', :format => :international_relative).should == '00423 384 11 48'
85
+ Phony.format('4233841148', :format => :international_relative).should == '00423 384 11 48'
80
86
  end
81
87
  context 'with no spaces' do
82
88
  it "should format north american numbers" do
83
- Phony.formatted('18091231234', :format => :international, :spaces => '').should == '+18091231234'
89
+ Phony.format('18091231234', :format => :international, :spaces => '').should == '+18091231234'
84
90
  end
85
91
  it "should format austrian numbers" do
86
- Phony.formatted('43198110', :format => :international, :spaces => '').should == '+43198110'
92
+ Phony.format('43198110', :format => :international, :spaces => '').should == '+43198110'
87
93
  end
88
94
  it "should format austrian numbers" do
89
- Phony.formatted('43198110', :format => :international_absolute, :spaces => '').should == '+43198110'
95
+ Phony.format('43198110', :format => :international_absolute, :spaces => '').should == '+43198110'
90
96
  end
91
97
  it "should format french numbers" do
92
- Phony.formatted('33142278186', :format => :+, :spaces => '').should == '+33142278186'
98
+ Phony.format('33142278186', :format => :+, :spaces => '').should == '+33142278186'
93
99
  end
94
100
  it "should format austrian numbers" do
95
- Phony.formatted('43198110', :format => :international_relative, :spaces => '').should == '0043198110'
101
+ Phony.format('43198110', :format => :international_relative, :spaces => '').should == '0043198110'
96
102
  end
97
103
  it 'should format liechtensteiner numbers' do
98
- Phony.formatted('4233841148', :format => :international_relative, :spaces => '').should == '004233841148'
104
+ Phony.format('4233841148', :format => :international_relative, :spaces => '').should == '004233841148'
99
105
  end
100
106
  end
101
107
  context 'with special spaces' do
102
108
  it "should format swiss numbers" do
103
- Phony.formatted('41443643532', :format => :international).should == '+41 44 364 35 32'
109
+ Phony.format('41443643532', :format => :international).should == '+41 44 364 35 32'
104
110
  end
105
111
  it "should format north american numbers" do
106
- Phony.formatted('18091231234', :format => :international, :spaces => :-).should == '+1-809-123-1234'
112
+ Phony.format('18091231234', :format => :international, :spaces => :-).should == '+1-809-123-1234'
107
113
  end
108
114
  it "should format austrian numbers" do
109
- Phony.formatted('43198110', :format => :international, :spaces => :-).should == '+43-1-98110'
115
+ Phony.format('43198110', :format => :international, :spaces => :-).should == '+43-1-98110'
110
116
  end
111
117
  it "should format austrian numbers" do
112
- Phony.formatted('43198110', :format => :international_absolute, :spaces => :-).should == '+43-1-98110'
118
+ Phony.format('43198110', :format => :international_absolute, :spaces => :-).should == '+43-1-98110'
113
119
  end
114
120
  it "should format french numbers" do
115
- Phony.formatted('33142278186', :format => :+, :spaces => :-).should == '+33-1-42-27-81-86'
121
+ Phony.format('33142278186', :format => :+, :spaces => :-).should == '+33-1-42-27-81-86'
116
122
  end
117
123
  it "should format austrian numbers" do
118
- Phony.formatted('43198110', :format => :international_relative, :spaces => :-).should == '0043-1-98110'
124
+ Phony.format('43198110', :format => :international_relative, :spaces => :-).should == '0043-1-98110'
119
125
  end
120
126
  it 'should format liechtensteiner numbers' do
121
- Phony.formatted('4233841148', :format => :international_relative, :spaces => :-).should == '00423-384-11-48'
127
+ Phony.format('4233841148', :format => :international_relative, :spaces => :-).should == '00423-384-11-48'
122
128
  end
123
129
  end
124
130
  end
125
131
  describe "national" do
126
132
  it "should format swiss numbers" do
127
- Phony.formatted('41443643532', :format => :national).should == '044 364 35 32'
133
+ Phony.format('41443643532', :format => :national).should == '044 364 35 32'
128
134
  end
129
135
  # TODO
130
136
  #
131
137
  it "should format swiss service numbers" do
132
- Phony.formatted('41800112233', :format => :national).should == '0800 112 233'
138
+ Phony.format('41800112233', :format => :national).should == '0800 112 233'
133
139
  end
134
140
  it "should format austrian numbers" do
135
- Phony.formatted('43198110', :format => :national).should == '01 98110'
141
+ Phony.format('43198110', :format => :national).should == '01 98110'
136
142
  end
137
143
  end
138
144
  describe "local" do
139
145
  it "should format swiss numbers" do
140
- Phony.formatted('41443643532', :format => :local).should == '364 35 32'
146
+ Phony.format('41443643532', :format => :local).should == '364 35 32'
141
147
  end
142
148
  it "should format german numbers" do
143
- Phony.formatted('493038625454', :format => :local).should == '386 25454'
149
+ Phony.format('493038625454', :format => :local).should == '386 25454'
144
150
  end
145
151
  end
146
152
  end
@@ -164,13 +170,13 @@ describe Phony do
164
170
  end
165
171
  context 'formatting' do
166
172
  it 'handles completely missing numbers well enough' do
167
- Phony.formatted('4144').should == '+41 44 '
173
+ Phony.format('4144').should == '+41 44 '
168
174
  end
169
175
  it 'handles a missing number part' do
170
- Phony.formatted('4144364').should == '+41 44 364'
176
+ Phony.format('4144364').should == '+41 44 364'
171
177
  end
172
178
  it 'handles a missing number part' do
173
- Phony.formatted('414436435').should == '+41 44 364 35'
179
+ Phony.format('414436435').should == '+41 44 364 35'
174
180
  end
175
181
  end
176
182
  end
@@ -203,13 +209,13 @@ describe Phony do
203
209
  performance_of { @phone_numbers.each { |number| Phony.normalize(number) } }.should < 0.00016
204
210
  end
205
211
  end
206
- describe 'formatted' do
212
+ describe 'format' do
207
213
  it 'is fast' do
208
214
  number = @phone_numbers.first
209
- performance_of { Phony.formatted(number) }.should < 0.000075
215
+ performance_of { Phony.format(number) }.should < 0.000075
210
216
  end
211
217
  it 'is fast' do
212
- performance_of { @phone_numbers.each { |number| Phony.formatted(number) } }.should < 0.00016
218
+ performance_of { @phone_numbers.each { |number| Phony.format(number) } }.should < 0.00016
213
219
  end
214
220
  end
215
221
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: phony
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.3.5
5
+ version: 1.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Florian Hanke
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-30 00:00:00 +10:00
13
+ date: 2011-05-02 00:00:00 +10:00
14
14
  default_executable:
15
15
  dependencies: []
16
16