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.
- data/README.textile +1 -1
- data/lib/countries.rb +385 -0
- data/lib/phony.rb +11 -9
- data/lib/phony/countries.rb +1 -0
- data/lib/phony/countries/austria.rb +68 -67
- data/lib/phony/countries/belgium.rb +29 -57
- data/lib/phony/countries/chile.rb +5 -12
- data/lib/phony/countries/china.rb +21 -20
- data/lib/phony/countries/egypt.rb +12 -37
- data/lib/phony/countries/germany.rb +39 -36
- data/lib/phony/countries/greece.rb +21 -25
- data/lib/phony/countries/hungary.rb +6 -19
- data/lib/phony/countries/italy.rb +174 -152
- data/lib/phony/countries/malaysia.rb +17 -17
- data/lib/phony/countries/netherlands.rb +50 -52
- data/lib/phony/countries/romania.rb +28 -27
- data/lib/phony/countries/south_korea.rb +11 -11
- data/lib/phony/countries/sweden.rb +49 -49
- data/lib/phony/countries/united_kingdom.rb +4 -4
- data/lib/phony/country.rb +14 -80
- data/lib/phony/country_codes.rb +23 -3
- data/lib/phony/dsl.rb +78 -0
- data/lib/phony/national_code.rb +2 -5
- data/lib/phony/national_splitters/dsl.rb +20 -0
- data/lib/phony/national_splitters/fixed.rb +1 -1
- data/lib/phony/national_splitters/none.rb +1 -1
- data/lib/phony/national_splitters/regex.rb +49 -0
- data/lib/phony/national_splitters/variable.rb +6 -6
- data/lib/phony/vanity.rb +3 -0
- data/spec/lib/phony/country_codes_spec.rb +1 -1
- data/spec/lib/phony/country_spec.rb +12 -45
- data/spec/lib/phony/local_splitters/fixed_spec.rb +8 -0
- data/spec/lib/phony/national_code_spec.rb +13 -0
- data/spec/lib/phony/national_splitters/regex_spec.rb +23 -0
- data/spec/lib/phony/national_splitters/variable_spec.rb +2 -4
- data/spec/lib/phony_spec.rb +44 -4
- metadata +9 -21
- data/lib/phony/countries/all_other.rb +0 -455
- data/lib/phony/countries/norway.rb +0 -11
- data/lib/phony/countries/peru.rb +0 -19
- data/lib/phony/countries/portugal.rb +0 -16
- data/lib/phony/national_splitters/experimental.rb +0 -17
- data/spec/lib/phony/countries/austria_spec.rb +0 -24
- data/spec/lib/phony/countries/belgium_spec.rb +0 -33
- data/spec/lib/phony/countries/egypt_spec.rb +0 -18
- data/spec/lib/phony/countries/greece_spec.rb +0 -18
- data/spec/lib/phony/countries/portugal_spec.rb +0 -21
- data/spec/lib/phony/countries/switzerland_spec.rb +0 -18
- data/spec/lib/phony/countries/united_kingdom_spec.rb +0 -50
| @@ -1,30 +1,26 @@ | |
| 1 | 
            +
            include Phony::DSL
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Greece uses a variable-length ndc code, thus we use a separate file to not let all_other.rb explode.
         | 
| 2 4 | 
             
            #
         | 
| 3 5 | 
             
            # Note: Greece uses a variable ndc format from length 2 to 4.
         | 
| 4 6 | 
             
            #       To save space, we only use ndcs of length up to 3 (and use the fallback).
         | 
| 5 7 | 
             
            #
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
               | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                            '699'
         | 
| 26 | 
            -
                           ],
         | 
| 27 | 
            -
                :service => [ # TODO
         | 
| 28 | 
            -
                             '800'
         | 
| 29 | 
            -
                            ]
         | 
| 30 | 
            -
              }
         | 
