phony 1.2.11 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.textile +1 -1
  2. data/lib/countries.rb +385 -0
  3. data/lib/phony.rb +11 -9
  4. data/lib/phony/countries.rb +1 -0
  5. data/lib/phony/countries/austria.rb +68 -67
  6. data/lib/phony/countries/belgium.rb +29 -57
  7. data/lib/phony/countries/chile.rb +5 -12
  8. data/lib/phony/countries/china.rb +21 -20
  9. data/lib/phony/countries/egypt.rb +12 -37
  10. data/lib/phony/countries/germany.rb +39 -36
  11. data/lib/phony/countries/greece.rb +21 -25
  12. data/lib/phony/countries/hungary.rb +6 -19
  13. data/lib/phony/countries/italy.rb +174 -152
  14. data/lib/phony/countries/malaysia.rb +17 -17
  15. data/lib/phony/countries/netherlands.rb +50 -52
  16. data/lib/phony/countries/romania.rb +28 -27
  17. data/lib/phony/countries/south_korea.rb +11 -11
  18. data/lib/phony/countries/sweden.rb +49 -49
  19. data/lib/phony/countries/united_kingdom.rb +4 -4
  20. data/lib/phony/country.rb +14 -80
  21. data/lib/phony/country_codes.rb +23 -3
  22. data/lib/phony/dsl.rb +78 -0
  23. data/lib/phony/national_code.rb +2 -5
  24. data/lib/phony/national_splitters/dsl.rb +20 -0
  25. data/lib/phony/national_splitters/fixed.rb +1 -1
  26. data/lib/phony/national_splitters/none.rb +1 -1
  27. data/lib/phony/national_splitters/regex.rb +49 -0
  28. data/lib/phony/national_splitters/variable.rb +6 -6
  29. data/lib/phony/vanity.rb +3 -0
  30. data/spec/lib/phony/country_codes_spec.rb +1 -1
  31. data/spec/lib/phony/country_spec.rb +12 -45
  32. data/spec/lib/phony/local_splitters/fixed_spec.rb +8 -0
  33. data/spec/lib/phony/national_code_spec.rb +13 -0
  34. data/spec/lib/phony/national_splitters/regex_spec.rb +23 -0
  35. data/spec/lib/phony/national_splitters/variable_spec.rb +2 -4
  36. data/spec/lib/phony_spec.rb +44 -4
  37. metadata +9 -21
  38. data/lib/phony/countries/all_other.rb +0 -455
  39. data/lib/phony/countries/norway.rb +0 -11
  40. data/lib/phony/countries/peru.rb +0 -19
  41. data/lib/phony/countries/portugal.rb +0 -16
  42. data/lib/phony/national_splitters/experimental.rb +0 -17
  43. data/spec/lib/phony/countries/austria_spec.rb +0 -24
  44. data/spec/lib/phony/countries/belgium_spec.rb +0 -33
  45. data/spec/lib/phony/countries/egypt_spec.rb +0 -18
  46. data/spec/lib/phony/countries/greece_spec.rb +0 -18
  47. data/spec/lib/phony/countries/portugal_spec.rb +0 -21
  48. data/spec/lib/phony/countries/switzerland_spec.rb +0 -18
  49. data/spec/lib/phony/countries/united_kingdom_spec.rb +0 -50
@@ -3,55 +3,53 @@
3
3
  # Note: The netherlands use a variable ndc format from length 2 to 3.
4
4
  # To save space, we only use ndcs of length 2 (and use the fallback of 3 to handle the rest).
5
5
  #
