Full Code of carr/phone for AI

master ae4b98a6fe3e cached
41 files
104.9 KB
38.9k tokens
332 symbols
1 requests
Download .txt
Repository: carr/phone
Branch: master
Commit: ae4b98a6fe3e
Files: 41
Total size: 104.9 KB

Directory structure:
gitextract_cgkn_9w2/

├── .document
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .ruby-version
├── .yardopts
├── ChangeLog.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── data/
│   └── phone/
│       └── countries.yml
├── lib/
│   ├── phone/
│   │   ├── country.rb
│   │   ├── errors.rb
│   │   └── version.rb
│   └── phone.rb
├── phone.gemspec
├── test/
│   ├── countries/
│   │   ├── au_test.rb
│   │   ├── ba_test.rb
│   │   ├── be_test.rb
│   │   ├── de_test.rb
│   │   ├── es_test.rb
│   │   ├── fr_test.rb
│   │   ├── gb_test.rb
│   │   ├── hr_test.rb
│   │   ├── hu_test.rb
│   │   ├── ie_test.rb
│   │   ├── me_test.rb
│   │   ├── nl_test.rb
│   │   ├── nz_test.rb
│   │   ├── pt_test.rb
│   │   ├── rs_test.rb
│   │   ├── se_test.rb
│   │   ├── si_test.rb
│   │   ├── ua_test.rb
│   │   ├── us_test.rb
│   │   ├── uy_test.rb
│   │   └── za_test.rb
│   ├── extension_test.rb
│   ├── helper.rb
│   └── phone_test.rb
└── test_usa_phones_with_extensions.csv

================================================
FILE CONTENTS
================================================

================================================
FILE: .document
================================================
- 
ChangeLog.md
LICENSE.txt


================================================
FILE: .github/workflows/ci.yml
================================================
name: Ruby CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  test:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        ruby-version: ["3.4", "3.3", "3.2", "3.1", "3.0", "2.7", "jruby-head", "ruby-head"]

    steps:
      - uses: actions/checkout@v4
      - name: Set up Ruby ${{ matrix.ruby-version }}
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby-version }}
          bundler-cache: true # runs 'bundle install' and caches installed gems automatically
      - name: Run tests
        run: bundle exec rake


================================================
FILE: .gitignore
================================================
Gemfile.lock
doc/
pkg/
tmp/
vendor/cache/*.gem


================================================
FILE: .ruby-version
================================================
2.0.0


================================================
FILE: .yardopts
================================================
--markup markdown --title "phone Documentation" --protected


================================================
FILE: ChangeLog.md
================================================
# 1.3.0 / (unreleased)

* Update README for yaml name and location (pepe)
* Relocate / rename `data/phone_countries.yml` to `data/phone/countries.yml` (elskwid)
* [improvement] Add modern gem infrastructure - add bundler, update gemspec, convert to minitest, locate gem files in proper directories, add .ruby-version, update README, update LICENSE.txt, add Changelog.md. (elskwid)
* [improvement] Memoize country code regex. (tiegz)
* [improvement] Update regex for: ZA, UY, NL, BE, FR, HU, PT, UA, RS, HR, SE, SI, and BA. (g1smd)
* [improvement] Add IE support. (dramalho)
* [improvement] Update #split_to_parts to provide a format override and handle nil parts. (dramalho)
* [improvement] Add NZ support. (jurgens)
* [improvement] Add options support to `#valid?`. (soulcutter)
* [improvement] Remove need for `cattr_accessor`. (elskwid)
* [fix] Incorrect error raised when missing phone number and add missing test. (elskwid)
* [fix] Fix extension handling in `::parse`. (elskwid)
* [improvement] Remove need for ActiveSupport detection. (elskwid)
* [improvement] Remove monkeypatching support library. (elskwid)
* [improvement] Add support for Travis CI. (elskwid)
* [improvement] Add tests for parameter mutation in `#valid?`. (elskwid)
* [fix] Fix parameter mutation in extension extraction. (elskwid)
* [fix] ME (Montenegro) area code correction and tests. (bsboris)
* [improvement] Add test for parameter mutation in `::parse`. (elskwid)
* [improvement] Code style clean up and method refactoring to clarify processing and remove multiple gsub calls. (elskwid)
* [doc] README updates.

# 1.2.3 / 2013-11-16

* [fix] Bring changes from v1.1 that were mysteriously missing from repo. (elskwid)
  - README updates
  - Spain area code updates
  - Support 3 character codes for countries
  - Update default area code
  - Update `::normalize`

# 1.2.2 / 2013-11-15

* Add license to gemspec. (bf4)

# 1.2.1 / 2013-10-24

* Add errors.rb to gemspec to fix gem. (mtarnovan)

#  1.2 / 2013-10-23 (yanked)

* Released to capture updates made after version 1.1. (elskwid)
* Add specific exception classes. (miloshadzic)

# 1.1 / 2011-06-23

* Implement `==`. (haxney and carr)
* Update Uraguay area codes and tests. (tiegz)

# 1.0 / 2011-04-04

* Namespaced library as `Phoner::Phone` (carr)

# Previous versions ...


================================================
FILE: Gemfile
================================================
source "https://rubygems.org"

gemspec

group :doc do
  gem "redcarpet"
end

group :test do
  gem "rake"
end


================================================
FILE: LICENSE.txt
================================================
Copyright (c) 2010-2013 Tomislav Car
Modifications copyright (c) 2010 Todd Eichel for Fooala, Inc.
Copyright (c) 2013 Don Morrison

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
[gem]: https://rubygems.org/gems/phone
[stable]: https://github.com/carr/phone/tree/v1.2.3
[gem-beta]: https://rubygems.org/gems/phone/versions/1.3.0.beta1
[beta]: https://github.com/carr/phone/tree/v1.3.0.beta1/
[ci]: https://github.com/carr/phone/actions/workflows/ci.yml

# phone

[![Beta Gem Version](https://img.shields.io/badge/beta-v1.3.0.beta1-blue.svg)][gem-beta]
[![Gem Version](https://img.shields.io/gem/v/phone.svg)][gem]
[![Build Status](https://github.com/carr/phone/actions/workflows/ci.yml/badge.svg)][ci]

Parsing, validating and creating phone numbers

* [Homepage](https://github.com/carr/phone#readme)
* [Issues](https://github.com/carr/phone/issues)
* [Documentation](http://rubydoc.info/gems/phone/frames)
* [Email](mailto:don at elskwid.net)

## Version

This documentation is for the unreleased development branch.

* Current release: [1.3.0.beta1][beta]
* Current stable: [1.2.3][stable]

## Description

Ruby library for phone number parsing, validation, and formatting.

## Features

### Automatic country and area code detection

Phone does its best to automatically detect the country and area code while parsing. To do this, phone uses data stored in `data/phone/countries.yml`.

Each country code can have a regular expression named `area_code` that describes what the area code for that particular country looks like.

If an `area_code` regular expression isn't specified, a default value which is considered correct for the US will be used.

If your country has phone numbers longer that 8 digits - exluding country and area code - you can specify that within the country's configuration in `data/phone/countries.yml`

### Validating

Validating is very relaxed, basically it strips out everything that's not a number or '+' character:

```ruby
Phoner::Phone.valid? 'blabla 091/555-4488 blabla'
```

### Formatting

Formating is done via the `#format` method. The method accepts a `Symbol` or a `String`.

When given a string, it interpolates the string with the following fields:

* %c - country_code (385)
* %a - area_code (91)
* %A - area_code with leading zero (091)
* %n - number (5554488)
* %f - first @@n1_length characters of number (configured through Phoner::Phone.n1_length), default is 3 (555)
* %l - last characters of number (4488)
* %x - the extension number

```ruby
pn = Phoner::Phone.parse('+385915554488')
pn.to_s # => "+385915554488"
pn.format("%A/%f-%l") # => "091/555-4488"
pn.format("+ %c (%a) %n") # => "+ 385 (91) 5554488"
```

When given a symbol it is used as a lookup for the format in the <tt>Phoner::Phone.named_formats</tt> hash.

```ruby
pn.format(:europe) # => "+385 (0) 91 555 4488"
pn.format(:us) # => "(234) 123-4567"
pn.format(:default_with_extension) # => "+3851234567x143"
```

You can add your own custom named formats like so:

```ruby
Phoner::Phone.named_formats[:short] = '%A/%n1-%n2'
pn.format(:short) # => 091/555-4488
```

### Finding countries by their isocode

If you don't have the country code, but you know from other sources what country a phone is from, you can retrieve the country using the country isocode (such as 'de', 'es', 'us', ...). Remember to call `Phoner::Country.load` before using this lookup.

```ruby
if country = Phoner::Country.find_by_country_isocode(user_country_isocode)
  phone_number = Phoner::Phone.parse(user_input, :country_code => country.country_code)
end
```

## Examples

```ruby
require 'phone'
```

### Initializing

Initialize a new phone object with the number, area code, country code and extension number:

```ruby
Phoner::Phone.new('5554488', '91', '385')
```

```ruby
Phoner::Phone.new(:number => '5554488', :area_code => '91', :country_code => '385', :extension => '143')
```

### Parsing

Create a new phone object by parsing from a string. Phoner::Phone does it's best to detect the country and area codes:

```ruby
Phoner::Phone.parse '+385915554488'
Phoner::Phone.parse '00385915554488'
```

If the country or area code isn't given in the string, you must set it, otherwise it doesn't work:

```ruby
Phoner::Phone.parse '091/555-4488', :country_code => '385'
Phoner::Phone.parse '(091) 555 4488', :country_code => '385'
```

If you feel that it's tedious, set the default country code once:

```ruby
Phoner::Phone.default_country_code = '385'
Phoner::Phone.parse '091/555-4488'
Phoner::Phone.parse '(091) 555 4488'
```

Same goes for the area code:

```ruby
Phoner::Phone.parse '451-588', :country_code => '385', :area_code => '47'
```
or

```ruby
Phoner::Phone.default_country_code = '385'
Phoner::Phone.default_area_code = '47'

Phoner::Phone.parse '451-588'
```

## Adding and maintaining countries

From time to time, the specifics about your countries information may change. You can add or update your countries configuration by editing `data/phone/countries.yml`

The following are the available attributes for configuration:

* `country_code`: Required. A string representing your country's international dialling code. e.g. "123"
* `national_dialing_prefix`: Required. A string representing your default dialling prefix for national calls. e.g. "0"
* `char_3_code`: Required. A string representing a country's ISO code. e.g. "US"
* `name`: Required. The name of the country. e.g. "Denmark"
* `international_dialing_prefix`: Required. The dialling prefix a country typically uses when making international calls. e.g. "0"
* `area_code`: Optional. A regular expression detailing valid area codes. Default: "\d{3}" i.e. any 3 digits.
* `max_num_length`: Optional. The maximum length of a phone number after country and area codes have been removed. Default: 8

## Test Countries

* [AU] Australia
* [BA] Bosnia and Herzegovina
* [BE] Belgium
* [DE] Germany
* [ES] Spain
* [FR] France
* [GB] United Kingdom
* [HR] Croatia
* [HU] Hungary
* [IE] Ireland
* [ME] Montenegro
* [NL] Netherlands
* [NZ] New Zealand
* [PT] Portugal
* [RS] Serbia
* [SE] Sweden
* [SI] Slovenia
* [UA] Ukraine
* [US] United States
* [UY] Uruguay
* [ZA] South Africa

## Known issues

There's an issue with Germany and Spanish area codes.

## Requirements


## Install

    $ gem install phone

Or as a Rails plugin, in your Gemfile

    gem 'phone'

And then `bundle install` from your command line.

## Copyright

Copyright (c) 2010-2013 Tomislav Car, [Infinum](http://www.infinum.co)
Copyright (c) 2013 Don Morrison

See [LICENSE.txt](LICENSE.txt) for details.

## Contributors

Don Morrison, Michael Squires, Todd Eichel (Fooala, Inc.), chipiga, Etienne Samson, Luke Randall, Jakob Hilden, Tieg Zaharia


================================================
FILE: Rakefile
================================================
# encoding: utf-8

require "rubygems"

begin
  require "bundler"
rescue LoadError => e
  warn e.message
  warn "Run `gem install bundler` to install Bundler."
  exit -1
end

begin
  Bundler.setup(:development)
rescue Bundler::BundlerError => e
  warn e.message
  warn "Run `bundle install` to install missing gems."
  exit e.status_code
end

require "rake"

require "rubygems/tasks"
Gem::Tasks.new

require "rake/testtask"

Rake::TestTask.new do |test|
  test.libs << "test"
  test.pattern = "test/**/*_test.rb"
  test.verbose = true
end

require "yard"
YARD::Rake::YardocTask.new
task :doc => :yard

task :default => :test


================================================
FILE: data/phone/countries.yml
================================================
--- 
"676": 
  :country_code: "676"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TO
  :name: Tonga
  :international_dialing_prefix: "0"
"54": 
  :country_code: "54"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AR
  :name: Argentina
  :international_dialing_prefix: "0"
"506": 
  :country_code: "506"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CR
  :name: Costa Rica
  :international_dialing_prefix: "0"
"251": 
  :country_code: "251"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ET
  :name: Ethiopia
  :international_dialing_prefix: "0"
"590": 
  :country_code: "590"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GP
  :name: Guadeloupe
  :international_dialing_prefix: "0"
"82": 
  :country_code: "82"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: KR
  :name: Korea, Republic of
  :international_dialing_prefix: "1"
"223": 
  :country_code: "223"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ML
  :name: Mali
  :international_dialing_prefix: "0"
"420": 
  :country_code: "420"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CZ
  :name: Czech Republic
  :international_dialing_prefix: "0"
"252": 
  :country_code: "252"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SO
  :name: Somalia
  :international_dialing_prefix: "0"
"677": 
  :country_code: "677"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SB
  :name: Solomon Islands
  :international_dialing_prefix: "0"
"421": 
  :country_code: "421"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SK
  :name: Slovakia
  :international_dialing_prefix: "0"
"507": 
  :country_code: "507"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: PA
  :name: Panama
  :international_dialing_prefix: "0"
"591": 
  :country_code: "591"
  :national_dialing_prefix: "10"
  :char_2_code: "10"
  :char_3_code: BO
  :name: Bolivia
  :international_dialing_prefix: "10"
"224": 
  :country_code: "224"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GN
  :name: Guinea
  :international_dialing_prefix: "0"
"84": 
  :country_code: "84"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: VN
  :name: Viet Nam
  :international_dialing_prefix: "0"
"678": 
  :country_code: "678"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: VU
  :name: Vanuatu
  :international_dialing_prefix: "0"
"27": 
  :country_code: "27"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ZA
  :name: South Africa
  :international_dialing_prefix: "0"
  :area_code: "800|86[01]|[1-9]\\d"
  :max_num_length: 11
"508":
  :country_code: "508"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PM
  :name: Saint Pierre And Miquelon
  :international_dialing_prefix: "0"
"55": 
  :country_code: "55"
  :national_dialing_prefix: "14"
  :char_2_code: "14"
  :char_3_code: BR
  :name: Brazil
  :international_dialing_prefix: "14"
"253": 
  :country_code: "253"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: DJ
  :name: Djibouti
  :international_dialing_prefix: "0"
"592": 
  :country_code: "592"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GY
  :name: Guyana
  :international_dialing_prefix: "0"
"225": 
  :country_code: "225"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CI
  :name: "C\xC3\xB4te D'Ivoire"
  :international_dialing_prefix: "0"
"56": 
  :country_code: "56"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CL
  :name: Chile
  :international_dialing_prefix: "0"
"679": 
  :country_code: "679"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: FJ
  :name: Fiji
  :international_dialing_prefix: "0"
"509": 
  :country_code: "509"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: HT
  :name: Haiti
  :international_dialing_prefix: "0"
"593": 
  :country_code: "593"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: EC
  :name: Ecuador
  :international_dialing_prefix: "0"
"254": 
  :country_code: "254"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: KE
  :name: Kenya
  :international_dialing_prefix: "0"
"226": 
  :country_code: "226"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BF
  :name: Burkina Faso
  :international_dialing_prefix: "0"
"423": 
  :country_code: "423"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: LI
  :name: Liechtenstein
  :international_dialing_prefix: "0"
"255": 
  :country_code: "255"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: TZ
  :name: Tanzania, United Republic of
  :international_dialing_prefix: "0"
"227": 
  :country_code: "227"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NE
  :name: Niger
  :international_dialing_prefix: "0"
"594": 
  :country_code: "594"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GF
  :name: French Guiana
  :international_dialing_prefix: "0"
"86": 
  :country_code: "86"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CN
  :name: China
  :international_dialing_prefix: "0"
"960": 
  :country_code: "960"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MV
  :name: Maldives
  :international_dialing_prefix: "0"
"57": 
  :country_code: "57"
  :national_dialing_prefix: "5"
  :char_2_code: "5"
  :char_3_code: CO
  :name: Colombia
  :international_dialing_prefix: "5"
"58": 
  :country_code: "58"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: VE
  :name: Venezuela, Bolivarian Republic of
  :international_dialing_prefix: "0"
"256": 
  :country_code: "256"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: UG
  :name: Uganda
  :international_dialing_prefix: "0"
"228": 
  :country_code: "228"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TG
  :name: Togo
  :international_dialing_prefix: "0"
"595": 
  :country_code: "595"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PY
  :name: Paraguay
  :international_dialing_prefix: "2"
"961": 
  :country_code: "961"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: LB
  :name: Lebanon
  :international_dialing_prefix: "0"
"596": 
  :country_code: "596"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MQ
  :name: Martinique
  :international_dialing_prefix: "0"
"257": 
  :country_code: "257"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BI
  :name: Burundi
  :international_dialing_prefix: "0"
"229": 
  :country_code: "229"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BJ
  :name: Benin
  :international_dialing_prefix: "0"