| 8 | 
            +
            ndcs = [
         | 
| 9 | 
            +
               '21', # Athens
         | 
| 10 | 
            +
              '231', # Thessaloniki
         | 
| 11 | 
            +
              '241', # Larissa
         | 
| 12 | 
            +
              '251', # Kavala
         | 
| 13 | 
            +
              '261', # Patras
         | 
| 14 | 
            +
              '271', # Tripoli
         | 
| 15 | 
            +
              '281', # Heraklion
         | 
| 16 | 
            +
              '690', # Mobile
         | 
| 17 | 
            +
              '693', # Mobile
         | 
| 18 | 
            +
              '694', # Mobile
         | 
| 19 | 
            +
              '695', # Mobile
         | 
| 20 | 
            +
              '697', # Mobile
         | 
| 21 | 
            +
              '698', # Mobile
         | 
| 22 | 
            +
              '699', # Mobile
         | 
| 23 | 
            +
              '800'  # Service
         | 
| 24 | 
            +
            ]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            Phony::Countries::Greece = one_of(ndcs, :max_length => 4) >> split(6)
         | 
| @@ -1,23 +1,10 @@ | |
| 1 | 
            +
            include Phony::DSL
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Hungarian phone numbers.
         | 
| 2 4 | 
             
            #
         | 
| 3 5 | 
             
            # http://en.wikipedia.org/wiki/Telephone_numbers_in_Hungary
         | 
| 4 6 | 
             
            #
         | 
| 5 | 
            -
            Phony::Countries::Hungary =  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
                # 1 is Budapest.
         | 
| 10 | 
            -
                # All others are captured using
         | 
| 11 | 
            -
                # the fallback length 2.
         | 
| 12 | 
            -
                #
         | 
| 13 | 
            -
                :landline => [
         | 
| 14 | 
            -
                               '1'
         | 
| 15 | 
            -
                              ],
         | 
| 16 | 
            -
                # TODO :mobile   => [],
         | 
| 17 | 
            -
                :service  => [
         | 
| 18 | 
            -
                               '104',
         | 
| 19 | 
            -
                               '105',
         | 
| 20 | 
            -
                               '107',
         | 
| 21 | 
            -
                               '112'
         | 
| 22 | 
            -
                             ]
         | 
| 23 | 
            -
              }
         | 
| 7 | 
            +
            Phony::Countries::Hungary = one_of('104', '105', '107', '112') >> split(3,3) | 
         | 
| 8 | 
            +
            # special
         | 
| 9 | 
            +
                                        # TODO mobile
         | 
| 10 | 
            +
                                        one_of('1', :max_length => 2)      >> split(3,4)
         | 
| @@ -1,156 +1,178 @@ | |
| 1 | 
            +
            include Phony::DSL
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Italian phone numbers.
         | 
| 2 4 | 
             
            #
         | 
| 3 5 | 
             
            # http://en.wikipedia.org/wiki/Telephone_numbers_in_Italy
         | 
| 4 6 | 
             
            #
         | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 7 | 
            -
               | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
             | 
