phony 1.0.1 → 1.1.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.
Files changed (41) hide show
  1. data/README.textile +14 -2
  2. data/lib/phony.rb +58 -463
  3. data/lib/phony/countries/all_other.rb +417 -0
  4. data/lib/phony/countries/austria.rb +69 -0
  5. data/lib/phony/countries/egypt.rb +40 -0
  6. data/lib/phony/countries/germany.rb +156 -0
  7. data/lib/phony/countries/greece.rb +30 -0
  8. data/lib/phony/countries/hungary.rb +23 -0
  9. data/lib/phony/countries/italy.rb +105 -0
  10. data/lib/phony/country.rb +102 -0
  11. data/lib/phony/country_codes.rb +102 -0
  12. data/lib/phony/local_splitter.rb +46 -0
  13. data/lib/phony/national_code.rb +27 -0
  14. data/lib/phony/national_splitters/fixed.rb +36 -0
  15. data/lib/phony/national_splitters/variable.rb +64 -0
  16. data/lib/phony/vanity.rb +35 -0
  17. data/spec/lib/phony/countries/austria_spec.rb +24 -0
  18. data/spec/lib/phony/countries/egypt_spec.rb +18 -0
  19. data/spec/lib/phony/countries/germany_spec.rb +24 -0
  20. data/spec/lib/phony/countries/greece_spec.rb +18 -0
  21. data/spec/lib/phony/countries/hungary_spec.rb +18 -0
  22. data/spec/lib/phony/countries/switzerland_spec.rb +18 -0
  23. data/spec/lib/phony/country_codes_spec.rb +110 -0
  24. data/spec/lib/phony/country_spec.rb +91 -0
  25. data/spec/lib/phony/local_splitter_spec.rb +48 -0
  26. data/spec/lib/phony/national_code_spec.rb +36 -0
  27. data/spec/lib/phony/national_splitters/fixed_spec.rb +43 -0
  28. data/spec/lib/phony/national_splitters/variable_spec.rb +35 -0
  29. data/spec/lib/phony/vanity_spec.rb +34 -0
  30. data/spec/lib/phony_spec.rb +117 -238
  31. metadata +45 -21
  32. data/lib/ndc/austria.rb +0 -69
  33. data/lib/ndc/fixed_size.rb +0 -113
  34. data/lib/ndc/germany.rb +0 -157
  35. data/lib/ndc/prefix.rb +0 -67
  36. data/lib/ndc/splitter.rb +0 -81
  37. data/spec/lib/ndc/austria_spec.rb +0 -40
  38. data/spec/lib/ndc/fixed_size_spec.rb +0 -65
  39. data/spec/lib/ndc/germany_spec.rb +0 -40
  40. data/spec/lib/ndc/prefix_spec.rb +0 -25
  41. data/spec/lib/ndc/splitter_spec.rb +0 -59
