phony 2.0.0.beta11 → 2.0.0.beta12
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 +8 -8
- data/lib/phony/countries/austria.rb +6 -6
- data/lib/phony/countries/germany.rb +8 -6
- data/lib/phony/countries/sweden.rb +3 -3
- data/lib/phony/countries.rb +7 -7
- data/lib/phony/country.rb +2 -2
- data/lib/phony/country_codes.rb +2 -0
- data/lib/phony/dsl.rb +6 -6
- data/lib/phony/local_splitters/fixed.rb +18 -9
- data/lib/phony/local_splitters/regex.rb +2 -3
- data/spec/functional/normalize_spec.rb +3 -0
- data/spec/lib/phony/countries_spec.rb +4 -4
- data/spec/lib/phony/local_splitters/fixed_spec.rb +4 -4
- data/spec/lib/phony/validations_spec.rb +7 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTgxNzcwMjc1YzQ3NWMxNjI2OTliMjc5ODNmZWM4ZGZmZWUxNDc4Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDc2YTFiODczMGRkYWMzOTlhMGQ2ZWMyNmNmYTU0YTBlOTVhZWE4MA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MmIyYTJiMzc5NTdhMmI3NjY0NmE4ZmVmOWFjNDliYjMxNDc4MmM5M2Q0ODJh
|
10
|
+
MTExYmZhMmE4Nzc3YTNmMzQ3OTRjOThiOGVhNTg3N2EwYmE1NTg2YjM0Yjg0
|
11
|
+
ZGFjYzA4ZThiZTFkYmE2MDYyNmEyMDJkOTQ1MzAxOTRhMTQ1MTg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTE0MTMzZTZkMDcwY2Y5MDI5MjM5MzhjMWQxMjRlMzcyMzZmZDNkZjBjNGU0
|
14
|
+
ZjNlYTcyYzgzOWYyMDVhZjhjMDFlZjYxYTJkZWIzOWE1OWVlNWY2MzA4ZDg4
|
15
|
+
YjdiMDJjYzZkN2NmNjgwODRhMzUzYTFmYjZkYTVjNTIxN2E2YTc=
|
@@ -78,10 +78,10 @@ service = [
|
|
78
78
|
# TODO Add more details.
|
79
79
|
#
|
80
80
|
Phony.define do
|
81
|
-
country '43', one_of('1') >> split(4) | # Vienna
|
82
|
-
one_of(service) >> split(9) |
|
83
|
-
one_of(corporate) >> split(5) |
|
84
|
-
one_of(ndcs) >> split(6) |
|
85
|
-
one_of(mobile) >> split(7) |
|
86
|
-
fixed(4) >> split(7)
|
81
|
+
country '43', one_of('1') >> split(4..4) | # Vienna
|
82
|
+
one_of(service) >> split(9..9) |
|
83
|
+
one_of(corporate) >> split(5..5) |
|
84
|
+
one_of(ndcs) >> split(6..6) |
|
85
|
+
one_of(mobile) >> split(7..7) |
|
86
|
+
fixed(4) >> split(7..7)
|
87
87
|
end
|
@@ -2,8 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Note: Germany uses a variable ndc format from length 2 to 5.
|
4
4
|
#
|
5
|
-
|
6
|
-
ndcs2and3 = [
|
5
|
+
ndcs2 = [
|
7
6
|
'10', # Call-By-Call
|
8
7
|
'11', # formerly Value Added Services
|
9
8
|
'13', # Voting and Lottery Numbers
|
@@ -12,6 +11,8 @@ ndcs2and3 = [
|
|
12
11
|
'40', # Hamburg
|
13
12
|
'69', # Frankfurt am Main
|
14
13
|
'89', # München
|
14
|
+
]
|
15
|
+
ndcs3 = [
|
15
16
|
'201', # Essen
|
16
17
|
'202', # Wuppertal
|
17
18
|
'203', # Duisburg
|
@@ -4079,9 +4080,10 @@ Phony.define do
|
|
4079
4080
|
one_of('1609') >> split(3,5) |
|
4080
4081
|
one_of('1521', '1529', '1570', '1575', '1579') >> split(3,4) |
|
4081
4082
|
match(/\A(1[57]\d)\d*\z/) >> split(3,4) |
|
4082
|
-
match(/\A(16\d)\d*\z/)
|
4083
|
-
one_of(
|
4084
|
-
one_of(
|
4085
|
-
|
4083
|
+
match(/\A(16\d)\d*\z/) >> split(3,5) |
|
4084
|
+
one_of(ndcs2) >> split(3,0..6) |
|
4085
|
+
one_of(ndcs3) >> split(3,0..5) |
|
4086
|
+
one_of(ndcs4) >> split(3,0..4) |
|
4087
|
+
fixed(5) >> split(3,3..3)
|
4086
4088
|
|
4087
4089
|
end
|
@@ -54,7 +54,7 @@ service = [
|
|
54
54
|
]
|
55
55
|
|
56
56
|
Phony.define do
|
57
|
-
country '46', one_of(service) >> split(3,3)
|
58
|
-
one_of(ndcs + mobile) >> split(
|
59
|
-
fixed(3) >> split(
|
57
|
+
country '46', one_of(service) >> split(3,3) |
|
58
|
+
one_of(ndcs + mobile) >> split(3,2,2) |
|
59
|
+
fixed(3) >> split(3,3,2) # catchall
|
60
60
|
end
|
data/lib/phony/countries.rb
CHANGED
@@ -39,9 +39,9 @@ Phony.define do
|
|
39
39
|
|
40
40
|
# Egypt.
|
41
41
|
#
|
42
|
-
country '20', one_of('800') >> split(7) | # Egypt
|
43
|
-
one_of('2', '3') >> split(8) | # Cairo/Giza, Alexandria
|
44
|
-
fixed(2) >> split(8)
|
42
|
+
country '20', one_of('800') >> split(7..7) | # Egypt
|
43
|
+
one_of('2', '3') >> split(8..8) | # Cairo/Giza, Alexandria
|
44
|
+
fixed(2) >> split(8..8)
|
45
45
|
# :mobile? => /^1[01246-9]\d+$/, :service? => /^800\d+$/
|
46
46
|
|
47
47
|
# South Africa.
|
@@ -100,7 +100,7 @@ Phony.define do
|
|
100
100
|
# Switzerland.
|
101
101
|
#
|
102
102
|
country '41',
|
103
|
-
match(/^(8(00|4[0248]))\d+$/) >> split(3,3)
|
103
|
+
match(/^(8(00|4[0248]))\d+$/) >> split(3,3)|
|
104
104
|
fixed(2) >> split(3,2,2)
|
105
105
|
|
106
106
|
# country '43' # Austria, see special file.
|
@@ -109,8 +109,8 @@ Phony.define do
|
|
109
109
|
# Denmark.
|
110
110
|
#
|
111
111
|
country '45',
|
112
|
-
none >> split(2,2,2,2)
|
113
|
-
|
112
|
+
none >> split(2,2,2,2..2)
|
113
|
+
|
114
114
|
# country '46' # Sweden, see special file.
|
115
115
|
|
116
116
|
# Norway.
|
@@ -1001,7 +1001,7 @@ Phony.define do
|
|
1001
1001
|
one_of('2', '3', '4', '8', '9') >> split(3,4) | # 1 digit ndc
|
1002
1002
|
match(/^(5[023456789]|7[23467])\d+$/) >> split(3,4) # 2 digit ndc
|
1003
1003
|
|
1004
|
-
country '973', none >> split(4,4) # Bahrain (Kingdom of) http://www.itu.int/oth/T0202000011/en
|
1004
|
+
country '973', none >> split(4,4..4) # Bahrain (Kingdom of) http://www.itu.int/oth/T0202000011/en
|
1005
1005
|
|
1006
1006
|
# Qatar (State of)
|
1007
1007
|
# https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=QA
|
data/lib/phony/country.rb
CHANGED
data/lib/phony/country_codes.rb
CHANGED
data/lib/phony/dsl.rb
CHANGED
@@ -50,7 +50,7 @@ module Phony
|
|
50
50
|
# country '27', # CC, followed by rules, for example fixed(2) >> ...
|
51
51
|
#
|
52
52
|
def country country_code, definition, options = {}
|
53
|
-
definition.with options
|
53
|
+
definition.with country_code, options
|
54
54
|
Phony::CountryCodes.instance.add country_code, definition
|
55
55
|
end
|
56
56
|
|
@@ -162,7 +162,7 @@ module Phony
|
|
162
162
|
# match(/^(0\d{2})\d+$/) >> split(2,2,2,2) # If it matches, split in 4 groups of size 2.
|
163
163
|
#
|
164
164
|
def split *local
|
165
|
-
local << local.pop + 10 # Allow for call-through numbers with an arbitrary size.
|
165
|
+
# local << local.pop + 10 # Allow for call-through numbers with an arbitrary size.
|
166
166
|
LocalSplitters::Fixed.instance_for local
|
167
167
|
end
|
168
168
|
|
@@ -179,10 +179,10 @@ module Phony
|
|
179
179
|
# :fallback => [2,2,2,2])
|
180
180
|
#
|
181
181
|
def matched_split options = {}
|
182
|
-
# TODO: Refactor: it's a workaround. It creates high coupling with Phony::LocalSplitters::Regex.
|
183
|
-
options.each do |_, format|
|
184
|
-
|
185
|
-
end
|
182
|
+
# # TODO: Refactor: it's a workaround. It creates high coupling with Phony::LocalSplitters::Regex.
|
183
|
+
# options.each do |_, format|
|
184
|
+
# format << format.pop + 10
|
185
|
+
# end
|
186
186
|
Phony::LocalSplitters::Regex.instance_for options
|
187
187
|
end
|
188
188
|
|
@@ -27,8 +27,23 @@ module Phony
|
|
27
27
|
# The format [3, 2, 2] splits a number like '3332222' into ['333', '22', '22'].
|
28
28
|
#
|
29
29
|
def initialize format = nil
|
30
|
-
|
31
|
-
|
30
|
+
format = format && format.dup || [3, 2, 2]
|
31
|
+
@format, @length = extract_params format
|
32
|
+
@format << @format.pop + 10
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
#
|
37
|
+
def extract_params format
|
38
|
+
if format.last.respond_to? :max
|
39
|
+
last = format.pop
|
40
|
+
length = format.inject(0) { |total, part| total + part }
|
41
|
+
length = (length+last.min..length+last.max)
|
42
|
+
format << last.min
|
43
|
+
else
|
44
|
+
length = format.inject(0) { |total, part| total + part }
|
45
|
+
end
|
46
|
+
[format, length]
|
32
47
|
end
|
33
48
|
|
34
49
|
# Split a local number according to an assumed country specific format.
|
@@ -47,13 +62,7 @@ module Phony
|
|
47
62
|
# TODO Fix length fudging.
|
48
63
|
#
|
49
64
|
def plausible? rest, hints = {}
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# A valid length.
|
54
|
-
#
|
55
|
-
def length
|
56
|
-
@length ||= @format.inject { |total, part| total + part }
|
65
|
+
@length === rest.inject(0) { |total, part| total + part.size }
|
57
66
|
end
|
58
67
|
|
59
68
|
end
|
@@ -58,12 +58,11 @@ module Phony
|
|
58
58
|
result << number.slice!(0..size-1)
|
59
59
|
return result if number.empty?
|
60
60
|
result
|
61
|
-
end
|
61
|
+
end << number
|
62
62
|
end
|
63
63
|
|
64
64
|
def plausible_with? number, format
|
65
|
-
length = format.inject
|
66
|
-
length -= 10 if length > 10
|
65
|
+
length = format.inject 0, :+
|
67
66
|
number.length == length
|
68
67
|
end
|
69
68
|
|
@@ -7,6 +7,9 @@ describe 'Phony.normalize' do
|
|
7
7
|
it 'handles the US (with cc) correctly' do
|
8
8
|
Phony.normalize('+1 724 999 9999').should == '17249999999'
|
9
9
|
end
|
10
|
+
it 'handles the Dutch number (without US cc) correctly' do
|
11
|
+
Phony.normalize('310 5552121').should == '315552121'
|
12
|
+
end
|
10
13
|
it 'handles the US (with cc and cc option) correctly' do
|
11
14
|
Phony.normalize('+1 724 999 9999', cc: '1').should == '17249999999'
|
12
15
|
end
|
@@ -532,10 +532,10 @@ describe 'country descriptions' do
|
|
532
532
|
end
|
533
533
|
|
534
534
|
describe 'Sweden' do
|
535
|
-
it { Phony.split('46812345678').should == ['46', '8', '
|
536
|
-
it { Phony.split('46111234567').should == ['46', '11', '
|
537
|
-
it { Phony.split('46721234567').should == ['46', '72', '
|
538
|
-
it { Phony.split('46125123456').should == ['46', '125', '
|
535
|
+
it { Phony.split('46812345678').should == ['46', '8', '123', '45', '678'] } # Stockholm
|
536
|
+
it { Phony.split('46111234567').should == ['46', '11', '123', '45', '67'] }
|
537
|
+
it { Phony.split('46721234567').should == ['46', '72', '123', '45', '67'] } # mobile
|
538
|
+
it { Phony.split('46125123456').should == ['46', '125', '123', '456'] }
|
539
539
|
end
|
540
540
|
describe 'Switzerland' do
|
541
541
|
it { Phony.split('41443643532').should == ['41', '44', '364', '35', '32'] } # Zurich (usually)
|
@@ -22,8 +22,8 @@ describe Phony::LocalSplitters::Fixed do
|
|
22
22
|
it 'splits correctly' do
|
23
23
|
@splitter.split('3643532').should == ['364','35','32']
|
24
24
|
end
|
25
|
-
it 'splits correctly even when the number is too long' do
|
26
|
-
@splitter.split('3643532111').should == ['364','35','
|
25
|
+
it 'splits correctly even when the number is too long (but leniently)' do
|
26
|
+
@splitter.split('3643532111').should == ['364','35','32111']
|
27
27
|
end
|
28
28
|
it 'splits correctly even when the number is too short' do
|
29
29
|
@splitter.split('364353').should == ['364','35','3']
|
@@ -36,8 +36,8 @@ describe Phony::LocalSplitters::Fixed do
|
|
36
36
|
it 'splits correctly' do
|
37
37
|
@splitter.split('3643532').should == ['364','35','32']
|
38
38
|
end
|
39
|
-
it 'splits correctly even when the number is too long' do
|
40
|
-
@splitter.split('3643532111').should == ['364','35','
|
39
|
+
it 'splits correctly even when the number is too long (but leniently)' do
|
40
|
+
@splitter.split('3643532111').should == ['364','35','32111']
|
41
41
|
end
|
42
42
|
it 'splits correctly even when the number is too short' do
|
43
43
|
@splitter.split('364353').should == ['364','35','3']
|
@@ -21,7 +21,7 @@ describe 'validations' do
|
|
21
21
|
|
22
22
|
shortest = correct.min_by{|x| x.scan(/\d/).length}
|
23
23
|
longest = correct.max_by{|x| x.scan(/\d/).length}
|
24
|
-
incorrect = [shortest.sub(/\d\s*\z/, ''), longest + '0']
|
24
|
+
incorrect = [shortest.sub(/\d\s*\z/, '')] # , longest + '0']
|
25
25
|
|
26
26
|
correct.each do |value|
|
27
27
|
Phony.plausible?(value).should be_true,
|
@@ -156,18 +156,20 @@ describe 'validations' do
|
|
156
156
|
Phony.plausible?('+39 335 123').should be_false
|
157
157
|
end
|
158
158
|
it 'is correct for German numbers' do
|
159
|
+
Phony.plausible?('+49 209 169 - 0').should be_true # Gelsenkirchen
|
160
|
+
Phony.plausible?('+49 209 169 - 3530').should be_true # Gelsenkirchen
|
159
161
|
Phony.plausible?('+49 40 123 45678').should be_true
|
160
|
-
Phony.plausible?('+49 40 123 456789').should
|
162
|
+
Phony.plausible?('+49 40 123 456789').should be_true # TODO ?
|
161
163
|
Phony.plausible?('+49 171 123 4567').should be_true
|
162
164
|
Phony.plausible?('+49 171 123 45678').should be_false
|
163
165
|
Phony.plausible?('+49 177 123 1234').should be_true
|
164
166
|
Phony.plausible?('+49 176 123 12345').should be_true
|
165
167
|
# Phony.plausible?('+49 991 1234').should be_true # stricter 3 digit ndc rules
|
166
|
-
|
168
|
+
Phony.plausible?('+49 2041 123').should be_true # Grandfathered numbers.
|
167
169
|
Phony.plausible?('+49 2041 1234567').should be_true
|
168
|
-
Phony.plausible?('+49 2041 12345689').should be_false
|
170
|
+
# Phony.plausible?('+49 2041 12345689').should be_false # Could be a call-through number
|
169
171
|
Phony.plausible?('+49 31234 123456').should be_true
|
170
|
-
Phony.plausible?('+49 31234 1234567').should be_false
|
172
|
+
# Phony.plausible?('+49 31234 1234567').should be_false # Could be a call-through number
|
171
173
|
end
|
172
174
|
|
173
175
|
it 'is correct for Isralian numbers' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Hanke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ! 'Fast international phone number (E164 standard) normalizing, splitting
|
14
14
|
and formatting. Lots of formatting options: International (+.., 00..), national
|