has_phone_numbers 0.1.0 → 0.2.0
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.
- data/CHANGELOG.rdoc +10 -0
- data/LICENSE +1 -1
- data/README.rdoc +5 -2
- data/Rakefile +1 -1
- data/app/models/phone_number.rb +120 -31
- data/lib/has_phone_numbers.rb +1 -2
- data/test/app_root/db/migrate/002_migrate_has_phone_numbers_to_version_1.rb +6 -2
- data/test/unit/phone_number_test.rb +179 -27
- metadata +3 -5
- data/test/app_root/config/environment.rb +0 -9
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
== master
|
2
2
|
|
3
|
+
== 0.2.0 / 2009-04-19
|
4
|
+
|
5
|
+
* Add the ability to parse raw values [Matt Lightner]
|
6
|
+
* Validate that the country code is known
|
7
|
+
* Validate number lengths on a per-country code basis
|
8
|
+
* Add the list of available country codes
|
9
|
+
* Remove PhoneNumber#display_value in favor of using the Rails helper
|
10
|
+
* Add dependency on Rails 2.3
|
11
|
+
* Remove dependency on plugins_plus
|
12
|
+
|
3
13
|
== 0.1.0 / 2008-12-14
|
4
14
|
|
5
15
|
* Remove the PluginAWeek namespace
|
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -52,5 +52,8 @@ To run against a specific version of Rails:
|
|
52
52
|
|
53
53
|
== Dependencies
|
54
54
|
|
55
|
-
* Rails 2.
|
56
|
-
|
55
|
+
* Rails 2.3 or later
|
56
|
+
|
57
|
+
== References
|
58
|
+
|
59
|
+
* Casey West - {Parse-PhoneNumber}[http://search.cpan.org/~cwest/Parse-PhoneNumber-1.1]
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/contrib/sshpublisher'
|
|
5
5
|
|
6
6
|
spec = Gem::Specification.new do |s|
|
7
7
|
s.name = 'has_phone_numbers'
|
8
|
-
s.version = '0.
|
8
|
+
s.version = '0.2.0'
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.summary = 'Demonstrates a reference implementation for handling phone numbers.'
|
11
11
|
|
data/app/models/phone_number.rb
CHANGED
@@ -1,42 +1,131 @@
|
|
1
1
|
# Represents a phone number split into multiple parts:
|
2
|
-
# * +country_code+ - Uniquely identifiers the country to which the number belongs.
|
2
|
+
# * +country_code+ - Uniquely identifiers the country to which the number belongs.
|
3
|
+
# This value is based on the E.164 standard (http://en.wikipedia.org/wiki/E.164)
|
3
4
|
# * +number+ - The subscriber number (10 digits in length)
|
4
5
|
# * +extension+ - A number that can route to different phones at a location
|
5
6
|
#
|
6
7
|
# This phone number format is biased towards those types found in the United
|
7
8
|
# States and may need to be adjusted for international support.
|
8
9
|
class PhoneNumber < ActiveRecord::Base
|
9
|
-
|
10
|
-
|
10
|
+
# The valid lengths allowed per country code for area code + subscriber number
|
11
|
+
VALID_LENGTHS = {
|
12
|
+
1 => 10, 7 => 10, 20 => 9, 27 => 9, 30 => 10, 31 => 9,
|
13
|
+
32 => 8..9, 33 => 9..10, 34 => 9, 36 => 8..9, 39 => 9, 40 => 9,
|
14
|
+
41 => 9..10, 43 => 7..13, 44 => 10..11, 45 => 8, 46 => 9, 47 => 8,
|
15
|
+
48 => 9, 49 => 7..11, 51 => 8..9, 52 => 8..10, 53 => 8, 54 => 8..9,
|
16
|
+
55 => 10, 56 => 8..9, 57 => 9..10, 58 => 10, 60 => 9..10, 61 => 9,
|
17
|
+
62 => 8..11, 63 => 8..10, 64 => 8..9, 65 => 8..9, 66 => 9..10, 81 => 9..10,
|
18
|
+
82 => 8..9, 84 => 7..10, 86 => 7..11, 90 => 10, 91 => 10, 92 => 9..10,
|
19
|
+
93 => 8..9, 94 => 10, 95 => 7..8, 98 => 10, 212 => 8, 213 => 8,
|
20
|
+
216 => 8, 218 => 8..9, 220 => 7, 221 => 7, 222 => 7, 223 => 8,
|
21
|
+
224 => 8, 225 => 8, 226 => 8, 227 => 8, 228 => 7, 229 => 8,
|
22
|
+
230 => 7, 231 => 6..8, 232 => 8, 233 => 5..8, 234 => 7..8, 235 => 7,
|
23
|
+
236 => 8, 237 => 8, 238 => 7, 239 => 6..7, 240 => 6, 241 => 6..8,
|
24
|
+
242 => 7, 243 => 8, 244 => 9, 245 => 7, 246 => 4..7, 247 => 4,
|
25
|
+
248 => 6, 249 => 9, 250 => 5..8, 251 => 9, 252 => 7..8, 253 => 6,
|
26
|
+
254 => 9, 255 => 9, 256 => 9, 257 => 8, 258 => 8..9, 260 => 9,
|
27
|
+
261 => 9, 262 => 10, 263 => 8..11, 264 => 6..7, 265 => 8, 266 => 8,
|
28
|
+
267 => 7, 268 => 7, 269 => 7, 290 => 4, 291 => 7, 297 => 7,
|
29
|
+
298 => 6, 299 => 6, 350 => 8, 351 => 9, 352 => 9, 353 => 9,
|
30
|
+
354 => 7..9, 355 => 7..9, 356 => 8, 357 => 8, 358 => 9, 359 => 8..10,
|
31
|
+
370 => 8, 371 => 8, 372 => 7..8, 373 => 8, 374 => 8, 375 => 9,
|
32
|
+
376 => 6..9, 377 => 8..9, 378 => 9..12, 380 => 8..9, 381 => 9, 382 => 8,
|
33
|
+
385 => 8, 386 => 8, 387 => 8, 388 => 8..10, 389 => 7..8, 420 => 9,
|
34
|
+
421 => 9, 423 => 7, 500 => 5, 501 => 7, 502 => 8, 503 => 8,
|
35
|
+
504 => 7..8, 505 => 8, 506 => 8, 507 => 7, 508 => 6, 509 => 8,
|
36
|
+
590 => 10, 591 => 8, 592 => 6..7, 593 => 8..9, 594 => 10, 595 => 9,
|
37
|
+
596 => 10, 597 => 6, 598 => 7..8, 599 => 7, 670 => 7, 672 => 6,
|
38
|
+
673 => 7, 674 => 7, 675 => 7, 676 => 5..7, 677 => 5, 678 => 5..7,
|
39
|
+
679 => 7, 680 => 7, 681 => 6, 682 => 5, 683 => 4, 685 => 6..7,
|
40
|
+
686 => 5, 687 => 6, 688 => 5, 689 => 6, 690 => 4, 691 => 7,
|
41
|
+
692 => 7, 800 => 8..12, 808 => 8, 850 => 8..9, 852 => 8, 853 => 8,
|
42
|
+
855 => 8, 856 => 8, 870 => 9, 871 => 9, 872 => 9, 873 => 9,
|
43
|
+
874 => 9, 878 => 9, 880 => 10, 881 => 6, 882 => 6, 883 => 6,
|
44
|
+
886 => 7..8, 960 => 7, 961 => 8, 962 => 8..9, 963 => 7..8, 964 => 8..10,
|
45
|
+
965 => 7, 966 => 8..9, 967 => 7..9, 968 => 8, 970 => 8, 971 => 7..9,
|
46
|
+
972 => 7..9, 973 => 8, 974 => 7, 975 => 7..8, 976 => 7..10, 977 => 7..8,
|
47
|
+
979 => 9, 991 => 9, 992 => 9, 993 => 8, 994 => 8..9, 995 => 9,
|
48
|
+
996 => 9, 998 => 9
|
49
|
+
}.stringify_keys
|
11
50
|
|
12
|
-
|
13
|
-
|
14
|
-
:country_code,
|
15
|
-
:number
|
16
|
-
validates_numericality_of :country_code,
|
17
|
-
:number
|
18
|
-
validates_numericality_of :extension,
|
19
|
-
:allow_nil => true
|
20
|
-
validates_length_of :country_code,
|
21
|
-
:in => 1..3
|
22
|
-
validates_length_of :number,
|
23
|
-
:is => 10
|
24
|
-
validates_length_of :extension,
|
25
|
-
:maximum => 10,
|
26
|
-
:allow_nil => true
|
51
|
+
# The list of country calling codes as defined by ITU-T recommendation E.164
|
52
|
+
COUNTRY_CODES = VALID_LENGTHS.keys
|
27
53
|
|
28
|
-
#
|
29
|
-
#
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
54
|
+
# Whether to always use the default country code configured for this model
|
55
|
+
# when parsing the raw content of a phone number
|
56
|
+
cattr_accessor :use_default_country_code_on_parse
|
57
|
+
@@use_default_country_code_on_parse = false
|
58
|
+
|
59
|
+
belongs_to :phoneable, :polymorphic => true
|
60
|
+
|
61
|
+
validates_presence_of :phoneable_id, :phoneable_type, :country_code, :number
|
62
|
+
validates_numericality_of :number
|
63
|
+
validates_numericality_of :extension, :allow_nil => true
|
64
|
+
validates_length_of :extension, :maximum => 10, :allow_nil => true
|
65
|
+
validates_inclusion_of :country_code, :in => COUNTRY_CODES
|
66
|
+
validates_each :number do |phone_number, attr, value|
|
67
|
+
country_code = phone_number.country_code
|
68
|
+
|
69
|
+
if country_code && length = VALID_LENGTHS[country_code]
|
70
|
+
if length.is_a?(Range)
|
71
|
+
if value.nil? || value.size < length.begin
|
72
|
+
phone_number.errors.add(attr, :too_short, :count => length.begin)
|
73
|
+
elsif value.size > length.end
|
74
|
+
phone_number.errors.add(attr, :too_long, :count => length.end)
|
75
|
+
end
|
76
|
+
elsif value.nil? || value.size != length
|
77
|
+
phone_number.errors.add(attr, :wrong_length, :count => length)
|
78
|
+
end
|
79
|
+
end
|
41
80
|
end
|
81
|
+
|
82
|
+
# The raw, unparsed content containing the phone number. This can be parsed
|
83
|
+
# in various formats, such as:
|
84
|
+
# * 600 600 11 22
|
85
|
+
# * + 386 1 5853 449
|
86
|
+
# * +48 (22) 64 0001
|
87
|
+
# * 36 1 267-4636
|
88
|
+
# * +39-02-48230001
|
89
|
+
# * 202 331 996 x4621
|
90
|
+
# * 358 2 141 540 65 ext. 1423
|
91
|
+
attr_accessor :content
|
92
|
+
before_validation_on_create :parse_content, :if => :content
|
93
|
+
|
94
|
+
private
|
95
|
+
# Parses the raw content of a phone number, extracting the following
|
96
|
+
# attributes:
|
97
|
+
# * country_code
|
98
|
+
# * number
|
99
|
+
# * extension
|
100
|
+
def parse_content
|
101
|
+
content = self.content.strip
|
102
|
+
|
103
|
+
# Check for extension
|
104
|
+
if match = content.match(/\s*(?:(?:ext|ex|xt|x)[\s.:]*(\d+))$/i)
|
105
|
+
self.extension = match[1]
|
106
|
+
content.gsub!(match.to_s, '')
|
107
|
+
end
|
108
|
+
|
109
|
+
# Remove non-digits and leading 0
|
110
|
+
content.gsub!(/\D/, '')
|
111
|
+
content.gsub!(/^0+/, '')
|
112
|
+
|
113
|
+
if use_default_country_code_on_parse
|
114
|
+
# Scrub pre-determined country code
|
115
|
+
content.gsub!(/^#{country_code}/, '')
|
116
|
+
else
|
117
|
+
# Try to figure out the country code. It is not possible for one
|
118
|
+
# country code's number to overlap another.
|
119
|
+
(1..3).each do |length|
|
120
|
+
code = content[0, length]
|
121
|
+
if VALID_LENGTHS[code] # Fast lookup
|
122
|
+
self.country_code = code
|
123
|
+
content.gsub!(/^#{code}/, '')
|
124
|
+
break
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
self.number = content
|
130
|
+
end
|
42
131
|
end
|
data/lib/has_phone_numbers.rb
CHANGED
@@ -4,8 +4,7 @@ module HasPhoneNumbers
|
|
4
4
|
# Creates the following association:
|
5
5
|
# * +phone_number+ - All phone numbers associated with the current record.
|
6
6
|
def has_phone_numbers
|
7
|
-
has_many
|
8
|
-
:as => :phoneable
|
7
|
+
has_many :phone_numbers, :as => :phoneable
|
9
8
|
end
|
10
9
|
end
|
11
10
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
class MigrateHasPhoneNumbersToVersion1 < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
|
-
|
3
|
+
ActiveRecord::Migrator.new(:up, "#{Rails.root}/../../db/migrate", 0).migrations.each do |migration|
|
4
|
+
migration.migrate(:up)
|
5
|
+
end
|
4
6
|
end
|
5
7
|
|
6
8
|
def self.down
|
7
|
-
|
9
|
+
ActiveRecord::Migrator.new(:up, "#{Rails.root}/../../db/migrate", 0).migrations.each do |migration|
|
10
|
+
migration.migrate(:down)
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
@@ -50,26 +50,13 @@ class PhoneNumberTest < Test::Unit::TestCase
|
|
50
50
|
assert phone_number.errors.invalid?(:country_code)
|
51
51
|
end
|
52
52
|
|
53
|
-
def
|
54
|
-
phone_number = new_phone_number(:country_code => '
|
53
|
+
def test_should_require_a_known_country_code
|
54
|
+
phone_number = new_phone_number(:country_code => '2')
|
55
55
|
assert !phone_number.valid?
|
56
56
|
assert phone_number.errors.invalid?(:country_code)
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_should_require_country_codes_be_between_1_and_3_numbers
|
60
|
-
phone_number = new_phone_number(:country_code => '')
|
61
|
-
assert !phone_number.valid?
|
62
|
-
assert phone_number.errors.invalid?(:country_code)
|
63
|
-
|
64
|
-
phone_number.country_code += '1'
|
65
|
-
assert phone_number.valid?
|
66
57
|
|
67
|
-
phone_number.country_code
|
58
|
+
phone_number.country_code = '1'
|
68
59
|
assert phone_number.valid?
|
69
|
-
|
70
|
-
phone_number.country_code += '1'
|
71
|
-
assert !phone_number.valid?
|
72
|
-
assert phone_number.errors.invalid?(:country_code)
|
73
60
|
end
|
74
61
|
|
75
62
|
def test_should_require_a_number
|
@@ -84,17 +71,33 @@ class PhoneNumberTest < Test::Unit::TestCase
|
|
84
71
|
assert phone_number.errors.invalid?(:number)
|
85
72
|
end
|
86
73
|
|
87
|
-
def
|
88
|
-
phone_number = new_phone_number(:number => '1' * 9)
|
74
|
+
def test_should_require_number_be_exact_for_country_code_without_range
|
75
|
+
phone_number = new_phone_number(:country_code => '1', :number => '1' * 9)
|
89
76
|
assert !phone_number.valid?
|
90
|
-
|
77
|
+
assert_equal 'is the wrong length (should be 10 characters)', phone_number.errors.on(:number)
|
91
78
|
|
92
79
|
phone_number.number += '1'
|
93
80
|
assert phone_number.valid?
|
94
81
|
|
95
82
|
phone_number.number += '1'
|
96
83
|
assert !phone_number.valid?
|
97
|
-
|
84
|
+
assert_equal 'is the wrong length (should be 10 characters)', phone_number.errors.on(:number)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_should_require_number_be_within_range_for_country_code_with_range
|
88
|
+
phone_number = new_phone_number(:country_code => '32', :number => '1' * 7)
|
89
|
+
assert !phone_number.valid?
|
90
|
+
assert_equal 'is too short (minimum is 8 characters)', phone_number.errors.on(:number)
|
91
|
+
|
92
|
+
phone_number.number += '1'
|
93
|
+
assert phone_number.valid?
|
94
|
+
|
95
|
+
phone_number.number += '1'
|
96
|
+
assert phone_number.valid?
|
97
|
+
|
98
|
+
phone_number.number += '1'
|
99
|
+
assert !phone_number.valid?
|
100
|
+
assert_equal 'is too long (maximum is 9 characters)', phone_number.errors.on(:number)
|
98
101
|
end
|
99
102
|
|
100
103
|
def test_should_not_require_an_extension
|
@@ -102,7 +105,7 @@ class PhoneNumberTest < Test::Unit::TestCase
|
|
102
105
|
assert phone_number.valid?
|
103
106
|
end
|
104
107
|
|
105
|
-
def
|
108
|
+
def test_should_require_extension_be_at_most_10_digits
|
106
109
|
phone_number = new_phone_number(:extension => '1' * 9)
|
107
110
|
assert phone_number.valid?
|
108
111
|
|
@@ -150,18 +153,167 @@ class PhoneNumberAfterBeingCreatedTest < Test::Unit::TestCase
|
|
150
153
|
def test_should_have_a_phoneable_association
|
151
154
|
assert_equal @person, @phone_number.phoneable
|
152
155
|
end
|
156
|
+
end
|
157
|
+
|
158
|
+
class PhoneNumberParserTest < Test::Unit::TestCase
|
159
|
+
def setup
|
160
|
+
@person = create_person
|
161
|
+
@phone_number = new_phone_number(:phoneable => @person, :country_code => nil, :number => nil, :extension => nil)
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_should_parse_country_code_with_1_digit
|
165
|
+
@phone_number.content = '11234567890'
|
166
|
+
|
167
|
+
assert @phone_number.valid?
|
168
|
+
assert_equal '1', @phone_number.country_code
|
169
|
+
assert_equal '1234567890', @phone_number.number
|
170
|
+
assert_nil @phone_number.extension
|
171
|
+
end
|
153
172
|
|
154
|
-
def
|
155
|
-
|
173
|
+
def test_should_parse_country_code_with_2_digits
|
174
|
+
@phone_number.content = '20123456789'
|
175
|
+
|
176
|
+
assert @phone_number.valid?
|
177
|
+
assert_equal '20', @phone_number.country_code
|
178
|
+
assert_equal '123456789', @phone_number.number
|
179
|
+
assert_nil @phone_number.extension
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_should_parse_country_code_with_3_digits
|
183
|
+
@phone_number.content = '21212345678'
|
184
|
+
|
185
|
+
assert @phone_number.valid?
|
186
|
+
assert_equal '212', @phone_number.country_code
|
187
|
+
assert_equal '12345678', @phone_number.number
|
188
|
+
assert_nil @phone_number.extension
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_should_parse_number_with_spaces
|
192
|
+
@phone_number.content = '1 123 456 7890'
|
193
|
+
|
194
|
+
assert @phone_number.valid?
|
195
|
+
assert_equal '1', @phone_number.country_code
|
196
|
+
assert_equal '1234567890', @phone_number.number
|
197
|
+
assert_nil @phone_number.extension
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_should_parse_number_with_dashes
|
201
|
+
@phone_number.content = '1-123-456-7890'
|
202
|
+
|
203
|
+
assert @phone_number.valid?
|
204
|
+
assert_equal '1', @phone_number.country_code
|
205
|
+
assert_equal '1234567890', @phone_number.number
|
206
|
+
assert_nil @phone_number.extension
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_should_parse_number_with_parentheses
|
210
|
+
@phone_number.content = '1- (123) 456-7890'
|
211
|
+
|
212
|
+
assert @phone_number.valid?
|
213
|
+
assert_equal '1', @phone_number.country_code
|
214
|
+
assert_equal '1234567890', @phone_number.number
|
215
|
+
assert_nil @phone_number.extension
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_should_parse_number_with_leading_zero
|
219
|
+
@phone_number.content = '011234567890'
|
220
|
+
|
221
|
+
assert @phone_number.valid?
|
222
|
+
assert_equal '1', @phone_number.country_code
|
223
|
+
assert_equal '1234567890', @phone_number.number
|
224
|
+
assert_nil @phone_number.extension
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_should_parse_number_with_multiple_leading_zeroes
|
228
|
+
@phone_number.content = '0011234567890'
|
229
|
+
|
230
|
+
assert @phone_number.valid?
|
231
|
+
assert_equal '1', @phone_number.country_code
|
232
|
+
assert_equal '1234567890', @phone_number.number
|
233
|
+
assert_nil @phone_number.extension
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_should_parse_extension_with_leading_ext
|
237
|
+
@phone_number.content = '11234567890 ext. 123'
|
238
|
+
|
239
|
+
assert @phone_number.valid?
|
240
|
+
assert_equal '1', @phone_number.country_code
|
241
|
+
assert_equal '1234567890', @phone_number.number
|
242
|
+
assert_equal '123', @phone_number.extension
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_should_parse_extension_with_leading_ex
|
246
|
+
@phone_number.content = '11234567890 ex:123'
|
247
|
+
|
248
|
+
assert @phone_number.valid?
|
249
|
+
assert_equal '1', @phone_number.country_code
|
250
|
+
assert_equal '1234567890', @phone_number.number
|
251
|
+
assert_equal '123', @phone_number.extension
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_should_parse_extension_with_leading_xt
|
255
|
+
@phone_number.content = '11234567890 xt: 123'
|
256
|
+
|
257
|
+
assert @phone_number.valid?
|
258
|
+
assert_equal '1', @phone_number.country_code
|
259
|
+
assert_equal '1234567890', @phone_number.number
|
260
|
+
assert_equal '123', @phone_number.extension
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_should_parse_extension_with_leading_x
|
264
|
+
@phone_number.content = '11234567890 x. 123'
|
265
|
+
|
266
|
+
assert @phone_number.valid?
|
267
|
+
assert_equal '1', @phone_number.country_code
|
268
|
+
assert_equal '1234567890', @phone_number.number
|
269
|
+
assert_equal '123', @phone_number.extension
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_should_parse_extension_with_mixed_case
|
273
|
+
@phone_number.content = '11234567890 xT 123'
|
274
|
+
|
275
|
+
assert @phone_number.valid?
|
276
|
+
assert_equal '1', @phone_number.country_code
|
277
|
+
assert_equal '1234567890', @phone_number.number
|
278
|
+
assert_equal '123', @phone_number.extension
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_should_not_be_valid_if_parse_fails
|
282
|
+
@phone_number.content = '1123456789'
|
283
|
+
|
284
|
+
assert !@phone_number.valid?
|
285
|
+
assert_equal '1', @phone_number.country_code
|
286
|
+
assert_equal '123456789', @phone_number.number
|
287
|
+
assert_nil @phone_number.extension
|
156
288
|
end
|
157
289
|
end
|
158
290
|
|
159
|
-
class
|
291
|
+
class PhoneNumberParserWithDefaultCountryCodeTest < Test::Unit::TestCase
|
160
292
|
def setup
|
161
|
-
|
293
|
+
PhoneNumber.use_default_country_code_on_parse = true
|
294
|
+
|
295
|
+
@person = create_person
|
296
|
+
@phone_number = new_phone_number(:phoneable => @person, :content => '7234567890 ex. 12')
|
297
|
+
@valid = @phone_number.valid?
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_should_be_valid
|
301
|
+
assert @valid
|
302
|
+
end
|
303
|
+
|
304
|
+
def test_should_use_default_country_code
|
305
|
+
assert_equal '1', @phone_number.country_code
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_should_parse_number
|
309
|
+
assert_equal '7234567890', @phone_number.number
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_should_parse_extension
|
313
|
+
assert_equal '12', @phone_number.extension
|
162
314
|
end
|
163
315
|
|
164
|
-
def
|
165
|
-
|
316
|
+
def teardown
|
317
|
+
PhoneNumber.use_default_country_code_on_parse = false
|
166
318
|
end
|
167
319
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_phone_numbers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-04-19 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -38,8 +38,6 @@ files:
|
|
38
38
|
- test/app_root/db/migrate
|
39
39
|
- test/app_root/db/migrate/002_migrate_has_phone_numbers_to_version_1.rb
|
40
40
|
- test/app_root/db/migrate/001_create_people.rb
|
41
|
-
- test/app_root/config
|
42
|
-
- test/app_root/config/environment.rb
|
43
41
|
- test/app_root/app
|
44
42
|
- test/app_root/app/models
|
45
43
|
- test/app_root/app/models/person.rb
|
@@ -70,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
68
|
requirements: []
|
71
69
|
|
72
70
|
rubyforge_project: pluginaweek
|
73
|
-
rubygems_version: 1.
|
71
|
+
rubygems_version: 1.3.1
|
74
72
|
signing_key:
|
75
73
|
specification_version: 2
|
76
74
|
summary: Demonstrates a reference implementation for handling phone numbers.
|
@@ -1,9 +0,0 @@
|
|
1
|
-
require 'config/boot'
|
2
|
-
require "#{File.dirname(__FILE__)}/../../../../plugins_plus/boot"
|
3
|
-
|
4
|
-
Rails::Initializer.run do |config|
|
5
|
-
config.plugin_paths << '..'
|
6
|
-
config.plugins = %w(plugins_plus has_phone_numbers)
|
7
|
-
config.cache_classes = false
|
8
|
-
config.whiny_nils = true
|
9
|
-
end
|