nt54 0.0.1

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.
@@ -0,0 +1,12 @@
1
+ Gemfile
2
+ Gemfile.lock
3
+ doc
4
+ docs
5
+ pkg
6
+ .DS_Store
7
+ coverage
8
+ .yardoc
9
+ *.gem
10
+ *.sqlite3
11
+ *.rbc
12
+ *.lock
@@ -0,0 +1,121 @@
1
+ # NT54
2
+
3
+ Parsing, validation, meta-information and formatting for Argentine phone
4
+ numbers.
5
+
6
+ ## Usage
7
+
8
+ require "nt54"
9
+
10
+ # Parsing
11
+ number = NT54::Parser.parse("0291-15-555-4444")
12
+ number.area_code # => "291"
13
+ number.local_prefix # => "555"
14
+ number.local_number # => "4444"
15
+ number.country_code # => "54"
16
+ number.mobile? # => true
17
+
18
+ # Validation
19
+ number = NT54::Parser.parse("0291-15-555-4444")
20
+ number.valid? # => true
21
+ NT54::Parser.valid?("0291-15-555-4444") # => true
22
+ NT54::Parser.valid?("03864-22-4444") # => false (there's no 3864 area code)
23
+
24
+ # Meta-information
25
+ number.area.city # => "Bahía Blanca"
26
+ number.area.province.code # => "B"
27
+ number.area.province.name # => "Buenos Aires"
28
+ number.area.lat # => "-38.71167760000001"
29
+ number.area.lng # => "-62.26807789999999"
30
+
31
+ # Formatting
32
+ number.format_international # => "+54 9 (291) 555-4444"
33
+ number.format_international_sms # => "+54 (291) 555-4444"
34
+ number.format_national # => "(0291) 15 555-4444"
35
+ number.format_local # => "15 555-4444"
36
+
37
+ # Special number handling
38
+ number = NT54::Parser.parse("100")
39
+ number.special? # => true
40
+ number.special.comment # => "Bomberos"
41
+ number.special.comment_en # => "Fire department"
42
+
43
+ ## More info
44
+
45
+ Simple phone number formats like the one used for North America can be somewhat
46
+ easily described with regular expressions, but Argentina's phone numbers are
47
+ quite complex. For example, area codes can be 2-4 numbers long and can overlap.
48
+ A prefix is used to denote mobile verse non-mobile numbers, and this prefix
49
+ changes number and position when dialing internationally. The prefix must be
50
+ used when calling internationally, but not when sending SMS internationally.
51
+
52
+ This means that Argentine phone numbers are best captured with a grammar, rather
53
+ than regular expressions, so NT54 uses a finite state machine to process the
54
+ number like a real hardware or software dialer.
55
+
56
+ If you're curious, you can debug the phone number processing like this:
57
+
58
+ D, [2012-01-24T15:29:00.993893 #10077] DEBUG -- : new state: Dialtone
59
+ D, [2012-01-24T15:29:00.994076 #10077] DEBUG -- : got 0
60
+ D, [2012-01-24T15:29:00.994209 #10077] DEBUG -- : triggering area_code_indicated
61
+ D, [2012-01-24T15:29:00.994272 #10077] DEBUG -- : new state: WaitForAreaCode
62
+ D, [2012-01-24T15:29:00.994320 #10077] DEBUG -- : got 2
63
+ D, [2012-01-24T15:29:00.994352 #10077] DEBUG -- : got 9
64
+ D, [2012-01-24T15:29:00.994660 #10077] DEBUG -- : got 1
65
+ D, [2012-01-24T15:29:00.994738 #10077] DEBUG -- : triggering area_code_potentially_completed
66
+ D, [2012-01-24T15:29:00.994804 #10077] DEBUG -- : new state: WaitForAreaCodeCompletion
67
+ D, [2012-01-24T15:29:00.994871 #10077] DEBUG -- : got 1
68
+ D, [2012-01-24T15:29:00.994910 #10077] DEBUG -- : 291 is a valid area code
69
+ D, [2012-01-24T15:29:00.994951 #10077] DEBUG -- : triggering mobile_prefix_started
70
+ D, [2012-01-24T15:29:00.994999 #10077] DEBUG -- : new state: WaitForMobilePrefixCompletion
71
+ D, [2012-01-24T15:29:00.995040 #10077] DEBUG -- : got 5
72
+ D, [2012-01-24T15:29:00.995071 #10077] DEBUG -- : triggering mobile_prefix_completed
73
+ D, [2012-01-24T15:29:00.995120 #10077] DEBUG -- : new state: WaitForLocalPrefix
74
+ D, [2012-01-24T15:29:00.995150 #10077] DEBUG -- : got 4
75
+ D, [2012-01-24T15:29:00.995213 #10077] DEBUG -- : got 4
76
+ D, [2012-01-24T15:29:00.995247 #10077] DEBUG -- : got 4
77
+ D, [2012-01-24T15:29:00.995281 #10077] DEBUG -- : got 5
78
+ D, [2012-01-24T15:29:00.995329 #10077] DEBUG -- : triggering local_prefix_completed
79
+ D, [2012-01-24T15:29:00.995371 #10077] DEBUG -- : new state: WaitForLocalNumber
80
+ D, [2012-01-24T15:29:00.995413 #10077] DEBUG -- : got 5
81
+ D, [2012-01-24T15:29:00.995441 #10077] DEBUG -- : got 5
82
+ D, [2012-01-24T15:29:00.997847 #10077] DEBUG -- : got 5
83
+ #<NT54::PhoneNumber:0x007f8e91058120
84
+ @area_code="291",
85
+ @country_code="54",
86
+ @local_number="5555",
87
+ @local_prefix="444",
88
+ @mobile=true>
89
+
90
+ ## Installation
91
+
92
+ gem install nt54
93
+
94
+ ## Author
95
+
96
+ [Norman Clarke](mailto:norman@njclarke.com)
97
+
98
+ ## Changelog
99
+
100
+ * 2012-01-24 - Initial release
101
+
102
+ ## License
103
+
104
+ Copyright (c) 2012 Norman Clarke
105
+
106
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
107
+ this software and associated documentation files (the "Software"), to deal in
108
+ the Software without restriction, including without limitation the rights to
109
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
110
+ the Software, and to permit persons to whom the Software is furnished to do so,
111
+ subject to the following conditions:
112
+
113
+ The above copyright notice and this permission notice shall be included in all
114
+ copies or substantial portions of the Software.
115
+
116
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
117
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
118
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
119
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
120
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
121
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ require "rubygems"
2
+ require "rake/testtask"
3
+
4
+ task :default => :test
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs = ["lib"]
8
+ t.verbose = false
9
+ t.test_files = FileList['test/*_test.rb']
10
+ end
11
+
12
+ task :clean do
13
+ %x{rm -rf *.gem doc pkg coverage}
14
+ %x{rm -f `find . -name '*.rbc'`}
15
+ end
16
+
17
+ task :gem do
18
+ %x{gem build nt54.gemspec}
19
+ end
20
+
21
+ task :yard => :guide do
22
+ puts %x{bundle exec yard}
23
+ end
24
+
25
+ task :doc => :yard
@@ -0,0 +1,16 @@
1
+ require "logger"
2
+ require "csv"
3
+ require "pathname"
4
+ require "pp"
5
+ require "ambry"
6
+ require "micromachine"
7
+ require "nt54/phone_number"
8
+ require "nt54/parser"
9
+ require "nt54/province"
10
+ require "nt54/area"
11
+ require "nt54/special_number"
12
+
13
+ module NT54
14
+ extend self
15
+ attr_accessor :log
16
+ end
@@ -0,0 +1,15 @@
1
+ module NT54
2
+ class Area
3
+ extend Ambry::Model
4
+ field :code, :city, :province_code, :comment, :lat, :lng
5
+
6
+ def province
7
+ Province.get(province_code)
8
+ end
9
+ end
10
+
11
+ CSV.foreach(Pathname(__FILE__).dirname.join("areas.csv")) do |row|
12
+ Area.create Hash[[:code, :city, :province_code, :comment].zip(row)]
13
+ end
14
+
15
+ end
@@ -0,0 +1,307 @@
1
+ 11,Buenos Aires,C,,-34.6084175,-58.37316130000001
2
+ 220,Pontevedra,B,,-34.74426400000001,-58.7001579
3
+ 2202,González Catán,B,,-34.7627204,-58.6300804
4
+ 221,La Plata,B,,-34.9173012,-57.9501305
5
+ 2221,Atalaya,B,,-35.0268593,-57.53101729999999
6
+ 2223,Altamirano,B,,-35.36700800000001,-58.1614
7
+ 2224,Glew,B,,-34.8854021,-58.3812772
8
+ 2225,Alejandro Korn,B,,-34.9710848,-58.38823009999999
9
+ 2226,Alejandro Petión,B,,-34.6084175,-58.37316130000001
10
+ 2227,Antonio Carboni,B,,-35.2000008,-59.3333282
11
+ 2229,Juan María Gutiérrez,B,,-34.5871849,-58.3991699
12
+ 223,Mar del Plata,B,,-37.9798584,-57.5897942
13
+ 2241,Chascomús,B,,-35.5654907,-58.0160484
14
+ 2242,Pila,B,,-36.0017624,-58.1404037
15
+ 2243,General Belgrano,B,,-35.7671432,-58.4959946
16
+ 2244,Las Flores,B,,-33.75,-59.9333305
17
+ 2245,Dolores,B,,-36.3145485,-57.68008039999999
18
+ 2246,Santa Teresita,B,,-36.5437544,-56.702013
19
+ 2252,San Clemente del Tuyú,B,,-36.3695702,-56.7175713
20
+ 2254,Cariló,B,,-37.1615028,-56.8993073
21
+ 2255,Villa Gesell,B,,-37.2633972,-56.9732704
22
+ 2257,Mar de Ajó,B,,-36.7311783,-56.6819267
23
+ 2261,Lobería,B,,-38.1640892,-58.7817154
24
+ 2262,Necochea,B,,-38.5544968,-58.73960879999999
25
+ 2264,Claraz,B,,-37.8900948,-59.2902184
26
+ 2265,Coronel Vidal,B,,-37.4456291,-57.726944
27
+ 2266,Mechongué,B,,-38.15000149999999,-58.216671
28
+ 2267,General Madariaga,B,,-37.03333,-57.13333
29
+ 2268,General Guido,B,,-36.7210945,-57.9162555
30
+ 2271,Abbott,B,,-35.282589,-58.8043213
31
+ 2272,Las Marianas,B,,-35.06560899999999,-59.5156784
32
+ 2273,Carmen de Areco,B,,-34.3806686,-59.8223267
33
+ 2274,Carlos Spegazzini,B,,-34.6193051,-58.4263416
34
+ 2281,Azul,B,,-36.7749672,-59.8540382
35
+ 2283,Tapalqué,B,,-36.355545,-60.0236549
36
+ 2284,Olavarría,B,,-36.8920898,-60.3149414
37
+ 2285,Laprida,B,,-37.5454292,-60.7987099
38
+ 2286,La Colina,B,,-37.3615913,-61.5340996
39
+ 2291,Mar del Sur,B,,-38.34144209999999,-57.99058909999999
40
+ 2292,Benito Juárez,B,,-37.6734123,-59.8051033
41
+ 2293,Tandil,B,,-37.3178101,-59.1503906
42
+ 2296,Ayacucho,B,,-37.1502686,-58.4829712
43
+ 2297,Rauch,B,,-36.7749176,-59.0897865
44
+ 2302,General Pico,L,,-35.6569519,-63.75454709999999
45
+ 2314,Espigas,B,,-36.4169312,-60.6774902
46
+ 2316,Arboledas,B,,-36.8838501,-61.4822388
47
+ 2317,Carlos María Naón,B,,-35.246891,-60.8367882
48
+ 2320,Del Viso,B,,-34.4792247,-58.79967199999999
49
+ 2322,Fátima,B,,-34.4259919,-58.9965377
50
+ 2323,Luján,B,,-34.565731,-59.1174316
51
+ 2324,Mercedes,B,,-34.6546021,-59.4284134
52
+ 2325,Azcuénaga,B,,-34.3833313,-59.34999850000001
53
+ 2326,Duggan,B,,-34.2072449,-59.6355782
54
+ 2331,Realicó,L,,-35.0380173,-64.2465744
55
+ 2333,Quemú Quemú,L,,-36.0488892,-63.5504112
56
+ 2334,Eduardo Castex,L,,-35.9136543,-64.2888718
57
+ 2335,Ingeniero Luiggi,L,,-35.3858719,-64.4675903
58
+ 2336,Huinca Renancó,X,,-34.8402596,-64.37178039999999
59
+ 2337,Fortín Olavarría,B,,-35.7110596,-63.02032089999999
60
+ 2338,Victorica,L,,-36.2161713,-65.4323502
61
+ 2342,Bragado,B,,-35.1199112,-60.48142619999999
62
+ 2343,Elvira,B,,-35.2331505,-59.4827309
63
+ 2344,Álvarez de Toledo,B,,-35.6375122,-59.62751009999999
64
+ 2345,Mosconi,B,,-35.7412682,-60.56213
65
+ 2346,Chivilcoy,B,,-34.8972397,-60.018837
66
+ 2352,Chacabuco,B,,-34.63593290000001,-60.4651222
67
+ 2353,Arribeños,B,,-34.2097626,-61.3543663
68
+ 2354,El Dorado,B,,-34.6508789,-61.5838585
69
+ 2355,Lincoln,B,,-34.8678589,-61.53442
70
+ 2356,Coronel Granada,B,,-34.7897377,-62.20030209999999
71
+ 2357,Carlos Salas,B,,-35.3924484,-61.99036030000001
72
+ 2358,Zavalía,B,,-34.8937607,-61.00455859999999
73
+ 2362,Junín,B,,-34.5822105,-60.94940190000001
74
+ 237,Francisco Álvarez,B,,-34.6056091,-58.85812389999999
75
+ 2392,Berutti,B,,-35.8551674,-62.51066590000001
76
+ 2393,Salazar,B,,-36.3066902,-62.20112990000001
77
+ 2394,Quenumá,B,,-36.5679893,-63.08898929999999
78
+ 2395,Bellocq,B,,-35.9170494,-61.5426598
79
+ 2396,Chiclana,B,,-35.7327118,-61.7404366
80
+ 2473,Wheelwright,S,,-33.782959,-61.2158203
81
+ 2474,Gahan,B,,-34.3352432,-60.0972443
82
+ 2475,Carabelas,B,,-34.0364685,-60.8659592
83
+ 2477,Pergamino,B,,-33.8881416,-60.5693359
84
+ 2478,Arrecifes,B,,-34.0638771,-60.10348889999999
85
+ 261,Mendoza,M,,-32.890183,-68.8440498
86
+ 2622,Colonia Las Rosas,M,,-33.5999985,-69.0999985
87
+ 2623,San Martín,M,,-33.0799789,-68.4694595
88
+ 2624,Cacheuta,M,,-33.0386314,-69.1012573
89
+ 2625,Bowen,M,,-34.999691,-67.5164795
90
+ 2626,Arroyito,M,,-32.8333282,-67.3000107
91
+ 2627,San Rafael,M,,-34.6131516,-68.341011
92
+ 264,San Juan,J,,-31.5272732,-68.5214081
93
+ 2646,Astica,J,,-30.9320107,-67.3846512
94
+ 2647,Colangüil,J,,-30.0343609,-69.2403793
95
+ 2648,Calingasta,J,,-31.3184566,-69.42536160000002
96
+ 2651,San Francisco del Monte de Oro,D,,-32.5991783,-66.1322021
97
+ 2655,La Toma,D,,-33.0548161,-65.61749429999999
98
+ 2656,Merlo,D,,-32.3492393,-65.0335693
99
+ 2657,Justo Daract,D,,-33.8653603,-65.18463129999999
100
+ 2658,Buena Esperanza,D,,-34.756794,-65.2529907
101
+ 266,San Luis,D,,-33.2995605,-66.3491821
102
+ 280,Trelew,U,,-43.2491302,-65.3074036
103
+ 2901,Ushuaia,V,,-54.79167940000001,-68.229248
104
+ 2902,El Calafate,Z,,-50.3402138,-72.27050779999999
105
+ 2903,Pastos Blancos,U,,-45.3,-70.5
106
+ 291,Bahía Blanca,B,,-38.71167760000001,-62.26807789999999
107
+ 2920,Viedma,R,,-40.8119087,-62.9962044
108
+ 2921,Coronel Dorrego,B,,-38.7194366,-61.28545759999999
109
+ 2922,Coronel Pringles,B,,-37.9854202,-61.3540382
110
+ 2923,Arroyo Corto,B,,-37.5128212,-62.3171997
111
+ 2924,Santa Teresa,L,,-37.5666667,-63.41666670000001
112
+ 2925,Felipe Solá,B,,-38.0075912,-62.81608199999999
113
+ 2926,Coronel Suárez,B,,-37.4559517,-61.93072509999999
114
+ 2927,Algarrobo,B,,-38.8949089,-63.1354523
115
+ 2928,Hilario Ascasubi,B,,-39.3760529,-62.64558030000001
116
+ 2929,Casbas,B,,-36.7571449,-62.5028076
117
+ 2931,General Conesa,R,,-40.1037178,-64.45793909999999
118
+ 2932,Punta Alta,B,,-38.8760605,-62.07408909999999
119
+ 2933,Huanguelen Sur,B,,-34.6084175,-58.37316130000001
120
+ 2934,San Antonio Oeste,R,,-40.7428017,-64.9676514
121
+ 2935,Rivera,B,,-37.1594315,-63.24351119999999
122
+ 2936,Carhué,B,,-37.1780663,-62.75482179999999
123
+ 2940,Ingeniero Jacobacci,R,,-41.3285255,-69.5493011
124
+ 2942,Zapala,Q,,-38.9023615,-70.06534049999999
125
+ 2944,San Carlos de Bariloche,R,,-41.1492882,-71.3012695
126
+ 2945,Esquel,U,,-42.9067192,-71.3081055
127
+ 2946,Choele Choel,R,,-39.2879906,-65.66539759999999
128
+ 2948,Chos Malal,Q,,-37.3793945,-70.2700043
129
+ 2952,General Acha,L,,-37.3761444,-64.6000443
130
+ 2953,Macachín,L,,-37.1502686,-63.64928819999999
131
+ 2954,Santa Rosa,L,,-36.6226883,-64.2859268
132
+ 2962,San Julián,Z,,-49.305111,-67.70797
133
+ 2963,Los Antiguos,Z,,-46.5486283,-71.6319773
134
+ 2964,Río Grande,V,,-53.79180909999999,-67.7197266
135
+ 2966,Río Gallegos,Z,,-51.6329918,-69.2276001
136
+ 297,Comodoro Rivadavia,U,,-45.8679199,-67.5
137
+ 2972,San Martín de los Andes,Q,,-40.1550903,-71.3541946
138
+ 298,General Roca,R,,-39.0267525,-67.5751724
139
+ 2982,Orense,B,,-38.6870613,-59.773838
140
+ 2983,Tres Arroyos,B,,-38.3763123,-60.2781296
141
+ 299,Neuquén,Q,,-38.9492798,-68.0658112
142
+ 3327,Benavídez,B,,-34.4151715,-58.6867547
143
+ 3329,Alsina,B,,-33.9080009,-59.3892059
144
+ 3382,Rufino,S,,-34.266468,-62.7097206
145
+ 3385,Laboulaye,X,,-34.127224,-63.3895645
146
+ 3387,Italó,X,,-34.783329,-63.7666702
147
+ 3388,Banderaló,B,,-35.0161705,-63.37463
148
+ 3400,Villa Constitución,S,,-33.2336388,-60.3341713
149
+ 3401,El Trébol,S,,-32.1980158,-61.70194999999999
150
+ 3402,Arroyo Seco,S,,-33.161659,-60.51317999999999
151
+ 3404,Gálvez,S,,-32.03339,-61.2158203
152
+ 3405,San Javier,S,,-30.5831909,-59.9496384
153
+ 3406,San Jorge,S,,-31.8962113,-61.85977699999999
154
+ 3407,El Paraíso,B,,-33.5769615,-59.98809809999999
155
+ 3408,San Cristóbal,S,,-30.3069038,-61.2378159
156
+ 3409,Colonia Bossi,S,,-30.6688976,-61.78675080000001
157
+ 341,Rosario,S,,-32.9507408,-60.66650010000001
158
+ 342,Coronda,S,,-31.9728813,-60.9193039
159
+ 343,Paraná,E,,-31.7413197,-60.51154709999999
160
+ 3435,Lucas González,E,,-32.3856506,-59.5289459
161
+ 3436,Victoria,E,,-32.6220245,-60.1570702
162
+ 3437,La Paz,E,,-30.7589703,-59.63927839999999
163
+ 3438,Bovril,E,,-31.3434707,-59.4465431
164
+ 3442,Concepción del Uruguay,E,,-32.4838219,-58.23302839999999
165
+ 3444,Gualeguay,E,,-33.1512413,-59.3344116
166
+ 3445,Rosario del Tala,E,,-32.3026733,-59.14167789999999
167
+ 3446,Gualeguaychú,E,,-33.0150185,-58.5192451
168
+ 3447,Villa Elisa,E,,-32.1641185,-58.40059899999999
169
+ 345,Concordia,E,,-31.3918479,-58.0170605
170
+ 3454,Federal,E,,-30.9512291,-58.7988281
171
+ 3455,Villaguay,E,,-31.849369,-59.01580809999999
172
+ 3456,Chajarí,E,,-30.7572746,-57.99161909999999
173
+ 3458,San José de Feliciano,E,,-30.3826904,-58.7493896
174
+ 3460,Sargento Cabral,S,,-33.4308929,-60.6272621
175
+ 3461,Campos Salles,B,,-33.4036369,-60.23913570000001
176
+ 3462,Venado Tuerto,S,,-33.75,-61.96564100000001
177
+ 3463,Canals,X,,-33.5619736,-62.8815918
178
+ 3464,Casilda,S,,-33.0496216,-61.1663818
179
+ 3465,Firmat,S,,-33.4555244,-61.48825069999999
180
+ 3466,Arocena,S,,-32.0777283,-60.9751549
181
+ 3467,Cruz Alta,X,,-33.008709,-61.8109207
182
+ 3468,Corral de Bustos,X,,-33.2835312,-62.1854591
183
+ 3469,Acebal,S,,-33.2412796,-60.83404160000001
184
+ 3471,Cañada de Gómez,S,,-32.8161583,-61.3998413
185
+ 3472,Marcos Juárez,X,,-32.6936073,-62.10267640000001
186
+ 3476,Totoras,S,,-32.5857964,-61.1678085
187
+ 3482,Reconquista,S,,-29.1448193,-59.64352419999999
188
+ 3483,Vera,S,,-29.4653301,-60.2160606
189
+ 3487,Zárate,B,,-34.0988083,-59.0322914
190
+ 3488,Dique Luján,B,,-34.3717288,-58.6880906
191
+ 3489,Campana,B,,-34.1674805,-58.95264049999999
192
+ 3491,Tostado,S,,-29.2327906,-61.77137080000001
193
+ 3492,Rafaela,S,,-31.2525979,-61.49164219999999
194
+ 3493,Sunchales,S,,-30.9429569,-61.5598907
195
+ 3496,Esperanza,S,,-31.4489859,-60.93036629999999
196
+ 3497,Cayastacito,S,,-31.1000004,-60.5666618
197
+ 3498,San Justo,S,,-30.7894382,-60.59102249999999
198
+ 351,Córdoba,X,,-31.3989296,-64.1821289
199
+ 3521,Deán Funes,X,,-30.42249679999999,-64.3527756
200
+ 3522,San Francisco del Chañar,X,,-29.7839394,-63.9321899
201
+ 3524,Villa del Totoral,X,,-30.816667,-63.71666699999999
202
+ 3525,Jesús María,X,,-30.97630969999999,-64.09581279999999
203
+ 353,Villa María,X,,-32.4104614,-63.24364499999999
204
+ 3532,Oliva,X,,-32.0412292,-63.5676689
205
+ 3533,Las Varillas,X,,-31.87050079999999,-62.7197901
206
+ 3534,Bell Ville,X,,-32.6201134,-62.68926239999999
207
+ 3541,Villa Carlos Paz,X,,-31.4209385,-64.5001297
208
+ 3542,Salsacate,X,,-31.3179455,-65.0883789
209
+ 3543,La Calera,X,,-31.396629,-64.45997600000001
210
+ 3544,Villa Dolores,X,,-31.944437,-65.19210819999999
211
+ 3546,Santa Rosa de Calamuchita,X,,-32.0677338,-64.5497437
212
+ 3547,Alta Gracia,X,,-31.65455249999999,-64.43060299999999
213
+ 3548,La Falda,X,,-31.0875359,-64.4837265
214
+ 3549,Cruz del Eje,X,,-30.7211227,-64.8098984
215
+ 3562,Morteros,X,,-30.7099133,-62.00429149999999
216
+ 3563,Balnearia,X,,-31.0128017,-62.66572489999999
217
+ 3564,San Francisco,X,,-31.42499919999999,-62.0841599
218
+ 3571,Río Tercero,X,,-32.1753998,-64.1122055
219
+ 3572,Río Segundo,X,,-31.65180209999999,-63.9123955
220
+ 3573,Calchín,X,,-31.668045,-63.19916920000001
221
+ 3574,Santa Rosa de Río Primero,X,,-31.1512527,-63.4034538
222
+ 3575,La Para,X,,-30.8919945,-62.99832149999999
223
+ 3576,Arroyito,X,,-31.4154091,-63.0505409
224
+ 358,Río Cuarto,X,,-33.132019,-64.3496704
225
+ 3582,Coronel Moldes,X,,-33.6346397,-64.59960939999999
226
+ 3583,Vicuña Mackenna,X,,-33.9179611,-64.3894806
227
+ 3584,La Carlota,X,,-33.4203339,-63.2935677
228
+ 3585,Adelia María,X,,-33.6373901,-64.0310669
229
+ 3711,Ingeniero Guillermo N. Juárez,P,,-23.8945923,-61.85535050000001
230
+ 3715,Las Lomitas,P,,-24.7045002,-60.6005783
231
+ 3716,Ibarreta,P,,-25.2150536,-59.8573494
232
+ 3717,Formosa,P,,-26.185201,-58.1753697
233
+ 3718,Clorinda,P,,-25.2881832,-57.7228203
234
+ 3721,Charadai,H,,-27.6559811,-59.8599968
235
+ 3722,Resistencia,H,,-27.451656,-58.98625199999999
236
+ 3725,General José de San Martín,H,,-26.53898,-59.34269
237
+ 3731,Charata,H,,-27.2179902,-61.18736169999999
238
+ 3732,Presidencia Roque Sáenz Peña,H,,-26.7906895,-60.4402504
239
+ 3734,Machagai,H,,-26.9329796,-60.0512695
240
+ 3735,Villa Ángela,H,,-27.5758266,-60.7136879
241
+ 3741,Bernardo de Irigoyen,N,,-26.25,-53.65000149999999
242
+ 3743,Jardín América,N,,-27.0431973,-55.2270686
243
+ 3751,San Pedro,N,,-26.6308594,-54.1131592
244
+ 3754,Dos Arroyos,N,,-27.700201,-55.24606319999999
245
+ 3755,Oberá,N,,-27.4815311,-55.1234932
246
+ 3756,Santo Tomé,W,,-28.5516205,-56.0456352
247
+ 3757,Puerto Iguazú,N,,-25.5971635,-54.578599
248
+ 3758,Concepción de la Sierra,N,,-27.9806169,-55.52174849999999
249
+ 376,Posadas,N,,-27.3621374,-55.90087459999999
250
+ 3772,Paso de los Libres,W,,-29.7137101,-57.0855601
251
+ 3773,Mercedes,W,,-29.1826935,-58.0789719
252
+ 3774,Curuzú Cuatiá,W,,-29.7915416,-58.0499307
253
+ 3775,Monte Caseros,W,,-30.2494283,-57.62968739999999
254
+ 3777,Goya,W,,-29.1442242,-59.2643242
255
+ 3781,San Miguel,W,,-27.9932613,-57.588829
256
+ 3782,San Lorenzo,W,,-28.1302185,-58.766201
257
+ 3783,Corrientes,W,,-27.4712257,-58.83958440000001
258
+ 3786,Ituzaingó,W,,-27.5899088,-56.68927009999999
259
+ 381,San Miguel de Tucumán,T,,-26.8082848,-65.2175903
260
+ 3821,Chepes,F,,-31.3363895,-66.5918427
261
+ 3822,La Rioja,F,,-29.4128001,-66.8559803
262
+ 3825,Chilecito,F,,-29.1659603,-67.5
263
+ 3826,Chamical,F,,-30.36156459999999,-66.31504819999999
264
+ 3827,Aimogasta,F,,-28.5549145,-66.81731409999999
265
+ 3832,Recreo,K,,-29.2792282,-65.06365199999999
266
+ 3833,Huillapima,K,,-28.7320004,-65.9838867
267
+ 3835,Andalgalá,K,,-27.6004009,-66.3162308
268
+ 3837,Tinogasta,K,,-28.0673199,-67.565918
269
+ 3838,El Cajón,K,,-26.4333305,-66.2666702
270
+ 3841,Pampa de los Guanacos,G,,-26.2302074,-61.8373413
271
+ 3843,Quimilí,G,,-27.6441841,-62.41556549999999
272
+ 3844,Añatuya,G,,-28.46558,-62.83356089999999
273
+ 3845,Villa Atamisqui,G,,-28.4820595,-63.8003502
274
+ 3846,Campo Gallo,G,,-26.5841694,-62.85004039999999
275
+ 385,Santiago del Estero,G,,-27.78442,-64.26728059999999
276
+ 3854,Ancaján,G,,-28.4333305,-64.933342
277
+ 3855,Suncho Corral,G,,-27.9333344,-63.4300537
278
+ 3856,Sumampa,G,,-29.3664608,-63.4680214
279
+ 3857,Los Juríes,G,,-28.465704,-62.1094246
280
+ 3858,Termas de Río Hondo,G,,-27.4942493,-64.8577881
281
+ 3861,Bobadal,G,,-26.7166691,-64.3833313
282
+ 3862,Trancas,T,,-26.2161293,-65.2835083
283
+ 3863,Famaillá,T,,-27.0560551,-65.40216830000001
284
+ 3865,Aguilares,T,,-27.4328594,-65.61586
285
+ 3867,Tafí del Valle,T,,-26.8458195,-65.700119
286
+ 3868,Cafayate,A,,-26.0703259,-65.9787521
287
+ 3869,Palá Palá,T,,-27.0666695,-65.2166672
288
+ 387,Salta,A,,-24.7829323,-65.4121552
289
+ 3873,Tartagal,A,,-22.5203762,-63.79910659999999
290
+ 3876,El Galpón,A,,-25.3839092,-64.6325684
291
+ 3877,Joaquín V. González,A,,-25.1135731,-64.1268692
292
+ 3878,Embarcación,A,,-23.2110825,-64.0974197
293
+ 388,San Salvador de Jujuy,Y,,-24.1857864,-65.2994767
294
+ 3885,La Quiaca,Y,,-22.1044031,-65.5967709
295
+ 3886,Libertador General San Martín,Y,,-23.81945,-64.790077
296
+ 3887,Humahuaca,Y,,-23.203963,-65.34860929999999
297
+ 3888,San Pedro,Y,,-24.2316571,-64.8678707
298
+ 3891,Graneros,T,,-27.6498394,-65.4400711
299
+ 3892,Amaichá del Valle,T,,-26.5863342,-65.9180298
300
+ 3894,Burruyacú,T,,-26.5937716,-64.811084
301
+ 600,,,premium rate,,
302
+ 605,,,premium rate for charity donation,,
303
+ 609,,,fixed-rate gaming,,
304
+ 610,,,dial-up internet access,,
305
+ 800,,,toll free,,
306
+ 810,,,local rate,,
307
+ 822,,,toll free calling card,,
@@ -0,0 +1,91 @@
1
+ require "nt54/parser/machinery"
2
+ require "nt54/parser/visitor"
3
+
4
+ module NT54
5
+
6
+ class Parser
7
+ include Machinery
8
+
9
+ attr_reader :number
10
+
11
+ trigger :country_code_indicated
12
+ transition :Dialtone, :WaitForCountryCodeStart
13
+
14
+ trigger :mobile_prefix_or_area_code_started
15
+ transition :Dialtone, :WaitForAreaCodeOrMobilePrefixCompletion
16
+
17
+ trigger :country_code_started
18
+ transition :WaitForCountryCodeStart, :WaitForCountryCodeEnd
19
+
20
+ trigger :area_code_indicated
21
+ transition :Dialtone, :WaitForAreaCode
22
+
23
+ trigger :country_code_completed
24
+ transition :WaitForCountryCodeEnd, :WaitForMobilePrefixOrAreaCode
25
+
26
+ trigger :mobile_prefix_or_area_code_indicated
27
+ transition :WaitForMobilePrefixOrAreaCode, :WaitForAreaCodeOrMobilePrefixCompletion
28
+
29
+ trigger :mobile_prefix_started
30
+ transition :WaitForPrefix, :WaitForMobilePrefixCompletion
31
+ transition :WaitForMobilePrefixOrAreaCode, :WaitForAreaCode
32
+ transition :WaitForAreaCodeCompletion, :WaitForMobilePrefixCompletion
33
+ transition :Dialtone, :WaitForMobilePrefixCompletion
34
+
35
+ trigger :area_code_completed
36
+ transition :WaitForAreaCodeOrMobilePrefixCompletion, :WaitForLocalPrefix
37
+ transition :WaitForAreaCodeCompletion, :WaitForPrefix
38
+ transition :WaitForAreaCode, :WaitForPrefix
39
+
40
+ trigger :area_code_potentially_completed
41
+ transition :WaitForAreaCode, :WaitForAreaCodeCompletion
42
+
43
+ trigger :mobile_prefix_completed
44
+ transition :WaitForAreaCodeOrMobilePrefixCompletion, :WaitForLocalPrefix
45
+ transition :WaitForMobilePrefixCompletion, :WaitForLocalPrefix
46
+
47
+ trigger :local_prefix_started
48
+ transition :Dialtone, :WaitForLocalPrefix
49
+ transition :WaitForPrefix, :WaitForLocalPrefix
50
+
51
+ trigger :area_code_started
52
+ transition :WaitForMobilePrefixOrAreaCode, :WaitForAreaCode
53
+ transition :WaitForPrefix, :WaitForAreaCode
54
+
55
+ trigger :local_prefix_completed
56
+ transition :WaitForLocalPrefix, :WaitForLocalNumber
57
+
58
+ trigger :special_number_started
59
+ transition :Dialtone, :WaitForSpecialNumberCompletion
60
+ transition :WaitForAreaCodeOrMobilePrefixCompletion, :WaitForSpecialNumberCompletion
61
+
62
+ def self.parse(sequence)
63
+ parser = new
64
+ sequence = sequence.to_s.gsub(/[^0-9+]/, '')
65
+ sequence.split("").map {|x| parser.dial(x)}
66
+ parser.number.fix!
67
+ end
68
+
69
+ def self.debug(sequence)
70
+ NT54.log = Logger.new(STDOUT)
71
+ NT54.log.level = Logger::DEBUG
72
+ pp parse(sequence)
73
+ end
74
+
75
+ def self.valid?(sequence)
76
+ number = parse(sequence)
77
+ number.valid?
78
+ rescue RuntimeError
79
+ false
80
+ end
81
+
82
+ def initialize
83
+ @number = PhoneNumber.new
84
+ @visitor = Parser::Visitors::Dialtone.new(@number)
85
+ end
86
+
87
+ def dial(keypress)
88
+ respond_to @visitor.accept(keypress)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,52 @@
1
+ module NT54
2
+ class Parser
3
+
4
+ module Machinery
5
+ private
6
+
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ def machine
12
+ @machine or begin
13
+ @machine = MicroMachine.new(:Dialtone).tap do |m|
14
+ m.instance_variable_set :@transitions_for, self.class.transitions
15
+ end
16
+ end
17
+ end
18
+
19
+ def respond_to(event)
20
+ return if event.nil?
21
+ next_visitor = machine.transitions_for[event][machine.state]
22
+ send event
23
+ @visitor = Visitors.const_get(next_visitor).new(@number)
24
+ end
25
+
26
+ module ClassMethods
27
+ def trigger(name, &block)
28
+ triggers << name
29
+ transitions[name] = {}
30
+ class_eval(<<-END, __FILE__, __LINE__ + 1)
31
+ def #{name}
32
+ NT54.log.debug "triggering #{name}" if NT54.log
33
+ machine.trigger :#{name}
34
+ end
35
+ END
36
+ end
37
+
38
+ def transition(from, to)
39
+ transitions[triggers.last][from] = to
40
+ end
41
+
42
+ def transitions
43
+ @transitions ||= {}
44
+ end
45
+
46
+ def triggers
47
+ @triggers ||= []
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,35 @@
1
+ module NT54
2
+ class Parser
3
+ class Visitor
4
+
5
+ attr :number
6
+
7
+ def initialize(number)
8
+ NT54.log.debug "new state: #{to_sym}" if NT54.log
9
+ @number = number
10
+ end
11
+
12
+ def accept(keypress)
13
+ NT54.log.debug "got #{keypress}" if NT54.log
14
+ return nil
15
+ end
16
+
17
+ def to_sym
18
+ self.class.to_s.split("::").last.to_sym
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ require "nt54/parser/visitors/dialtone"
25
+ require "nt54/parser/visitors/wait_for_area_code"
26
+ require "nt54/parser/visitors/wait_for_area_code_completion"
27
+ require "nt54/parser/visitors/wait_for_area_code_or_mobile_prefix_completion"
28
+ require "nt54/parser/visitors/wait_for_country_code_end"
29
+ require "nt54/parser/visitors/wait_for_country_code_start"
30
+ require "nt54/parser/visitors/wait_for_local_number"
31
+ require "nt54/parser/visitors/wait_for_local_prefix"
32
+ require "nt54/parser/visitors/wait_for_mobile_prefix_completion"
33
+ require "nt54/parser/visitors/wait_for_mobile_prefix_or_area_code"
34
+ require "nt54/parser/visitors/wait_for_prefix"
35
+ require "nt54/parser/visitors/wait_for_special_number_completion"
@@ -0,0 +1,26 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class Dialtone < Visitor
5
+ def accept(keypress)
6
+ super
7
+ case keypress
8
+ when "+"
9
+ :country_code_indicated
10
+ when "1"
11
+ :mobile_prefix_or_area_code_started
12
+ when "0"
13
+ :area_code_indicated
14
+ when ("4".."8")
15
+ @number.local_prefix << keypress
16
+ :local_prefix_started
17
+ when("9")
18
+ @number.special_sequence << keypress
19
+ :special_number_started
20
+ else raise "Don't know how to handle #{keypress}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForAreaCode < Visitor
5
+ def accept(keypress)
6
+ super
7
+ @number.area_code << keypress
8
+ if @number.area_code.length == 2 && @number.area
9
+ :area_code_completed
10
+ elsif @number.area_code.length > 2
11
+ :area_code_potentially_completed
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForAreaCodeCompletion < Visitor
5
+ def accept(keypress)
6
+ super
7
+ # Some area codes overlap, (e.g., 387 and 3873), so we need to check
8
+ # for a 4-digit area code even if we already have a valid 3-digit one.
9
+ candidate = @number.area_code + keypress
10
+ if Area.key? candidate
11
+ NT54.log.debug "#{candidate} is a valid area code" if NT54.log
12
+ @number.area_code = candidate
13
+ :area_code_completed
14
+ elsif Area.key? @number.area_code
15
+ NT54.log.debug "#{@number.area_code} is a valid area code" if NT54.log
16
+ if keypress == "1"
17
+ @number.mobile = true
18
+ :mobile_prefix_started
19
+ else
20
+ @number.local_prefix << keypress
21
+ :area_code_completed
22
+ end
23
+ else
24
+ NT54.log.warn("Continuing with invalid or unknown area code") if NT54.log
25
+ @number.local_prefix << keypress
26
+ :area_code_completed
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForAreaCodeOrMobilePrefixCompletion < Visitor
5
+ def accept(keypress)
6
+ super
7
+ if keypress == "1"
8
+ @number.area_code = "11"
9
+ :area_code_completed
10
+ elsif keypress == "5"
11
+ @number.mobile = true
12
+ :mobile_prefix_completed
13
+ elsif keypress == "0" || keypress == "2"
14
+ @number.special_sequence = "1#{keypress}"
15
+ :special_number_started
16
+ else raise "Invalid number #{keypress}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,14 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForCountryCodeEnd < Visitor
5
+ def accept(keypress)
6
+ super
7
+ raise "Expected 4, got #{keypress}" unless keypress.to_s == "4"
8
+ @number.country_code << keypress
9
+ :country_code_completed
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForCountryCodeStart < Visitor
5
+ def accept(keypress)
6
+ super
7
+ raise "Expected 5, got #{keypress}" unless keypress.to_s == "5"
8
+ @number.country_code << keypress
9
+ :country_code_started
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForLocalNumber < Visitor
5
+ def accept(keypress)
6
+ @number.local_number << keypress
7
+ super
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForLocalPrefix < Visitor
5
+ def accept(keypress)
6
+ super
7
+ combo = [@number.area_code.length, @number.local_prefix.length]
8
+ if combo == [2,4] || combo == [3,3] || combo == [4,2] || combo == [0, 4]
9
+ @number.local_number << keypress
10
+ return :local_prefix_completed
11
+ else
12
+ @number.local_prefix << keypress
13
+ nil
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForMobilePrefixCompletion < Visitor
5
+ def accept(keypress)
6
+ super
7
+ raise "Expected 5, got #{keypress}" unless keypress.to_s == "5"
8
+ :mobile_prefix_completed
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForMobilePrefixOrAreaCode < Visitor
5
+ def accept(keypress)
6
+ super
7
+ case keypress.to_s
8
+ when "1"
9
+ :mobile_prefix_or_area_code_indicated
10
+ when "9"
11
+ @number.mobile = true
12
+ :mobile_prefix_started
13
+ else
14
+ @number.area_code << keypress
15
+ :area_code_started
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForPrefix < Visitor
5
+ def accept(keypress)
6
+ super
7
+ if keypress == "1"
8
+ @number.mobile = true
9
+ :mobile_prefix_started
10
+ else
11
+ @number.local_prefix << keypress
12
+ :local_prefix_started
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ module NT54
2
+ class Parser
3
+ module Visitors
4
+ class WaitForSpecialNumberCompletion < Visitor
5
+ def accept(keypress)
6
+ @number.special_sequence << keypress
7
+ super
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,83 @@
1
+ module NT54
2
+ class PhoneNumber
3
+
4
+ attr_accessor :country_code, :area_code, :local_prefix, :local_number,
5
+ :city, :province_code, :mobile, :special_sequence, :special
6
+
7
+ def initialize
8
+ [:country_code, :area_code, :local_prefix, :local_number, :special_sequence].each do |var|
9
+ instance_variable_set :"@#{var}", ""
10
+ end
11
+ end
12
+
13
+ def area
14
+ @area ||= Area.get(area_code)
15
+ rescue Ambry::NotFoundError
16
+ end
17
+
18
+ def mobile?
19
+ !! mobile
20
+ end
21
+
22
+ def special
23
+ @special ||= SpecialNumber.get(special_sequence)
24
+ rescue Ambry::NotFoundError
25
+ end
26
+
27
+ def special?
28
+ !! special
29
+ end
30
+
31
+ def format_international
32
+ "+#{country_code} #{mobile? ? 9 : ''} (#{area_code}) #{local_prefix}-#{local_number}".squeeze(' ')
33
+ end
34
+
35
+ def format_international_sms
36
+ "+#{country_code} (#{area_code}) #{local_prefix}-#{local_number}"
37
+ end
38
+
39
+ def format_national
40
+ "(0#{area_code}) #{mobile? ? 15 : ''} #{local_prefix}-#{local_number}".squeeze(' ')
41
+ end
42
+
43
+ def format_local
44
+ "#{mobile? ? 15 : ''} #{local_prefix}-#{local_number}".squeeze(' ')
45
+ end
46
+
47
+ def real_length
48
+ area_code.length + local_prefix.length + local_number.length + special_sequence.length
49
+ end
50
+
51
+ def valid?
52
+ if special? && real_length == 3
53
+ return true
54
+ end
55
+ return false unless area_code
56
+ return false unless area
57
+ return false unless local_prefix.length >= 2
58
+ return false unless local_number.length >= 3
59
+ return false unless real_length == 10
60
+ true
61
+ end
62
+
63
+ def fix!
64
+ if real_length == 3 && special_sequence == ""
65
+ @special_sequence = "#{area_code}#{local_prefix}"
66
+ @area_code = ""
67
+ @local_prefix = ""
68
+ return self
69
+ end
70
+
71
+ @country_code = "54" if @country_code == ""
72
+ # If we didn't dial an area code, then we don't really know how long the
73
+ # prefix/local numbers are, so fake it.
74
+ unless area_code
75
+ until @local_number.length >= @local_prefix.length
76
+ @local_number.insert(0, @local_prefix.slice!(-1))
77
+ end
78
+ end
79
+ self
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,14 @@
1
+ module NT54
2
+ class Province
3
+ extend Ambry::Model
4
+ field :code, :name
5
+
6
+ def areas
7
+ Area.find {|x| x.province_code == code}
8
+ end
9
+ end
10
+
11
+ CSV.foreach(Pathname(__FILE__).dirname.join("provinces.csv")) do |row|
12
+ Province.create Hash[[:code, :name].zip(row)]
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ code,name
2
+ C,Capital Federal
3
+ B,Buenos Aires
4
+ K,Catamarca
5
+ X,Córdoba
6
+ W,Corrientes
7
+ H,Chaco
8
+ U,Chubut
9
+ E,Entre Ríos
10
+ P,Formosa
11
+ Y,Jujuy
12
+ L,La Pampa
13
+ F,La Rioja
14
+ M,Mendoza
15
+ N,Misiones
16
+ Q,Neuquén
17
+ R,Rio Negro
18
+ A,Salta
19
+ J,San Juan
20
+ D,San Luis
21
+ Z,Santa Cruz
22
+ S,Santa Fe
23
+ G,Santiago del Estero
24
+ V,Tierra del Fuego
25
+ T,Tucumán
@@ -0,0 +1,10 @@
1
+ module NT54
2
+ class SpecialNumber
3
+ extend Ambry::Model
4
+ field :sequence, :comment, :comment_en
5
+ end
6
+
7
+ CSV.foreach(Pathname(__FILE__).dirname.join("special_numbers.csv")) do |row|
8
+ SpecialNumber.create Hash[[:sequence, :comment, :comment_en].zip(row)]
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ 100,Bomberos,Fire department
2
+ 101,Policía,Police
3
+ 102,Teléfono del niño,Child services
4
+ 103,Defensa civil,Civil defense
5
+ 106,Prefectura Naval,Coast Guard
6
+ 107,Servicio público de emergencias médicas,Ambulance
7
+ 110, Información de guía telefónica,Phone directory
8
+ 112,Atención comercial al cliente de la compañía telefónica,Customer service
9
+ 113,Hora oficial,Official time
10
+ 114,Servicio de reparación de la línea telefónica,Phone repair service
11
+ 115,Prueba de línea,Ring test
12
+ 121,Información del consumo de la línea,Phone usage info
13
+ 125,Asistencia para hipoacúsicos,Assistance service for the hearing-impaired
14
+ 911,Emergencias,Emergency
@@ -0,0 +1,3 @@
1
+ module NT54
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path("../lib/nt54/version", __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "nt54"
5
+ s.version = NT54::VERSION
6
+ s.authors = ["Norman Clarke"]
7
+ s.email = ["norman@njclarke.com"]
8
+ s.homepage = "http://github.com/norman/nt54"
9
+ s.summary = "A library for working with Argentine phone numbers"
10
+ s.files = `git ls-files`.split("\n")
11
+ s.test_files = `git ls-files -- {test}/*`.split("\n")
12
+ s.require_paths = ["lib"]
13
+ s.description = "Provides Argentine phone number parsing, validation, formatting and meta-information."
14
+
15
+ s.add_dependency "ambry"
16
+ s.add_dependency "micromachine"
17
+ s.add_development_dependency "minitest"
18
+ end
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require "nt54"
3
+ require "minitest/unit"
4
+
5
+ MiniTest::Unit.autorun
@@ -0,0 +1,57 @@
1
+ require File.expand_path("../helper", __FILE__)
2
+
3
+ module NT54
4
+ class ParserTest < MiniTest::Unit::TestCase
5
+
6
+ parsing_tests = {
7
+ "+54-11-4781-8888" => ["11", "4781", "8888", false, true],
8
+ "0-11-4781-8888" => ["11", "4781", "8888", false, true],
9
+ "11-4781-8888" => ["11", "4781", "8888", false, true],
10
+ "15-6445-3333" => ["", "6445", "3333", true, false],
11
+ "0342-15-631-2222" => ["342", "631", "2222", true, true],
12
+ "0291-453-8888" => ["291", "453", "8888", false, true],
13
+ "+54-291-453-8888" => ["291", "453", "8888", false, true],
14
+ "0291-15-453-8888" => ["291", "453", "8888", true, true],
15
+ "+54-9-291-453-8888" => ["291", "453", "8888", true, true],
16
+ "0-11-15-4430-3333" => ["11", "4430", "3333", true, true],
17
+ "0810-444-4444" => ["810", "444", "4444", false, true],
18
+ "0 (221) 15 123-4567" => ["221", "123", "4567", true, true],
19
+ "0 (3722) 15 12-3456" => ["3722", "12", "3456", true, true],
20
+ "0387-431-9999" => ["387", "431", "9999", false, true],
21
+ "03868-42-6666" => ["3868", "42", "6666", false, true],
22
+ "0387-154-106666" => ["387", "410", "6666", true, true],
23
+ "03873-424444" => ["3873", "42", "4444", false, true],
24
+ "03488-218888" => ["3488", "21", "8888", false, true],
25
+ "03488-15-218888" => ["3488", "21", "8888", true, true],
26
+ "02965-422222" => ["296", "542", "2222", false, false],
27
+ "+54 15-5310-7777" => ["", "5310", "7777", true, false]
28
+ }
29
+
30
+ parsing_tests.each do |given, expected|
31
+ class_eval(<<-END, __FILE__, __LINE__+1)
32
+ def test_#{given.gsub(/[^0-9]/, "")}
33
+ number = Parser.parse("#{given}")
34
+ assert_equal "#{expected[0]}", number.area_code, "Bad area code"
35
+ assert_equal "#{expected[1]}", number.local_prefix, "Bad local prefix"
36
+ assert_equal "#{expected[2]}", number.local_number, "Bad local number"
37
+ assert_equal #{expected[3]}, number.mobile?, "Bad mobile detection"
38
+ assert_equal #{expected[4]}, number.valid?, "Bad validity check"
39
+ end
40
+ END
41
+ end
42
+
43
+ def test_non_argentine_numbers_should_be_invalid
44
+ assert !Parser.valid?("+1-206-444-5555")
45
+ end
46
+
47
+ def test_incomplete_numbers_should_be_invalid
48
+ assert !Parser.valid?("+54")
49
+ end
50
+
51
+ def test_numbers_with_unknown_area_codes_should_be_invalid
52
+ assert Parser.valid?("03861-22-4444")
53
+ # There's no "3864" area code
54
+ assert !Parser.valid?("03864-22-4444")
55
+ end
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nt54
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Norman Clarke
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ambry
16
+ requirement: &70264475542380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70264475542380
25
+ - !ruby/object:Gem::Dependency
26
+ name: micromachine
27
+ requirement: &70264475541700 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70264475541700
36
+ - !ruby/object:Gem::Dependency
37
+ name: minitest
38
+ requirement: &70264475541060 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70264475541060
47
+ description: Provides Argentine phone number parsing, validation, formatting and meta-information.
48
+ email:
49
+ - norman@njclarke.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - README.md
56
+ - Rakefile
57
+ - lib/nt54.rb
58
+ - lib/nt54/area.rb
59
+ - lib/nt54/areas.csv
60
+ - lib/nt54/parser.rb
61
+ - lib/nt54/parser/machinery.rb
62
+ - lib/nt54/parser/visitor.rb
63
+ - lib/nt54/parser/visitors/dialtone.rb
64
+ - lib/nt54/parser/visitors/wait_for_area_code.rb
65
+ - lib/nt54/parser/visitors/wait_for_area_code_completion.rb
66
+ - lib/nt54/parser/visitors/wait_for_area_code_or_mobile_prefix_completion.rb
67
+ - lib/nt54/parser/visitors/wait_for_country_code_end.rb
68
+ - lib/nt54/parser/visitors/wait_for_country_code_start.rb
69
+ - lib/nt54/parser/visitors/wait_for_local_number.rb
70
+ - lib/nt54/parser/visitors/wait_for_local_prefix.rb
71
+ - lib/nt54/parser/visitors/wait_for_mobile_prefix_completion.rb
72
+ - lib/nt54/parser/visitors/wait_for_mobile_prefix_or_area_code.rb
73
+ - lib/nt54/parser/visitors/wait_for_prefix.rb
74
+ - lib/nt54/parser/visitors/wait_for_special_number_completion.rb
75
+ - lib/nt54/phone_number.rb
76
+ - lib/nt54/province.rb
77
+ - lib/nt54/provinces.csv
78
+ - lib/nt54/special_number.rb
79
+ - lib/nt54/special_numbers.csv
80
+ - lib/nt54/version.rb
81
+ - nt54.gemspec
82
+ - test/helper.rb
83
+ - test/parser_test.rb
84
+ homepage: http://github.com/norman/nt54
85
+ licenses: []
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 1.8.10
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: A library for working with Argentine phone numbers
108
+ test_files: []