@@ -0,0 +1,40 @@
1
+ # Egyptian phone numbers.
2
+ #
3
+ # http://en.wikipedia.org/wiki/Telephone_numbers_in_Egypt
4
+ #
5
+ Phony::Countries::Egypt = Phony::Country.configured :local_format => [8],
6
+ :local_special_format => [7],
7
+ :ndc_fallback_length => 2,
8
+ :ndc_mapping => {
9
+ :landline => [
10
+ '2', # Cairo/Giza
11
+ '3', # Alexandria
12
+ '13', # Banha
13
+ '15', # 10th of Ramadan
14
+ '45', # Damanhur
15
+ '46', # Marsa Matruh
16
+ '47', # Kafer El Sheik
17
+ '48', # Monufia
18
+ '50', # Mansoura
19
+ '55', # Zazazig
20
+ '56', # Spare
21
+ '57', # Damiette
22
+ '62', # Suez
23
+ '64', # Ismailia
24
+ '65', # Red Sea
25
+ '66', # Port Said
26
+ '68', # El Arish
27
+ '69', # El-Tor
28
+ '82', # Beni Suef
29
+ '84', # Fayoum
30
+ '86', # Minia
31
+ '88', # Assiout
32
+ '92', # Wadi El Gehid
33
+ '93', # Sohag
34
+ '95', # Luxor
35
+ '96', # Qunea
36
+ '97', # Aswan
37
+ ],
38
+ :mobile => %w{10 11 12 14 16 17 18 19},
39
+ :service => %w{800} # Not exhaustive.
40
+ }
@@ -0,0 +1,156 @@
1
+ # Germany uses a variable-length ndc code, thus we use a separate file to not let all_other.rb explode.
2
+ #
3
+ # Note: Germany uses a variable ndc format from length 2 to 5.
4
+ # To save space, we only use ndcs up to length 4.
5
+ #
6
+ Phony::Countries::Germany = Phony::Country.configured :local_format => [3, 10],
7
+ :local_special_format => [3, 10],
8
+ :ndc_fallback_length => 4,
9
+ :ndc_mapping => {
10
+ :landline => ['10', # Call-By-Call
11
+ '11', # formerly Value Added Services
12
+ '12', # Innovative Services
13
+ '13', # Voting and Lottery Numbers
14
+ '30', # Berlin
15
+ '32', # Non Geographical Numbers
16
+ '40', # Hamburg
17
+ '69', # Frankfurt am Main
18
+ '89', # München
19
+ '201', # Essen
20
+ '202', # Wuppertal
21
+ '203', # Duisburg
22
+ '208', # Mühlheim an der Ruhr
23
+ '209', # Gelsenkirchen
24
+ '211', # Düsseldorf
25
+ '212', # Solingen
26
+ '214', # Leverkusen
27
+ '221', # Köln
28
+ '228', # Bonn
29
+ '231', # Dortmund
30
+ '234', # Bochum
31
+ '241', # Aachen
32
+ '251', # Münster
33
+ '261', # Koblenz
34
+ '271', # Siegen
35
+ '281', # Wesel
36
+ '291', # Meschede
37
+ '310', # Test Number Long Distance
38
+ '311', # Test Number Local
39
+ '335', # Frankfurt (Oder)
40
+ '340', # Dessau
41
+ '341', # Leipzig
42
+ '345', # Halle (Saale)
43
+ '351', # Dresden
44
+ '355', # Cottbus
45
+ '361', # Erfurt
46
+ '365', # Gera
47
+ '371', # Chemnitz
48
+ '375', # Zwickau
49
+ '381', # Rostock
50
+ '385', # Schwerin
51
+ '391', # Magdeburg
52
+ '395', # Neubrandenburg
53
+ '421', # Bremen
54
+ '431', # Kiel
55
+ '441', # Oldenburg
56
+ '461', # Flensburg
57
+ '471', # Bremerhaven
58
+ '481', # Heide
59
+ '491', # Leer
60
+ '511', # Hannover
61
+ '521', # Bielefeld
62
+ '531', # Braunschweig
63
+ '541', # Osnabrück
64
+ '551', # Göttingen
65
+ '561', # Kassel
66
+ '571', # Minden
67
+ '581', # Uelzen
68
+ '591', # Lingen (Ems)
69
+ '611', # Wiesbaden
70
+ '621', # Mannheim / Ludwigshafen
71
+ '631', # Kaiserslautern
72
+ '641', # Gießen
73
+ '651', # Trier
74
+ '661', # Fulda
75
+ '671', # Bad Kreuznach
76
+ '681', # Saarbrücken
77
+ '700', # Personal Numbers
78
+ '701', # Personal Numbers, reserved
79
+ '711', # Stuttgart
80
+ '721', # Karlsruhe
81
+ '731', # Ulm
82
+ '741', # Rottweil
83
+ '751', # Ravensburg
84
+ '761', # Freiburg im Breisgau
85
+ '771', # Donaueschingen
86
+ '781', # Offenburg
87
+ '791', # Schwäbisch Hall
88
+ '800', # Toll-Free Numbers
89
+ '801', # Toll-Free Numbers, reserved
90
+ '811', # Hallbergmoos
91
+ '821', # Augsburg
92
+ '831', # Kempten
93
+ '841', # Ingolstadt
94
+ '851', # Passau
95
+ '861', # Traunstein
96
+ '871', # Landshut
97
+ '881', # Weilheim in Oberbayern
98
+ '900', # Premium Rate Numbers
99
+ '901', # Premium Rate Numbers, reserved
100
+ '902', # Replacement for 0137/0138
101
+ '906', # Donauwörth
102
+ '911', # Nürnberg
103
+ '921', # Bayreuth
104
+ '931', # Würzburg
105
+ '941', # Regensburg
106
+ '951', # Bamberg
107
+ '961', # Weiden
108
+ '971', # Bad Kissingen
109
+ '981', # Ansbach
110
+ '991', # Deggendorf
111
+ ],
112
+ :mobile => [
113
+ '150', # Group3G/Quam
114
+ '151', # T-Mobile
115
+ '152', # Vodafone
116
+ '155', # E-Plus
117
+ '156', # Mobilcom
118
+ '157', # E-Plus
119
+ '159', # O2
120
+ '160', # T-Mobile
121
+ '161', # C-Netz
122
+ '162', # Vodafone
123
+ '163', # E-Plus
124
+ '164', # Cityruf
125
+ '165', # Quix
126
+ '166', # Telmi
127
+ '168', # Scall
128
+ '169', # Cityruf, Scall, Skyper (e*cityruf, e*message, e*skyper)
129
+ '170', # T-Mobile
130
+ '171', # T-Mobile
131
+ '172', # Vodafone
132
+ '173', # Vodafone
133
+ '174', # Vodafone
134
+ '175', # T-Mobile
135
+ '176', # O2 Germany
136
+ '177', # E-Plus
137
+ '178', # E-Plus
138
+ '179', # O2 Germany
139
+ ],
140
+ :service => [
141
+ '181', # IVPNs
142
+ '182', # Closed User Group
143
+ '183', # Closed User Group
144
+ '184', # Closed User Group
145
+ '185', # Closed User Group
146
+ '186', # Closed User Group
147
+ '187', # Closed User Group
148
+ '189', # Closed User Group
149
+ '190', # former Premium Rate Services
150
+ '191', # Online Services
151
+ '192', # Online Services
152
+ '193', # Online Services
153
+ '194', # Online Services
154
+ '199', # Network-Internal Traffic Control
155
+ ]
156
+ }
@@ -0,0 +1,30 @@
1
+ # Greece uses a variable-length ndc code, thus we use a separate file to not let all_other.rb explode.
2
+ #
3
+ # Note: Greece uses a variable ndc format from length 2 to 4.
4
+ # To save space, we only use ndcs of length up to 3 (and use the fallback).
5
+ #
6
+ Phony::Countries::Greece = Phony::Country.configured :local_format => [6],
7
+ :ndc_fallback_length => 4,
8
+ :ndc_mapping => {
9
+ :landline => [
10
+ '21', # Athens
11
+ '231', # Thessaloniki
12
+ '241', # Larissa
13
+ '251', # Kavala
14
+ '261', # Patras
15
+ '271', # Tripoli
16
+ '281', # Heraklion
17
+ ],
18
+ :mobile => [
19
+ '690',
20
+ '693',
21
+ '694',
22
+ '695',
23
+ '697',
24
+ '698',
25
+ '699'
26
+ ],
27
+ :service => [ # TODO
28
+ '800'
29
+ ]
30
+ }
@@ -0,0 +1,23 @@
1
+ # Hungarian phone numbers.
2
+ #
3
+ # http://en.wikipedia.org/wiki/Telephone_numbers_in_Hungary
4
+ #
5
+ Phony::Countries::Hungary = Phony::Country.configured :local_format => [3, 4], # Also captures 3, 3 on a fallback.
6
+ :local_special_format => [3, 3],
7
+ :ndc_fallback_length => 2,
8
+ :ndc_mapping => {
9
+ # 1 is Budapest.
10
+ # All others are captured using
11
+ # the fallback length 2.
12
+ #
13
+ :landline => [
14
+ '1'
15
+ ],
16
+ :mobile => [], # TODO
17
+ :service => [
18
+ '104',
19
+ '105',
20
+ '107',
21
+ '112'
22
+ ]
23
+ }
@@ -0,0 +1,105 @@
1
+ # Italian phone numbers.
2
+ #
3
+ # http://en.wikipedia.org/wiki/Telephone_numbers_in_Italy
4
+ #
5
+ Phony::Countries::Italy = Phony::Country.configured :local_format => [3, 4],
6
+ :local_special_format => [3, 3],
7
+ :ndc_fallback_length => 3,
8
+ :ndc_mapping => {
9
+ :landline => [
10
+ '10', # Genoa
11
+ '11', # Turin
12
+ '122', # Sestrieres, Bardonecchia and other Susa Valley mountain resorts
13
+ '125', # Ivrea
14
+ '131', # Alessandria
15
+ '141', # Asti
16
+ '15', # Biella
17
+ '161', # Vercelli
18
+ '165', # Aosta, Courmayeur
19
+ '166', # Cervinia
20
+ '171', # Cuneo
21
+ '185', # Tigullio
22
+ '187', # La Spezia and Cinque Terre
23
+ '19', # Savona
24
+ '2', # Milan
25
+ '30', # Brescia
26
+ '31', # Como
27
+ '321', # Novara
28
+ '331', # Varese
29
+ '341', # Lecco
30
+ '342', # Sondrio
31
+ '35', # Bergamo
32
+ '369', # Mediaset Cologno Monzese and Segrate TV studios, geographical rate (used for polls, television programs, etc.)
33
+ '376', # Mantua
34
+ '382', # Pavia
35
+ '39', # Monza
36
+ '40', # Trieste
37
+ '41', # Venice
38
+ '425', # Rovigo
39
+ '432', # Udine
40
+ '444', # Vicenza
41
+ '45', # Verona
42
+ '461', # Trento
43
+ '471', # Bolzano
44
+ '481', # Gorizia
45
+ '49', # Padua
46
+ '50', # Pisa
47
+ '51', # Bologna
48
+ '521', # Parma
49
+ '522', # Reggio nell'Emilia
50
+ '523', # Piacenza
51
+ '532', # Ferrara
52
+ '536', # Sassuolo
53
+ '541', # Rimini
54
+ '549', # San Marino (Most Serene Republic of San Marino)
55
+ '55', # Florence
56
+ '573', # Pistoia
57
+ '577', # Siena
58
+ '586', # Livorno
59
+ '59', # Modena
60
+ '6', # Rome (including State of Vatican City) and Aprilia
61
+ '70', # Cagliari
62
+ '71', # Ancona
63
+ '75', # Perugia
64
+ '769', # RAI Saxa Rubra Studios, geographical rate (used for polls, television programs, etc.)
65
+ '771', # Fondi
66
+ '773', # Latina
67
+ '775', # Frosinone
68
+ '789', # Olbia and Costa Smeralda
69
+ '79', # Sassari
70
+ '80', # Bari
71
+ '81', # Naples
72
+ '823', # Caserta
73
+ '824', # Benevento
74
+ '825', # Avellino
75
+ '85', # Pescara
76
+ '865', # Isernia
77
+ '871', # Chieti
78
+ '872', # Lanciano
79
+ '873', # Vasto
80
+ '874', # Campobasso
81
+ '875', # Termoli
82
+ '881', # Foggia
83
+ '89', # Salerno
84
+ '90', # Messina
85
+ '91', # Palermo
86
+ '92', # Agrigento
87
+ '95', # Catania
88
+ '961', # Catanzaro
89
+ '965', # Reggio di Calabria
90
+ '971', # Potenza
91
+ '99', # Taranto
92
+ ],
93
+ :mobile => [], # TODO
94
+ :service => [ # Not exhaustive.
95
+ '112',
96
+ '113',
97
+ '115',
98
+ '117',
99
+ '118',
100
+ '878',
101
+ '1515',
102
+ '1518',
103
+ '1530'
104
+ ]
105
+ }
@@ -0,0 +1,102 @@
1
+ module Phony
2
+
3
+ #
4
+ #
5
+ class Country
6
+
7
+ def initialize national_code, special_code = nil
8
+ @national_code = national_code
9
+ @special_code = special_code
10
+ end
11
+
12
+ #
13
+ #
14
+ def split national_number
15
+ ndc, *rest = @special_code.split national_number if @special_code
16
+ ndc, *rest = @national_code.split national_number unless rest && !rest.empty?
17
+ [ndc, *rest]
18
+ end
19
+
20
+ # Is this national number a vanity number?
21
+ #
22
+ def vanity? national_number
23
+ Vanity.vanity? national_number
24
+ end
25
+ #
26
+ #
27
+ def vanity_to_number vanity_number
28
+ ndc, *rest = split vanity_number
29
+ "#{ndc}#{Vanity.replace(rest.join)}"
30
+ end
31
+
32
+
33
+ # Get a configured country instance.
34
+ #
35
+ # Define your countries like this:
36
+ # Phony::Countries::Austria = Phony::Country.configured <options>
37
+ #
38
+ # Example:
39
+ # Phony::Country.configured :local_format => [3, 2, 2],
40
+ # :service_local_format => [3, 3],
41
+ # :ndc_fallback_length => 4,
42
+ # :ndc_mapping => {
43
+ # :normal => ['44'],
44
+ # :service => ['800'],
45
+ # :mobile => ['76']
46
+ # }
47
+ #
48
+ # Service numbers can have a special formatting.
49
+ # Cellphones usually use the same as the landline.
50
+ # If that is not the case, I will expand the framework.
51
+ #
52
+ def self.configured options = {}
53
+ ndc_fallback_length = options[:ndc_fallback_length]
54
+ ndc_mapping = options[:ndc_mapping] || raise("No ndc_mapping given!")
55
+
56
+ national_splitter = Phony::NationalSplitters::Variable.new ndc_fallback_length, ndc_mapping
57
+ local_splitter = Phony::LocalSplitter.instance_for options[:local_format] || [3, 2, 2]
58
+ national_code = Phony::NationalCode.new national_splitter, local_splitter
59
+
60
+ if ndc_mapping[:service]
61
+ service_national_splitter = Phony::NationalSplitters::Variable.new nil, :service => ndc_mapping[:service]
62
+ service_local_splitter = Phony::LocalSplitter.instance_for options[:service_local_format] || [3, 3]
63
+ service_code = Phony::NationalCode.new service_national_splitter, service_local_splitter
64
+ end
65
+
66
+ new national_code, service_code
67
+ end
68
+
69
+ # Gets a configured country instance with fixed length ndc code.
70
+ #
71
+ # Define your countries like this:
72
+ # Phony::Countries::Switzerland = Phony::Country.fixed <options>
73
+ #
74
+ # Example:
75
+ # Phony::Country.fixed :ndc_length => 4,
76
+ # :local_format => [3, 2, 2],
77
+ # :service_local_format => [3, 3],
78
+ # :service_ndcs => ['800']
79
+ #
80
+ def self.fixed options = {}
81
+ ndc_length = options[:ndc_length]
82
+ service_ndcs = options[:service_ndcs]
83
+ local_format = options[:local_format]
84
+
85
+ national_splitter = Phony::NationalSplitters::Fixed.new ndc_length
86
+ local_splitter = Phony::LocalSplitter.instance_for local_format || [3, 2, 2]
87
+ national_code = Phony::NationalCode.new national_splitter, local_splitter
88
+
89
+ service_code = nil
90
+ if service_ndcs
91
+ service_local_format = options[:service_local_format] || local_format
92
+ service_national_splitter = Phony::NationalSplitters::Variable.new nil, :service => service_ndcs
93
+ service_local_splitter = Phony::LocalSplitter.instance_for service_local_format || [3, 3]
94
+ service_code = Phony::NationalCode.new service_national_splitter, service_local_splitter
95
+ end
96
+
97
+ new national_code, service_code
98
+ end
99
+
100
+ end
101
+
102
+ end