"962": 
  :country_code: "962"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: JO
  :name: Jordan
  :international_dialing_prefix: "0"
"963": 
  :country_code: "963"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SY
  :name: Syrian Arab Republic
  :international_dialing_prefix: "0"
"597": 
  :country_code: "597"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SR
  :name: Suriname
  :international_dialing_prefix: "0"
"680": 
  :country_code: "680"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: PW
  :name: Palau
  :international_dialing_prefix: "0"
"258": 
  :country_code: "258"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MZ
  :name: Mozambique
  :international_dialing_prefix: "0"
"30": 
  :country_code: "30"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GR
  :name: Greece
  :international_dialing_prefix: "0"
"681": 
  :country_code: "681"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: WF
  :name: Wallis and Futuna
  :international_dialing_prefix: "19"
"598": 
  :country_code: "598"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: UY
  :name: Uruguay
  :international_dialing_prefix: "0"
  :area_code: "2|42|4364|43[34567]|4452|44[3457]|454[24]|4567?|4586|46[234]|4675|47[237]|4779|9[0-9]"
"992": 
  :country_code: "992"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: TJ
  :name: Tajikistan
  :international_dialing_prefix: "810"
"31": 
  :country_code: "31"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NL
  :name: Netherlands
  :international_dialing_prefix: "0"
  :area_code: "6760|66|6|800|878|8[4578]|90[069]|1[035]|2[0346]|3[03568]|4[0356]|5[0358]|7\\d|11[134578]|16[124-8]|17[24]|18[0-467]|22[2-46-9]|25[125]|29[479]|31[3-8]|32[01]|34[1-8]|41[12368]|47[58]|48[15-8]|49[23579]|5[129][1-9]|54[134-8]|56[126]|57[0-3578]"
"850": 
  :country_code: "850"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: KP
  :name: Korea, Democratic People's Republic Of
  :international_dialing_prefix: "0"
"964": 
  :country_code: "964"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: IQ
  :name: Iraq
  :international_dialing_prefix: "0"
"370": 
  :country_code: "370"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: LT
  :name: Lithuania
  :international_dialing_prefix: "0"
"993": 
  :country_code: "993"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: TM
  :name: Turkmenistan
  :international_dialing_prefix: "810"
"599": 
  :country_code: "599"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AN
  :name: Netherlands Antilles
  :international_dialing_prefix: "0"
"32": 
  :country_code: "32"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BE
  :name: Belgium
  :international_dialing_prefix: "0"
  :area_code: "800|90\\d|2|3|4|9|1[0-69]|5\\d|6[013-9]|7[0178]|8[1-9]"
"965": 
  :country_code: "965"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: KW
  :name: Kuwait
  :international_dialing_prefix: "0"
"371": 
  :country_code: "371"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: LV
  :name: Latvia
  :international_dialing_prefix: "0"
"682": 
  :country_code: "682"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CK
  :name: Cook Islands
  :international_dialing_prefix: "0"
"60": 
  :country_code: "60"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MY
  :name: Malaysia
  :international_dialing_prefix: "0"
"966": 
  :country_code: "966"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SA
  :name: Saudi Arabia
  :international_dialing_prefix: "0"
"683": 
  :country_code: "683"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: NU
  :name: Niue
  :international_dialing_prefix: "0"
"230": 
  :country_code: "230"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MU
  :name: Mauritius
  :international_dialing_prefix: "20"
"994": 
  :country_code: "994"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: AZ
  :name: Azerbaijan
  :international_dialing_prefix: "810"
"852": 
  :country_code: "852"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: HK
  :name: Hong Kong
  :international_dialing_prefix: "1"
"372": 
  :country_code: "372"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: EE
  :name: Estonia
  :international_dialing_prefix: "0"
"61": 
  :country_code: "61"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AU
  :name: Australia
  :international_dialing_prefix: "11"
  :area_code: "[234578]"
"880": 
  :country_code: "880"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BD
  :name: Bangladesh
  :international_dialing_prefix: "0"
"967": 
  :country_code: "967"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: YE
  :name: Yemen
  :international_dialing_prefix: "0"
"90": 
  :country_code: "90"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: TR
  :name: Turkey
  :international_dialing_prefix: "0"
"373": 
  :country_code: "373"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MD
  :name: Moldova, Republic of
  :international_dialing_prefix: "0"
"33": 
  :country_code: "33"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: FR
  :name: France
  :international_dialing_prefix: "0"
  :area_code: "[1-9]"
"995": 
  :country_code: "995"
  :national_dialing_prefix: 8*
  :char_2_code: 8*
  :char_3_code: GE
  :name: Georgia
  :international_dialing_prefix: "810"
"853": 
  :country_code: "853"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MO
  :name: Macao
  :international_dialing_prefix: "0"
"231": 
  :country_code: "231"
  :national_dialing_prefix: "22"
  :char_2_code: "22"
  :char_3_code: LR
  :name: Liberia
  :international_dialing_prefix: "0"
"62": 
  :country_code: "62"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ID
  :name: Indonesia
  :international_dialing_prefix: "1"
"260": 
  :country_code: "260"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ZM
  :name: Zambia
  :international_dialing_prefix: "0"
"34": 
  :country_code: "34"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: ES
  :name: Spain
  :international_dialing_prefix: "0"
  :area_code: "6[0-9][0-9]|7[1-9][0-9]|8[0-9][0-9]|9[0-9][0-9]"  
"232": 
  :country_code: "232"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SL
  :name: Sierra Leone
  :international_dialing_prefix: "0"
"685": 
  :country_code: "685"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: WS
  :name: Samoa
  :international_dialing_prefix: "0"
"63": 
  :country_code: "63"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PH
  :name: Philippines
  :international_dialing_prefix: "0"
"968": 
  :country_code: "968"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: OM
  :name: Oman
  :international_dialing_prefix: "0"
"996": 
  :country_code: "996"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: KG
  :name: Kyrgyzstan
  :international_dialing_prefix: "0"
"374": 
  :country_code: "374"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: AM
  :name: Armenia
  :international_dialing_prefix: "0"
"91": 
  :country_code: "91"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: IN
  :name: India
  :international_dialing_prefix: "0"
"92": 
  :country_code: "92"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PK
  :name: Pakistan
  :international_dialing_prefix: "0"
