phony 1.2.11 → 1.3.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 (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