phone 0.9.9.3 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.rdoc +30 -21
- data/data/phone_countries.yml +2 -1
- data/lib/country.rb +30 -0
- data/lib/phone.rb +229 -226
- data/test/countries/de_test.rb +5 -0
- data/test/countries/fr_test.rb +4 -0
- data/test/countries/hr_test.rb +22 -22
- data/test/countries/pt_test.rb +129 -0
- data/test/countries/us_test.rb +3 -3
- data/test/extension_test.rb +3 -3
- data/test/phone_test.rb +30 -30
- data/test/test_helper.rb +1 -1
- metadata +6 -9
- data/lib/phone_country.rb +0 -27
data/Readme.rdoc
CHANGED
@@ -9,34 +9,40 @@ You can install the phone library as a gem
|
|
9
9
|
Or as a Rails plugin
|
10
10
|
script/plugin install git://github.com/carr/phone.git
|
11
11
|
|
12
|
+
== Updates in v 1.0
|
13
|
+
|
14
|
+
The biggest updating is the namespacing problem fixed that a lot of people were having. You now use phone by refering to
|
15
|
+
|
16
|
+
Phoner::Phone
|
17
|
+
|
12
18
|
== Initializing
|
13
19
|
You can initialize a new phone object with the number, area code, country code and extension number
|
14
20
|
|
15
|
-
Phone.new('5125486', '91', '385')
|
21
|
+
Phoner::Phone.new('5125486', '91', '385')
|
16
22
|
or
|
17
|
-
Phone.new(:number => '5125486', :area_code => '91', :country_code => '385', :extension => '143')
|
23
|
+
Phoner::Phone.new(:number => '5125486', :area_code => '91', :country_code => '385', :extension => '143')
|
18
24
|
|
19
25
|
== Parsing
|
20
|
-
You can create a new phone object by parsing from a string. Phone does it's best to detect the country and area codes:
|
21
|
-
Phone.parse '+385915125486'
|
22
|
-
Phone.parse '00385915125486'
|
26
|
+
You can create a new phone object by parsing from a string. Phoner::Phone does it's best to detect the country and area codes:
|
27
|
+
Phoner::Phone.parse '+385915125486'
|
28
|
+
Phoner::Phone.parse '00385915125486'
|
23
29
|
|
24
30
|
If the country or area code isn't given in the string, you must set it, otherwise it doesn't work:
|
25
|
-
Phone.parse '091/512-5486', :country_code => '385'
|
26
|
-
Phone.parse '(091) 512 5486', :country_code => '385'
|
31
|
+
Phoner::Phone.parse '091/512-5486', :country_code => '385'
|
32
|
+
Phoner::Phone.parse '(091) 512 5486', :country_code => '385'
|
27
33
|
|
28
34
|
If you feel that it's tedious, set the default country code once (in your config/environment.rb):
|
29
|
-
Phone.default_country_code = '385'
|
30
|
-
Phone.parse '091/512-5486'
|
31
|
-
Phone.parse '(091) 512 5486'
|
35
|
+
Phoner::Phone.default_country_code = '385'
|
36
|
+
Phoner::Phone.parse '091/512-5486'
|
37
|
+
Phoner::Phone.parse '(091) 512 5486'
|
32
38
|
|
33
39
|
Same goes for the area code:
|
34
|
-
Phone.parse '451-588', :country_code => '385', :area_code => '47'
|
40
|
+
Phoner::Phone.parse '451-588', :country_code => '385', :area_code => '47'
|
35
41
|
or
|
36
|
-
Phone.default_country_code = '385'
|
37
|
-
Phone.default_area_code = '47'
|
42
|
+
Phoner::Phone.default_country_code = '385'
|
43
|
+
Phoner::Phone.default_area_code = '47'
|
38
44
|
|
39
|
-
Phone.parse '451-588'
|
45
|
+
Phoner::Phone.parse '451-588'
|
40
46
|
|
41
47
|
=== Automatic country and area code detection
|
42
48
|
Like it's stated above, Phone does it's best to automatically detect the country and area code while parsing. Do do this,
|
@@ -45,12 +51,12 @@ phone uses data stored in <tt>data/countries.yml</tt>.
|
|
45
51
|
Each country code can have a regular expression named <tt>area_code</tt> that describes how the area code for that
|
46
52
|
particular country looks like.
|
47
53
|
|
48
|
-
If an <tt>area_code</tt> regular expression isn't specified, the default, <tt>Phone::DEFAULT_AREA_CODE</tt> (correct for
|
54
|
+
If an <tt>area_code</tt> regular expression isn't specified, the default, <tt>Phoner::Phone::DEFAULT_AREA_CODE</tt> (correct for
|
49
55
|
the US) is used.
|
50
56
|
|
51
57
|
== Validating
|
52
58
|
Validating is very relaxed, basically it strips out everything that's not a number or '+' character:
|
53
|
-
Phone.valid? 'blabla 091/512-5486 blabla'
|
59
|
+
Phoner::Phone.valid? 'blabla 091/512-5486 blabla'
|
54
60
|
|
55
61
|
== Formatting
|
56
62
|
Formating is done via the <tt>format</tt> method. The method accepts a <tt>Symbol</tt> or a <tt>String</tt>.
|
@@ -61,22 +67,22 @@ When given a string, it interpolates the string with the following fields:
|
|
61
67
|
* %a - area_code (91)
|
62
68
|
* %A - area_code with leading zero (091)
|
63
69
|
* %n - number (5125486)
|
64
|
-
* %f - first @@n1_length characters of number (configured through Phone.n1_length), default is 3 (512)
|
70
|
+
* %f - first @@n1_length characters of number (configured through Phoner::Phone.n1_length), default is 3 (512)
|
65
71
|
* %l - last characters of number (5486)
|
66
72
|
* %x - the extension number
|
67
73
|
|
68
|
-
pn = Phone.parse('+385915125486')
|
74
|
+
pn = Phoner::Phone.parse('+385915125486')
|
69
75
|
pn.to_s # => "+385915125486"
|
70
76
|
pn.format("%A/%f-%l") # => "091/512-5486"
|
71
77
|
pn.format("+ %c (%a) %n") # => "+ 385 (91) 5125486"
|
72
78
|
|
73
|
-
When given a symbol it is used as a lookup for the format in the <tt>Phone.named_formats</tt> hash.
|
79
|
+
When given a symbol it is used as a lookup for the format in the <tt>Phoner::Phone.named_formats</tt> hash.
|
74
80
|
pn.format(:europe) # => "+385 (0) 91 512 5486"
|
75
81
|
pn.format(:us) # => "(234) 123 4567"
|
76
82
|
pn.format(:default_with_extension) # => "+3851234567x143"
|
77
83
|
|
78
84
|
You can add your own custom named formats like so:
|
79
|
-
Phone.named_formats[:short] = '%A/%n1-%n2'
|
85
|
+
Phoner::Phone.named_formats[:short] = '%A/%n1-%n2'
|
80
86
|
pn.format(:short) # => 091/512-5486
|
81
87
|
|
82
88
|
= TODO
|
@@ -99,8 +105,11 @@ Currently tested on:
|
|
99
105
|
[US] United States
|
100
106
|
[ZA] South Africa
|
101
107
|
|
108
|
+
= Known issues
|
109
|
+
There's an issue with Germany and area codes.
|
110
|
+
|
102
111
|
= Author
|
103
|
-
Copyright © 2010 Tomislav Car, Infinum
|
112
|
+
Copyright © 2010 Tomislav Car, {Infinum}[http://www.infinumdigital.com]
|
104
113
|
|
105
114
|
= Contributors
|
106
115
|
Don Morrison, Michael Squires, Todd Eichel (Fooala, Inc.), chipiga, Etienne Samson, Luke Randall
|
data/data/phone_countries.yml
CHANGED
@@ -528,7 +528,7 @@
|
|
528
528
|
:char_3_code: FR
|
529
529
|
:name: France
|
530
530
|
:international_dialing_prefix: "0"
|
531
|
-
:area_code: "[1-
|
531
|
+
:area_code: "[1-7,8-9]"
|
532
532
|
"995":
|
533
533
|
:country_code: "995"
|
534
534
|
:national_dialing_prefix: 8*
|
@@ -957,6 +957,7 @@
|
|
957
957
|
:char_3_code: PT
|
958
958
|
:name: Portugal
|
959
959
|
:international_dialing_prefix: "0"
|
960
|
+
:area_code: "21|22|2[3-9][1-9]|70[78]|80[089]|9[136]|92[1-9]"
|
960
961
|
"973":
|
961
962
|
:country_code: "973"
|
962
963
|
:national_dialing_prefix: None
|
data/lib/country.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Phoner
|
2
|
+
class Country < Struct.new(:name, :country_code, :char_2_code, :area_code)
|
3
|
+
cattr_accessor :all
|
4
|
+
|
5
|
+
def self.load
|
6
|
+
return @@all if @@all.present?
|
7
|
+
|
8
|
+
data_file = File.join(File.dirname(__FILE__), '..', 'data', 'phone_countries.yml')
|
9
|
+
|
10
|
+
@@all = {}
|
11
|
+
YAML.load(File.read(data_file)).each_pair do |key, c|
|
12
|
+
@@all[key] = Country.new(c[:name], c[:country_code], c[:char_2_code], c[:area_code])
|
13
|
+
end
|
14
|
+
@@all
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
name
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.find_by_country_code(code)
|
22
|
+
@@all[code]
|
23
|
+
end
|
24
|
+
|
25
|
+
def country_code_regexp
|
26
|
+
Regexp.new("^[+]#{country_code}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/phone.rb
CHANGED
@@ -10,240 +10,243 @@
|
|
10
10
|
# Phone.default_area_code
|
11
11
|
#
|
12
12
|
require File.join(File.dirname(__FILE__), 'support') unless defined? ActiveSupport
|
13
|
-
require File.join(File.dirname(__FILE__), '
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
self.number = hash_or_args[ keys[:number] ]
|
45
|
-
self.area_code = hash_or_args[ keys[:area_code] ] || self.default_area_code
|
46
|
-
self.country_code = hash_or_args[ keys[:country_code] ] || self.default_country_code
|
47
|
-
self.extension = hash_or_args[ keys[:extension] ]
|
48
|
-
|
49
|
-
raise "Must enter number" if self.number.blank?
|
50
|
-
raise "Must enter area code or set default area code" if self.area_code.blank?
|
51
|
-
raise "Must enter country code or set default country code" if self.country_code.blank?
|
52
|
-
end
|
53
|
-
|
54
|
-
# create a new phone number by parsing a string
|
55
|
-
# the format of the string is detect automatically (from FORMATS)
|
56
|
-
def self.parse(string, options={})
|
57
|
-
if string.present?
|
58
|
-
PhoneCountry.load
|
59
|
-
extension = extract_extension(string)
|
60
|
-
string = normalize(string)
|
61
|
-
|
62
|
-
options[:country_code] ||= self.default_country_code
|
63
|
-
options[:area_code] ||= self.default_area_code
|
64
|
-
|
65
|
-
parts = split_to_parts(string, options)
|
66
|
-
|
67
|
-
pn = Phone.new(parts) if parts
|
68
|
-
if pn.present? and extension.present?
|
69
|
-
pn.extension = extension
|
13
|
+
require File.join(File.dirname(__FILE__), 'country')
|
14
|
+
|
15
|
+
module Phoner
|
16
|
+
class Phone
|
17
|
+
NUMBER = '([0-9]{1,8})$'
|
18
|
+
DEFAULT_AREA_CODE = '[2-9][0-8][0-9]' # USA
|
19
|
+
|
20
|
+
attr_accessor :country_code, :area_code, :number, :extension
|
21
|
+
|
22
|
+
cattr_accessor :default_country_code
|
23
|
+
cattr_accessor :default_area_code
|
24
|
+
cattr_accessor :named_formats
|
25
|
+
|
26
|
+
# length of first number part (using multi number format)
|
27
|
+
cattr_accessor :n1_length
|
28
|
+
# default length of first number part
|
29
|
+
@@n1_length = 3
|
30
|
+
|
31
|
+
@@named_formats = {
|
32
|
+
:default => "+%c%a%n",
|
33
|
+
:default_with_extension => "+%c%a%nx%x",
|
34
|
+
:europe => '+%c (0) %a %f %l',
|
35
|
+
:us => "(%a) %f-%l"
|
36
|
+
}
|
37
|
+
|
38
|
+
def initialize(*hash_or_args)
|
39
|
+
if hash_or_args.first.is_a?(Hash)
|
40
|
+
hash_or_args = hash_or_args.first
|
41
|
+
keys = {:number => :number, :area_code => :area_code, :country_code => :country_code, :extension => :extension}
|
42
|
+
else
|
43
|
+
keys = {:number => 0, :area_code => 1, :country_code => 2, :extension => 3}
|
70
44
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
45
|
+
|
46
|
+
self.number = hash_or_args[ keys[:number] ]
|
47
|
+
self.area_code = hash_or_args[ keys[:area_code] ] || self.default_area_code
|
48
|
+
self.country_code = hash_or_args[ keys[:country_code] ] || self.default_country_code
|
49
|
+
self.extension = hash_or_args[ keys[:extension] ]
|
50
|
+
|
51
|
+
raise "Must enter number" if self.number.blank?
|
52
|
+
raise "Must enter area code or set default area code" if self.area_code.blank?
|
53
|
+
raise "Must enter country code or set default country code" if self.country_code.blank?
|
54
|
+
end
|
55
|
+
|
56
|
+
# create a new phone number by parsing a string
|
57
|
+
# the format of the string is detect automatically (from FORMATS)
|
58
|
+
def self.parse(string, options={})
|
59
|
+
if string.present?
|
60
|
+
Country.load
|
61
|
+
extension = extract_extension(string)
|
62
|
+
string = normalize(string)
|
63
|
+
|
64
|
+
options[:country_code] ||= self.default_country_code
|
65
|
+
options[:area_code] ||= self.default_area_code
|
66
|
+
|
67
|
+
parts = split_to_parts(string, options)
|
68
|
+
|
69
|
+
pn = Phone.new(parts) if parts
|
70
|
+
if pn.present? and extension.present?
|
71
|
+
pn.extension = extension
|
72
|
+
end
|
73
|
+
return pn
|
94
74
|
end
|
95
75
|
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
76
|
+
|
77
|
+
# is this string a valid phone number?
|
78
|
+
def self.valid?(string)
|
79
|
+
begin
|
80
|
+
parse(string).present?
|
81
|
+
rescue RuntimeError # if we encountered exceptions (missing country code, missing area code etc)
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# split string into hash with keys :country_code, :area_code and :number
|
87
|
+
def self.split_to_parts(string, options = {})
|
88
|
+
country = detect_country(string)
|
89
|
+
|
90
|
+
if country
|
91
|
+
options[:country_code] = country.country_code
|
92
|
+
string = string.gsub(country.country_code_regexp, '0')
|
100
93
|
else
|
101
|
-
|
94
|
+
if options[:country_code]
|
95
|
+
country = Country.find_by_country_code options[:country_code]
|
96
|
+
end
|
102
97
|
end
|
98
|
+
|
99
|
+
if country.nil?
|
100
|
+
if options[:country_code].nil?
|
101
|
+
raise "Must enter country code or set default country code"
|
102
|
+
else
|
103
|
+
raise "Could not find country with country code #{options[:country_code]}"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
format = detect_format(string, country)
|
108
|
+
|
109
|
+
return nil if format.nil?
|
110
|
+
|
111
|
+
parts = string.match formats(country)[format]
|
112
|
+
|
113
|
+
case format
|
114
|
+
when :short
|
115
|
+
{:number => parts[2], :area_code => parts[1], :country_code => options[:country_code]}
|
116
|
+
when :really_short
|
117
|
+
{:number => parts[1], :area_code => options[:area_code], :country_code => options[:country_code]}
|
118
|
+
end
|
103
119
|
end
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
{:number => parts[2], :area_code => parts[1], :country_code => options[:country_code]}
|
114
|
-
when :really_short
|
115
|
-
{:number => parts[1], :area_code => options[:area_code], :country_code => options[:country_code]}
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# detect country from the string entered
|
120
|
-
def self.detect_country(string)
|
121
|
-
detected_country = nil
|
122
|
-
# find if the number has a country code
|
123
|
-
PhoneCountry.all.each_pair do |country_code, country|
|
124
|
-
if string =~ country.country_code_regexp
|
125
|
-
detected_country = country
|
120
|
+
|
121
|
+
# detect country from the string entered
|
122
|
+
def self.detect_country(string)
|
123
|
+
detected_country = nil
|
124
|
+
# find if the number has a country code
|
125
|
+
Country.all.each_pair do |country_code, country|
|
126
|
+
if string =~ country.country_code_regexp
|
127
|
+
detected_country = country
|
128
|
+
end
|
126
129
|
end
|
130
|
+
detected_country
|
127
131
|
end
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
:really_short => Regexp.new('^' + NUMBER)
|
138
|
-
}
|
139
|
-
end
|
140
|
-
|
141
|
-
# detect format (from FORMATS) of input string
|
142
|
-
def self.detect_format(string_with_number, country)
|
143
|
-
arr = []
|
144
|
-
formats(country).each_pair do |format, regexp|
|
145
|
-
arr << format if string_with_number =~ regexp
|
146
|
-
end
|
147
|
-
|
148
|
-
# raise "Detected more than 1 format for #{string_with_number}" if arr.size > 1
|
149
|
-
if arr.length > 1
|
150
|
-
# puts %Q{detect_format: more than one format found - #{arr.inspect}}
|
151
|
-
return :really_short
|
152
|
-
end
|
153
|
-
arr.first
|
154
|
-
end
|
155
|
-
|
156
|
-
# fix string so it's easier to parse, remove extra characters etc.
|
157
|
-
def self.normalize(string_with_number)
|
158
|
-
string_with_number.gsub("(0)", "").gsub(/[^0-9+]/, '').gsub(/^00/, '+')
|
159
|
-
end
|
160
|
-
|
161
|
-
# pull off anything that look like an extension
|
162
|
-
#TODO: refactor things so this doesn't change string as a side effect
|
163
|
-
#
|
164
|
-
def self.extract_extension(string)
|
165
|
-
return nil if string.nil?
|
166
|
-
if string.sub! /[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(*([-0-9]{1,})\)*#?$/i, ''
|
167
|
-
extension = $2
|
168
|
-
return extension
|
132
|
+
|
133
|
+
def self.formats(country)
|
134
|
+
area_code_regexp = country.area_code || DEFAULT_AREA_CODE
|
135
|
+
{
|
136
|
+
# 047451588, 013668734
|
137
|
+
:short => Regexp.new('^0?(' + area_code_regexp + ')' + NUMBER),
|
138
|
+
# 451588
|
139
|
+
:really_short => Regexp.new('^' + NUMBER)
|
140
|
+
}
|
169
141
|
end
|
142
|
+
|
143
|
+
# detect format (from FORMATS) of input string
|
144
|
+
def self.detect_format(string_with_number, country)
|
145
|
+
arr = []
|
146
|
+
formats(country).each_pair do |format, regexp|
|
147
|
+
arr << format if string_with_number =~ regexp
|
148
|
+
end
|
149
|
+
|
150
|
+
# raise "Detected more than 1 format for #{string_with_number}" if arr.size > 1
|
151
|
+
if arr.length > 1
|
152
|
+
# puts %Q{detect_format: more than one format found - #{arr.inspect}}
|
153
|
+
return :really_short
|
154
|
+
end
|
155
|
+
arr.first
|
156
|
+
end
|
157
|
+
|
158
|
+
# fix string so it's easier to parse, remove extra characters etc.
|
159
|
+
def self.normalize(string_with_number)
|
160
|
+
string_with_number.gsub("(0)", "").gsub(/[^0-9+]/, '').gsub(/^00/, '+')
|
161
|
+
end
|
162
|
+
|
163
|
+
# pull off anything that look like an extension
|
164
|
+
#TODO: refactor things so this doesn't change string as a side effect
|
165
|
+
#
|
166
|
+
def self.extract_extension(string)
|
167
|
+
return nil if string.nil?
|
168
|
+
if string.sub! /[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(*([-0-9]{1,})\)*#?$/i, ''
|
169
|
+
extension = $2
|
170
|
+
return extension
|
171
|
+
end
|
172
|
+
#
|
173
|
+
# We already returned any recognizable extension.
|
174
|
+
# However, we might still have extra junk to the right
|
175
|
+
# of the phone number proper, so just chop it off.
|
176
|
+
#
|
177
|
+
idx = string.rindex(/[0-9]/)
|
178
|
+
return nil if idx.nil?
|
179
|
+
return nil if idx == (string.length - 1) # at the end
|
180
|
+
string.slice!((idx+1)..-1) # chop it
|
181
|
+
return nil
|
182
|
+
end
|
183
|
+
|
184
|
+
# format area_code with trailing zero (e.g. 91 as 091)
|
185
|
+
# format area_code with trailing zero (e.g. 91 as 091)
|
186
|
+
def area_code_long
|
187
|
+
"0" + area_code if area_code
|
188
|
+
end
|
189
|
+
|
190
|
+
# first n characters of :number
|
191
|
+
def number1
|
192
|
+
number[0...self.class.n1_length]
|
193
|
+
end
|
194
|
+
|
195
|
+
# everything left from number after the first n characters (see number1)
|
196
|
+
def number2
|
197
|
+
n2_length = number.size - self.class.n1_length
|
198
|
+
number[-n2_length, n2_length]
|
199
|
+
end
|
200
|
+
|
201
|
+
# Formats the phone number.
|
202
|
+
#
|
203
|
+
# if the method argument is a String, it is used as a format string, with the following fields being interpolated:
|
170
204
|
#
|
171
|
-
#
|
172
|
-
#
|
173
|
-
#
|
205
|
+
# * %c - country_code (385)
|
206
|
+
# * %a - area_code (91)
|
207
|
+
# * %A - area_code with leading zero (091)
|
208
|
+
# * %n - number (5125486)
|
209
|
+
# * %f - first @@n1_length characters of number (configured through Phone.n1_length), default is 3 (512)
|
210
|
+
# * %l - last characters of number (5486)
|
211
|
+
# * %x - entire extension
|
174
212
|
#
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
number
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
raise "The format #{fmt} doesn't exist'" unless named_formats.has_key?(fmt)
|
216
|
-
format_number named_formats[fmt]
|
217
|
-
else
|
218
|
-
format_number(fmt)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
# the default format is "+%c%a%n"
|
223
|
-
def to_s
|
224
|
-
format(:default)
|
225
|
-
end
|
226
|
-
|
227
|
-
# does this number belong to the default country code?
|
228
|
-
def has_default_country_code?
|
229
|
-
country_code == self.class.default_country_code
|
230
|
-
end
|
231
|
-
|
232
|
-
# does this number belong to the default area code?
|
233
|
-
def has_default_area_code?
|
234
|
-
area_code == self.class.default_area_code
|
235
|
-
end
|
236
|
-
|
237
|
-
private
|
238
|
-
|
239
|
-
def format_number(fmt)
|
240
|
-
result = fmt.gsub("%c", country_code || "").
|
241
|
-
gsub("%a", area_code || "").
|
242
|
-
gsub("%A", area_code_long || "").
|
243
|
-
gsub("%n", number || "").
|
244
|
-
gsub("%f", number1 || "").
|
245
|
-
gsub("%l", number2 || "").
|
246
|
-
gsub("%x", extension || "")
|
247
|
-
return result
|
248
|
-
end
|
249
|
-
end
|
213
|
+
# if the method argument is a Symbol, it is used as a lookup key for a format String in Phone.named_formats
|
214
|
+
# pn.format(:europe)
|
215
|
+
def format(fmt)
|
216
|
+
if fmt.is_a?(Symbol)
|
217
|
+
raise "The format #{fmt} doesn't exist'" unless named_formats.has_key?(fmt)
|
218
|
+
format_number named_formats[fmt]
|
219
|
+
else
|
220
|
+
format_number(fmt)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# the default format is "+%c%a%n"
|
225
|
+
def to_s
|
226
|
+
format(:default)
|
227
|
+
end
|
228
|
+
|
229
|
+
# does this number belong to the default country code?
|
230
|
+
def has_default_country_code?
|
231
|
+
country_code == self.class.default_country_code
|
232
|
+
end
|
233
|
+
|
234
|
+
# does this number belong to the default area code?
|
235
|
+
def has_default_area_code?
|
236
|
+
area_code == self.class.default_area_code
|
237
|
+
end
|
238
|
+
|
239
|
+
private
|
240
|
+
|
241
|
+
def format_number(fmt)
|
242
|
+
result = fmt.gsub("%c", country_code || "").
|
243
|
+
gsub("%a", area_code || "").
|
244
|
+
gsub("%A", area_code_long || "").
|
245
|
+
gsub("%n", number || "").
|
246
|
+
gsub("%f", number1 || "").
|
247
|
+
gsub("%l", number2 || "").
|
248
|
+
gsub("%x", extension || "")
|
249
|
+
return result
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
data/test/countries/de_test.rb
CHANGED
@@ -11,4 +11,9 @@ class DETest < Test::Unit::TestCase
|
|
11
11
|
parse_test('+49 162 3499558', '49', '162', '3499558')
|
12
12
|
end
|
13
13
|
|
14
|
+
# TODO: germany has 2-5 length area codes, that's why this test doesn't go through
|
15
|
+
#def test_country_side
|
16
|
+
# parse_test('+49 (0)6120 59511-23', '49', '6120', '5951123')
|
17
|
+
#end
|
18
|
+
|
14
19
|
end
|
data/test/countries/fr_test.rb
CHANGED
@@ -10,6 +10,10 @@ class FRTest < Test::Unit::TestCase
|
|
10
10
|
def test_mobile
|
11
11
|
parse_test('+33 6 11 22 33 44', '33', '6', '11223344')
|
12
12
|
end
|
13
|
+
|
14
|
+
def test_mobile_07
|
15
|
+
parse_test('+33 7 11 22 33 44', '33', '7', '11223344')
|
16
|
+
end
|
13
17
|
|
14
18
|
def test_voip
|
15
19
|
parse_test('+33 9 11 22 33 44', '33', '9', '11223344')
|
data/test/countries/hr_test.rb
CHANGED
@@ -28,49 +28,49 @@ class HRTest < Test::Unit::TestCase
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_short_without_special_characters_with_country
|
31
|
-
Phone.default_country_code = '385'
|
31
|
+
Phoner::Phone.default_country_code = '385'
|
32
32
|
parse_test('044885047', '385', '44', '885047')
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_zagreb_short_without_special_characters_with_country
|
36
|
-
Phone.default_country_code = '385'
|
36
|
+
Phoner::Phone.default_country_code = '385'
|
37
37
|
parse_test('013668734', '385', '1', '3668734')
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_long_with_zero_in_brackets
|
41
|
-
Phone.default_country_code = nil
|
41
|
+
Phoner::Phone.default_country_code = nil
|
42
42
|
parse_test('+385 (0)1 366 8111', '385', '1', '3668111')
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_has_default_country_code
|
46
|
-
Phone.default_country_code = '385'
|
46
|
+
Phoner::Phone.default_country_code = '385'
|
47
47
|
|
48
|
-
assert_equal Phone.parse('+38547451588').has_default_country_code?, true
|
49
|
-
assert_equal Phone.parse('+38647451588').has_default_country_code?, false
|
48
|
+
assert_equal Phoner::Phone.parse('+38547451588').has_default_country_code?, true
|
49
|
+
assert_equal Phoner::Phone.parse('+38647451588').has_default_country_code?, false
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_has_default_area_code
|
53
|
-
Phone.default_country_code = '385'
|
54
|
-
Phone.default_area_code = '47'
|
53
|
+
Phoner::Phone.default_country_code = '385'
|
54
|
+
Phoner::Phone.default_area_code = '47'
|
55
55
|
|
56
|
-
assert_equal Phone.parse('047/451-588').has_default_area_code?, true
|
57
|
-
assert_equal Phone.parse('032/336-1456').has_default_area_code?, false
|
56
|
+
assert_equal Phoner::Phone.parse('047/451-588').has_default_area_code?, true
|
57
|
+
assert_equal Phoner::Phone.parse('032/336-1456').has_default_area_code?, false
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_validates
|
61
|
-
Phone.default_country_code = nil
|
62
|
-
assert_equal Phone.valid?('00385915125486'), true
|
63
|
-
assert_equal Phone.valid?('+385915125486'), true
|
64
|
-
assert_equal Phone.valid?('+385 (91) 512 5486'), true
|
65
|
-
assert_equal Phone.valid?('+38547451588'), true
|
61
|
+
Phoner::Phone.default_country_code = nil
|
62
|
+
assert_equal Phoner::Phone.valid?('00385915125486'), true
|
63
|
+
assert_equal Phoner::Phone.valid?('+385915125486'), true
|
64
|
+
assert_equal Phoner::Phone.valid?('+385 (91) 512 5486'), true
|
65
|
+
assert_equal Phoner::Phone.valid?('+38547451588'), true
|
66
66
|
|
67
|
-
Phone.default_country_code = '385'
|
68
|
-
assert_equal Phone.valid?('0915125486'), true
|
69
|
-
assert_equal Phone.valid?('091/512-5486'), true
|
70
|
-
assert_equal Phone.valid?('091/512-5486'), true
|
71
|
-
assert_equal Phone.valid?('091 512 54 86'), true
|
72
|
-
assert_equal Phone.valid?('091-512-54-86'), true
|
73
|
-
assert_equal Phone.valid?('047/451-588'), true
|
67
|
+
Phoner::Phone.default_country_code = '385'
|
68
|
+
assert_equal Phoner::Phone.valid?('0915125486'), true
|
69
|
+
assert_equal Phoner::Phone.valid?('091/512-5486'), true
|
70
|
+
assert_equal Phoner::Phone.valid?('091/512-5486'), true
|
71
|
+
assert_equal Phoner::Phone.valid?('091 512 54 86'), true
|
72
|
+
assert_equal Phoner::Phone.valid?('091-512-54-86'), true
|
73
|
+
assert_equal Phoner::Phone.valid?('047/451-588'), true
|
74
74
|
end
|
75
75
|
|
76
76
|
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
## Portugal
|
4
|
+
# source 1: http://pt.wikipedia.org/wiki/N%C3%BAmeros_de_telefone_em_Portugal
|
5
|
+
# source 2: http://www.anacom.pt/render.jsp?categoryId=279035
|
6
|
+
|
7
|
+
class PTTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
### Prefixes followed by corresponding tests
|
10
|
+
|
11
|
+
## 01-09: reserved for future use
|
12
|
+
## 1: Short Numbers
|
13
|
+
|
14
|
+
## 2: Landline / fixed numbers
|
15
|
+
|
16
|
+
## two digits landlines
|
17
|
+
# 21: Lisbon (Lisboa)
|
18
|
+
def test_lisbon
|
19
|
+
parse_test('+351 21 123 4567', '351', '21', '1234567')
|
20
|
+
end
|
21
|
+
# 22: Oporto (Porto)
|
22
|
+
def test_oporto
|
23
|
+
parse_test('+351 22 123 4567', '351', '22', '1234567')
|
24
|
+
end
|
25
|
+
|
26
|
+
## three digits landlines
|
27
|
+
# 231: Mealhada
|
28
|
+
def test_mealhada
|
29
|
+
parse_test('+351 231 123456', '351', '231', '123456')
|
30
|
+
end
|
31
|
+
|
32
|
+
# 232-295 (Viseu - Angra do Heroismo)
|
33
|
+
def test_viseu
|
34
|
+
parse_test('+351 232 123456', '351', '232', '123456')
|
35
|
+
end
|
36
|
+
def test_angra
|
37
|
+
parse_test('+351 295 123456', '351', '295', '123456')
|
38
|
+
end
|
39
|
+
|
40
|
+
# 296: Ponta Delgada
|
41
|
+
def test_pontadelgada
|
42
|
+
parse_test('+351 296 123456', '351', '296', '123456')
|
43
|
+
end
|
44
|
+
|
45
|
+
## 3: Nomad services
|
46
|
+
## 4: Not used
|
47
|
+
## 5: Free
|
48
|
+
## 6: Audiotext service, data network access...
|
49
|
+
|
50
|
+
## 7: Premium numbers ("Universal access numbers")
|
51
|
+
|
52
|
+
# 707-708: Premium Numbers
|
53
|
+
def test_707
|
54
|
+
Phoner::Phone.default_country_code = '351'
|
55
|
+
parse_test('707 123 456', '351', '707', '123456')
|
56
|
+
end
|
57
|
+
|
58
|
+
## 8: Free toll numbers
|
59
|
+
|
60
|
+
# 800: Numero verde ("Green Number")
|
61
|
+
def test_800
|
62
|
+
Phoner::Phone.default_country_code = '351'
|
63
|
+
parse_test('800 123 456', '351', '800', '123456')
|
64
|
+
end
|
65
|
+
# 808: Numero azul ("Blue Number")
|
66
|
+
def test_808
|
67
|
+
Phoner::Phone.default_country_code = '351'
|
68
|
+
parse_test('808 123 456', '351', '808', '123456')
|
69
|
+
end
|
70
|
+
# 809: Custo partilhado ("Shared cost")
|
71
|
+
def test_809
|
72
|
+
Phoner::Phone.default_country_code = '351'
|
73
|
+
parse_test('809 123 456', '351', '809', '123456')
|
74
|
+
end
|
75
|
+
|
76
|
+
## 9: Mobile networks
|
77
|
+
|
78
|
+
## two-digits mobile networks
|
79
|
+
# 91: Vodafone
|
80
|
+
def test_vodafone
|
81
|
+
parse_test('+351 91 1234567', '351', '91', '1234567')
|
82
|
+
end
|
83
|
+
# 93: Optimus
|
84
|
+
def test_optimus
|
85
|
+
parse_test('+351 93 1234567', '351', '93', '1234567')
|
86
|
+
end
|
87
|
+
# 96: TMN two-digits
|
88
|
+
def test_tmn
|
89
|
+
parse_test('+351 96 1234567', '351', '96', '1234567')
|
90
|
+
end
|
91
|
+
|
92
|
+
## three-digits mobile networks
|
93
|
+
# 921: TMN three-digits
|
94
|
+
def test_tmn921
|
95
|
+
parse_test('+351 921 123456', '351', '921', '123456')
|
96
|
+
end
|
97
|
+
# 923-926: TMN three-digits (corporate networks)
|
98
|
+
def test_tmn923
|
99
|
+
parse_test('+351 925 123456', '351', '925', '123456')
|
100
|
+
end
|
101
|
+
# 922: Phone-ix
|
102
|
+
def test_phoneix
|
103
|
+
parse_test('+351 922 123456', '351', '922', '123456')
|
104
|
+
end
|
105
|
+
# 929: Zon Mobile
|
106
|
+
def test_zonmobile
|
107
|
+
parse_test('+351 929 123456', '351', '929', '123456')
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_validates
|
111
|
+
Phoner::Phone.default_country_code = nil
|
112
|
+
assert_equal Phoner::Phone.valid?('00351211234567'), true
|
113
|
+
assert_equal Phoner::Phone.valid?('00351911234567'), true
|
114
|
+
assert_equal Phoner::Phone.valid?('+351931234567'), true
|
115
|
+
assert_equal Phoner::Phone.valid?('+351 (911) 123 456'), true
|
116
|
+
assert_equal Phoner::Phone.valid?('+351921123456'), true
|
117
|
+
|
118
|
+
Phoner::Phone.default_country_code = '351'
|
119
|
+
assert_equal Phoner::Phone.valid?('(931) 234-567'), true
|
120
|
+
assert_equal Phoner::Phone.valid?('(211) 234 567'), true
|
121
|
+
assert_equal Phoner::Phone.valid?('232-123-456'), true
|
122
|
+
assert_equal Phoner::Phone.valid?('232123456'), true
|
123
|
+
assert_equal Phoner::Phone.valid?('92 212 34 56'), true
|
124
|
+
assert_equal Phoner::Phone.valid?('221234567'), true
|
125
|
+
assert_equal Phoner::Phone.valid?('708123456'), true
|
126
|
+
assert_equal Phoner::Phone.valid?('800 123 456'), true
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
data/test/countries/us_test.rb
CHANGED
@@ -12,13 +12,13 @@ class USTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_long_with_default_country_code
|
15
|
-
Phone.default_country_code = '1'
|
15
|
+
Phoner::Phone.default_country_code = '1'
|
16
16
|
parse_test('2069735100', '1', '206', '9735100')
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_short_with_default_country_code_and_area_code
|
20
|
-
Phone.default_country_code = '1'
|
21
|
-
Phone.default_area_code = '206'
|
20
|
+
Phoner::Phone.default_country_code = '1'
|
21
|
+
Phoner::Phone.default_area_code = '206'
|
22
22
|
parse_test('9735100', '1', '206', '9735100')
|
23
23
|
end
|
24
24
|
end
|
data/test/extension_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
|
3
3
|
class ExtensionTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def test_parse_usa_long_with_simple_extension
|
6
|
-
pn = Phone.parse "+1 2069735100 x143"
|
6
|
+
pn = Phoner::Phone.parse "+1 2069735100 x143"
|
7
7
|
|
8
8
|
assert_not_nil pn, %Q{parse should pass}
|
9
9
|
assert_equal '9735100', pn.number
|
@@ -13,12 +13,12 @@ class ExtensionTest < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_to_s_with_extension
|
16
|
-
pn = Phone.new '5125486', '91', '385', '143'
|
16
|
+
pn = Phoner::Phone.new '5125486', '91', '385', '143'
|
17
17
|
assert_equal '+385915125486x143', pn.format(:default_with_extension)
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_format_with_extension
|
21
|
-
pn = Phone.new '5125486', '91', '385', '143'
|
21
|
+
pn = Phoner::Phone.new '5125486', '91', '385', '143'
|
22
22
|
assert_equal '(091)/512-5486 x 143', pn.format('(%A)/%f-%l x %x')
|
23
23
|
end
|
24
24
|
|
data/test/phone_test.rb
CHANGED
@@ -3,104 +3,104 @@ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
|
3
3
|
class PhoneTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def test_number_without_country_code_initialize
|
6
|
-
Phone.default_country_code = nil
|
6
|
+
Phoner::Phone.default_country_code = nil
|
7
7
|
|
8
8
|
assert_raise RuntimeError do
|
9
|
-
pn = Phone.new '5125486', '91'
|
9
|
+
pn = Phoner::Phone.new '5125486', '91'
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_number_without_country_and_area_code_initialize
|
14
|
-
Phone.default_country_code = nil
|
15
|
-
Phone.default_area_code = nil
|
14
|
+
Phoner::Phone.default_country_code = nil
|
15
|
+
Phoner::Phone.default_area_code = nil
|
16
16
|
|
17
17
|
assert_raise RuntimeError do
|
18
|
-
pn = Phone.new '451588'
|
18
|
+
pn = Phoner::Phone.new '451588'
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_number_with_default_area_code_initialize
|
23
|
-
Phone.default_country_code = '385'
|
24
|
-
Phone.default_area_code = '47'
|
23
|
+
Phoner::Phone.default_country_code = '385'
|
24
|
+
Phoner::Phone.default_area_code = '47'
|
25
25
|
|
26
|
-
pn = Phone.new '451588'
|
26
|
+
pn = Phoner::Phone.new '451588'
|
27
27
|
assert pn.number == '451588'
|
28
28
|
assert pn.area_code == '47'
|
29
29
|
assert pn.country_code == '385'
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_number_with_default_country_code_initialize
|
33
|
-
Phone.default_country_code = '386'
|
33
|
+
Phoner::Phone.default_country_code = '386'
|
34
34
|
|
35
|
-
pn = Phone.new '5125486', '91'
|
35
|
+
pn = Phoner::Phone.new '5125486', '91'
|
36
36
|
assert pn.number == '5125486'
|
37
37
|
assert pn.area_code == '91'
|
38
38
|
assert pn.country_code == '386'
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_number_with_country_code_initialize
|
42
|
-
Phone.default_country_code = '387'
|
42
|
+
Phoner::Phone.default_country_code = '387'
|
43
43
|
|
44
|
-
pn = Phone.new '5125486', '91', '385'
|
44
|
+
pn = Phoner::Phone.new '5125486', '91', '385'
|
45
45
|
assert pn.number == '5125486'
|
46
46
|
assert pn.area_code == '91'
|
47
47
|
assert pn.country_code == '385'
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_parse_empty
|
51
|
-
assert_equal Phone.parse(''), nil
|
52
|
-
assert_equal Phone.parse(nil), nil
|
51
|
+
assert_equal Phoner::Phone.parse(''), nil
|
52
|
+
assert_equal Phoner::Phone.parse(nil), nil
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_parse_short_without_special_characters_without_country
|
56
|
-
Phone.default_country_code = nil
|
56
|
+
Phoner::Phone.default_country_code = nil
|
57
57
|
|
58
58
|
assert_raise RuntimeError do
|
59
|
-
pn = Phone.parse "0915125486"
|
59
|
+
pn = Phoner::Phone.parse "0915125486"
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_parse_short_with_special_characters_without_country
|
64
|
-
Phone.default_country_code = nil
|
64
|
+
Phoner::Phone.default_country_code = nil
|
65
65
|
|
66
66
|
assert_raise RuntimeError do
|
67
|
-
pn = Phone.parse "091/512-5486"
|
67
|
+
pn = Phoner::Phone.parse "091/512-5486"
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
def test_to_s
|
72
|
-
Phone.default_country_code = nil
|
73
|
-
pn = Phone.new '5125486', '91', '385'
|
72
|
+
Phoner::Phone.default_country_code = nil
|
73
|
+
pn = Phoner::Phone.new '5125486', '91', '385'
|
74
74
|
assert pn.to_s == '+385915125486'
|
75
75
|
end
|
76
76
|
|
77
77
|
def test_to_s_without_country_code
|
78
|
-
Phone.default_country_code = '385'
|
79
|
-
pn = Phone.new '5125486', '91'
|
78
|
+
Phoner::Phone.default_country_code = '385'
|
79
|
+
pn = Phoner::Phone.new '5125486', '91'
|
80
80
|
assert pn.format("0%a%n") == '0915125486'
|
81
81
|
end
|
82
82
|
|
83
83
|
def test_format_special_with_country_code
|
84
|
-
Phone.default_country_code = nil
|
85
|
-
pn = Phone.new '5125486', '91', '385'
|
84
|
+
Phoner::Phone.default_country_code = nil
|
85
|
+
pn = Phoner::Phone.new '5125486', '91', '385'
|
86
86
|
assert pn.format("+ %c (%a) %n") == '+ 385 (91) 5125486'
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_format_special_without_country_code
|
90
|
-
Phone.default_country_code = '385'
|
91
|
-
pn = Phone.new '5125486', '91'
|
90
|
+
Phoner::Phone.default_country_code = '385'
|
91
|
+
pn = Phoner::Phone.new '5125486', '91'
|
92
92
|
assert_equal pn.format("%A/%f-%l"), '091/512-5486'
|
93
93
|
end
|
94
94
|
|
95
95
|
def test_format_with_symbol_specifier
|
96
|
-
Phone.default_country_code = nil
|
97
|
-
pn = Phone.new '5125486', '91', '385'
|
96
|
+
Phoner::Phone.default_country_code = nil
|
97
|
+
pn = Phoner::Phone.new '5125486', '91', '385'
|
98
98
|
assert_equal pn.format(:europe), '+385 (0) 91 512 5486'
|
99
99
|
end
|
100
100
|
|
101
101
|
def test_doesnt_validate
|
102
|
-
assert_equal Phone.valid?('asdas'), false
|
103
|
-
assert_equal Phone.valid?('385915125486'), false
|
102
|
+
assert_equal Phoner::Phone.valid?('asdas'), false
|
103
|
+
assert_equal Phoner::Phone.valid?('385915125486'), false
|
104
104
|
end
|
105
105
|
|
106
106
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 37
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
6
|
+
- 1
|
7
7
|
- 0
|
8
|
-
|
9
|
-
- 9
|
10
|
-
- 3
|
11
|
-
version: 0.9.9.3
|
8
|
+
version: "1.0"
|
12
9
|
platform: ruby
|
13
10
|
authors:
|
14
11
|
- Tomislav Car
|
@@ -18,7 +15,7 @@ autorequire:
|
|
18
15
|
bindir: bin
|
19
16
|
cert_chain: []
|
20
17
|
|
21
|
-
date:
|
18
|
+
date: 2011-04-05 00:00:00 +02:00
|
22
19
|
default_executable:
|
23
20
|
dependencies: []
|
24
21
|
|
@@ -39,7 +36,7 @@ files:
|
|
39
36
|
- LICENSE
|
40
37
|
- data/phone_countries.yml
|
41
38
|
- lib/phone.rb
|
42
|
-
- lib/
|
39
|
+
- lib/country.rb
|
43
40
|
- lib/support.rb
|
44
41
|
- test/extension_test.rb
|
45
42
|
- test/phone_test.rb
|
@@ -53,6 +50,7 @@ files:
|
|
53
50
|
- test/countries/hr_test.rb
|
54
51
|
- test/countries/hu_test.rb
|
55
52
|
- test/countries/nl_test.rb
|
53
|
+
- test/countries/pt_test.rb
|
56
54
|
- test/countries/rs_test.rb
|
57
55
|
- test/countries/se_test.rb
|
58
56
|
- test/countries/si_test.rb
|
@@ -76,7 +74,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
74
|
requirements:
|
77
75
|
- - ">="
|
78
76
|
- !ruby/object:Gem::Version
|
79
|
-
hash: 3
|
80
77
|
segments:
|
81
78
|
- 0
|
82
79
|
version: "0"
|
@@ -85,7 +82,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
82
|
requirements:
|
86
83
|
- - ">="
|
87
84
|
- !ruby/object:Gem::Version
|
88
|
-
hash: 3
|
89
85
|
segments:
|
90
86
|
- 0
|
91
87
|
version: "0"
|
@@ -109,6 +105,7 @@ test_files:
|
|
109
105
|
- test/countries/hr_test.rb
|
110
106
|
- test/countries/hu_test.rb
|
111
107
|
- test/countries/nl_test.rb
|
108
|
+
- test/countries/pt_test.rb
|
112
109
|
- test/countries/rs_test.rb
|
113
110
|
- test/countries/se_test.rb
|
114
111
|
- test/countries/si_test.rb
|
data/lib/phone_country.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
class PhoneCountry < Struct.new(:name, :country_code, :char_2_code, :area_code)
|
2
|
-
cattr_accessor :all
|
3
|
-
|
4
|
-
def self.load
|
5
|
-
return @@all if @@all.present?
|
6
|
-
|
7
|
-
data_file = File.join(File.dirname(__FILE__), '..', 'data', 'phone_countries.yml')
|
8
|
-
|
9
|
-
@@all = {}
|
10
|
-
YAML.load(File.read(data_file)).each_pair do |key, c|
|
11
|
-
@@all[key] = PhoneCountry.new(c[:name], c[:country_code], c[:char_2_code], c[:area_code])
|
12
|
-
end
|
13
|
-
@@all
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_s
|
17
|
-
name
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.find_by_country_code(code)
|
21
|
-
@@all[code]
|
22
|
-
end
|
23
|
-
|
24
|
-
def country_code_regexp
|
25
|
-
Regexp.new("^[+]#{country_code}")
|
26
|
-
end
|
27
|
-
end
|