6
- Phony::Countries::Netherlands = Phony::Country.configured :local_format => [8], # 8 is for mobile numbers, other numbers will work as well (they use 7).
7
- :ndc_fallback_length => 3,
8
- :ndc_mapping => {
9
- :landline => [
10
- '10', # Rotterdam
11
- '13', # Tilburg
12
- '14', # KPN
13
- '15', # Delft
14
- '20', # Amsterdam
15
- '23', # Haarlem
16
- '24', # Nijmegen
17
- '26', # Arnhem
18
- '30', # Utrecht
19
- '33', # Amersfoort
20
- '35', # Hilversum
21
- '36', # Almere
22
- '38', # Zwolle
23
- '40', # Eindhoven
24
- '43', # Maastricht
25
- '45', # Heerlen
26
- '46', # Sittard
27
- '50', # Groningen
28
- '53', # Enschede
29
- '55', # Apeldoorn
30
- '58', # Leeuwarden
31
- '70', # Den Haag
32
- '71', # Leiden
33
- '72', # Alkmaar
34
- '73', # 's-Hertogenbosch
35
- '74', # Hengelo
36
- '75', # Zaanstad
37
- '76', # Breda
38
- '77', # Venlo
39
- '78', # Dordrecht
40
- '79', # Zoetermeer
41
- ],
42
- :mobile => [
43
- '6' # Mobiele nummers en Semafoondiensten
44
- ],
45
- :service => [
46
- '84', # Persoonlijke-assistentdiensten, zoals voicemail en faxmail
47
- '85', # Plaatsonafhankelijk netnummer
48
- '87', # Both of the above.
49
- '88', # Bedrijfsnummers
50
- '91', # Plaatsonafhankelijk netnummer
51
- '676', # Inbelnummers van Internetproviders
52
- '800', # Gratis informatienummers
53
- '900', # Betaalde informatienummers
54
- '906', # Betaalde informatienummers
55
- '909', # Betaalde informatienummers
56
- ]
57
- }
6
+ ndcs = [
7
+ '10', # Rotterdam
8
+ '13', # Tilburg
9
+ '14', # KPN
10
+ '15', # Delft
11
+ '20', # Amsterdam
12
+ '23', # Haarlem
13
+ '24', # Nijmegen
14
+ '26', # Arnhem
15
+ '30', # Utrecht
16
+ '33', # Amersfoort
17
+ '35', # Hilversum
18
+ '36', # Almere
19
+ '38', # Zwolle
20
+ '40', # Eindhoven
21
+ '43', # Maastricht
22
+ '45', # Heerlen
23
+ '46', # Sittard
24
+ '50', # Groningen
25
+ '53', # Enschede
26
+ '55', # Apeldoorn
27
+ '58', # Leeuwarden
28
+ '70', # Den Haag
29
+ '71', # Leiden
30
+ '72', # Alkmaar
31
+ '73', # 's-Hertogenbosch
32
+ '74', # Hengelo
33
+ '75', # Zaanstad
34
+ '76', # Breda
35
+ '77', # Venlo
36
+ '78', # Dordrecht
37
+ '79', # Zoetermeer
38
+ ]
39
+
40
+ service = [
41
+ '84', # Persoonlijke-assistentdiensten, zoals voicemail en faxmail
42
+ '85', # Plaatsonafhankelijk netnummer
43
+ '87', # Both of the above.
44
+ '88', # Bedrijfsnummers
45
+ '91', # Plaatsonafhankelijk netnummer
46
+ '676', # Inbelnummers van Internetproviders
47
+ '800', # Gratis informatienummers
48
+ '900', # Betaalde informatienummers
49
+ '906', # Betaalde informatienummers
50
+ '909', # Betaalde informatienummers
51
+ ]
52
+
53
+ Phony::Countries::Netherlands = one_of(service) >> split(3,3) |
54
+ one_of(['6'] + ndcs, :max_length => 3) >> split(8) # mobile + landline
55
+ # 8 is for mobile numbers, other numbers will work as well (they use 7).
@@ -1,31 +1,32 @@
1
+ include Phony::DSL
2
+
1
3
  # Romanian phone numbers.
2
4
  #
3
5
  # http://en.wikipedia.org/wiki/Romania_telephone_area_codes
4
6
  #