"64": 
  :country_code: "64"
  :national_dialing_prefix: 0 (None fo
  :char_2_code: 0 (None fo
  :char_3_code: NZ
  :name: New Zealand
  :international_dialing_prefix: "0"
  :area_code: "[1-9]"
"855": 
  :country_code: "855"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: KH
  :name: Cambodia
  :international_dialing_prefix: "0"
"261": 
  :country_code: "261"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MG
  :name: Madagascar
  :international_dialing_prefix: "0"
"1": 
  :country_code: "1"
  :national_dialing_prefix: "1"
  :char_2_code: "1"
  :char_3_code: US
  :name: United States
  :international_dialing_prefix: "11"
"375": 
  :country_code: "375"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: BY
  :name: Belarus
  :international_dialing_prefix: "810"
"233": 
  :country_code: "233"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GH
  :name: Ghana
  :international_dialing_prefix: "0"
"686": 
  :country_code: "686"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: KI
  :name: Kiribati
  :international_dialing_prefix: "0"
"998": 
  :country_code: "998"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: UZ
  :name: Uzbekistan
  :international_dialing_prefix: "810"
"65": 
  :country_code: "65"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SG
  :name: Singapore
  :international_dialing_prefix: "1"
"290": 
  :country_code: "290"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SH
  :name: Saint Helena
  :international_dialing_prefix: "0"
"262": 
  :country_code: "262"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: RE
  :name: "R\xC3\xA9union"
  :international_dialing_prefix: "0"
"234": 
  :country_code: "234"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NG
  :name: Nigeria
  :international_dialing_prefix: "9"
"687": 
  :country_code: "687"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: NC
  :name: New Caledonia
  :international_dialing_prefix: "0"
"856": 
  :country_code: "856"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: LA
  :name: Lao People's Democratic Republic
  :international_dialing_prefix: "0"
"93": 
  :country_code: "93"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AF
  :name: Afghanistan
  :international_dialing_prefix: "0"
"376": 
  :country_code: "376"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: AD
  :name: Andorra
  :international_dialing_prefix: "0"
"36": 
  :country_code: "36"
  :national_dialing_prefix: "6"
  :char_2_code: "6"
  :char_3_code: HU
  :name: Hungary
  :international_dialing_prefix: "0"
  :area_code: "1|[2-9]\\d"
"263": 
  :country_code: "263"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ZW
  :name: Zimbabwe
  :international_dialing_prefix: "0"
"688": 
  :country_code: "688"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TV
  :name: Tuvalu
  :international_dialing_prefix: "0"
"94": 
  :country_code: "94"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: LK
  :name: Sri Lanka
  :international_dialing_prefix: "0"
"377": 
  :country_code: "377"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MC
  :name: Monaco
  :international_dialing_prefix: "0"
"235": 
  :country_code: "235"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TD
  :name: Chad
  :international_dialing_prefix: "15"
"291": 
  :country_code: "291"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ER
  :name: Eritrea
  :international_dialing_prefix: "0"
"66": 
  :country_code: "66"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: TH
  :name: Thailand
  :international_dialing_prefix: "1"
"886": 
  :country_code: "886"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TW
  :name: Taiwan, Province Of China
  :international_dialing_prefix: "2"
"378": 
  :country_code: "378"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SM
  :name: San Marino
  :international_dialing_prefix: "0"
"264": 
  :country_code: "264"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NA
  :name: Namibia
  :international_dialing_prefix: "0"
"95": 
  :country_code: "95"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MM
  :name: Myanmar
  :international_dialing_prefix: "0"
"236": 
  :country_code: "236"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CF
  :name: Central African Republic
  :international_dialing_prefix: "0"
"689": 
  :country_code: "689"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: PF
  :name: French Polynesia
  :international_dialing_prefix: "0"
"970": 
  :country_code: "970"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PS
  :name: Palestinian Territory, Occupied
  :international_dialing_prefix: "0"
"237": 
  :country_code: "237"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CM
  :name: Cameroon
  :international_dialing_prefix: "0"
"39": 
  :country_code: "39"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: IT
  :name: Italy
  :international_dialing_prefix: "0"
"265": 
  :country_code: "265"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: MW
  :name: Malawi
  :international_dialing_prefix: "0"
"971": 
  :country_code: "971"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AE
  :name: United Arab Emirates
  :international_dialing_prefix: "0"
"238": 
  :country_code: "238"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CV
  :name: Cape Verde
  :international_dialing_prefix: "0"
"266": 
  :country_code: "266"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: LS
  :name: Lesotho
  :international_dialing_prefix: "0"
"239": 
  :country_code: "239"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ST
  :name: Sao Tome and Principe
  :international_dialing_prefix: "0"
"7": 
  :country_code: "7"
  :national_dialing_prefix: "8"
  :char_2_code: "8"
  :char_3_code: RU
  :name: Russian Federation
  :international_dialing_prefix: "810"
"98": 
  :country_code: "98"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: IR
  :name: Iran, Islamic Republic Of
  :international_dialing_prefix: "0"
"972": 
  :country_code: "972"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: IL
  :name: Israel
  :international_dialing_prefix: "0"
"350": 
  :country_code: "350"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GI
  :name: Gibraltar
  :international_dialing_prefix: "0"
"267": 
  :country_code: "267"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BW
  :name: Botswana
  :international_dialing_prefix: "0"
"690": 
  :country_code: "690"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TK
  :name: Tokelau
  :international_dialing_prefix: "0"
"268": 
  :country_code: "268"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SZ
  :name: Swaziland
  :international_dialing_prefix: "0"
"40": 
  :country_code: "40"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: RO
  :name: Romania
  :international_dialing_prefix: "0"
"351": 
  :country_code: "351"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: PT
  :name: Portugal
  :international_dialing_prefix: "0"
  :area_code: "2[12]|2[3-9][1-9]|70[78]|80[089]|9[136]|92[1-9]"
"973": 
  :country_code: "973"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BH
  :name: Bahrain
  :international_dialing_prefix: "0"
"380": 
  :country_code: "380"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: UA
  :name: Ukraine
  :international_dialing_prefix: "00"
  :area_code: "[1-9]\\d"
"41": 
  :country_code: "41"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CH
  :name: Switzerland
  :international_dialing_prefix: "0"
"974": 
  :country_code: "974"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: QA
  :name: Qatar
  :international_dialing_prefix: "0"
"691": 
  :country_code: "691"
  :national_dialing_prefix: "1"
  :char_2_code: "1"
  :char_3_code: FM
  :name: Micronesia, Federated States Of
  :international_dialing_prefix: "11"
"297": 
  :country_code: "297"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: AW
  :name: Aruba
  :international_dialing_prefix: "0"
"352": 
  :country_code: "352"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: LU
  :name: Luxembourg
  :international_dialing_prefix: "0"
"269": 
  :country_code: "269"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: YT
  :name: Mayotte
  :international_dialing_prefix: "0"
"381": 
  :country_code: "381"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: RS
  :name: Serbia
  :international_dialing_prefix: "99"
  :area_code: "[1-9]\\d"
"975": 
  :country_code: "975"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: BT
  :name: Bhutan
  :international_dialing_prefix: "0"
"298": 
  :country_code: "298"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: FO
  :name: Faroe Islands
  :international_dialing_prefix: "0"
"353": 
  :country_code: "353"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: IE
  :name: Ireland
  :international_dialing_prefix: "0"
  :area_code: "1|[2,4-7,9][0-9]|8[0,3-9]|822|818"  
"692": 
  :country_code: "692"
  :national_dialing_prefix: "1"
  :char_2_code: "1"
  :char_3_code: MH
  :name: Marshall Islands
  :international_dialing_prefix: "0"
"212": 
  :country_code: "212"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MA
  :name: Morocco
  :international_dialing_prefix: "0"
"382": 
  :country_code: "382"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: ME
  :name: Montenegro
  :international_dialing_prefix: "99"
  :area_code: "[2-6][0-9]"
"976": 
  :country_code: "976"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MN
  :name: Mongolia
  :international_dialing_prefix: "1"
"240": 
  :country_code: "240"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GQ
  :name: Equatorial Guinea
  :international_dialing_prefix: "0"
"299": 
  :country_code: "299"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GL
  :name: Greenland
  :international_dialing_prefix: "9"
"354": 
  :country_code: "354"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: IS
  :name: Iceland
  :international_dialing_prefix: "0"
"43": 
  :country_code: "43"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AT
  :name: Austria
  :international_dialing_prefix: "0"
"977": 
  :country_code: "977"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NP
  :name: Nepal
  :international_dialing_prefix: "0"
"241": 
  :country_code: "241"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GA
  :name: Gabon
  :international_dialing_prefix: "0"
"355": 
  :country_code: "355"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AL
  :name: Albania
  :international_dialing_prefix: "0"
"213": 
  :country_code: "213"
  :national_dialing_prefix: "7"
  :char_2_code: "7"
  :char_3_code: DZ
  :name: Algeria
  :international_dialing_prefix: "0"
"44": 
  :country_code: "44"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: GB
  :name: United Kingdom
  :international_dialing_prefix: "0"
  :area_code: "2[03489]|11[3-8]|1[2-69]1|1[2-9][0-9]{2}|70|7[0-9]{3}|[8|9][0-9]{2}|3[0-9]{2}"
"242": 
  :country_code: "242"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CG
  :name: Congo
  :international_dialing_prefix: "0"
"356": 
  :country_code: "356"
  :national_dialing_prefix: "21"
  :char_2_code: "21"
  :char_3_code: MT
  :name: Malta
  :international_dialing_prefix: "0"
"357": 
  :country_code: "357"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CY
  :name: Cyprus
  :international_dialing_prefix: "0"
"45": 
  :country_code: "45"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: DK
  :name: Denmark
  :international_dialing_prefix: "0"
"385": 
  :country_code: "385"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: HR
  :name: Croatia
  :international_dialing_prefix: "0"
  :area_code: "1|[2-9]\\d"
"243": 
  :country_code: "243"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: CD
  :name: Congo, The Democratic Republic Of The
  :international_dialing_prefix: "0"
"216": 
  :country_code: "216"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TN
  :name: Tunisia
  :international_dialing_prefix: "0"
"46": 
  :country_code: "46"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SE
  :name: Sweden
  :international_dialing_prefix: "0"
  :area_code: "900|1[013689]|2[0136]|3[1356]|4[0246]|54|6[03]|7[01236]|8|9[09]|1[2457]\\d|2[2457-9]\\d|3[0247-9]\\d|4[1357-9]\\d|5[0-35-9]\\d|6[124-9]\\d|74\\d|9[1-8]\\d"
"386": 
  :country_code: "386"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SI
  :name: Slovenia
  :international_dialing_prefix: "0"
  :area_code: "3[01]|4[01]|51|7[01]|64|59|1|2|3|4|5|6|7"
"358": 
  :country_code: "358"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: FI
  :name: Finland
  :international_dialing_prefix: "0"
"244": 
  :country_code: "244"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: AO
  :name: Angola
  :international_dialing_prefix: "0"
"47": 
  :country_code: "47"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: "NO"
  :name: Norway
  :international_dialing_prefix: "0"
"359": 
  :country_code: "359"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BG
  :name: Bulgaria
  :international_dialing_prefix: "0"
"387": 
  :country_code: "387"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BA
  :name: Bosnia and Herzegovina
  :international_dialing_prefix: "0"
  :area_code: "6|[0-57-9]\\d"
"245": 
  :country_code: "245"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GW
  :name: Guinea-Bissau
  :international_dialing_prefix: "0"
"48": 
  :country_code: "48"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PL
  :name: Poland
  :international_dialing_prefix: "0"
"218": 
  :country_code: "218"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: LY
  :name: Libyan Arab Jamahiriya
  :international_dialing_prefix: "0"
"49": 
  :country_code: "49"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: DE
  :name: Germany
  :international_dialing_prefix: "0"
  :area_code: "[0-9]{3}"
"389": 
  :country_code: "389"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MK
  :name: Macedonia, the Former Yugoslav Republic Of
  :international_dialing_prefix: "0"
"670": 
  :country_code: "670"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: TL
  :name: Timor-Leste
  :international_dialing_prefix: None
"248": 
  :country_code: "248"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SC
  :name: Seychelles
  :international_dialing_prefix: "0"
"20": 
  :country_code: "20"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: EG
  :name: Egypt
  :international_dialing_prefix: "0"
"500": 
  :country_code: "500"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: FK
  :name: Falkland Islands (Malvinas)
  :international_dialing_prefix: "0"
"249": 
  :country_code: "249"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: SD
  :name: Sudan
  :international_dialing_prefix: "0"
"501": 
  :country_code: "501"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BZ
  :name: Belize
  :international_dialing_prefix: "0"
"672": 
  :country_code: "672"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: NF
  :name: Norfolk Island
  :international_dialing_prefix: "0"
"502": 
  :country_code: "502"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GT
  :name: Guatemala
  :international_dialing_prefix: "0"
"51": 
  :country_code: "51"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PE
  :name: Peru
  :international_dialing_prefix: "0"
"220": 
  :country_code: "220"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: GM
  :name: Gambia
  :international_dialing_prefix: "0"
"673": 
  :country_code: "673"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: BN
  :name: Brunei Darussalam
  :international_dialing_prefix: "0"
"503": 
  :country_code: "503"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SV
  :name: El Salvador
  :international_dialing_prefix: "0"
"221": 
  :country_code: "221"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: SN
  :name: Senegal
  :international_dialing_prefix: "0"
"674": 
  :country_code: "674"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: NR
  :name: Nauru
  :international_dialing_prefix: "0"
"52": 
  :country_code: "52"
  :national_dialing_prefix: "1"
  :char_2_code: "1"
  :char_3_code: MX
  :name: Mexico
  :international_dialing_prefix: "0"
"504": 
  :country_code: "504"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: HN
  :name: Honduras
  :international_dialing_prefix: "0"
"250": 
  :country_code: "250"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: RW
  :name: Rwanda
  :international_dialing_prefix: "0"
"872": 
  :country_code: "872"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: PN
  :name: Pitcairn
  :international_dialing_prefix: "0"
"675": 
  :country_code: "675"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: PG
  :name: Papua New Guinea
  :international_dialing_prefix: "5"
"505": 
  :country_code: "505"
  :national_dialing_prefix: None
  :char_2_code: None
  :char_3_code: NI
  :name: Nicaragua
  :international_dialing_prefix: "0"
"222": 
  :country_code: "222"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: MR
  :name: Mauritania
  :international_dialing_prefix: "0"
"53": 
  :country_code: "53"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: CU
  :name: Cuba
  :international_dialing_prefix: "119"
"81": 
  :country_code: "81"
  :national_dialing_prefix: "0"
  :char_2_code: "0"
  :char_3_code: JP
  :name: Japan
  :international_dialing_prefix: "10"


================================================
FILE: lib/phone/country.rb
================================================
require "yaml"

module Phoner
  class Country < Struct.new(:name, :country_code, :char_2_code, :char_3_code, :area_code, :max_num_length)
    module All
      attr_accessor :all
    end
    extend All

    def all
      self.class.all
    end

    def self.load
      return self.all if !self.all.nil? && !self.all.empty?

      data_file = File.join("..","..","data", "phone", "countries.yml")
      data_path = File.expand_path(data_file, File.dirname(__FILE__))

      self.all = {}
      YAML.load(File.read(data_path)).each_pair do |key, c|
        self.all[key] = Country.new(
          c[:name],
          c[:country_code],
          c[:char_2_code],
          c[:char_3_code],
          c.fetch(:area_code, "[0-9][0-9][0-9]").freeze,
          c.fetch(:max_num_length, 8)
        )
      end

      self.all
    end

    def self.find_by_country_code(code)
      self.all[code]
    end

    def self.find_by_country_isocode(isocode)
      if country = self.all.detect{|c|c[1].char_3_code.downcase == isocode}
        country[1]
      end
    end

    def to_s
      name
    end

    def country_code_regexp
      @country_code_regexp ||= Regexp.new("^[+]#{country_code}")
    end
  end
end


================================================
FILE: lib/phone/errors.rb
================================================
module Phoner
  class PhoneError < RuntimeError;end
  class BlankNumberError < PhoneError;end
  class AreaCodeError < PhoneError;end
  class CountryCodeError < PhoneError;end
end


================================================
FILE: lib/phone/version.rb
================================================
module Phone
  # phone version
  VERSION = "1.3.0.beta1"
end


================================================
FILE: lib/phone.rb
================================================
# An object representing a phone number.
#
# The phone number is recorded in 3 separate parts:
# * country_code - e.g. "385", "386"
# * area_code - e.g. "91", "47"
# * number - e.g. "5125486", "451588"
#
# All parts are mandatory, but country code and area code can be set for all phone numbers using
#   Phone.default_country_code
#   Phone.default_area_code
#
require "phone/country"
require "phone/errors"

module Phoner
  class Phone
    module ClassAttributes
      attr_accessor :default_country_code
      attr_accessor :default_area_code
      attr_accessor :named_formats
      attr_accessor :n1_length
    end
    extend ClassAttributes

    module ClassAttributeAccessors
      def default_country_code
        self.class.default_country_code
      end

      def default_area_code
        self.class.default_area_code
      end

      def named_formats
        self.class.named_formats
      end

      def n1_length
        self.class.n1_length
      end
    end
    include ClassAttributeAccessors

    self.named_formats = {
      :default => "+%c%a%n",
      :default_with_extension => "+%c%a%nx%x",
      :europe => "+%c (0) %a %f %l",
      :us => "(%a) %f-%l"
    }

    # length of first number part (using multi number format)
    # default length of first number part
    self.n1_length = 3

    # common extension patterns
    COMMON_EXTENSIONS = /[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(*([-0-9]{1,})\)*#?$/i
    # common extra characters and sequences we normalize out
    COMMON_EXTRAS = /(\(0\)|[^0-9+]|^\+?00?)/
    # replacements for extra characters
    COMMON_EXTRAS_REPLACEMENTS = {
      "00" => "+",
      "+00" => "+",
      "+0" => "+"
    }
    # default replacement
    COMMON_EXTRAS_REPLACEMENTS.default = ""

    # tokens used in the formatting string: %c, %a, %A, etc
    FORMAT_TOKENS = /(%[caAnflx])/

    # is this string a valid phone number?
    def self.valid?(string, options = {})
      begin
        !parse(string, options).nil?
      # if we encountered exceptions (missing country code, missing area code etc)
      rescue PhoneError
        return false
      end
    end

    # create a new phone number by parsing a string
    # the format of the string is detect automatically (from FORMATS)
    def self.parse(string, options={})
      return if string.to_s.empty?

      Country.load
      string, extension = extract_extension(string)
      string = normalize(string)

      options[:country_code] ||= self.default_country_code
      options[:area_code] ||= self.default_area_code

      parts = split_to_parts(string, options)

      pn = Phone.new(parts.merge(:extension => extension)) if parts
      return pn
    end

    # Returns an array of the number with the extension removed, and the extension.
    #
    # Example:
    #
    #  number, ext = Phoner::Phone.extract_extension("+1 (123) 456-7890 x321")
    #  # []
    def self.extract_extension(string)
      return [nil, nil] if string.nil?

      if subbed = string.sub(COMMON_EXTENSIONS, "")
        [subbed, $2]
      else
        [string, nil]
      end
    end

    # fix string so it's easier to parse, remove extra characters etc.
    def self.normalize(string_with_number)
      # TODO: When we drop 1.8.7 we can pass the hash in as an arg to #gsub
      string_with_number.gsub(COMMON_EXTRAS) do |match|
        COMMON_EXTRAS_REPLACEMENTS[match.to_s]
      end
    end

    # split string into hash with keys :country_code, :area_code and :number
    def self.split_to_parts(string, options = {})
      country = detect_country(string)

      if country
        options[:country_code] = country.country_code
        string = string.gsub(country.country_code_regexp, "0")
      else
        if options[:country_code]
          country = Country.find_by_country_code options[:country_code]
        end
      end

      if country.nil?
        if options[:country_code].nil?
          raise CountryCodeError, "Must enter country code or set default country code"
        else
          raise CountryCodeError, "Could not find country with country code #{options[:country_code]}"
        end
      end

      format = detect_format(string, country)
      return nil if format.nil?

      # Override the format IF overriding options are not present
      format = :short if options[:area_code].nil?

      parts = string.match formats(country)[format]
      return nil if parts.nil?

      case format
        when :short
          {
            :number => parts[2],
            :area_code => parts[1],
            :country_code => options[:country_code]
          }
        when :really_short
          {
            :number => parts[1],
            :area_code => options[:area_code],
            :country_code => options[:country_code]
          }
      end
    end

    # detect country from the string entered
    def self.detect_country(string)
      detected_country = nil
      # find if the number has a country code
      Country.all.each_pair do |country_code, country|
        if string =~ country.country_code_regexp
          detected_country = country
        end
      end
      detected_country
    end

    # detect format (from FORMATS) of input string
    def self.detect_format(string_with_number, country)
      arr = []
      formats(country).each_pair do |format, regexp|
        arr << format if string_with_number =~ regexp
      end

      # raise "Detected more than 1 format for #{string_with_number}" if arr.size > 1
      if arr.length > 1
        # puts %Q{detect_format: more than one format found - #{arr.inspect}}
        return :really_short
      end
      arr.first
    end

    def self.formats(country)
      area_code_regexp = country.area_code
      number_regex     = "([0-9]{1,#{country.max_num_length}})$".freeze

      {
        # 047451588, 013668734
        :short => Regexp.new("^0?(#{area_code_regexp})#{number_regex}"),
        # 451588
        :really_short => Regexp.new("^#{number_regex}")
      }
    end

    attr_accessor :country_code, :area_code, :number, :extension

    # Initialize a new instance with a list or hash of phone number parts
    #
    # Example:
    #  Phone.new("5125486", "91", "385")
    #
    #  # or
    #
    #  Phone.new(
    #    :number => "5125486",
    #    :area_code => "91",
    #    :country_code => "385",
    #    :extension => "143"
    #  )
    def initialize(*args)
      input = args.first.is_a?(Hash) ? args.first : args_to_hash(args)

      # set defaults
      input[:area_code] ||= self.default_area_code
      input[:country_code] ||= self.default_country_code

      @number = input[:number].to_s.strip
      raise BlankNumberError, "Must enter number" if @number.empty?

      @area_code = input[:area_code].to_s.strip
      raise AreaCodeError,
            "Must enter area code or set default" if @area_code.empty?

      @country_code = input[:country_code].to_s.strip
      raise CountryCodeError,
            "Must enter country code or set default" if @country_code.empty?

      @extension = input[:extension]
    end

    # format area_code with trailing zero (e.g. 91 as 091)
    # format area_code with trailing zero (e.g. 91 as 091)
    def area_code_long
      "0#{area_code}" if area_code
    end

    # first n characters of :number
    def number1
      number[0...self.class.n1_length]
    end

    # everything left from number after the first n characters (see number1)
    def number2
      n2_length = number.size - self.class.n1_length
      number[-n2_length, n2_length]
    end

    # Formats the phone number.
    #
    # if the method argument is a String, it is used as a format string, with the following fields being interpolated:
    #
    # * %c - country_code (385)
    # * %a - area_code (91)
    # * %A - area_code with leading zero (091)
    # * %n - number (5125486)
    # * %f - first @@n1_length characters of number (configured through Phone.n1_length), default is 3 (512)
    # * %l - last characters of number (5486)
    # * %x - entire extension
    #
    # if the method argument is a Symbol, it is used as a lookup key for a format String in Phone.named_formats
    #   pn.format(:europe)
    def format(fmt)
      if fmt.is_a?(Symbol)
        raise "The format #{fmt} doesn't exist" unless named_formats.has_key?(fmt)
        format_number named_formats[fmt]
      else
        format_number(fmt)
      end
    end

    # the default format is "+%c%a%n"
    def to_s
      format(:default)
    end

    # does this number belong to the default country code?
    def has_default_country_code?
      country_code == self.class.default_country_code
    end

    # does this number belong to the default area code?
    def has_default_area_code?
      area_code == self.class.default_area_code
    end

    # comparison of 2 phone objects
    def ==(other)
      methods = [:country_code, :area_code, :number, :extension]
      methods.all? { |method| other.respond_to?(method) && send(method) == other.send(method) }
    end

    private

    # Convert initialize arguments into parameter hash
    #
    # Example:
    #
    # args_to_hash ["5125486", "91", "385"]
    # #=> { :number => "5125486",
    #       :area_code => "91",
    #       :country_code => "385",
    #       :extension => nil }
    def args_to_hash(args)
      {
        :number => args[0],
        :area_code => args[1],
        :country_code => args[2],
        :extension => args[3]
      }
    end

    def format_number(fmt)
      replacements = {
        "%c" => (country_code || ""),
        "%a" => (area_code || ""),
        "%A" => (area_code_long || ""),
        "%n" => (number || ""),
        "%f" => (number1 || ""),
        "%l" => (number2 || ""),
        "%x" => (extension || "")
      }

      # TODO: When we drop 1.8.7 we can pass the hash in as an arg to #gsub
      fmt.gsub(FORMAT_TOKENS) do |match|
        replacements[match.to_s]
      end
    end
  end
end


================================================
FILE: phone.gemspec
================================================
# -*- encoding: utf-8 -*-

require File.expand_path("../lib/phone/version", __FILE__)

Gem::Specification.new do |gem|
  gem.name          = "phone"
  gem.version       = Phone::VERSION
  gem.summary       = %q{Phone number parsing, validation and formatting}
  gem.description   = %q{Phone number parsing, validation and formatting in Ruby}
  gem.license       = "MIT"
  gem.authors       = ["Tomislav Carr", "Todd Eichel", "Don Morrison"]
  gem.email         = ["tomislav@infinum.hr", "todd@toddeichel.com", "don@elskwid.net"]
  gem.homepage      = "https://github.com/carr/phone#readme"

  gem.files         = `git ls-files`.split($/)
  gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
  gem.require_paths = ["lib"]

  gem.add_development_dependency "bundler", ">= 1.2"
  gem.add_development_dependency "minitest", "~> 5.0"
  gem.add_development_dependency "rake", "~> 10.0"
  gem.add_development_dependency "rubygems-tasks", "~> 0.2"
  gem.add_development_dependency "yard", "~> 0.8"
end


================================================
FILE: test/countries/au_test.rb
================================================
require "helper"

# 0x 5551 reserved for fictitious use. (not including x=3)
# 0x 7010 reserved for fictitious use.

## Australia
class AUTest < Minitest::Test

  # 00 Emergency and International access
  # 01 Alternate phone services
  # 014 Satellite phone services
  # 016 Paging [+3D or +6D]
  # 018 Analogue (AMPS) mobile phone - few numbers still in use [+6D]
  # 0198 Data networks [+2D or +6D] - e.g. 0198 379 000 is the Dial-Up POP number for iiNet

  # 02 Central East region (NSW, ACT)
  def test_central_east
    parse_test('+61 2 5551 1234', '61', '2', '55511234')
  end

  # 03 South-east region (VIC, TAS)
  def test_south_east
    parse_test('+61 3 5551 1234', '61', '3', '55511234')
  end

  # 04 Mobile services (Digital - GSM, CDMA, 3G)
  def test_mobile
    parse_test('+61 4 5551 1234', '61', '4', '55511234')
  end

  # 05 Universal/Personal numberings (uncommon)
  def test_personal
    parse_test('+61 5 5551 1234', '61', '5', '55511234')
  end

  # 07 North-east region (QLD)
  def test_north_east
    parse_test('+61 7 5551 1234', '61', '7', '55511234')
  end

  # 08 Central and West region (SA, NT, WA)
  def test_central
    parse_test('+61 8 5551 1234', '61', '8', '55511234')
  end

  # (Geographical region boundaries do not exactly follow state borders.)
  # 1 Non-geographic numbers

end


================================================
FILE: test/countries/ba_test.rb
================================================
require "helper"

## Bosnia and Herzegovina
class BATest < Minitest::Test

  def test_local
    parse_test('+387 33 25 02 33', '387', '33', '250233')
  end

end


================================================
FILE: test/countries/be_test.rb
================================================
# -*- coding: utf-8 -*-
require "helper"

## Belgium
class BETest < Minitest::Test

  ## single digit
  # 02:   Brussels (Bruxelles/Brussel)
  def test_brussels
    parse_test('+32 2 1234567', '32', '2', '1234567')
  end
  # 03:   Antwerpen (Antwerp), Sint-Niklaas
  def test_antwerpen
    parse_test('+32 3 1234567', '32', '3', '1234567')
  end
  # 04:   Liège (Luik), Voeren (Fourons)
  def test_liege
    parse_test('+32 4 1234567', '32', '4', '1234567')
  end
  # 09:   Gent (Ghent/Gand)
  def test_gent
    parse_test('+32 9 1234567', '32', '9', '1234567')
  end

  ## two digit
  # 010:  Wavre (Waver)
  def test_wavre
    parse_test('+32 10 123456', '32', '10', '123456')
  end
  # 011:  Hasselt
  def test_hasselt
    parse_test('+32 11 123456', '32', '11', '123456')
  end
  # 012:  Tongeren (Tongres)
  def test_tongeren
    parse_test('+32 12 123456', '32', '12', '123456')
  end
  # 013:  Diest
  def test_diest
    parse_test('+32 13 123456', '32', '13', '123456')
  end
  # 014:  Herentals, Turnhout
  # 015:  Mechelen (Malines)
  # 016:  Leuven (Louvain), Tienen (Tirlemont)
  # 019:  Waremme (Borgworm)
  def test_waremme
    parse_test('+32 19 123456', '32', '19', '123456')
  end

  # 050:  Brugge (Bruges), Zeebrugge
  def test_brugge
    parse_test('+32 50 123456', '32', '50', '123456')
  end
  # 051:  Roeselare (Roulers)
  def test_roeselare
    parse_test('+32 51 123456', '32', '51', '123456')
  end
  # 052:  Dendermonde (Termonde)
  # 053:  Aalst (Alost)
  # 054:  Ninove
  # 055:  Ronse (Renaix)
  # 056:  Kortrijk (Courtrai), Comines-Warneton, Mouscron (Moeskroen)
  # 057:  Ieper (Ypres)
  # 058:  Veurne (Furnes)
  # 059:  Oostende (Ostend)
  def test_oostende
    parse_test('+32 59 123456', '32', '59', '123456')
  end

  # 060:  Chimay
  def test_chimay
    parse_test('+32 60 123456', '32', '60', '123456')
  end
  # 061:  Bastogne, Libramont-Chevigny
  # 063:  Arlon (Aarlen)
  # 064:  La Louviere
  # 065:  Mons (Bergen)
  # 067:  Nivelles (Nijvel)
  def test_nivelles
    parse_test('+32 67 123456', '32', '67', '123456')
  end
  # 068:  Ath (Aat)
  # 069:  Tournai (Doornik)

  # 070:  Specialty Numbers (i.e. bus information or bank information)
  def test_specialty
    parse_test('+32 70 123456', '32', '70', '123456')
  end
  # 071:  Charleroi

  # 081:  Namur (Namen)
  def test_namur
    parse_test('+32 81 123456', '32', '81', '123456')
  end
  # 082:  Dinant
  # 083:  Ciney
  # 084:  Jemelle, Marche-en-Famenne
  # 085:  Huy
  # 086:  Durbuy
  # 087:  Verviers
  # 089:  Genk

  # 0800: toll free service
  def test_toll_free
    parse_test('+32 800 12345', '32', '800', '12345')
  end

  # 090x: Premium numbers (0900, 0901, 0902, 0903, 0904, 0905, 0906, 0907, 0908, 0909)
  def test_premium_900
    parse_test('+32 900 12345', '32', '900', '12345')
  end

  def test_premium_901
    parse_test('+32 901 12345', '32', '901', '12345')
  end

end


================================================
FILE: test/countries/de_test.rb
================================================
require "helper"

## Germany
class DETest < Minitest::Test

  def test_local
    parse_test('+49 714 1605832', '49', '714', '1605832')
  end

  def test_mobile
    parse_test('+49 162 3499558', '49', '162', '3499558')
  end

  # TODO: germany has 2-5 length area codes, that's why this test doesn't go through
  #def test_country_side
  #  parse_test('+49 (0)6120 59511-23', '49', '6120', '5951123')
  #end

end


================================================
FILE: test/countries/es_test.rb
================================================
require "helper"

## Spain
# http://en.wikipedia.org/wiki/Telephone_numbers_in_Spain
# http://gospain.about.com/od/practicaltraveltips/f/area_codes.htm

# A problem is that landline area codes can be 2 (92) as well as 3 digits (923)
# right now the area_code_regexp is only finding 3 digit area_codes

class ESTest < Minitest::Test
  
  def test_validates
    Phoner::Phone.default_country_code = nil
    assert_equal Phoner::Phone.valid?("+34-695-097-612"), true
    assert_equal Phoner::Phone.valid?("0034 91-3597426"), true
    assert_equal Phoner::Phone.valid?("+0034 91-3597426"), true
    assert_equal Phoner::Phone.valid?("+34 92-6563629"), true
    assert_equal Phoner::Phone.valid?("(+34) 606 275 213"), true
    assert_equal Phoner::Phone.valid?("+034 937 299 016"), true
    assert_equal Phoner::Phone.valid?("+34 93 487 32 93"), true

    Phoner::Phone.default_country_code = '34'
    assert_equal Phoner::Phone.valid?(" 607 65 05 01 "), true
    assert_equal Phoner::Phone.valid?(" 971 15 66 33"), true
    assert_equal Phoner::Phone.valid?(" 93-4559934"), true
    assert_equal Phoner::Phone.valid?("628 274 908"), true
    assert_equal Phoner::Phone.valid?("744 486 62 78"), true
    assert_equal Phoner::Phone.valid?("916754559"), true
    assert_equal Phoner::Phone.valid?("93.4327119"), true
    assert_equal Phoner::Phone.valid?("986300257"), true
  end
  
end


================================================
FILE: test/countries/fr_test.rb
================================================
require "helper"

## France
class FRTest < Minitest::Test

  def test_local
    parse_test('+33 4 75 06 07 07', '33', '4', '75060707')
  end

  def test_mobile
    parse_test('+33 6 11 22 33 44', '33', '6', '11223344')
  end

  def test_mobile_07
     parse_test('+33 7 11 22 33 44', '33', '7', '11223344')
  end

  def test_voip
    parse_test('+33 9 11 22 33 44', '33', '9', '11223344')
  end

end


================================================
FILE: test/countries/gb_test.rb
================================================
# -*- coding: utf-8 -*-
require "helper"

# http://stakeholders.ofcom.org.uk/telecoms/numbering/guidance-tele-no/numbers-for-drama
#
# Geographic Area     Geographic Area Code  Telephone Number Range
# (1000 numbers in each range)
# Leeds               0113                  496 0000 to 496 0999
# Sheffield           0114                  496 0000 to 496 0999
# Nottingham          0115                  496 0000 to 496 0999
# Leicester           0116                  496 0000 to 496 0999
# Bristol             0117                  496 0000 to 496 0999
# Reading             0118                  496 0000 to 496 0999
# Birmingham          0121                  496 0000 to 496 0999
# Edinburgh           0131                  496 0000 to 496 0999
# Glasgow             0141                  496 0000 to 496 0999
# Liverpool           0151                  496 0000 to 496 0999
# Manchester          0161                  496 0000 to 496 0999
# London              020                   7946 0000 to 7946 0999
# Tyneside/Durham
#/Sunderland          0191                  498 0000 to 498 0999
# Northern Ireland    028                   9018 0000 to 9018 0999
# Cardiff             029                   2018 0000 to 2018 0999
# No area             01632                 960000 to 960999
#
# Other Telephone Numbers
#
# Telephone Number Type   Telephone Number Range
# (1000 numbers in each range)
# Mobile                  07700 900000 to 900999
# Freephone               08081 570000 to 570999
# Premium Rate Services   0909 8790000 to 8790999
# UK Wide                 03069 990000 to 990999

class GBTest < Minitest::Test

  ## SHORT CODES
  # London              020                   7946 0000 to 7946 0999
  def test_london
    parse_test('+44 20 7946 0123', '44', '20', '79460123')
  end

  # Northern Ireland    028                   9018 0000 to 9018 0999
  def test_northern_ireland
    parse_test('+44 28 9018 0123', '44', '28', '90180123')
  end

  # Cardiff             029                   2018 0000 to 2018 0999
  def test_cardiff
    parse_test('+44 29 2018 0123', '44', '29', '20180123')
  end

  # Leeds               0113                  496 0000 to 496 0999
  def test_leeds
    parse_test('+44 113 496 0123', '44', '113', '4960123')
  end

  # Sheffield           0114                  496 0000 to 496 0999
  def test_sheffield
    parse_test('+44 114 496 0123', '44', '114', '4960123')
  end

  # Nottingham          0115                  496 0000 to 496 0999
  def test_nottingham
    parse_test('+44 115 496 0123', '44', '115', '4960123')
  end

  # Leicester           0116                  496 0000 to 496 0999
  def test_leicester
    parse_test('+44 116 496 0123', '44', '116', '4960123')
  end

  # Bristol             0117                  496 0000 to 496 0999
  def test_bristol
    parse_test('+44 117 496 0123', '44', '117', '4960123')
  end

  # Reading             0118                  496 0000 to 496 0999
  def test_reading
    parse_test('+44 118 496 0123', '44', '118', '4960123')
  end

  # Birmingham          0121                  496 0000 to 496 0999
  def test_birmingham
    parse_test('+44 121 496 0123', '44', '121', '4960123')
  end

  # Edinburgh           0131                  496 0000 to 496 0999
  def test_edinburgh
    parse_test('+44 131 496 0123', '44', '131', '4960123')
  end

  # Glasgow             0141                  496 0000 to 496 0999
  def test_glasgow
    parse_test('+44 141 496 0123', '44', '141', '4960123')
  end

  # Liverpool           0151                  496 0000 to 496 0999
  def test_liverpool
    parse_test('+44 151 496 0123', '44', '151', '4960123')
  end

  # Manchester          0161                  496 0000 to 496 0999
  def test_manchester
    parse_test('+44 161 496 0123', '44', '161', '4960123')
  end

  # Tyneside/Durham
  #/Sunderland          0191                  498 0000 to 498 0999
  def test_tyneside
    parse_test('+44 191 496 0123', '44', '191', '4960123')
  end

  ## LONG CODES

  # 01202 — Bournemouth (BO)
  def test_bournemouth
    parse_test('+44 1202 96 0123', '44', '1202', '960123')
  end

  # 01326 — Falmouth (FA)
  def test_falmouth
    parse_test('+44 1326 96 0123', '44', '1326', '960123')
  end

  # 01420 — Alton (HA)
  def test_alton
    parse_test('+44 1420 96 0123', '44', '1420', '960123')
  end

  # 01598 — Lynton (LY)
  def test_lynton
    parse_test('+44 1598 96 0123', '44', '1598', '960123')
  end

  # 01637 — Newquay (NE)
  def test_newquay
    parse_test('+44 1637 96 0123', '44', '1637', '960123')
  end

  # 01700 — Rothesay (RO)
  def test_rothesay
    parse_test('+44 1700 96 0123', '44', '1700', '960123')
  end

  # 01951 — Colonsay
  def test_colonsay
    parse_test('+44 1951 96 0123', '44', '1951', '960123')
  end

  # No area             01632                 960000 to 960999
  def test_no_area
    parse_test('+44 1632 96 0123', '44', '1632', '960123')
  end

  # Personal numbering  070 xxxx xxxx
  def test_personal_numbering
    parse_test('+44 70 00001234', '44', '70', '00001234')
  end

  # Mobile                  07700 900000 to 900999
  def test_mobile
    parse_test('+44 7700 900345', '44', '7700', '900345')
  end

  def test_mobile_2
    parse_test('+44 7778 900345', '44', '7778', '900345')
  end

  # Freephone               08081 570000 to 570999
  def test_freephone
    parse_test('+44 808 1570123', '44', '808', '1570123')
  end

  def test_freephone_2
    parse_test('+44 873 1570123', '44', '873', '1570123')
  end

  # Premium Rate Services   0909 8790000 to 8790999
  def test_premium
    parse_test('+44 909 8790999', '44', '909', '8790999')
  end

  def test_premium2
    parse_test('+44 910 8790123', '44', '910', '8790123')
  end

  # UK Wide                 03069 990000 to 990999
  def test_wide
    parse_test('+44 306 9990123', '44', '306', '9990123')
  end

  def test_wide_2
    parse_test('+44 339 9990123', '44', '339', '9990123')
  end

end


================================================
FILE: test/countries/hr_test.rb
================================================
require "helper"

## Croatia
class HRTest < Minitest::Test

  def test_zagreb
    parse_test('+38513668734', '385', '1', '3668734')
  end

  def test_mobile
    parse_test('+385915125486', '385', '91', '5125486')
  end

  def test_long_without_special_characters
    parse_test('+385915125486', '385', '91', '5125486')
  end

  def test_long_with_special_characters
    parse_test('+ 385 (91) 512 / 5486 ', '385', '91', '5125486')
  end

  def test_long_with_leading_zeros
    parse_test('00385915125486', '385', '91', '5125486')
  end

  def test_zagreb_long_with_leading_zeros
    parse_test('0038513668734', '385', '1', '3668734')
  end

  def test_short_without_special_characters_with_country
    Phoner::Phone.default_country_code = '385'
    parse_test('044885047', '385', '44', '885047')
  end

  def test_zagreb_short_without_special_characters_with_country
    Phoner::Phone.default_country_code = '385'
    parse_test('013668734', '385', '1', '3668734')
  end

  def test_long_with_zero_in_brackets
    Phoner::Phone.default_country_code = nil
    parse_test('+385 (0)1 366 8111', '385', '1', '3668111')
  end

  def test_has_default_country_code
    Phoner::Phone.default_country_code = '385'

    assert_equal Phoner::Phone.parse('+38547451588').has_default_country_code?, true
    assert_equal Phoner::Phone.parse('+38647451588').has_default_country_code?, false
  end

  def test_has_default_area_code
    Phoner::Phone.default_country_code = '385'
    Phoner::Phone.default_area_code = '47'

    assert_equal Phoner::Phone.parse('047/451-588').has_default_area_code?, true
    assert_equal Phoner::Phone.parse('032/336-1456').has_default_area_code?, false
  end

  def test_validates
    Phoner::Phone.default_country_code = nil
    assert_equal Phoner::Phone.valid?('00385915125486'), true
    assert_equal Phoner::Phone.valid?('+385915125486'), true
    assert_equal Phoner::Phone.valid?('+385 (91) 512 5486'), true
    assert_equal Phoner::Phone.valid?('+38547451588'), true

    Phoner::Phone.default_country_code = '385'
    assert_equal Phoner::Phone.valid?('0915125486'), true
    assert_equal Phoner::Phone.valid?('091/512-5486'), true
    assert_equal Phoner::Phone.valid?('091/512-5486'), true
    assert_equal Phoner::Phone.valid?('091 512 54 86'), true
    assert_equal Phoner::Phone.valid?('091-512-54-86'), true
    assert_equal Phoner::Phone.valid?('047/451-588'), true
  end

end


================================================
FILE: test/countries/hu_test.rb
================================================
require "helper"

## Hungary
class HUTest < Minitest::Test

  def test_mobile
    parse_test('+36 30 5517999', '36', '30', '5517999')
  end

end


================================================
FILE: test/countries/ie_test.rb
================================================
require "helper"

## Ireland
class IETest < Minitest::Test

  def test_short_cork_number
    parse_test('+353 28 28946', '353', '28', '28946')
  end

  def test_short_cork_number_2
    parse_test('+353 28 28943', '353', '28', '28943')
  end

  def test_short_wrong_area_code
    pp = Phoner::Phone.parse('+353 33023')

    assert_nil pp
  end

end


================================================
FILE: test/countries/me_test.rb
================================================
require "helper"

## Montenegro
class METest < Minitest::Test

  def test_mobile
    parse_test('+382 69 555 5555', '382', '69', '5555555')
  end

  def test_local
    parse_test('+382 20 555 5555', '382', '20', '5555555')
  end

end


================================================
FILE: test/countries/nl_test.rb
================================================
require "helper"

## Netherlands
class NETest < Minitest::Test

  # 06:   mobile phone number
  def test_mobile
    parse_test('+31 6 12345678', '31', '6', '12345678')
  end

  # 066:  mobile pagers
  def test_pagers
    parse_test('+31 66 1234567', '31', '66', '1234567')
  end

  # 06760:  internet access number
  def test_internet_access
    parse_test('+31 6760 12345', '31', '6760', '12345')
  end

  # 0800: toll free number
  def test_toll_free
    parse_test('+31 800 123456', '31', '800', '123456')
  end

  # 084:  location independent (used mostly for fax-to-email and voicemail services)
  def test_location_independent_84
    parse_test('+31 84 1234567', '31', '84', '1234567')
  end

  # 085:  location independent
  def test_location_independent_85
    parse_test('+31 85 1234567', '31', '85', '1234567')
  end

  # 087:  location independent
  def test_location_independent_87
    parse_test('+31 87 1234567', '31', '87', '1234567')
  end

  # 088:  location independent (for companies)
  def test_location_independent_88
    parse_test('+31 88 1234567', '31', '88', '1234567')
  end

  # 0878: location independent (voice over IP)
  def test_location_independent_878
    parse_test('+31 878 123456', '31', '878', '123456')
  end

  # 0900: premium rate, information
  def test_premium_900
    parse_test('+31 900 123456', '31', '900', '123456')
  end

  # 0906: premium rate, erotic
  def test_premium_906
    parse_test('+31 906 123456', '31', '906', '123456')
  end
  # 0909: premium rate, entertainment

  # 112:  emergency services number
  # 14xxx(x): public authorities, where xxxx is the three- or four-digit area-code of the municipality
  # 18xx: number information

  # 01x(x) to 05x(x): geographical area codes

  ## two digit
  # 010 Rotterdam
  def test_rotterdam
    parse_test('+31 10 1234567', '31', '10', '1234567')
  end
  # 013 Tilburg
  def test_tilburg
    parse_test('+31 13 1234567', '31', '13', '1234567')
  end
  # 015 Delft

  # 020 Amsterdam
  def test_amsterdam
    parse_test('+31 20 1234567', '31', '20', '1234567')
  end
  # 023 Haarlem
  # 024 Nijmegen
  # 026 Arnhem

  # 030 Utrecht
  def test_utrecht
    parse_test('+31 30 1234567', '31', '30', '1234567')
  end
  # 033 Amersfoort
  def test_amersfoort
    parse_test('+31 33 1234567', '31', '33', '1234567')
  end
  # 035 Hilversum
  # 036 Almere
  # 038 Zwolle

  # 040 Eindhoven
  # 043 Maastricht
  # 045 Heerlen
  def test_heerlen
    parse_test('+31 45 1234567', '31', '45', '1234567')
  end
  # 046 Sittard

  # 050 Groningen
  def test_groningen
    parse_test('+31 50 1234567', '31', '50', '1234567')
  end
  # 053 Enschede
  # 055 Apeldoorn
  # 058 Leeuwarden
  def test_leeuwarden
    parse_test('+31 58 1234567', '31', '58', '1234567')
  end

  # 07x: geographical area codes (cities all over the country)
  # 070 The Hague
  def test_the_hague
    parse_test('+31 70 1234567', '31', '70', '1234567')
  end
  # 071 Leiden
  def test_leiden
    parse_test('+31 71 1234567', '31', '71', '1234567')
  end
  # 072 Alkmaar
  # 073 's-Hertogenbosch
  # 074 Hengelo
  # 075 Zaandam
  def test_zaandam
    parse_test('+31 75 1234567', '31', '75', '1234567')
  end
  # 076 Breda
  # 077 Venlo
  # 078 Dordrecht
  # 079 Zoetermeer
  def test_zoetermeer
    parse_test('+31 79 1234567', '31', '79', '1234567')
  end


  ## three digit
  # 0111 Zierikzee
  def test_zierikzee
    parse_test('+31 111 123456', '31', '111', '123456')
  end
  # 0113 Goes
  def test_goes
    parse_test('+31 113 123456', '31', '113', '123456')
  end
  # 0114 Hulst
  # 0115 Terneuzen
  # 0117 Sluis
  def test_sluis
    parse_test('+31 117 123456', '31', '117', '123456')
  end
  # 0118 Middelburg

  # 0161 Gilze-Rijen
  def test_gilze
    parse_test('+31 161 123456', '31', '161', '123456')
  end
  # 0162 Oosterhout
  # 0164 Bergen op Zoom
  def test_bergen
    parse_test('+31 164 123456', '31', '164', '123456')
  end
  # 0165 Roosendaal
  # 0166 Tholen
  # 0167 Steenbergen
  # 0168 Zevenbergen

  # 0172 Alphen aan den Rijn
  def test_alphen
    parse_test('+31 172 123456', '31', '172', '123456')
  end
  # 0174 Naaldwijk

  # 0180 Ridderkerk
  def test_ridderkerk
    parse_test('+31 180 123456', '31', '180', '123456')
  end
  # 0181 Spijkenisse
  # 0182 Gouda
  def test_gouda
    parse_test('+31 182 123456', '31', '182', '123456')
  end
  # 0183 Gorinchem
  # 0184 Sliedrecht
  # 0186 Oud-Beijerland
  # 0187 Middelharnis

  # 0222 Texel
  def test_texel
    parse_test('+31 222 123456', '31', '222', '123456')
  end
  # 0223 Den Helder
  # 0224 Schagen
  def test_shagen
    parse_test('+31 224 123456', '31', '224', '123456')
  end
  # 0226 Harenkarspel
  # 0227 Medemblik, Middenmeer as well as Heerhugowaard
  # 0228 Enkhuizen
  # 0229 Hoorn
  def test_hoorn
    parse_test('+31 229 123456', '31', '229', '123456')
  end

  # 0251 Beverwijk
  def test_beverwijk
    parse_test('+31 251 123456', '31', '251', '123456')
  end
  # 0252 Hillegom
  # 0255 IJmuiden

  # 0294 Weesp
  def test_weesp
    parse_test('+31 294 123456', '31', '294', '123456')
  end
  # 0297 Aalsmeer
  # 0299 Purmerend

  # 0313 Dieren
  def test_dieren
    parse_test('+31 313 123456', '31', '313', '123456')
  end
  # 0314 Doetinchem
  # 0315 Terborg
  def test_terborg
    parse_test('+31 315 123456', '31', '315', '123456')
  end
  # 0316 Zevenaar
  # 0317 Wageningen
  # 0318 Ede / Veenendaal

  # 0320 Lelystad
  def test_lelystad
    parse_test('+31 320 123456', '31', '320', '123456')
  end
  # 0321 Dronten

  # 0341 Harderwijk
  def test_harderwijk
    parse_test('+31 341 123456', '31', '341', '123456')
  end
  # 0342 Barneveld
  # 0343 Doorn
  # 0344 Tiel
  def test_tiel
    parse_test('+31 344 123456', '31', '344', '123456')
  end
  # 0345 Culemborg
  # 0346 Maarssen
  # 0347 Vianen
  # 0348 Woerden

  # 0411 Boxtel
  def test_boxtel
    parse_test('+31 411 123456', '31', '411', '123456')
  end
  # 0412 Oss
  # 0413 Veghel
  # 0416 Waalwijk
  # 0418 Zaltbommel

  # 0475 Roermond
  def test_roermond
    parse_test('+31 475 123456', '31', '475', '123456')
  end
  # 0478 Venray

  # 0481 Bemmel
  def test_bemmel
    parse_test('+31 481 123456', '31', '481', '123456')
  end
  # 0485 Cuijk
  # 0486 Grave
  # 0487 Druten
  def test_druten
    parse_test('+31 487 123456', '31', '487', '123456')
  end
  # 0488 Zetten

  # 0492 Helmond
  def test_helmond
    parse_test('+31 492 123456', '31', '492', '123456')
  end
  # 0493 Deurne
  # 0495 Weert
  def test_weert
    parse_test('+31 495 123456', '31', '495', '123456')
  end
  # 0497 Eersel
  # 0499 Best

  # 0511 Veenwouden
  def test_veenwouden
    parse_test('+31 511 123456', '31', '511', '123456')
  end
  # 0512 Drachten
  # 0513 Heerenveen
  # 0514 Balk
  # 0515 Sneek
  def test_sneek
    parse_test('+31 515 123456', '31', '515', '123456')
  end
  # 0516 Oosterwolde
  # 0517 Franeker
  # 0518 St. Annaparochie
  # 0519 Dokkum

  # 0521 Steenwijk
  def test_steenwijk
    parse_test('+31 521 123456', '31', '521', '123456')
  end
  # 0522 Meppel
  # 0523 Hardenberg
  # 0524 Coevorden
  def tst_coevorden
    parse_test('+31 524 123456', '31', '524', '123456')
  end
  # 0525 Elburg
  # 0527 Emmeloord
  # 0528 Hoogeveen
  # 0529 Ommen

  # 0541 Oldenzaal
  def test_oldenzaal
    parse_test('+31 541 123456', '31', '541', '123456')
  end
  # 0543 Winterswijk
  # 0544 Groenlo
  # 0545 Neede
  def test_neede
    parse_test('+31 545 123456', '31', '545', '123456')
  end
  # 0546 Almelo
  # 0547 Goor
  # 0548 Rijssen

  # 0561 Wolvega
  def test_wolvega
    parse_test('+31 561 123456', '31', '561', '123456')
  end
  # 0562 Terschelling/Vlieland
  # 0566 Irnsum

  # 0570 Deventer
  def test_deventer
    parse_test('+31 570 123456', '31', '570', '123456')
  end
  # 0571 Voorst
  # 0572 Raalte
  # 0573 Lochem
  def test_lochem
    parse_test('+31 573 123456', '31', '573', '123456')
  end
  # 0575 Zutphen
  # 0577 Uddel
  # 0578 Epe

  # 0591 Emmen
  def test_emmen
    parse_test('+31 591 123456', '31', '591', '123456')
  end
  # 0592 Assen
  # 0593 Beilen
  def test_beilen
    parse_test('+31 593 123456', '31', '593', '123456')
  end
  # 0594 Zuidhorn
  # 0595 Warffum
  # 0596 Appingedam
  # 0597 Winschoten
  # 0598 Hoogezand
  # 0599 Stadskanaal
  def test_stadskanaal
    parse_test('+31 599 123456', '31', '599', '123456')
  end

end


================================================
FILE: test/countries/nz_test.rb
================================================
require "helper"

## New Zealand
class NZTest < Minitest::Test
  def test_local
    parse_test('+6431234567',  '64', '3',  '1234567')
  end
end


================================================
FILE: test/countries/pt_test.rb
================================================
require "helper"

## Portugal
# source 1: http://pt.wikipedia.org/wiki/N%C3%BAmeros_de_telefone_em_Portugal
# source 2: http://www.anacom.pt/render.jsp?categoryId=279035

class PTTest < Minitest::Test

  ### Prefixes followed by corresponding tests

  ## 01-09: reserved for future use
  ## 1: Short Numbers

  ## 2: Landline / fixed numbers

  ## two digits landlines
  # 21:   Lisbon (Lisboa)
  def test_lisbon
    parse_test('+351 21 123 4567', '351', '21', '1234567')
  end
  # 22:   Oporto (Porto)
  def test_oporto
    parse_test('+351 22 123 4567', '351', '22', '1234567')
  end

  ## three digits landlines
  # 231:  Mealhada
  def test_mealhada
    parse_test('+351 231 123456', '351', '231', '123456')
  end

  # 232-295  (Viseu - Angra do Heroismo)
  def test_viseu
    parse_test('+351 232 123456', '351', '232', '123456')
  end
  def test_angra
    parse_test('+351 295 123456', '351', '295', '123456')
  end

  # 296: Ponta Delgada
  def test_pontadelgada
    parse_test('+351 296 123456', '351', '296', '123456')
  end

  ## 3: Nomad services
  ## 4: Not used
  ## 5: Free
  ## 6: Audiotext service, data network access...

  ## 7: Premium numbers ("Universal access numbers")

  # 707-708: Premium Numbers
  def test_707
    Phoner::Phone.default_country_code = '351'
    parse_test('707 123 456', '351', '707', '123456')
  end

  ## 8: Free toll numbers

  # 800: Numero verde ("Green Number")
  def test_800
    Phoner::Phone.default_country_code = '351'
    parse_test('800 123 456', '351', '800', '123456')
  end
  # 808: Numero azul ("Blue Number")
  def test_808
    Phoner::Phone.default_country_code = '351'
    parse_test('808 123 456', '351', '808', '123456')
  end
  # 809: Custo partilhado ("Shared cost")
  def test_809
    Phoner::Phone.default_country_code = '351'
    parse_test('809 123 456', '351', '809', '123456')
  end

  ## 9: Mobile networks

  ## two-digits mobile networks
  # 91: Vodafone
  def test_vodafone
    parse_test('+351 91 1234567', '351', '91', '1234567')
  end
  # 93: Optimus
  def test_optimus
    parse_test('+351 93 1234567', '351', '93', '1234567')
  end
  # 96: TMN two-digits
  def test_tmn
    parse_test('+351 96 1234567', '351', '96', '1234567')
  end

  ## three-digits mobile networks
  # 921: TMN three-digits
  def test_tmn921
    parse_test('+351 921 123456', '351', '921', '123456')
  end
  # 923-926: TMN three-digits (corporate networks)
  def test_tmn923
    parse_test('+351 925 123456', '351', '925', '123456')
  end
  # 922: Phone-ix
  def test_phoneix
    parse_test('+351 922 123456', '351', '922', '123456')
  end
  # 929: Zon Mobile
  def test_zonmobile
    parse_test('+351 929 123456', '351', '929', '123456')
  end

  def test_validates
    Phoner::Phone.default_country_code = nil
    assert_equal Phoner::Phone.valid?('00351211234567'), true
    assert_equal Phoner::Phone.valid?('00351911234567'), true
    assert_equal Phoner::Phone.valid?('+351931234567'), true
    assert_equal Phoner::Phone.valid?('+351 (911) 123 456'), true
    assert_equal Phoner::Phone.valid?('+351921123456'), true

    Phoner::Phone.default_country_code = '351'
    assert_equal Phoner::Phone.valid?('(931) 234-567'), true
    assert_equal Phoner::Phone.valid?('(211) 234 567'), true
    assert_equal Phoner::Phone.valid?('232-123-456'), true
    assert_equal Phoner::Phone.valid?('232123456'), true
    assert_equal Phoner::Phone.valid?('92 212 34 56'), true
    assert_equal Phoner::Phone.valid?('221234567'), true
    assert_equal Phoner::Phone.valid?('708123456'), true
    assert_equal Phoner::Phone.valid?('800 123 456'), true
  end

end


================================================
FILE: test/countries/rs_test.rb
================================================
require "helper"

## Serbia
class RSTest < Minitest::Test

  def test_local
    # Beograd
    parse_test('+381 11 24 33 836', '381', '11', '2433836')
  end


  def test_mobile
    # mts
    parse_test('+381 648542987', '381', '64', '8542987')
  end

end


================================================
FILE: test/countries/se_test.rb
================================================
# -*- coding: utf-8 -*-
require "helper"

## Sweden
class SETest < Minitest::Test

  # 08  Greater Stockholm
  def test_stockholm
    parse_test('+4685555555', '46', '8', '5555555')
  end

  ## two digit codes

  # 010 Geographically Independent Numbers / VOIP services
  def test_independent_numbers
    parse_test('+46105555555', '46', '10', '5555555')
  end

  # 011 Norrköping
  def test_norrkoping
    parse_test('+46115555555', '46', '11', '5555555')
  end

  # 013 Linköping
  def test_linkoping
    parse_test('+46135555555', '46', '13', '5555555')
  end

  # 016 Eskilstuna-Torshälla
  def test_eskilstuna
    parse_test('+46165555555', '46', '16', '5555555')
  end

  # 018 Uppsala
  def test_uppsala
    parse_test('+46185555555', '46', '18', '5555555')
  end

  # 019 Örebro-Kumla
  def test_orebro
    parse_test('+46195555555', '46', '19', '5555555')
  end

  # 020 toll-free
  def test_toll_free
    parse_test('+46205555555', '46', '20', '5555555')
  end

  # 021 Västerås
  def test_vasteras
    parse_test('+46215555555', '46', '21', '5555555')
  end

  # 023 Falun
  def test_falun
    parse_test('+46235555555', '46', '23', '5555555')
  end

  # 026 Gävle-Sandviken
  def test_gavle
    parse_test('+46265555555', '46', '26', '5555555')
  end

  # 031 Göteborg
  def test_goteborg
    parse_test('+46315555555', '46', '31', '5555555')
  end

  # 033 Borås
  def test_boras
    parse_test('+46335555555', '46', '33', '5555555')
  end

  # 035 Halmstad
  def test_halmstad
    parse_test('+46355555555', '46', '35', '5555555')
  end

  # 036 Jönköping-Huskvarna
  def test_jonkoping
    parse_test('+46365555555', '46', '36', '5555555')
  end

  # 040 Malmö
  def test_malmo
    parse_test('+46405555555', '46', '40', '5555555')
  end

  # 042 Helsingborg-Höganäs
  def test_helsingborg
    parse_test('+46425555555', '46', '42', '5555555')
  end

  # 044 Kristianstad
  def test_kristianstad
    parse_test('+46445555555', '46', '44', '5555555')
  end

  # 046 Lund
  def test_lund
    parse_test('+46465555555', '46', '46', '5555555')
  end

  # 054 Karlstad
  def test_karlstad
    parse_test('+46545555555', '46', '54', '5555555')
  end

  # 060 Sundsvall-Timrå
  def test_sundsvall
    parse_test('+46605555555', '46', '60', '5555555')
  end

  # 063 Östersund
  def test_ostersund
    parse_test('+46635555555', '46', '63', '5555555')
  end

  # 070,
  def test_mobile_70
    parse_test('+46705555555', '46', '70', '5555555')
  end

  # 071 Telematics in Mobile Networks (used to be Premium rate numbers)
  def test_telematics
    parse_test('+46715555555', '46', '71', '5555555')
  end

  # 072,
  def test_mobile_72
    parse_test('+46725555555', '46', '72', '5555555')
  end

  # 073,
  def test_mobile_73
    parse_test('+46735555555', '46', '73', '5555555')
  end

  # 076  Mobile networks
  def test_mobile_76
    parse_test('+46765555555', '46', '76', '5555555')
  end

  # 090 Umeå
  def test_umea
    parse_test('+46905555555', '46', '90', '5555555')
  end

  # 099 Premium rate calls
  def test_premium_99
    parse_test('+46995555555', '46', '99', '5555555')
  end

  ## three digit codes

  # 0120  Åtvidaberg
  def test_atvidaberg
    parse_test('+46120555555', '46', '120', '555555')
  end
  # 0121  Söderköping
  # 0122  Finspång
  # 0123  Valdemarsvik
  # 0125  Vikbolandet
  # 0140  Tranås
  # 0141  Motala
  # 0142  Mjölby-Skänninge-Boxholm
  # 0143  Vadstena
  # 0144  Ödeshög
  # 0150  Katrineholm
  # 0151  Vingåker
  # 0152  Strängnäs
  # 0155  Nyköping-Oxelösund
  # 0156  Trosa-Vagnhärad
  # 0157  Flen-Malmköping
  # 0158  Gnesta
  # 0159  Mariefred
  # 0171  Enköping
  def test_enkoping
    parse_test('+461715555555', '46', '171', '5555555')
  end
  # 0173  Öregrund-Östhammar
  # 0174  Alunda
  # 0175  Hallstavik-Rimbo
  # 0176  Norrtälje

  # 0220  Hallstahammar-Surahammar
  def test_hallstahammar
    parse_test('+462205555555', '46', '220', '5555555')
  end
  # 0221  Köping
  # 0222  Skinnskatteberg
  # 0223  Fagersta-Norberg
  # 0224  Sala-Heby
  # 0225  Hedemora-Säter
  # 0226  Avesta-Krylbo
  # 0227  Kungsör
  # 0240  Ludvika-Smedjebacken
  # 0241  Gagnef-Floda
  # 0243  Borlänge
  # 0246  Svärdsjö-Enviken
  # 0247  Leksand-Insjön
  # 0248  Rättvik
  def test_rattvik
    parse_test('+462485555555', '46', '248', '5555555')
  end
  # 0250  Mora-Orsa
  # 0251  Älvdalen
  # 0253  Idre-Särna
  # 0258  Furudal
  # 0270  Söderhamn
  # 0271  Alfta-Edsbyn
  # 0278  Bollnäs
  # 0280  Malung
  # 0281  Vansbro
  # 0290  Hofors-Storvik
  # 0291  Hedesunda-Österfärnebo
  # 0292  Tärnsjö-Östervåla
  # 0293  Tierp-Söderfors
  # 0294  Karlholmsbruk-Skärplinge
  # 0295  Örbyhus-Dannemora
  # 0297  Ockelbo-Hamrånge
  def test_ockelbo
    parse_test('+462975555555', '46', '297', '5555555')
  end

  # 0300  Kungsbacka
  def test_kungsbacka
    parse_test('+463005555555', '46', '300', '5555555')
  end
  # 0301  Hindås
  # 0302  Lerum
  # 0303  Kungälv
  # 0304  Orust-Tjörn
  # 0320  Kinna
  # 0321  Ulricehamn
  # 0322  Alingsås-Vårgårda
  # 0325  Svenljunga-Tranemo
  # 0340  Varberg
  def test_varberg
    parse_test('+463405555555', '46', '340', '5555555')
  end
  # 0345  Hyltebruk-Torup
  # 0346  Falkenberg
  # 0370  Värnamo
  # 0371  Gislaved-Anderstorp
  # 0372  Ljungby
  # 0380  Nässjö
  # 0381  Eksjö
  # 0382  Sävsjö
  # 0383  Vetlanda
  # 0390  Gränna
  # 0392  Mullsjö
  # 0393  Vaggeryd

  # 0410  Trelleborg
  def test_trelleborg
    parse_test('+464105555555', '46', '410', '5555555')
  end
  # 0411  Ystad
  # 0413  Eslöv-Höör
  # 0414  Simrishamn
  # 0415  Hörby
  # 0416  Sjöbo
  # 0417  Tomelilla
  # 0418  Landskrona-Svalöv
  # 0430  Laholm
  def test_lanholm
    parse_test('+464305555555', '46', '430', '5555555')
  end
  # 0431  Ängelholm-Båstad
  # 0433  Markaryd-Strömsnäsbruk
  # 0435  Klippan-Perstorp
  # 0451  Hässleholm
  # 0454  Karlshamn-Olofström
  # 0455  Karlskrona
  # 0456  Sölvesborg-Bromölla
  # 0457  Ronneby
  # 0459  Ryd
  # 0470  Växjö
  def test_vaxjo
    parse_test('+464705555555', '46', '470', '5555555')
  end
  # 0471  Emmaboda
  # 0472  Alvesta-Rydaholm
  # 0474  Åseda-Lenhovda
  # 0476  Älmhult
  # 0477  Tingsryd
  # 0478  Lessebo
  # 0479  Osby
  # 0480  Kalmar
  # 0481  Nybro
  # 0485  Öland
  # 0486  Torsås
  # 0490  Västervik
  # 0491  Oskarshamn-Högsby
  # 0492  Vimmerby
  # 0493  Gamleby
  # 0494  Kisa
  def test_kisa
    parse_test('+464945555555', '46', '494', '5555555')
  end
  # 0495  Hultsfred-Virserum
  # 0496  Mariannelund
  # 0498  Gotland
  # 0499  Mönsterås

  # 0500  Skövde
  def test_skovde
    parse_test('+465005555555', '46', '500', '5555555')
  end
  # 0501  Mariestad
  # 0502  Tidaholm
  # 0503  Hjo
  def test_hjo
    parse_test('+465035555555', '46', '503', '5555555')
  end
  # 0504  Tibro
  # 0505  Karlsborg
  # 0506  Töreboda-Hova
  # 0510  Lidköping
  # 0511  Skara-Götene
  # 0512  Vara-Nossebro
  # 0513  Herrljunga
  # 0514  Grästorp
  # 0515  Falköping
  # 0520  Trollhättan
  # 0521  Vänersborg
  # 0522  Uddevalla
  # 0523  Lysekil
  # 0524  Munkedal
  # 0525  Grebbestad
  # 0526  Strömstad
  # 0528  Färgelanda
  # 0530  Mellerud
  # 0531  Bengtsfors
  # 0532  Åmål
  # 0533  Säffle
  # 0534  Ed
  # 0550  Kristinehamn
  # 0551  Gullspång
  # 0552  Deje
  def test_deje
    parse_test('+465525555555', '46', '552', '5555555')
  end
  # 0553  Molkom
  # 0554  Kil
  # 0555  Grums
  # 0560  Torsby
  # 0563  Hagfors-Munkfors
  # 0564  Sysslebäck
  # 0565  Sunne
  # 0570  Arvika
  # 0571  Charlottenberg-Åmotfors
  # 0573  Årjäng
  # 0580  Kopparberg
  # 0581  Lindesberg
  # 0582  Hallsberg-Pålsboda
  # 0583  Askersund
  # 0584  Laxå
  # 0585  Fjugesta-Svartå
  # 0586  Karlskoga-Degerfors
  # 0587  Nora
  def test_nora
    parse_test('+465875555555', '46', '587', '5555555')
  end
  # 0589  Arboga
  # 0590  Filipstad
  # 0591  Hällefors-Grythyttan

  # 0611  Härnösand
  def test_harnosand
    parse_test('+466115555555', '46', '611', '5555555')
  end
  # 0612  Kramfors
  # 0613  Ullånger
  # 0620  Sollefteå
  # 0621  Junsele
  # 0622  Näsåker
  # 0623  Ramsele
  # 0624  Backe
  # 0640  Krokom
  # 0642  Lit
  # 0643  Hallen-Oviken
  # 0644  Hammerdal
  # 0645  Föllinge
  # 0647  Åre-Järpen
  # 0650  Hudiksvall
  # 0651  Ljusdal
  # 0652  Bergsjö
  # 0653  Delsbo
  # 0657  Los
  # 0660  Örnsköldsvik
  # 0661  Bredbyn
  # 0662  Björna
  # 0663  Husum
  def test_husum
    parse_test('+466635555555', '46', '663', '5555555')
  end
  # 0670  Strömsund
  # 0671  Hoting
  # 0672  Gäddede
  # 0680  Sveg
  # 0682  Rätan
  # 0684  Hede-Funäsdalen
  # 0687  Svenstavik
  # 0690  Ånge
  # 0691  Torpshammar
  # 0692  Liden
  # 0693  Bräcke-Gällö
  # 0695  Stugun
  # 0696  Hammarstrand

  # 07x(x)  various non-geographical area codes
  # ambiguous!

  # 074(x)  Pagers
  def test_pagers
    parse_test('+467405555555', '46', '740', '5555555')
  end

  # 0900  Premium rate calls
  def test_premium_900
    parse_test('+469005555555', '46', '900', '5555555')
  end
  # 0910  Skellefteå
  # 0911  Piteå
  # 0912  Byske
  # 0913  Lövånger
  # 0914  Burträsk
  # 0915  Bastuträsk
  # 0916  Jörn
  def test_jorn
    parse_test('+469165555555', '46', '916', '5555555')
  end
  # 0918  Norsjö
  # 0920  Luleå
  # 0921  Boden
  # 0922  Haparanda
  # 0923  Kalix
  # 0924  Råneå
  # 0925  Lakaträsk
  # 0926  Överkalix
  # 0927  Övertorneå
  # 0928  Harads
  # 0929  Älvsbyn
  # 0930  Nordmaling
  # 0932  Bjurholm
  # 0933  Vindeln
  # 0934  Robertsfors
  # 0935  Vännäs
  def test_vannas
    parse_test('+469355555555', '46', '935', '5555555')
  end
  # 0939  Premium rate calls
  # 0940  Vilhelmina
  # 0941  Åsele
  # 0942  Dorotea
  # 0943  Fredrika
  # 0944  Premium rate calls
  # 0950  Lycksele
  # 0951  Storuman
  # 0952  Sorsele
  # 0953  Malå
  # 0954  Tärnaby
  # 0960  Arvidsjaur
  # 0961  Arjeplog
  # 0970  Gällivare
  # 0971  Jokkmokk
  # 0973  Porjus
  # 0975  Hakkas
  # 0976  Vuollerim
  # 0977  Korpilombolo
  # 0978  Pajala
  # 0980  Kiruna
  # 0981  Vittangi
  def test_vittangi
    parse_test('+469815555555', '46', '981', '5555555')
  end
end


================================================
FILE: test/countries/si_test.rb
================================================
require "helper"

## Slovenia
class SITest < Minitest::Test

  def test_local
    #Maribor
    parse_test('+ 386 2 23 46 611', '386', '2', '2346611')
  end

  def test_local_2
    # Koper
    parse_test('+ 386 5 23 46 611', '386', '5', '2346611')
  end

  def test_mobile
    # Mobitel
    parse_test('+386 51 258999', '386', '51', '258999')
  end

end


================================================
FILE: test/countries/ua_test.rb
================================================
require "helper"

## Ukraine
class UATest < Minitest::Test

  def test_local
    parse_test('+380 57 711 22 33', '380', '57', '7112233')
  end

  def test_mobile
    parse_test('+380-50-111-22-33', '380', '50', '1112233')
  end

  def test_mobile2
    parse_test('+380-66-042-22-01', '380', '66', '0422201')
  end

end


================================================
FILE: test/countries/us_test.rb
================================================
require "helper"

## United States
class USTest < Minitest::Test

  def test_local
    parse_test('+1 555 123 4567', '1', '555', '1234567')
  end

  def test_tollfree
    parse_test('+1 800 555 3456', '1', '800', '5553456')
  end

  def test_long_with_default_country_code
    Phoner::Phone.default_country_code = '1'
    parse_test('2069735100', '1', '206', '9735100')
  end

  def test_short_with_default_country_code_and_area_code
    Phoner::Phone.default_country_code = '1'
    Phoner::Phone.default_area_code = '206'
    parse_test('9735100', '1', '206', '9735100')
  end
end


================================================
FILE: test/countries/uy_test.rb
================================================
require "helper"

## Uruguay
# source: http://en.wikipedia.org/wiki/Telephone_numbers_in_Uruguay
class UYTest < Minitest::Test

  # 02 Montevideo
  def test_montevideo
    parse_test('+598 2 1234567', '598', '2', '1234567')
  end

  # 042 Maldonado
  def test_maldonado
    parse_test('+598 42 123456', '598', '42', '123456')
  end

  # 09 Mobile phones
  def test_mobile_phones
    parse_test('+598 99 570110', '598', '99', '570110')
  end

end


================================================
FILE: test/countries/za_test.rb
================================================
require "helper"

## South Africa
class ZATest < Minitest::Test

  def test_local
    # Telkom
    parse_test('+27 11 555 5555', '27', '11', '5555555')
  end

  def test_mobile
    # Vodacom
    parse_test('+27 82 555 5555', '27', '82', '5555555')

    # Broader cellular ranges past initial allocation given to telecoms service providers
    parse_test('+27 62 555 5555', '27', '62', '5555555')
    parse_test('+27 99 555 5555', '27', '99', '5555555')
  end

  def test_tollfree
    # Telkom
    parse_test('+27 800 123 321', '27', '800', '123321')
  end

  def test_long_msisdns
    parse_test('+279602007648699', '27', '96', '02007648699')
  end

end


================================================
FILE: test/extension_test.rb
================================================
require "helper"

class ExtensionTest < Minitest::Test

  def test_parse_usa_long_with_simple_extension
    pn = Phoner::Phone.parse "+1 2069735100 x143"

    refute_nil pn, %Q{parse should pass}
    assert_equal '9735100', pn.number
    assert_equal '206', pn.area_code
    assert_equal '1', pn.country_code
    assert_equal '143', pn.extension
  end

  def test_to_s_with_extension
    pn = Phoner::Phone.new '5125486', '91', '385', '143'
    assert_equal '+385915125486x143', pn.format(:default_with_extension)
  end

  def test_format_with_extension
    pn = Phoner::Phone.new '5125486', '91', '385', '143'
    assert_equal '(091)/512-5486 x 143', pn.format('(%A)/%f-%l x %x')
  end

  def test_extract_extension
    string = "+1 2069735100 x143"
    number, ext = Phoner::Phone.extract_extension(string)

    assert_equal "+1 2069735100 x143", string
    assert_equal "+1 2069735100", number
    assert_equal "143", ext
  end
end


================================================
FILE: test/helper.rb
================================================
require "rubygems"

begin
  require "bundler"
rescue LoadError => e
  STDERR.puts e.message
  STDERR.puts "Run `gem install bundler` to install Bundler."
  exit e.status_code
end

begin
  Bundler.setup(:default, :development, :test)
rescue Bundler::BundlerError => e
  STDERR.puts e.message
  STDERR.puts "Run `bundle install` to install missing gems."
  exit e.status_code
end

require "phone"
require "minitest/autorun"

class Minitest::Test
  def setup
    Phoner::Phone.default_country_code = nil
    Phoner::Phone.default_area_code = nil
  end

  def teardown
    Phoner::Phone.default_country_code = nil
    Phoner::Phone.default_area_code = nil
  end
end

def parse_test(raw, country_code, area_code, number)
  pn = Phoner::Phone.parse(raw)

  refute_nil pn, %Q{parse should pass}
  assert_equal country_code, pn.country_code
  assert_equal area_code, pn.area_code
  assert_equal number, pn.number
end


================================================
FILE: test/phone_test.rb
================================================
require "helper"

class PhoneTest < Minitest::Test

  def test_with_nil_number_initialize
    assert_raises Phoner::BlankNumberError do
      Phoner::Phone.new nil
    end
  end

  def test_with_empty_number_initialize
    assert_raises Phoner::BlankNumberError do
      Phoner::Phone.new ""
    end
  end

  def test_number_without_country_code_initialize
    Phoner::Phone.default_country_code = nil

    assert_raises Phoner::CountryCodeError do
      Phoner::Phone.new '5125486', '91'
    end
  end

  def test_number_without_country_and_area_code_initialize
    Phoner::Phone.default_country_code = nil
    Phoner::Phone.default_area_code = nil

    assert_raises Phoner::AreaCodeError do
      Phoner::Phone.new '451588'
    end
  end

  def test_number_with_default_area_code_initialize
    Phoner::Phone.default_country_code = '385'
    Phoner::Phone.default_area_code = '47'

    pn = Phoner::Phone.new '451588'
    assert pn.number == '451588'
    assert pn.area_code == '47'
    assert pn.country_code == '385'
  end

  def test_number_with_default_country_code_initialize
    Phoner::Phone.default_country_code = '386'

    pn = Phoner::Phone.new '5125486', '91'
    assert pn.number == '5125486'
    assert pn.area_code == '91'
    assert pn.country_code == '386'
  end

  def test_number_with_country_code_initialize
    Phoner::Phone.default_country_code = '387'

    pn = Phoner::Phone.new '5125486', '91', '385'
    assert pn.number == '5125486'
    assert pn.area_code == '91'
    assert pn.country_code == '385'
  end

  def test_parse_empty
    assert_nil Phoner::Phone.parse('')
    assert_nil Phoner::Phone.parse(nil)
  end

  def test_parse_with_special_characters_with_country
    pn = Phoner::Phone.parse "+1 545-545-5454"
    assert "1", pn.country_code
    assert "545", pn.area_code
    assert "5455454", pn.number
  end

  def test_parse_with_extension
    pn = Phoner::Phone.parse "+1 545-545-5454 ext. 4307"
    assert "1", pn.country_code
    assert "545", pn.area_code
    assert "5455454", pn.number
    assert "4307", pn.extension
  end

  def test_parse_wont_alter_parameter
    number = "+1 545-545-5454 ext. 4307"
    _parsed = Phoner::Phone.parse number
    assert_equal "+1 545-545-5454 ext. 4307", number
  end

  def test_parse_short_without_special_characters_without_country
    Phoner::Phone.default_country_code = nil

    assert_raises Phoner::CountryCodeError do
      Phoner::Phone.parse "0915125486"
    end
  end

  def test_parse_short_with_special_characters_without_country
    Phoner::Phone.default_country_code = nil

    assert_raises Phoner::CountryCodeError do
      Phoner::Phone.parse "091/512-5486"
    end
  end

  def test_normalize
    numbers = [
      ["(0)512-5486", "5125486"],
      ["z512-5486", "5125486"],
      ["00512-5486", "+5125486"],
      ["+00512-5486", "+5125486"],
      ["+0512-5486", "+5125486"],
    ]

    numbers.each do |number, expected|
      assert_equal expected, Phoner::Phone.normalize(number)
    end
  end

  def test_to_s
    Phoner::Phone.default_country_code = nil
    pn = Phoner::Phone.new '5125486', '91', '385'
    assert pn.to_s == '+385915125486'
  end

  def test_to_s_without_country_code
    Phoner::Phone.default_country_code = '385'
    pn = Phoner::Phone.new '5125486', '91'
    assert pn.format("0%a%n") == '0915125486'
  end

  def test_format_special_with_country_code
    Phoner::Phone.default_country_code = nil
    pn = Phoner::Phone.new '5125486', '91', '385'
    assert pn.format("+ %c (%a) %n") == '+ 385 (91) 5125486'
  end

  def test_format_special_without_country_code
    Phoner::Phone.default_country_code = '385'
    pn = Phoner::Phone.new '5125486', '91'
    assert_equal pn.format("%A/%f-%l"), '091/512-5486'
  end

  def test_format_with_symbol_specifier
    Phoner::Phone.default_country_code = nil
    pn = Phoner::Phone.new '5125486', '91', '385'
    assert_equal pn.format(:europe), '+385 (0) 91 512 5486'
  end

  def test_validity
    assert true, Phoner::Phone.valid?("+17788827175")
  end

  def test_successful_validity_wont_alter_parameter
    number = "+17755551212"
    Phoner::Phone.valid?(number)
    assert_equal "+17755551212", number
  end

  def test_failing_validity_wont_alter_parameter
    number = "ABC123"
    Phoner::Phone.valid?(number)
    assert_equal "ABC123", number
  end

  def test_validity_with_country_code
    assert true, Phoner::Phone.valid?("7788827175", :country_code => "1")
  end

  def test_doesnt_validate
    assert_equal Phoner::Phone.valid?('asdas'), false
    assert_equal Phoner::Phone.valid?('385915125486'), false
  end

  def test_valid_wont_strip_the_extension
    number = '+1 (123) 456-7890 x321'

    parsed = Phoner::Phone.parse(number)
    assert_equal "+11234567890", parsed.to_s
    assert_equal "321", parsed.extension

    assert Phoner::Phone.valid?(number)

    parsed = Phoner::Phone.parse(number)
    assert_equal "+11234567890", parsed.to_s
    assert_equal"321", parsed.extension
  end

  def test_comparison_true
    pn1 = Phoner::Phone.new '5125486', '91', '385'
    pn2 = Phoner::Phone.new '5125486', '91', '385'
    assert pn1 == pn2
  end

  def test_comparison_false
    pn1 = Phoner::Phone.new '5125486', '91', '385'
    pn2 = Phoner::Phone.new '1234567', '91', '385'
    assert pn1 != pn2
  end

  def test_find_by_country_isocode
    Phoner::Country.load
    assert_equal Phoner::Country.find_by_country_isocode('de').country_code, "49"
    assert_nil Phoner::Country.find_by_country_isocode('xx')
    assert_nil Phoner::Country.find_by_country_isocode('bla')
  end
end


================================================
FILE: test_usa_phones_with_extensions.csv
================================================
601-867-5000 ext 75292
(334)821-2223 Ext. 107
(863) 983-6171 ext: 0055
601-987-3995 ext 10
(512) 473-3200Ext2396
(727) 558-5010 ext: 0112
(904) 360-5611 ext: 5611
(937) 255-7204Ext337
228-374-5022 ext 5386
(205)987-3500 Ext. 205-32
(607) 273-8588x402
(205)328-3330 Ext. 802-59
(407) 251-2452 ext: 0146
502-564-8110 xt 312
(828) 698-3923x13
(608)836-7433 Ext. 5147
(1-808)935-3222 Ext. 2#
(770)420-3179 Ext. x 179
(415) 558-8669x218
(205)879-6330 Ext. 731-50
(205)987-5995 Ext. 802-58
(609) 924-2200Ext10
(312) 440-4373x12
(978) 369-9602x457
1-602-264-1774 # 135
502-564-8890 x4340
502-564-5550 x4569
(480)437-2600 Ext. VM123
(850) 245-4131 ext: 3506
601-354-6161 ext 103
(414)778-5400 Ext. 127
(262)338-4475 Ext. #16
(602) 264-1774 extention # 135
(314) 361-3221x107
(800) 255-5747x46
410-514-7336 TDDTTY + Voice
(617) 695-2300x393
1-334-386-8800 Ext. 107
(928)634-9536 Ext. 143
502-573-1555 x266
(978) 927-8000x246
(920) 887-4600Ext340
502-564-1404 x4536
(850) 245-6774 ext: 4774
(718) 852-3000 Ext 269
228-374-5022 ext 5022
502-564-0105 x10260
(850) 000-0000 ext: 00000000
(979) 233-1616x306
(207) 333-3267x224
(561) 625-5122 ext: 687
(386) 961-7414 ext: 7414
(262)549-2249 Ext. 104
(205)322-7500 Ext. BECKYS
(303)858-8100 Ext. n.a.
(937) 255-7204x337
601-944-4830 ext 104
228-432-1056 ext 104
(209) 586-1495Ext104
502-564-8139 : 4645
(602) 264-1774 ext is 135
(602) 264-1774Ext135
502-564-7822 x4212
(609) 921-8808Ext3
(703) 739-7900x222
(609) 758-2241x144
(970)223-6500 Ext. X6510
(734) 485-2000Ext255
(904) 620-4424 ext: 8614424
(904) 827-2520 ext: 2520
(978) 774-1050x251
(541) 343-0123x2269
(608)277-2752 Ext. 2752
(203) 869-6786x335
502-564-5981 x272
606-878-5908 x6085
502-564-2257 x3464
(205)871-1911 Ext. (205)
502-564-7770 x3965
(608)374-2130 Ext. 28
(850) 410-9660 ext: 9240
601-987-6837 ext 102
(414)529-1101 Ext. 153
(209) 586-1495x104
(520)408-1885 Ext. # 227
601-605-5388 ext 100
(352) 375-8484 ext: 0174
15025645981x225
(602) 264-1774 X 135
(205)803-1499 Ext. 414-03
(651) 459-4121x203
+61 3 9811 2400
(262)681-2020 Ext. 6682
601-944-4845 ext 118
384-1100 VOICE MAIL:3004
(205)251-1267 Ext. 802-09
(410) 280-2038Ext11
502-564-3170 x190
15025646734x4420
Download .txt
gitextract_cgkn_9w2/

├── .document
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .ruby-version
├── .yardopts
├── ChangeLog.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── data/
│   └── phone/
│       └── countries.yml
├── lib/
│   ├── phone/
│   │   ├── country.rb
│   │   ├── errors.rb
│   │   └── version.rb
│   └── phone.rb
├── phone.gemspec
├── test/
│   ├── countries/
│   │   ├── au_test.rb
│   │   ├── ba_test.rb
│   │   ├── be_test.rb
│   │   ├── de_test.rb
│   │   ├── es_test.rb
│   │   ├── fr_test.rb
│   │   ├── gb_test.rb
│   │   ├── hr_test.rb
│   │   ├── hu_test.rb
│   │   ├── ie_test.rb
│   │   ├── me_test.rb
│   │   ├── nl_test.rb
│   │   ├── nz_test.rb
│   │   ├── pt_test.rb
│   │   ├── rs_test.rb
│   │   ├── se_test.rb
│   │   ├── si_test.rb
│   │   ├── ua_test.rb
│   │   ├── us_test.rb
│   │   ├── uy_test.rb
│   │   └── za_test.rb
│   ├── extension_test.rb
│   ├── helper.rb
│   └── phone_test.rb
└── test_usa_phones_with_extensions.csv
Download .txt
SYMBOL INDEX (332 symbols across 28 files)

FILE: lib/phone.rb
  type Phoner (line 15) | module Phoner
    class Phone (line 16) | class Phone
      type ClassAttributes (line 17) | module ClassAttributes
      type ClassAttributeAccessors (line 25) | module ClassAttributeAccessors
        function default_country_code (line 26) | def default_country_code
        function default_area_code (line 30) | def default_area_code
        function named_formats (line 34) | def named_formats
        function n1_length (line 38) | def n1_length
      method valid? (line 72) | def self.valid?(string, options = {})
      method parse (line 83) | def self.parse(string, options={})
      method extract_extension (line 105) | def self.extract_extension(string)
      method normalize (line 116) | def self.normalize(string_with_number)
      method split_to_parts (line 124) | def self.split_to_parts(string, options = {})
      method detect_country (line 170) | def self.detect_country(string)
      method detect_format (line 182) | def self.detect_format(string_with_number, country)
      method formats (line 196) | def self.formats(country)
      method initialize (line 223) | def initialize(*args)
      method area_code_long (line 246) | def area_code_long
      method number1 (line 251) | def number1
      method number2 (line 256) | def number2
      method format (line 275) | def format(fmt)
      method to_s (line 285) | def to_s
      method has_default_country_code? (line 290) | def has_default_country_code?
      method has_default_area_code? (line 295) | def has_default_area_code?
      method == (line 300) | def ==(other)
      method args_to_hash (line 316) | def args_to_hash(args)
      method format_number (line 325) | def format_number(fmt)

FILE: lib/phone/country.rb
  type Phoner (line 3) | module Phoner
    class Country (line 4) | class Country < Struct.new(:name, :country_code, :char_2_code, :char_3...
      type All (line 5) | module All
      method all (line 10) | def all
      method load (line 14) | def self.load
      method find_by_country_code (line 35) | def self.find_by_country_code(code)
      method find_by_country_isocode (line 39) | def self.find_by_country_isocode(isocode)
      method to_s (line 45) | def to_s
      method country_code_regexp (line 49) | def country_code_regexp

FILE: lib/phone/errors.rb
  type Phoner (line 1) | module Phoner
    class PhoneError (line 2) | class PhoneError < RuntimeError;end
    class BlankNumberError (line 3) | class BlankNumberError < PhoneError;end
    class AreaCodeError (line 4) | class AreaCodeError < PhoneError;end
    class CountryCodeError (line 5) | class CountryCodeError < PhoneError;end

FILE: lib/phone/version.rb
  type Phone (line 1) | module Phone

FILE: test/countries/au_test.rb
  class AUTest (line 7) | class AUTest < Minitest::Test
    method test_central_east (line 17) | def test_central_east
    method test_south_east (line 22) | def test_south_east
    method test_mobile (line 27) | def test_mobile
    method test_personal (line 32) | def test_personal
    method test_north_east (line 37) | def test_north_east
    method test_central (line 42) | def test_central

FILE: test/countries/ba_test.rb
  class BATest (line 4) | class BATest < Minitest::Test
    method test_local (line 6) | def test_local

FILE: test/countries/be_test.rb
  class BETest (line 5) | class BETest < Minitest::Test
    method test_brussels (line 9) | def test_brussels
    method test_antwerpen (line 13) | def test_antwerpen
    method test_liege (line 17) | def test_liege
    method test_gent (line 21) | def test_gent
    method test_wavre (line 27) | def test_wavre
    method test_hasselt (line 31) | def test_hasselt
    method test_tongeren (line 35) | def test_tongeren
    method test_diest (line 39) | def test_diest
    method test_waremme (line 46) | def test_waremme
    method test_brugge (line 51) | def test_brugge
    method test_roeselare (line 55) | def test_roeselare
    method test_oostende (line 66) | def test_oostende
    method test_chimay (line 71) | def test_chimay
    method test_nivelles (line 79) | def test_nivelles
    method test_specialty (line 86) | def test_specialty
    method test_namur (line 92) | def test_namur
    method test_toll_free (line 104) | def test_toll_free
    method test_premium_900 (line 109) | def test_premium_900
    method test_premium_901 (line 113) | def test_premium_901

FILE: test/countries/de_test.rb
  class DETest (line 4) | class DETest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_mobile (line 10) | def test_mobile

FILE: test/countries/es_test.rb
  class ESTest (line 10) | class ESTest < Minitest::Test
    method test_validates (line 12) | def test_validates

FILE: test/countries/fr_test.rb
  class FRTest (line 4) | class FRTest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_mobile (line 10) | def test_mobile
    method test_mobile_07 (line 14) | def test_mobile_07
    method test_voip (line 18) | def test_voip

FILE: test/countries/gb_test.rb
  class GBTest (line 35) | class GBTest < Minitest::Test
    method test_london (line 39) | def test_london
    method test_northern_ireland (line 44) | def test_northern_ireland
    method test_cardiff (line 49) | def test_cardiff
    method test_leeds (line 54) | def test_leeds
    method test_sheffield (line 59) | def test_sheffield
    method test_nottingham (line 64) | def test_nottingham
    method test_leicester (line 69) | def test_leicester
    method test_bristol (line 74) | def test_bristol
    method test_reading (line 79) | def test_reading
    method test_birmingham (line 84) | def test_birmingham
    method test_edinburgh (line 89) | def test_edinburgh
    method test_glasgow (line 94) | def test_glasgow
    method test_liverpool (line 99) | def test_liverpool
    method test_manchester (line 104) | def test_manchester
    method test_tyneside (line 110) | def test_tyneside
    method test_bournemouth (line 117) | def test_bournemouth
    method test_falmouth (line 122) | def test_falmouth
    method test_alton (line 127) | def test_alton
    method test_lynton (line 132) | def test_lynton
    method test_newquay (line 137) | def test_newquay
    method test_rothesay (line 142) | def test_rothesay
    method test_colonsay (line 147) | def test_colonsay
    method test_no_area (line 152) | def test_no_area
    method test_personal_numbering (line 157) | def test_personal_numbering
    method test_mobile (line 162) | def test_mobile
    method test_mobile_2 (line 166) | def test_mobile_2
    method test_freephone (line 171) | def test_freephone
    method test_freephone_2 (line 175) | def test_freephone_2
    method test_premium (line 180) | def test_premium
    method test_premium2 (line 184) | def test_premium2
    method test_wide (line 189) | def test_wide
    method test_wide_2 (line 193) | def test_wide_2

FILE: test/countries/hr_test.rb
  class HRTest (line 4) | class HRTest < Minitest::Test
    method test_zagreb (line 6) | def test_zagreb
    method test_mobile (line 10) | def test_mobile
    method test_long_without_special_characters (line 14) | def test_long_without_special_characters
    method test_long_with_special_characters (line 18) | def test_long_with_special_characters
    method test_long_with_leading_zeros (line 22) | def test_long_with_leading_zeros
    method test_zagreb_long_with_leading_zeros (line 26) | def test_zagreb_long_with_leading_zeros
    method test_short_without_special_characters_with_country (line 30) | def test_short_without_special_characters_with_country
    method test_zagreb_short_without_special_characters_with_country (line 35) | def test_zagreb_short_without_special_characters_with_country
    method test_long_with_zero_in_brackets (line 40) | def test_long_with_zero_in_brackets
    method test_has_default_country_code (line 45) | def test_has_default_country_code
    method test_has_default_area_code (line 52) | def test_has_default_area_code
    method test_validates (line 60) | def test_validates

FILE: test/countries/hu_test.rb
  class HUTest (line 4) | class HUTest < Minitest::Test
    method test_mobile (line 6) | def test_mobile

FILE: test/countries/ie_test.rb
  class IETest (line 4) | class IETest < Minitest::Test
    method test_short_cork_number (line 6) | def test_short_cork_number
    method test_short_cork_number_2 (line 10) | def test_short_cork_number_2
    method test_short_wrong_area_code (line 14) | def test_short_wrong_area_code

FILE: test/countries/me_test.rb
  class METest (line 4) | class METest < Minitest::Test
    method test_mobile (line 6) | def test_mobile
    method test_local (line 10) | def test_local

FILE: test/countries/nl_test.rb
  class NETest (line 4) | class NETest < Minitest::Test
    method test_mobile (line 7) | def test_mobile
    method test_pagers (line 12) | def test_pagers
    method test_internet_access (line 17) | def test_internet_access
    method test_toll_free (line 22) | def test_toll_free
    method test_location_independent_84 (line 27) | def test_location_independent_84
    method test_location_independent_85 (line 32) | def test_location_independent_85
    method test_location_independent_87 (line 37) | def test_location_independent_87
    method test_location_independent_88 (line 42) | def test_location_independent_88
    method test_location_independent_878 (line 47) | def test_location_independent_878
    method test_premium_900 (line 52) | def test_premium_900
    method test_premium_906 (line 57) | def test_premium_906
    method test_rotterdam (line 70) | def test_rotterdam
    method test_tilburg (line 74) | def test_tilburg
    method test_amsterdam (line 80) | def test_amsterdam
    method test_utrecht (line 88) | def test_utrecht
    method test_amersfoort (line 92) | def test_amersfoort
    method test_heerlen (line 102) | def test_heerlen
    method test_groningen (line 108) | def test_groningen
    method test_leeuwarden (line 114) | def test_leeuwarden
    method test_the_hague (line 120) | def test_the_hague
    method test_leiden (line 124) | def test_leiden
    method test_zaandam (line 131) | def test_zaandam
    method test_zoetermeer (line 138) | def test_zoetermeer
    method test_zierikzee (line 145) | def test_zierikzee
    method test_goes (line 149) | def test_goes
    method test_sluis (line 155) | def test_sluis
    method test_gilze (line 161) | def test_gilze
    method test_bergen (line 166) | def test_bergen
    method test_alphen (line 175) | def test_alphen
    method test_ridderkerk (line 181) | def test_ridderkerk
    method test_gouda (line 186) | def test_gouda
    method test_texel (line 195) | def test_texel
    method test_shagen (line 200) | def test_shagen
    method test_hoorn (line 207) | def test_hoorn
    method test_beverwijk (line 212) | def test_beverwijk
    method test_weesp (line 219) | def test_weesp
    method test_dieren (line 226) | def test_dieren
    method test_terborg (line 231) | def test_terborg
    method test_lelystad (line 239) | def test_lelystad
    method test_harderwijk (line 245) | def test_harderwijk
    method test_tiel (line 251) | def test_tiel
    method test_boxtel (line 260) | def test_boxtel
    method test_roermond (line 269) | def test_roermond
    method test_bemmel (line 275) | def test_bemmel
    method test_druten (line 281) | def test_druten
    method test_helmond (line 287) | def test_helmond
    method test_weert (line 292) | def test_weert
    method test_veenwouden (line 299) | def test_veenwouden
    method test_sneek (line 306) | def test_sneek
    method test_steenwijk (line 315) | def test_steenwijk
    method tst_coevorden (line 321) | def tst_coevorden
    method test_oldenzaal (line 330) | def test_oldenzaal
    method test_neede (line 336) | def test_neede
    method test_wolvega (line 344) | def test_wolvega
    method test_deventer (line 351) | def test_deventer
    method test_lochem (line 357) | def test_lochem
    method test_emmen (line 365) | def test_emmen
    method test_beilen (line 370) | def test_beilen
    method test_stadskanaal (line 379) | def test_stadskanaal

FILE: test/countries/nz_test.rb
  class NZTest (line 4) | class NZTest < Minitest::Test
    method test_local (line 5) | def test_local

FILE: test/countries/pt_test.rb
  class PTTest (line 7) | class PTTest < Minitest::Test
    method test_lisbon (line 18) | def test_lisbon
    method test_oporto (line 22) | def test_oporto
    method test_mealhada (line 28) | def test_mealhada
    method test_viseu (line 33) | def test_viseu
    method test_angra (line 36) | def test_angra
    method test_pontadelgada (line 41) | def test_pontadelgada
    method test_707 (line 53) | def test_707
    method test_800 (line 61) | def test_800
    method test_808 (line 66) | def test_808
    method test_809 (line 71) | def test_809
    method test_vodafone (line 80) | def test_vodafone
    method test_optimus (line 84) | def test_optimus
    method test_tmn (line 88) | def test_tmn
    method test_tmn921 (line 94) | def test_tmn921
    method test_tmn923 (line 98) | def test_tmn923
    method test_phoneix (line 102) | def test_phoneix
    method test_zonmobile (line 106) | def test_zonmobile
    method test_validates (line 110) | def test_validates

FILE: test/countries/rs_test.rb
  class RSTest (line 4) | class RSTest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_mobile (line 12) | def test_mobile

FILE: test/countries/se_test.rb
  class SETest (line 5) | class SETest < Minitest::Test
    method test_stockholm (line 8) | def test_stockholm
    method test_independent_numbers (line 15) | def test_independent_numbers
    method test_norrkoping (line 20) | def test_norrkoping
    method test_linkoping (line 25) | def test_linkoping
    method test_eskilstuna (line 30) | def test_eskilstuna
    method test_uppsala (line 35) | def test_uppsala
    method test_orebro (line 40) | def test_orebro
    method test_toll_free (line 45) | def test_toll_free
    method test_vasteras (line 50) | def test_vasteras
    method test_falun (line 55) | def test_falun
    method test_gavle (line 60) | def test_gavle
    method test_goteborg (line 65) | def test_goteborg
    method test_boras (line 70) | def test_boras
    method test_halmstad (line 75) | def test_halmstad
    method test_jonkoping (line 80) | def test_jonkoping
    method test_malmo (line 85) | def test_malmo
    method test_helsingborg (line 90) | def test_helsingborg
    method test_kristianstad (line 95) | def test_kristianstad
    method test_lund (line 100) | def test_lund
    method test_karlstad (line 105) | def test_karlstad
    method test_sundsvall (line 110) | def test_sundsvall
    method test_ostersund (line 115) | def test_ostersund
    method test_mobile_70 (line 120) | def test_mobile_70
    method test_telematics (line 125) | def test_telematics
    method test_mobile_72 (line 130) | def test_mobile_72
    method test_mobile_73 (line 135) | def test_mobile_73
    method test_mobile_76 (line 140) | def test_mobile_76
    method test_umea (line 145) | def test_umea
    method test_premium_99 (line 150) | def test_premium_99
    method test_atvidaberg (line 157) | def test_atvidaberg
    method test_enkoping (line 178) | def test_enkoping
    method test_hallstahammar (line 187) | def test_hallstahammar
    method test_rattvik (line 203) | def test_rattvik
    method test_ockelbo (line 222) | def test_ockelbo
    method test_kungsbacka (line 227) | def test_kungsbacka
    method test_varberg (line 239) | def test_varberg
    method test_trelleborg (line 256) | def test_trelleborg
    method test_lanholm (line 267) | def test_lanholm
    method test_vaxjo (line 280) | def test_vaxjo
    method test_kisa (line 299) | def test_kisa
    method test_skovde (line 308) | def test_skovde
    method test_hjo (line 314) | def test_hjo
    method test_deje (line 342) | def test_deje
    method test_nora (line 363) | def test_nora
    method test_harnosand (line 371) | def test_harnosand
    method test_husum (line 396) | def test_husum
    method test_pagers (line 417) | def test_pagers
    method test_premium_900 (line 422) | def test_premium_900
    method test_jorn (line 432) | def test_jorn
    method test_vannas (line 451) | def test_vannas
    method test_vittangi (line 476) | def test_vittangi

FILE: test/countries/si_test.rb
  class SITest (line 4) | class SITest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_local_2 (line 11) | def test_local_2
    method test_mobile (line 16) | def test_mobile

FILE: test/countries/ua_test.rb
  class UATest (line 4) | class UATest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_mobile (line 10) | def test_mobile
    method test_mobile2 (line 14) | def test_mobile2

FILE: test/countries/us_test.rb
  class USTest (line 4) | class USTest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_tollfree (line 10) | def test_tollfree
    method test_long_with_default_country_code (line 14) | def test_long_with_default_country_code
    method test_short_with_default_country_code_and_area_code (line 19) | def test_short_with_default_country_code_and_area_code

FILE: test/countries/uy_test.rb
  class UYTest (line 5) | class UYTest < Minitest::Test
    method test_montevideo (line 8) | def test_montevideo
    method test_maldonado (line 13) | def test_maldonado
    method test_mobile_phones (line 18) | def test_mobile_phones

FILE: test/countries/za_test.rb
  class ZATest (line 4) | class ZATest < Minitest::Test
    method test_local (line 6) | def test_local
    method test_mobile (line 11) | def test_mobile
    method test_tollfree (line 20) | def test_tollfree
    method test_long_msisdns (line 25) | def test_long_msisdns

FILE: test/extension_test.rb
  class ExtensionTest (line 3) | class ExtensionTest < Minitest::Test
    method test_parse_usa_long_with_simple_extension (line 5) | def test_parse_usa_long_with_simple_extension
    method test_to_s_with_extension (line 15) | def test_to_s_with_extension
    method test_format_with_extension (line 20) | def test_format_with_extension
    method test_extract_extension (line 25) | def test_extract_extension

FILE: test/helper.rb
  class Minitest::Test (line 22) | class Minitest::Test
    method setup (line 23) | def setup
    method teardown (line 28) | def teardown
  function parse_test (line 34) | def parse_test(raw, country_code, area_code, number)

FILE: test/phone_test.rb
  class PhoneTest (line 3) | class PhoneTest < Minitest::Test
    method test_with_nil_number_initialize (line 5) | def test_with_nil_number_initialize
    method test_with_empty_number_initialize (line 11) | def test_with_empty_number_initialize
    method test_number_without_country_code_initialize (line 17) | def test_number_without_country_code_initialize
    method test_number_without_country_and_area_code_initialize (line 25) | def test_number_without_country_and_area_code_initialize
    method test_number_with_default_area_code_initialize (line 34) | def test_number_with_default_area_code_initialize
    method test_number_with_default_country_code_initialize (line 44) | def test_number_with_default_country_code_initialize
    method test_number_with_country_code_initialize (line 53) | def test_number_with_country_code_initialize
    method test_parse_empty (line 62) | def test_parse_empty
    method test_parse_with_special_characters_with_country (line 67) | def test_parse_with_special_characters_with_country
    method test_parse_with_extension (line 74) | def test_parse_with_extension
    method test_parse_wont_alter_parameter (line 82) | def test_parse_wont_alter_parameter
    method test_parse_short_without_special_characters_without_country (line 88) | def test_parse_short_without_special_characters_without_country
    method test_parse_short_with_special_characters_without_country (line 96) | def test_parse_short_with_special_characters_without_country
    method test_normalize (line 104) | def test_normalize
    method test_to_s (line 118) | def test_to_s
    method test_to_s_without_country_code (line 124) | def test_to_s_without_country_code
    method test_format_special_with_country_code (line 130) | def test_format_special_with_country_code
    method test_format_special_without_country_code (line 136) | def test_format_special_without_country_code
    method test_format_with_symbol_specifier (line 142) | def test_format_with_symbol_specifier
    method test_validity (line 148) | def test_validity
    method test_successful_validity_wont_alter_parameter (line 152) | def test_successful_validity_wont_alter_parameter
    method test_failing_validity_wont_alter_parameter (line 158) | def test_failing_validity_wont_alter_parameter
    method test_validity_with_country_code (line 164) | def test_validity_with_country_code
    method test_doesnt_validate (line 168) | def test_doesnt_validate
    method test_valid_wont_strip_the_extension (line 173) | def test_valid_wont_strip_the_extension
    method test_comparison_true (line 187) | def test_comparison_true
    method test_comparison_false (line 193) | def test_comparison_false
    method test_find_by_country_isocode (line 199) | def test_find_by_country_isocode
Condensed preview — 41 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (116K chars).
[
  {
    "path": ".document",
    "chars": 28,
    "preview": "- \nChangeLog.md\nLICENSE.txt\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 602,
    "preview": "name: Ruby CI\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  test:\n\n    runs-on"
  },
  {
    "path": ".gitignore",
    "chars": 47,
    "preview": "Gemfile.lock\ndoc/\npkg/\ntmp/\nvendor/cache/*.gem\n"
  },
  {
    "path": ".ruby-version",
    "chars": 6,
    "preview": "2.0.0\n"
  },
  {
    "path": ".yardopts",
    "chars": 60,
    "preview": "--markup markdown --title \"phone Documentation\" --protected\n"
  },
  {
    "path": "ChangeLog.md",
    "chars": 2314,
    "preview": "# 1.3.0 / (unreleased)\n\n* Update README for yaml name and location (pepe)\n* Relocate / rename `data/phone_countries.yml`"
  },
  {
    "path": "Gemfile",
    "chars": 109,
    "preview": "source \"https://rubygems.org\"\n\ngemspec\n\ngroup :doc do\n  gem \"redcarpet\"\nend\n\ngroup :test do\n  gem \"rake\"\nend\n"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1155,
    "preview": "Copyright (c) 2010-2013 Tomislav Car\nModifications copyright (c) 2010 Todd Eichel for Fooala, Inc.\nCopyright (c) 2013 Do"
  },
  {
    "path": "README.md",
    "chars": 6514,
    "preview": "[gem]: https://rubygems.org/gems/phone\n[stable]: https://github.com/carr/phone/tree/v1.2.3\n[gem-beta]: https://rubygems."
  },
  {
    "path": "Rakefile",
    "chars": 624,
    "preview": "# encoding: utf-8\n\nrequire \"rubygems\"\n\nbegin\n  require \"bundler\"\nrescue LoadError => e\n  warn e.message\n  warn \"Run `gem"
  },
  {
    "path": "data/phone/countries.yml",
    "chars": 33675,
    "preview": "--- \n\"676\": \n  :country_code: \"676\"\n  :national_dialing_prefix: None\n  :char_2_code: None\n  :char_3_code: TO\n  :name: To"
  },
  {
    "path": "lib/phone/country.rb",
    "chars": 1199,
    "preview": "require \"yaml\"\n\nmodule Phoner\n  class Country < Struct.new(:name, :country_code, :char_2_code, :char_3_code, :area_code,"
  },
  {
    "path": "lib/phone/errors.rb",
    "chars": 179,
    "preview": "module Phoner\n  class PhoneError < RuntimeError;end\n  class BlankNumberError < PhoneError;end\n  class AreaCodeError < Ph"
  },
  {
    "path": "lib/phone/version.rb",
    "chars": 61,
    "preview": "module Phone\n  # phone version\n  VERSION = \"1.3.0.beta1\"\nend\n"
  },
  {
    "path": "lib/phone.rb",
    "chars": 9915,
    "preview": "# An object representing a phone number.\n#\n# The phone number is recorded in 3 separate parts:\n# * country_code - e.g. \""
  },
  {
    "path": "phone.gemspec",
    "chars": 1006,
    "preview": "# -*- encoding: utf-8 -*-\n\nrequire File.expand_path(\"../lib/phone/version\", __FILE__)\n\nGem::Specification.new do |gem|\n "
  },
  {
    "path": "test/countries/au_test.rb",
    "chars": 1322,
    "preview": "require \"helper\"\n\n# 0x 5551 reserved for fictitious use. (not including x=3)\n# 0x 7010 reserved for fictitious use.\n\n## "
  },
  {
    "path": "test/countries/ba_test.rb",
    "chars": 161,
    "preview": "require \"helper\"\n\n## Bosnia and Herzegovina\nclass BATest < Minitest::Test\n\n  def test_local\n    parse_test('+387 33 25 0"
  },
  {
    "path": "test/countries/be_test.rb",
    "chars": 2894,
    "preview": "# -*- coding: utf-8 -*-\nrequire \"helper\"\n\n## Belgium\nclass BETest < Minitest::Test\n\n  ## single digit\n  # 02:   Brussels"
  },
  {
    "path": "test/countries/de_test.rb",
    "chars": 412,
    "preview": "require \"helper\"\n\n## Germany\nclass DETest < Minitest::Test\n\n  def test_local\n    parse_test('+49 714 1605832', '49', '71"
  },
  {
    "path": "test/countries/es_test.rb",
    "chars": 1380,
    "preview": "require \"helper\"\n\n## Spain\n# http://en.wikipedia.org/wiki/Telephone_numbers_in_Spain\n# http://gospain.about.com/od/pract"
  },
  {
    "path": "test/countries/fr_test.rb",
    "chars": 400,
    "preview": "require \"helper\"\n\n## France\nclass FRTest < Minitest::Test\n\n  def test_local\n    parse_test('+33 4 75 06 07 07', '33', '4"
  },
  {
    "path": "test/countries/gb_test.rb",
    "chars": 5932,
    "preview": "# -*- coding: utf-8 -*-\nrequire \"helper\"\n\n# http://stakeholders.ofcom.org.uk/telecoms/numbering/guidance-tele-no/numbers"
  },
  {
    "path": "test/countries/hr_test.rb",
    "chars": 2412,
    "preview": "require \"helper\"\n\n## Croatia\nclass HRTest < Minitest::Test\n\n  def test_zagreb\n    parse_test('+38513668734', '385', '1',"
  },
  {
    "path": "test/countries/hu_test.rb",
    "chars": 145,
    "preview": "require \"helper\"\n\n## Hungary\nclass HUTest < Minitest::Test\n\n  def test_mobile\n    parse_test('+36 30 5517999', '36', '30"
  },
  {
    "path": "test/countries/ie_test.rb",
    "chars": 348,
    "preview": "require \"helper\"\n\n## Ireland\nclass IETest < Minitest::Test\n\n  def test_short_cork_number\n    parse_test('+353 28 28946',"
  },
  {
    "path": "test/countries/me_test.rb",
    "chars": 234,
    "preview": "require \"helper\"\n\n## Montenegro\nclass METest < Minitest::Test\n\n  def test_mobile\n    parse_test('+382 69 555 5555', '382"
  },
  {
    "path": "test/countries/nl_test.rb",
    "chars": 8304,
    "preview": "require \"helper\"\n\n## Netherlands\nclass NETest < Minitest::Test\n\n  # 06:   mobile phone number\n  def test_mobile\n    pars"
  },
  {
    "path": "test/countries/nz_test.rb",
    "chars": 144,
    "preview": "require \"helper\"\n\n## New Zealand\nclass NZTest < Minitest::Test\n  def test_local\n    parse_test('+6431234567',  '64', '3'"
  },
  {
    "path": "test/countries/pt_test.rb",
    "chars": 3607,
    "preview": "require \"helper\"\n\n## Portugal\n# source 1: http://pt.wikipedia.org/wiki/N%C3%BAmeros_de_telefone_em_Portugal\n# source 2: "
  },
  {
    "path": "test/countries/rs_test.rb",
    "chars": 254,
    "preview": "require \"helper\"\n\n## Serbia\nclass RSTest < Minitest::Test\n\n  def test_local\n    # Beograd\n    parse_test('+381 11 24 33 "
  },
  {
    "path": "test/countries/se_test.rb",
    "chars": 10023,
    "preview": "# -*- coding: utf-8 -*-\nrequire \"helper\"\n\n## Sweden\nclass SETest < Minitest::Test\n\n  # 08  Greater Stockholm\n  def test_"
  },
  {
    "path": "test/countries/si_test.rb",
    "chars": 353,
    "preview": "require \"helper\"\n\n## Slovenia\nclass SITest < Minitest::Test\n\n  def test_local\n    #Maribor\n    parse_test('+ 386 2 23 46"
  },
  {
    "path": "test/countries/ua_test.rb",
    "chars": 319,
    "preview": "require \"helper\"\n\n## Ukraine\nclass UATest < Minitest::Test\n\n  def test_local\n    parse_test('+380 57 711 22 33', '380', "
  },
  {
    "path": "test/countries/us_test.rb",
    "chars": 582,
    "preview": "require \"helper\"\n\n## United States\nclass USTest < Minitest::Test\n\n  def test_local\n    parse_test('+1 555 123 4567', '1'"
  },
  {
    "path": "test/countries/uy_test.rb",
    "chars": 446,
    "preview": "require \"helper\"\n\n## Uruguay\n# source: http://en.wikipedia.org/wiki/Telephone_numbers_in_Uruguay\nclass UYTest < Minitest"
  },
  {
    "path": "test/countries/za_test.rb",
    "chars": 654,
    "preview": "require \"helper\"\n\n## South Africa\nclass ZATest < Minitest::Test\n\n  def test_local\n    # Telkom\n    parse_test('+27 11 55"
  },
  {
    "path": "test/extension_test.rb",
    "chars": 935,
    "preview": "require \"helper\"\n\nclass ExtensionTest < Minitest::Test\n\n  def test_parse_usa_long_with_simple_extension\n    pn = Phoner:"
  },
  {
    "path": "test/helper.rb",
    "chars": 909,
    "preview": "require \"rubygems\"\n\nbegin\n  require \"bundler\"\nrescue LoadError => e\n  STDERR.puts e.message\n  STDERR.puts \"Run `gem inst"
  },
  {
    "path": "test/phone_test.rb",
    "chars": 5577,
    "preview": "require \"helper\"\n\nclass PhoneTest < Minitest::Test\n\n  def test_with_nil_number_initialize\n    assert_raises Phoner::Blan"
  },
  {
    "path": "test_usa_phones_with_extensions.csv",
    "chars": 2171,
    "preview": "601-867-5000 ext 75292\n(334)821-2223 Ext. 107\n(863) 983-6171 ext: 0055\n601-987-3995 ext 10\n(512) 473-3200Ext2396\n(727) 5"
  }
]

About this extraction

This page contains the full source code of the carr/phone GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 41 files (104.9 KB), approximately 38.9k tokens, and a symbol index with 332 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!