| 147 | 
            -
             | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 150 | 
            -
             | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 154 | 
            -
             | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 7 | 
            +
            ndcs = [
         | 
| 8 | 
            +
              '010', # Genoa
         | 
| 9 | 
            +
              '011', # Turin
         | 
| 10 | 
            +
             '0122', # Sestrieres, Bardonecchia and other Susa Valley mountain resorts
         | 
| 11 | 
            +
             '0125', # Ivrea
         | 
| 12 | 
            +
             '0131', # Alessandria
         | 
| 13 | 
            +
             '0141', # Asti
         | 
| 14 | 
            +
              '015', # Biella
         | 
| 15 | 
            +
             '0161', # Vercelli
         | 
| 16 | 
            +
             '0165', # Aosta, Courmayeur
         | 
| 17 | 
            +
             '0166', # Cervinia
         | 
| 18 | 
            +
             '0171', # Cuneo 
         | 
| 19 | 
            +
             '0185', # Tigullio
         | 
| 20 | 
            +
             '0187', # La Spezia and Cinque Terre
         | 
| 21 | 
            +
              '019', # Savona
         | 
| 22 | 
            +
               '02', # Milan
         | 
| 23 | 
            +
              '030', # Brescia
         | 
| 24 | 
            +
              '031', # Como
         | 
| 25 | 
            +
             '0321', # Novara
         | 
| 26 | 
            +
             '0331', # Varese
         | 
| 27 | 
            +
             '0341', # Lecco
         | 
| 28 | 
            +
             '0342', # Sondrio
         | 
| 29 | 
            +
              '035', # Bergamo
         | 
| 30 | 
            +
             '0369', # Mediaset Cologno Monzese and Segrate TV studios, geographical rate (used for polls, television programs, etc.)
         | 
| 31 | 
            +
             '0376', # Mantua
         | 
| 32 | 
            +
             '0382', # Pavia
         | 
| 33 | 
            +
              '039', # Monza
         | 
| 34 | 
            +
              '040', # Trieste
         | 
| 35 | 
            +
              '041', # Venice
         | 
| 36 | 
            +
             '0425', # Rovigo
         | 
| 37 | 
            +
             '0432', # Udine
         | 
| 38 | 
            +
             '0444', # Vicenza
         | 
| 39 | 
            +
              '045', # Verona
         | 
| 40 | 
            +
             '0461', # Trento
         | 
| 41 | 
            +
             '0471', # Bolzano
         | 
| 42 | 
            +
             '0481', # Gorizia
         | 
| 43 | 
            +
              '049', # Padua
         | 
| 44 | 
            +
              '050', # Pisa
         | 
| 45 | 
            +
              '051', # Bologna
         | 
| 46 | 
            +
             '0521', # Parma
         | 
| 47 | 
            +
             '0522', # Reggio nell'Emilia
         | 
| 48 | 
            +
             '0523', # Piacenza
         | 
| 49 | 
            +
             '0532', # Ferrara
         | 
| 50 | 
            +
             '0536', # Sassuolo
         | 
| 51 | 
            +
             '0541', # Rimini
         | 
| 52 | 
            +
             '0549', # San Marino (Most Serene Republic of San Marino)
         | 
| 53 | 
            +
              '055', # Florence
         | 
| 54 | 
            +
             '0573', # Pistoia
         | 
| 55 | 
            +
             '0577', # Siena
         | 
| 56 | 
            +
             '0586', # Livorno
         | 
| 57 | 
            +
              '059', # Modena
         | 
| 58 | 
            +
               '06', # Rome (including State of Vatican City) and Aprilia
         | 
| 59 | 
            +
              '070', # Cagliari
         | 
| 60 | 
            +
              '071', # Ancona
         | 
| 61 | 
            +
              '075', # Perugia
         | 
| 62 | 
            +
             '0769', # RAI Saxa Rubra Studios, geographical rate (used for polls, television programs, etc.)
         | 
| 63 | 
            +
             '0771', # Fondi
         | 
| 64 | 
            +
             '0773', # Latina
         | 
| 65 | 
            +
             '0775', # Frosinone
         | 
| 66 | 
            +
             '0789', # Olbia and Costa Smeralda 
         | 
| 67 | 
            +
              '079', # Sassari
         | 
| 68 | 
            +
              '080', # Bari
         | 
| 69 | 
            +
              '081', # Naples
         | 
| 70 | 
            +
             '0823', # Caserta
         | 
| 71 | 
            +
             '0824', # Benevento
         | 
| 72 | 
            +
             '0825', # Avellino 
         | 
| 73 | 
            +
              '085', # Pescara
         | 
| 74 | 
            +
             '0865', # Isernia 
         | 
| 75 | 
            +
             '0871', # Chieti
         | 
| 76 | 
            +
             '0872', # Lanciano
         | 
| 77 | 
            +
             '0873', # Vasto
         | 
| 78 | 
            +
             '0874', # Campobasso 
         | 
| 79 | 
            +
             '0875', # Termoli
         | 
| 80 | 
            +
             '0881', # Foggia
         | 
| 81 | 
            +
              '089', # Salerno 
         | 
| 82 | 
            +
              '090', # Messina
         | 
| 83 | 
            +
              '091', # Palermo
         | 
| 84 | 
            +
              '092', # Agrigento
         | 
| 85 | 
            +
              '095', # Catania
         | 
| 86 | 
            +
             '0961', # Catanzaro 
         | 
| 87 | 
            +
             '0965', # Reggio di Calabria
         | 
| 88 | 
            +
             '0971', # Potenza
         | 
| 89 | 
            +
              '099', # Taranto
         | 
| 90 | 
            +
             ]
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            mobile = [
         | 
| 93 | 
            +
             '310',
         | 
| 94 | 
            +
             '31100',
         | 
| 95 | 
            +
             '31101',
         | 
| 96 | 
            +
             '31102',
         | 
| 97 | 
            +
             '31103',
         | 
| 98 | 
            +
             '31104',
         | 
| 99 | 
            +
             '31105',
         | 
| 100 | 
            +
             '313',
         | 
| 101 | 
            +
             '319',
         | 
| 102 | 
            +
             ('3200'..'3209').to_a,
         | 
| 103 | 
            +
             '322',
         | 
| 104 | 
            +
             ('3230'..'3239').to_a,
         | 
| 105 | 
            +
             ('3270'..'3279').to_a,
         | 
| 106 | 
            +
             ('3280'..'3289').to_a,
         | 
| 107 | 
            +
             ('3290'..'3299').to_a,
         | 
| 108 | 
            +
             ('3300'..'3309').to_a,
         | 
| 109 | 
            +
             '331',
         | 
| 110 | 
            +
             ('3330'..'3339').to_a,
         | 
| 111 | 
            +
             ('3340'..'3349').to_a,
         | 
| 112 | 
            +
             ('3350'..'3359').to_a,
         | 
| 113 | 
            +
             ('3360'..'3369').to_a,
         | 
| 114 | 
            +
             ('3370'..'3379').to_a,
         | 
| 115 | 
            +
             ('3380'..'3389').to_a,
         | 
| 116 | 
            +
             ('3390'..'3399').to_a,
         | 
| 117 | 
            +
             ('3400'..'3409').to_a,
         | 
| 118 | 
            +
             '341',
         | 
| 119 | 
            +
             ('3430'..'3439').to_a,
         | 
| 120 | 
            +
             '345',
         | 
| 121 | 
            +
             ('3460'..'3469').to_a,
         | 
| 122 | 
            +
             ('3470'..'3479').to_a,
         | 
| 123 | 
            +
             ('3480'..'3489').to_a,
         | 
| 124 | 
            +
             ('3490'..'3499').to_a,
         | 
| 125 | 
            +
             '350',
         | 
| 126 | 
            +
             ('3600'..'3609').to_a,
         | 
| 127 | 
            +
             '361',
         | 
| 128 | 
            +
             '362',
         | 
| 129 | 
            +
             ('3630'..'3639').to_a,
         | 
| 130 | 
            +
             ('3660'..'3669').to_a,
         | 
| 131 | 
            +
             ('3680'..'3689').to_a,
         | 
| 132 | 
            +
             '370',
         | 
| 133 | 
            +
             '373',
         | 
| 134 | 
            +
             '377',
         | 
| 135 | 
            +
             ('3800'..'3809').to_a,
         | 
| 136 | 
            +
             ('3880'..'3889').to_a,
         | 
| 137 | 
            +
             ('3890'..'3899').to_a,
         | 
| 138 | 
            +
             ('3900'..'3909').to_a,
         | 
| 139 | 
            +
             ('3910'..'3919').to_a,
         | 
| 140 | 
            +
             ('3920'..'3929').to_a,
         | 
| 141 | 
            +
             ('3930'..'3939').to_a,
         | 
| 142 | 
            +
             '397'
         | 
| 143 | 
            +
            ].flatten
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            service = [ # Not exhaustive.
         | 
| 146 | 
            +
             '112',
         | 
| 147 | 
            +
             '113',
         | 
| 148 | 
            +
             '115',
         | 
| 149 | 
            +
             '117',
         | 
| 150 | 
            +
             '118',
         | 
| 151 | 
            +
             '1515',
         | 
| 152 | 
            +
             '1518',
         | 
| 153 | 
            +
             '1530'
         | 
| 154 | 
            +
            ]
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            # TODO Normalize!
         | 