5
- Phony::Countries::Romania = Phony::Country.configured :local_format => [3, 4], # Also captures 3, 3 on a fallback.
6
- :local_special_format => [3, 3],
7
- :local_mobile_format => [3, 4],
8
- :ndc_fallback_length => 3,
9
- :ndc_mapping => {
10
- :landline => [
11
- '21', # Bucureşti
12
- '31', # Bucureşti
13
- ],
14
- :mobile => [
15
- '71',
16
- '72',
17
- '73',
18
- '74',
19
- '75',
20
- '76',
21
- '77',
22
- '78',
23
- ],
24
- :service => [
25
- '112',
26
- '800',
27
- '900',
28
- '903',
29
- '906',
30
- ]
31
- }
7
+
8
+ ndcs = [
9
+ '21', # Bucureşti
10
+ '31', # Bucureşti
11
+ ]
12
+ mobile = [
13
+ '71',
14
+ '72',
15
+ '73',
16
+ '74',
17
+ '75',
18
+ '76',
19
+ '77',
20
+ '78',
21
+ ]
22
+ service = [
23
+ '112',
24
+ '800',
25
+ '900',
26
+ '903',
27
+ '906',
28
+ ]
29
+
30
+ Phony::Countries::Romania = one_of(*service) >> split(3,3) |
31
+ match(/^(7[1-8])\d*$/) >> split(3,4) |
32
+ one_of('21', '31', :max_length => 3) >> split(3,4) # Bucureşti
@@ -1,15 +1,15 @@
1
+ include Phony::DSL
2
+
1
3
  # South Korean (Republic of Korea) phone numbers.
2
4
  #
3
5
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_South_Korea
4
6
  #
5
- Phony::Countries::SouthKorea = Phony::Country.configured :local_format => [4, 4],
6
- :ndc_fallback_length => 2,
7
- :ndc_mapping => {
8
- :landline => [
9
- '2', # Seoul
10
- ],
11
- :mobile => %w{ 10 11 12 13 14 15 16 17 18 19 },
12
- # TODO 4-digit services, like "unreasonable infringement of livelihood report" number :)
13
- #
14
- :service => %w{ 30 50 60 70 80 100 101 105 106 107 108 109 111 112 113 114 115 116 117 118 119 120 121 122 123 125 127 128 129 131 132 134 141 182 188 }
15
- }
7
+
8
+ # TODO 4-digit services, like "unreasonable infringement of livelihood report" number :)
9
+ #
10
+ service = %w{ 30 50 60 70 80 100 101 105 106 107 108 109 111 112 113 114 115 116 117 118 119 120 121 122 123 125 127 128 129 131 132 134 141 182 188 }
11
+ mobile = ('10'..'19').to_a
12
+
13
+ Phony::Countries::SouthKorea = one_of(*service) >> split(3,3) |
14
+ one_of(*mobile) >> split(4,4) |
15
+ one_of('2', :max_length => 2) >> split(4,4) # Seoul
@@ -6,52 +6,52 @@
6
6
  # Taken from: http://en.wikipedia.org/wiki/Telephone_numbers_in_Sweden
7
7
  # http://www.pts.se/upload/Ovrigt/Tele/Nummerfragor/bilaga-2b.pdf
8
8
  #