| 157 | 
            +
            #
         | 
| 158 | 
            +
            # Phony::Countries::Italy = one_of(*service)                >> split(3,3) | 
         | 
| 159 | 
            +
            #                           one_of(*mobile)                 >> split(3,4) | 
         | 
| 160 | 
            +
            #                           one_of(*ndcs, :max_length => 3) >> split(3,4)
         | 
| 161 | 
            +
                                      
         | 
| 162 | 
            +
            handlers = []
         | 
| 163 | 
            +
            handlers << Phony::NationalCode.new(
         | 
| 164 | 
            +
              Phony::NationalSplitters::Variable.new(nil, service),
         | 
| 165 | 
            +
              Phony::LocalSplitters::Fixed.instance_for([4, 4]),
         | 
| 166 | 
            +
              false
         | 
| 167 | 
            +
            )
         | 
| 168 | 
            +
            handlers << Phony::NationalCode.new(
         | 
| 169 | 
            +
              Phony::NationalSplitters::Variable.new(nil, mobile),
         | 
| 170 | 
            +
              Phony::LocalSplitters::Fixed.instance_for([3, 4]),
         | 
| 171 | 
            +
              false
         | 
| 172 | 
            +
            )
         | 
| 173 | 
            +
            handlers << Phony::NationalCode.new(
         | 
| 174 | 
            +
              Phony::NationalSplitters::Variable.new(3, ndcs),
         | 
| 175 | 
            +
              Phony::LocalSplitters::Fixed.instance_for([3, 4]),
         | 
| 176 | 
            +
              false
         | 
| 177 | 
            +
            )
         | 