9
- Phony::Countries::Sweden = Phony::Country.configured :local_format => [8],
10
- :ndc_fallback_length => 3,
11
- :ndc_mapping => {
12
- :landline => [
13
- '7', # Non-geographical
14
- '8', # Stockholm
15
- '10', # VOIP
16
- '11', # Norrköping
17
- '13', # Linköping
18
- '16', # Eskilstuna-Torshälla
19
- '18', # Uppsala
20
- '19', # Örebro-Kumla
21
- '20', # toll-free
22
- '21', # Västerås
23
- '23', # Falun
24
- '26', # Gävle-Sandviken
25
- '31', # Göteborg
26
- '33', # Borås
27
- '35', # Halmstad
28
- '36', # Jönköping-Huskvarna
29
- '40', # Malmö
30
- '42', # Helsingborg-Höganäs
31
- '44', # Kristianstad
32
- '46', # Lund
33
- '54', # Karlstad
34
- '60', # Sundsvall-Timrå
35
- '63', # Östersund
36
- '90', # Umeå
37
- ],
38
- :mobile => [
39
- '70', # Mobile
40
- '71', # Telematics
41
- '72', # Mobile
42
- '73', # Mobile
43
- '74', # Pagers
44
- '76', # Mobile
45
- ],
46
- :service => [
47
- '99', # Premium Rate
48
- '112', # Emergency Service
49
- '116', # Psychological Help
50
- '118', # Number enquiries
51
- '900', # Premium Rate
52
- '939', # Premium Rate
53
- '944', # Premium Rate
54
- '1177', # Health Care Advice
55
- '11414', # Police
56
- ]
57
- }
9
+
10
+ ndcs = [
11
+ '7', # Non-geographical
12
+ '8', # Stockholm
13
+ '10', # VOIP
14
+ '11', # Norrköping
15
+ '13', # Linköping
16
+ '16', # Eskilstuna-Torshälla
17
+ '18', # Uppsala
18
+ '19', # Örebro-Kumla
19
+ '20', # toll-free
20
+ '21', # Västerås
21
+ '23', # Falun
22
+ '26', # Gävle-Sandviken
23
+ '31', # Göteborg
24
+ '33', # Borås
25
+ '35', # Halmstad
26
+ '36', # Jönköping-Huskvarna
27
+ '40', # Malmö
28
+ '42', # Helsingborg-Höganäs
29
+ '44', # Kristianstad
30
+ '46', # Lund
31
+ '54', # Karlstad
32
+ '60', # Sundsvall-Timrå
33
+ '63', # Östersund
34
+ '90', # Umeå
35
+ ]
36
+ mobile = [
37
+ '70', # Mobile
38
+ '71', # Telematics
39
+ '72', # Mobile
40
+ '73', # Mobile
41
+ '74', # Pagers
42
+ '76', # Mobile
43
+ ]
44
+ service = [
45
+ '99', # Premium Rate
46
+ '112', # Emergency Service
47
+ '116', # Psychological Help
48
+ '118', # Number enquiries
49
+ '900', # Premium Rate
50
+ '939', # Premium Rate
51
+ '944', # Premium Rate
52
+ '1177', # Health Care Advice
53
+ '11414', # Police
54
+ ]
55
+
56
+ Phony::Countries::Sweden = one_of(service) >> split(3,3) |
57
+ one_of(ndcs + mobile, :max_length => 3) >> split(8)
@@ -12,7 +12,7 @@
12
12
  #
13
13
  handlers = []
14
14
 