| 178 | 
            +
            Phony::Countries::Italy = Phony::Country.new *handlers
         | 
| @@ -1,21 +1,21 @@ | |
| 1 | 
            +
            include Phony::DSL
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Malaysian phone numbers.
         | 
| 2 4 | 
             
            #
         | 
| 3 5 | 
             
            # http://en.wikipedia.org/wiki/Telephone_numbers_in_Malaysia
         | 
| 4 6 | 
             
            #
         | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 7 | 
            -
               | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
                :service  => %w{ 100 101 102 103 104 108 112 991 994 995 999 }
         | 
| 21 | 
            -
              }
         | 
| 7 | 
            +
            ndcs = [
         | 
| 8 | 
            +
              '2', # Singapore
         | 
| 9 | 
            +
              '3', # Selangor & Federal Territories of Kuala Lumpur & Putrajaya & also Genting Highlands, Pahang
         | 
| 10 | 
            +
              '4', # Kedah, Penang & Perlis
         | 
| 11 | 
            +
              '5', # Perak & Cameron Highlands (Pahang)
         | 
| 12 | 
            +
              '6', # Melaka, Negeri Sembilan & Muar (Johor)
         | 
| 13 | 
            +
              '7', # Johor (except Muar)
         | 
| 14 | 
            +
              '9', # Kelantan, Pahang (except Cameron Highlands & Genting Highlands) & Terengganu
         | 
| 15 | 
            +
            ]
         | 
| 16 | 
            +
            mobile = %w{ 10 11 12 13 14 153 154 156 158 16 17 18 19 }
         | 
| 17 | 
            +
            service = %w{ 100 101 102 103 104 108 112 991 994 995 999 }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            Phony::Countries::Malaysia = one_of(service)                >> split(3,3) |
         | 
| 20 | 
            +
                                         one_of(mobile)                 >> split(8)   |
         | 
| 21 | 
            +
                                         one_of(ndcs, :max_length => 2) >> split(8)
         |