15
- area_code_2_national = Phony::NationalSplitters::Variable.new nil, :landline => [
15
+ area_code_2_national = Phony::NationalSplitters::Variable.new nil, [
16
16
  '20', # London
17
17
  '23', # Southampton, Portsmith
18
18
  '24', # Coventry
@@ -22,7 +22,7 @@ area_code_2_national = Phony::NationalSplitters::Variable.new nil, :landline =>
22
22
  area_code_2_local = Phony::LocalSplitters::Fixed.instance_for [4, 4]
23
23
  handlers << Phony::NationalCode.new(area_code_2_national, area_code_2_local)
24
24
 
25
- area_code_3_national = Phony::NationalSplitters::Variable.new nil, :landline => [
25
+ area_code_3_national = Phony::NationalSplitters::Variable.new nil, [
26
26
  # Geographical.
27
27
  #
28
28
  '113', # Leeds
@@ -61,7 +61,7 @@ handlers << Phony::NationalCode.new(area_code_3_national, area_code_3
61
61
 
62
62
  # 6 is the fallback length.
63
63
  #
64
- area_code_45_national = Phony::NationalSplitters::Variable.new 6, :landline => [
64
+ area_code_45_national = Phony::NationalSplitters::Variable.new 6, [
65
65
  # Geographical.
66
66
  #
67
67
  '1204', # Bolton
@@ -100,7 +100,7 @@ area_code_45_national = Phony::NationalSplitters::Variable.new 6, :landline => [
100
100
  '17684', # Pooley Bridge
101
101
  '17687', # Keswick
102
102
  '19467', # Gosforth
103
- ]
103
+ ].flatten
104
104
  area_code_45_local = Phony::LocalSplitters::Fixed.instance_for [6]
105
105
  handlers << Phony::NationalCode.new(area_code_45_national, area_code_45_local)
106
106
 
data/lib/phony/country.rb CHANGED
@@ -4,18 +4,31 @@ module Phony
4
4
  #
5
5
  class Country
6
6
 
7
+ attr_accessor :codes
8
+
7
9
  #
8
10
  #
9
11
  def initialize *codes
10
12
  @codes = codes
11
13
  end
12
14
 
15
+ # DSL.
16
+ #
17
+ # TODO
18
+ #
19
+ def |(other)
20
+ self.codes = self.codes + other.codes
21
+ self
22
+ end
23
+
13
24
  # A number is split with the code handlers as given in the initializer.
14
25
  #
26
+ # Note: If the ndc is nil, it will not return it.
27
+ #
15
28
  def split national_number
16
29
  @codes.each do |code|
17
30
  ndc, *rest = code.split national_number
18
- return [ndc, *rest] if rest && !rest.empty?
31
+ return ndc ? [ndc, *rest] : rest if rest && !rest.empty?
19
32
  end
20
33
  end
21
34
 
@@ -46,85 +59,6 @@ module Phony
46
59
  "#{ndc}#{Vanity.replace(rest.join)}"
47
60
  end
48
61
 
49
-
50
- # Get a configured country instance.
51
- #
52
- # Define your countries like this:
53
- # Phony::Countries::Austria = Phony::Country.configured <options>
54
- #
55
- # Example:
56
- # Phony::Country.configured :local_format => [3, 2, 2],
57
- # :service_local_format => [3, 3],
58
- # :ndc_fallback_length => 4,
59
- # :ndc_mapping => {
60
- # :normal => ['44'],
61
- # :service => ['800'],
62
- # :mobile => ['76']
63
- # }
64
- #
65
- # Service numbers can have a special formatting.
66
- # Cellphones usually use the same as the landline.
67
- # If that is not the case, I will expand the framework.
68
- #
69
- def self.configured options = {}
70
- normalize = options[:normalize]
71
- ndc_fallback_length = options[:ndc_fallback_length]
72
- ndc_mapping = options[:ndc_mapping] || raise("No ndc_mapping given!")
73
-
74
- codes = []
75
-
76
- if ndc_mapping[:service]
77
- service_national_splitter = Phony::NationalSplitters::Variable.new nil, :service => ndc_mapping[:service]
78
- service_local_splitter = Phony::LocalSplitters::Fixed.instance_for options[:service_local_format] || [3, 6]
79
- codes << Phony::NationalCode.new(service_national_splitter, service_local_splitter, normalize)
80
- end
81
- if ndc_mapping[:mobile]
82
- mobile_local_format = options[:mobile_local_format] || options[:local_format] || [9]
83
- mobile_national_splitter = Phony::NationalSplitters::Variable.new nil, :mobile => ndc_mapping[:mobile]
84
- mobile_local_splitter = Phony::LocalSplitters::Fixed.instance_for mobile_local_format
85
- codes << Phony::NationalCode.new(mobile_national_splitter, mobile_local_splitter, normalize)
86
- end
87
-
88
- national_splitter = Phony::NationalSplitters::Variable.new ndc_fallback_length, ndc_mapping
89
- local_splitter = Phony::LocalSplitters::Fixed.instance_for options[:local_format] || [3, 2, 2]
90
- codes << Phony::NationalCode.new(national_splitter, local_splitter, normalize)
91
-
92
- new *codes
93
- end
94
-
95
- # Gets a configured country instance with fixed length ndc code.
96
- #
97
- # Define your countries like this:
98
- # Phony::Countries::Switzerland = Phony::Country.fixed <options>
99
- #
100
- # Example:
101
- # Phony::Country.fixed :ndc_length => 4,
102
- # :local_format => [3, 2, 2],
103
- # :service_local_format => [3, 3],
104
- # :service_ndcs => ['800']
105
- #
106
- def self.fixed options = {}
107
- normalize = options[:normalize]
108
- ndc_length = options[:ndc_length]
109
- service_ndcs = options[:service_ndcs]
110
- local_format = options[:local_format]
111
-
112
- codes = []
113
-
114
- if service_ndcs
115
- service_local_format = options[:service_local_format] || local_format || [3, 3]
116
- service_national_splitter = Phony::NationalSplitters::Variable.new nil, :service => service_ndcs
117
- service_local_splitter = Phony::LocalSplitters::Fixed.instance_for service_local_format
118
- codes << Phony::NationalCode.new(service_national_splitter, service_local_splitter, normalize)
119
- end
120
-
121
- national_splitter = Phony::NationalSplitters::Fixed.new ndc_length
122
- local_splitter = Phony::LocalSplitters::Fixed.instance_for local_format || [3, 2, 2]
123
- codes << Phony::NationalCode.new(national_splitter, local_splitter, normalize)
124
-
125
- new *codes
126
- end
127
-
128
62
  end
129
63
 
130
64
  end