as_dialed_from 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +3 -0
- data/Gemfile +19 -0
- data/Guardfile +5 -0
- data/LICENSE +13 -0
- data/README.md +41 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/as_dialed_from.gemspec +319 -0
- data/lib/as_dialed_from/metadata.rb +94 -0
- data/lib/as_dialed_from/number.rb +79 -0
- data/lib/as_dialed_from.rb +11 -0
- data/resources/PhoneNumberMetaData.xml +20321 -0
- data/resources/country_codes.yml +446 -0
- data/resources/territories/.gitkeep +0 -0
- data/resources/territories/AC.yml +4 -0
- data/resources/territories/AD.yml +4 -0
- data/resources/territories/AE.yml +5 -0
- data/resources/territories/AF.yml +5 -0
- data/resources/territories/AG.yml +5 -0
- data/resources/territories/AI.yml +5 -0
- data/resources/territories/AL.yml +5 -0
- data/resources/territories/AM.yml +5 -0
- data/resources/territories/AN.yml +4 -0
- data/resources/territories/AO.yml +4 -0
- data/resources/territories/AR.yml +5 -0
- data/resources/territories/AS.yml +5 -0
- data/resources/territories/AT.yml +5 -0
- data/resources/territories/AU.yml +5 -0
- data/resources/territories/AW.yml +4 -0
- data/resources/territories/AX.yml +5 -0
- data/resources/territories/AZ.yml +5 -0
- data/resources/territories/BA.yml +5 -0
- data/resources/territories/BB.yml +5 -0
- data/resources/territories/BD.yml +5 -0
- data/resources/territories/BE.yml +5 -0
- data/resources/territories/BF.yml +4 -0
- data/resources/territories/BG.yml +5 -0
- data/resources/territories/BH.yml +4 -0
- data/resources/territories/BI.yml +4 -0
- data/resources/territories/BJ.yml +4 -0
- data/resources/territories/BL.yml +5 -0
- data/resources/territories/BM.yml +5 -0
- data/resources/territories/BN.yml +5 -0
- data/resources/territories/BO.yml +5 -0
- data/resources/territories/BR.yml +5 -0
- data/resources/territories/BS.yml +5 -0
- data/resources/territories/BT.yml +4 -0
- data/resources/territories/BW.yml +4 -0
- data/resources/territories/BY.yml +5 -0
- data/resources/territories/BZ.yml +5 -0
- data/resources/territories/CA.yml +5 -0
- data/resources/territories/CC.yml +5 -0
- data/resources/territories/CD.yml +5 -0
- data/resources/territories/CF.yml +4 -0
- data/resources/territories/CG.yml +5 -0
- data/resources/territories/CH.yml +5 -0
- data/resources/territories/CI.yml +5 -0
- data/resources/territories/CK.yml +4 -0
- data/resources/territories/CL.yml +5 -0
- data/resources/territories/CM.yml +4 -0
- data/resources/territories/CN.yml +5 -0
- data/resources/territories/CO.yml +5 -0
- data/resources/territories/CR.yml +4 -0
- data/resources/territories/CU.yml +5 -0
- data/resources/territories/CV.yml +4 -0
- data/resources/territories/CX.yml +5 -0
- data/resources/territories/CY.yml +4 -0
- data/resources/territories/CZ.yml +4 -0
- data/resources/territories/DE.yml +5 -0
- data/resources/territories/DJ.yml +4 -0
- data/resources/territories/DK.yml +4 -0
- data/resources/territories/DM.yml +5 -0
- data/resources/territories/DO.yml +5 -0
- data/resources/territories/DZ.yml +5 -0
- data/resources/territories/EC.yml +5 -0
- data/resources/territories/EE.yml +4 -0
- data/resources/territories/EG.yml +5 -0
- data/resources/territories/ER.yml +5 -0
- data/resources/territories/ES.yml +4 -0
- data/resources/territories/ET.yml +5 -0
- data/resources/territories/FI.yml +5 -0
- data/resources/territories/FJ.yml +5 -0
- data/resources/territories/FK.yml +4 -0
- data/resources/territories/FM.yml +4 -0
- data/resources/territories/FO.yml +4 -0
- data/resources/territories/FR.yml +5 -0
- data/resources/territories/GA.yml +5 -0
- data/resources/territories/GB.yml +5 -0
- data/resources/territories/GD.yml +5 -0
- data/resources/territories/GE.yml +5 -0
- data/resources/territories/GF.yml +5 -0
- data/resources/territories/GG.yml +5 -0
- data/resources/territories/GH.yml +5 -0
- data/resources/territories/GI.yml +4 -0
- data/resources/territories/GL.yml +4 -0
- data/resources/territories/GM.yml +4 -0
- data/resources/territories/GN.yml +4 -0
- data/resources/territories/GP.yml +5 -0
- data/resources/territories/GQ.yml +4 -0
- data/resources/territories/GR.yml +4 -0
- data/resources/territories/GT.yml +4 -0
- data/resources/territories/GU.yml +5 -0
- data/resources/territories/GW.yml +4 -0
- data/resources/territories/GY.yml +4 -0
- data/resources/territories/HK.yml +4 -0
- data/resources/territories/HN.yml +4 -0
- data/resources/territories/HR.yml +5 -0
- data/resources/territories/HT.yml +4 -0
- data/resources/territories/HU.yml +5 -0
- data/resources/territories/ID.yml +5 -0
- data/resources/territories/IE.yml +5 -0
- data/resources/territories/IL.yml +5 -0
- data/resources/territories/IM.yml +5 -0
- data/resources/territories/IN.yml +5 -0
- data/resources/territories/IO.yml +4 -0
- data/resources/territories/IQ.yml +5 -0
- data/resources/territories/IR.yml +5 -0
- data/resources/territories/IS.yml +4 -0
- data/resources/territories/IT.yml +5 -0
- data/resources/territories/JE.yml +5 -0
- data/resources/territories/JM.yml +5 -0
- data/resources/territories/JO.yml +5 -0
- data/resources/territories/JP.yml +5 -0
- data/resources/territories/KE.yml +5 -0
- data/resources/territories/KG.yml +5 -0
- data/resources/territories/KH.yml +5 -0
- data/resources/territories/KI.yml +5 -0
- data/resources/territories/KM.yml +4 -0
- data/resources/territories/KN.yml +5 -0
- data/resources/territories/KP.yml +5 -0
- data/resources/territories/KR.yml +5 -0
- data/resources/territories/KW.yml +4 -0
- data/resources/territories/KY.yml +5 -0
- data/resources/territories/KZ.yml +5 -0
- data/resources/territories/LA.yml +5 -0
- data/resources/territories/LB.yml +5 -0
- data/resources/territories/LC.yml +5 -0
- data/resources/territories/LI.yml +4 -0
- data/resources/territories/LK.yml +5 -0
- data/resources/territories/LR.yml +5 -0
- data/resources/territories/LS.yml +4 -0
- data/resources/territories/LT.yml +5 -0
- data/resources/territories/LU.yml +4 -0
- data/resources/territories/LV.yml +4 -0
- data/resources/territories/LY.yml +5 -0
- data/resources/territories/MA.yml +5 -0
- data/resources/territories/MC.yml +5 -0
- data/resources/territories/MD.yml +5 -0
- data/resources/territories/ME.yml +5 -0
- data/resources/territories/MF.yml +5 -0
- data/resources/territories/MG.yml +5 -0
- data/resources/territories/MH.yml +4 -0
- data/resources/territories/MK.yml +5 -0
- data/resources/territories/ML.yml +5 -0
- data/resources/territories/MM.yml +4 -0
- data/resources/territories/MN.yml +5 -0
- data/resources/territories/MO.yml +4 -0
- data/resources/territories/MP.yml +5 -0
- data/resources/territories/MQ.yml +5 -0
- data/resources/territories/MR.yml +4 -0
- data/resources/territories/MS.yml +5 -0
- data/resources/territories/MT.yml +4 -0
- data/resources/territories/MU.yml +4 -0
- data/resources/territories/MV.yml +4 -0
- data/resources/territories/MW.yml +5 -0
- data/resources/territories/MX.yml +5 -0
- data/resources/territories/MY.yml +5 -0
- data/resources/territories/MZ.yml +4 -0
- data/resources/territories/NA.yml +5 -0
- data/resources/territories/NC.yml +4 -0
- data/resources/territories/NE.yml +5 -0
- data/resources/territories/NF.yml +4 -0
- data/resources/territories/NG.yml +5 -0
- data/resources/territories/NI.yml +4 -0
- data/resources/territories/NL.yml +5 -0
- data/resources/territories/NO.yml +5 -0
- data/resources/territories/NP.yml +5 -0
- data/resources/territories/NR.yml +4 -0
- data/resources/territories/NU.yml +4 -0
- data/resources/territories/NZ.yml +5 -0
- data/resources/territories/OM.yml +4 -0
- data/resources/territories/PA.yml +5 -0
- data/resources/territories/PE.yml +5 -0
- data/resources/territories/PF.yml +4 -0
- data/resources/territories/PG.yml +4 -0
- data/resources/territories/PH.yml +5 -0
- data/resources/territories/PK.yml +5 -0
- data/resources/territories/PL.yml +4 -0
- data/resources/territories/PM.yml +4 -0
- data/resources/territories/PR.yml +5 -0
- data/resources/territories/PS.yml +5 -0
- data/resources/territories/PT.yml +4 -0
- data/resources/territories/PW.yml +4 -0
- data/resources/territories/PY.yml +5 -0
- data/resources/territories/QA.yml +4 -0
- data/resources/territories/RE.yml +5 -0
- data/resources/territories/RO.yml +5 -0
- data/resources/territories/RS.yml +5 -0
- data/resources/territories/RU.yml +5 -0
- data/resources/territories/RW.yml +5 -0
- data/resources/territories/SA.yml +5 -0
- data/resources/territories/SB.yml +4 -0
- data/resources/territories/SC.yml +4 -0
- data/resources/territories/SD.yml +5 -0
- data/resources/territories/SE.yml +5 -0
- data/resources/territories/SG.yml +4 -0
- data/resources/territories/SH.yml +4 -0
- data/resources/territories/SI.yml +5 -0
- data/resources/territories/SJ.yml +5 -0
- data/resources/territories/SK.yml +5 -0
- data/resources/territories/SL.yml +5 -0
- data/resources/territories/SM.yml +5 -0
- data/resources/territories/SN.yml +4 -0
- data/resources/territories/SO.yml +4 -0
- data/resources/territories/SR.yml +4 -0
- data/resources/territories/ST.yml +4 -0
- data/resources/territories/SV.yml +4 -0
- data/resources/territories/SY.yml +5 -0
- data/resources/territories/SZ.yml +5 -0
- data/resources/territories/TC.yml +5 -0
- data/resources/territories/TD.yml +4 -0
- data/resources/territories/TF.yml +4 -0
- data/resources/territories/TG.yml +5 -0
- data/resources/territories/TH.yml +5 -0
- data/resources/territories/TJ.yml +5 -0
- data/resources/territories/TK.yml +3 -0
- data/resources/territories/TL.yml +4 -0
- data/resources/territories/TM.yml +5 -0
- data/resources/territories/TN.yml +4 -0
- data/resources/territories/TO.yml +5 -0
- data/resources/territories/TR.yml +5 -0
- data/resources/territories/TT.yml +5 -0
- data/resources/territories/TV.yml +4 -0
- data/resources/territories/TW.yml +5 -0
- data/resources/territories/TZ.yml +5 -0
- data/resources/territories/UA.yml +5 -0
- data/resources/territories/UG.yml +5 -0
- data/resources/territories/US.yml +5 -0
- data/resources/territories/UY.yml +5 -0
- data/resources/territories/UZ.yml +5 -0
- data/resources/territories/VA.yml +5 -0
- data/resources/territories/VC.yml +5 -0
- data/resources/territories/VE.yml +5 -0
- data/resources/territories/VG.yml +5 -0
- data/resources/territories/VI.yml +5 -0
- data/resources/territories/VN.yml +5 -0
- data/resources/territories/VU.yml +4 -0
- data/resources/territories/WF.yml +4 -0
- data/resources/territories/WS.yml +5 -0
- data/resources/territories/YE.yml +5 -0
- data/resources/territories/YT.yml +5 -0
- data/resources/territories/ZA.yml +5 -0
- data/resources/territories/ZM.yml +5 -0
- data/resources/territories/ZW.yml +5 -0
- data/tasks/as_dialed_from.rake +20 -0
- data/test/as_dialed_from/metadata_test.rb +26 -0
- data/test/as_dialed_from/number_test.rb +78 -0
- data/test/as_dialed_from_test.rb +11 -0
- data/test/test_helper.rb +1 -0
- metadata +405 -0
data/.rvmrc
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
source :rubygems
|
2
|
+
|
3
|
+
group :development, :test do
|
4
|
+
gem 'xml-simple'
|
5
|
+
|
6
|
+
gem 'test-unit'
|
7
|
+
gem 'guard-test'
|
8
|
+
|
9
|
+
gem 'rcov'
|
10
|
+
|
11
|
+
gem 'bundler'
|
12
|
+
gem 'jeweler'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'rbconfig'
|
16
|
+
if RbConfig::CONFIG['host_os'] =~ /darwin/i
|
17
|
+
gem 'rb-fsevent'
|
18
|
+
gem 'growl'
|
19
|
+
end
|
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2011 Movitas
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# as_dialed_from
|
2
|
+
|
3
|
+
Figure out how a number should be dialed from another country.
|
4
|
+
A fork of a port of Google's libphonenumber.
|
5
|
+
|
6
|
+
## Examples
|
7
|
+
|
8
|
+
as_dialed_from prototypes the String class with an `as_dialed_from` method.
|
9
|
+
|
10
|
+
```rb
|
11
|
+
"+12155551212".as_dialed_from "US"
|
12
|
+
=> "12155551212"
|
13
|
+
|
14
|
+
"+12155551212".as_dialed_from 52 # Mexico
|
15
|
+
=> "0012155551212"
|
16
|
+
|
17
|
+
"+12155551212".as_dialed_from "74957285000" # Russia
|
18
|
+
=> "8~1012155551212"
|
19
|
+
```
|
20
|
+
|
21
|
+
The "from" argument can be one of many things
|
22
|
+
|
23
|
+
* An ISO 3166-2 code (`"US"`)
|
24
|
+
* Any valid country code digits, as an Integer (`1`) or String (`"1"`)
|
25
|
+
* If a phone number is passed, it will try to find the country code for that number (`"12155551212"`)
|
26
|
+
|
27
|
+
## Installing
|
28
|
+
|
29
|
+
### Shell
|
30
|
+
|
31
|
+
```sh
|
32
|
+
gem install as_dialed_from
|
33
|
+
```
|
34
|
+
|
35
|
+
### Gemfile
|
36
|
+
|
37
|
+
```rb
|
38
|
+
gem 'as_dialed_from'
|
39
|
+
```
|
40
|
+
|
41
|
+
And then `bundle install`
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "as_dialed_from"
|
18
|
+
gem.homepage = "http://github.com/Movitas/as_dialed_from"
|
19
|
+
gem.license = "Apache"
|
20
|
+
gem.summary = "Figure out how a number should be dialed from another country"
|
21
|
+
gem.description = "Figure out how a number should be dialed from another country. A fork of a port of Google's libphonenumber."
|
22
|
+
gem.email = "jcampbell@movitas.com"
|
23
|
+
gem.authors = ["Justin Campbell"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
require 'rcov/rcovtask'
|
36
|
+
Rcov::RcovTask.new do |test|
|
37
|
+
test.libs << 'test'
|
38
|
+
test.pattern = 'test/**/test_*.rb'
|
39
|
+
test.verbose = true
|
40
|
+
test.rcov_opts << '--exclude "gems/*"'
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
Dir.glob('tasks/*.rake').each { |r| import r }
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.1
|
@@ -0,0 +1,319 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{as_dialed_from}
|
8
|
+
s.version = "0.1.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Justin Campbell"]
|
12
|
+
s.date = %q{2011-07-20}
|
13
|
+
s.description = %q{Figure out how a number should be dialed from another country. A fork of a port of Google's libphonenumber.}
|
14
|
+
s.email = %q{jcampbell@movitas.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".rvmrc",
|
21
|
+
"Gemfile",
|
22
|
+
"Guardfile",
|
23
|
+
"LICENSE",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"as_dialed_from.gemspec",
|
28
|
+
"lib/as_dialed_from.rb",
|
29
|
+
"lib/as_dialed_from/metadata.rb",
|
30
|
+
"lib/as_dialed_from/number.rb",
|
31
|
+
"resources/PhoneNumberMetaData.xml",
|
32
|
+
"resources/country_codes.yml",
|
33
|
+
"resources/territories/.gitkeep",
|
34
|
+
"resources/territories/AC.yml",
|
35
|
+
"resources/territories/AD.yml",
|
36
|
+
"resources/territories/AE.yml",
|
37
|
+
"resources/territories/AF.yml",
|
38
|
+
"resources/territories/AG.yml",
|
39
|
+
"resources/territories/AI.yml",
|
40
|
+
"resources/territories/AL.yml",
|
41
|
+
"resources/territories/AM.yml",
|
42
|
+
"resources/territories/AN.yml",
|
43
|
+
"resources/territories/AO.yml",
|
44
|
+
"resources/territories/AR.yml",
|
45
|
+
"resources/territories/AS.yml",
|
46
|
+
"resources/territories/AT.yml",
|
47
|
+
"resources/territories/AU.yml",
|
48
|
+
"resources/territories/AW.yml",
|
49
|
+
"resources/territories/AX.yml",
|
50
|
+
"resources/territories/AZ.yml",
|
51
|
+
"resources/territories/BA.yml",
|
52
|
+
"resources/territories/BB.yml",
|
53
|
+
"resources/territories/BD.yml",
|
54
|
+
"resources/territories/BE.yml",
|
55
|
+
"resources/territories/BF.yml",
|
56
|
+
"resources/territories/BG.yml",
|
57
|
+
"resources/territories/BH.yml",
|
58
|
+
"resources/territories/BI.yml",
|
59
|
+
"resources/territories/BJ.yml",
|
60
|
+
"resources/territories/BL.yml",
|
61
|
+
"resources/territories/BM.yml",
|
62
|
+
"resources/territories/BN.yml",
|
63
|
+
"resources/territories/BO.yml",
|
64
|
+
"resources/territories/BR.yml",
|
65
|
+
"resources/territories/BS.yml",
|
66
|
+
"resources/territories/BT.yml",
|
67
|
+
"resources/territories/BW.yml",
|
68
|
+
"resources/territories/BY.yml",
|
69
|
+
"resources/territories/BZ.yml",
|
70
|
+
"resources/territories/CA.yml",
|
71
|
+
"resources/territories/CC.yml",
|
72
|
+
"resources/territories/CD.yml",
|
73
|
+
"resources/territories/CF.yml",
|
74
|
+
"resources/territories/CG.yml",
|
75
|
+
"resources/territories/CH.yml",
|
76
|
+
"resources/territories/CI.yml",
|
77
|
+
"resources/territories/CK.yml",
|
78
|
+
"resources/territories/CL.yml",
|
79
|
+
"resources/territories/CM.yml",
|
80
|
+
"resources/territories/CN.yml",
|
81
|
+
"resources/territories/CO.yml",
|
82
|
+
"resources/territories/CR.yml",
|
83
|
+
"resources/territories/CU.yml",
|
84
|
+
"resources/territories/CV.yml",
|
85
|
+
"resources/territories/CX.yml",
|
86
|
+
"resources/territories/CY.yml",
|
87
|
+
"resources/territories/CZ.yml",
|
88
|
+
"resources/territories/DE.yml",
|
89
|
+
"resources/territories/DJ.yml",
|
90
|
+
"resources/territories/DK.yml",
|
91
|
+
"resources/territories/DM.yml",
|
92
|
+
"resources/territories/DO.yml",
|
93
|
+
"resources/territories/DZ.yml",
|
94
|
+
"resources/territories/EC.yml",
|
95
|
+
"resources/territories/EE.yml",
|
96
|
+
"resources/territories/EG.yml",
|
97
|
+
"resources/territories/ER.yml",
|
98
|
+
"resources/territories/ES.yml",
|
99
|
+
"resources/territories/ET.yml",
|
100
|
+
"resources/territories/FI.yml",
|
101
|
+
"resources/territories/FJ.yml",
|
102
|
+
"resources/territories/FK.yml",
|
103
|
+
"resources/territories/FM.yml",
|
104
|
+
"resources/territories/FO.yml",
|
105
|
+
"resources/territories/FR.yml",
|
106
|
+
"resources/territories/GA.yml",
|
107
|
+
"resources/territories/GB.yml",
|
108
|
+
"resources/territories/GD.yml",
|
109
|
+
"resources/territories/GE.yml",
|
110
|
+
"resources/territories/GF.yml",
|
111
|
+
"resources/territories/GG.yml",
|
112
|
+
"resources/territories/GH.yml",
|
113
|
+
"resources/territories/GI.yml",
|
114
|
+
"resources/territories/GL.yml",
|
115
|
+
"resources/territories/GM.yml",
|
116
|
+
"resources/territories/GN.yml",
|
117
|
+
"resources/territories/GP.yml",
|
118
|
+
"resources/territories/GQ.yml",
|
119
|
+
"resources/territories/GR.yml",
|
120
|
+
"resources/territories/GT.yml",
|
121
|
+
"resources/territories/GU.yml",
|
122
|
+
"resources/territories/GW.yml",
|
123
|
+
"resources/territories/GY.yml",
|
124
|
+
"resources/territories/HK.yml",
|
125
|
+
"resources/territories/HN.yml",
|
126
|
+
"resources/territories/HR.yml",
|
127
|
+
"resources/territories/HT.yml",
|
128
|
+
"resources/territories/HU.yml",
|
129
|
+
"resources/territories/ID.yml",
|
130
|
+
"resources/territories/IE.yml",
|
131
|
+
"resources/territories/IL.yml",
|
132
|
+
"resources/territories/IM.yml",
|
133
|
+
"resources/territories/IN.yml",
|
134
|
+
"resources/territories/IO.yml",
|
135
|
+
"resources/territories/IQ.yml",
|
136
|
+
"resources/territories/IR.yml",
|
137
|
+
"resources/territories/IS.yml",
|
138
|
+
"resources/territories/IT.yml",
|
139
|
+
"resources/territories/JE.yml",
|
140
|
+
"resources/territories/JM.yml",
|
141
|
+
"resources/territories/JO.yml",
|
142
|
+
"resources/territories/JP.yml",
|
143
|
+
"resources/territories/KE.yml",
|
144
|
+
"resources/territories/KG.yml",
|
145
|
+
"resources/territories/KH.yml",
|
146
|
+
"resources/territories/KI.yml",
|
147
|
+
"resources/territories/KM.yml",
|
148
|
+
"resources/territories/KN.yml",
|
149
|
+
"resources/territories/KP.yml",
|
150
|
+
"resources/territories/KR.yml",
|
151
|
+
"resources/territories/KW.yml",
|
152
|
+
"resources/territories/KY.yml",
|
153
|
+
"resources/territories/KZ.yml",
|
154
|
+
"resources/territories/LA.yml",
|
155
|
+
"resources/territories/LB.yml",
|
156
|
+
"resources/territories/LC.yml",
|
157
|
+
"resources/territories/LI.yml",
|
158
|
+
"resources/territories/LK.yml",
|
159
|
+
"resources/territories/LR.yml",
|
160
|
+
"resources/territories/LS.yml",
|
161
|
+
"resources/territories/LT.yml",
|
162
|
+
"resources/territories/LU.yml",
|
163
|
+
"resources/territories/LV.yml",
|
164
|
+
"resources/territories/LY.yml",
|
165
|
+
"resources/territories/MA.yml",
|
166
|
+
"resources/territories/MC.yml",
|
167
|
+
"resources/territories/MD.yml",
|
168
|
+
"resources/territories/ME.yml",
|
169
|
+
"resources/territories/MF.yml",
|
170
|
+
"resources/territories/MG.yml",
|
171
|
+
"resources/territories/MH.yml",
|
172
|
+
"resources/territories/MK.yml",
|
173
|
+
"resources/territories/ML.yml",
|
174
|
+
"resources/territories/MM.yml",
|
175
|
+
"resources/territories/MN.yml",
|
176
|
+
"resources/territories/MO.yml",
|
177
|
+
"resources/territories/MP.yml",
|
178
|
+
"resources/territories/MQ.yml",
|
179
|
+
"resources/territories/MR.yml",
|
180
|
+
"resources/territories/MS.yml",
|
181
|
+
"resources/territories/MT.yml",
|
182
|
+
"resources/territories/MU.yml",
|
183
|
+
"resources/territories/MV.yml",
|
184
|
+
"resources/territories/MW.yml",
|
185
|
+
"resources/territories/MX.yml",
|
186
|
+
"resources/territories/MY.yml",
|
187
|
+
"resources/territories/MZ.yml",
|
188
|
+
"resources/territories/NA.yml",
|
189
|
+
"resources/territories/NC.yml",
|
190
|
+
"resources/territories/NE.yml",
|
191
|
+
"resources/territories/NF.yml",
|
192
|
+
"resources/territories/NG.yml",
|
193
|
+
"resources/territories/NI.yml",
|
194
|
+
"resources/territories/NL.yml",
|
195
|
+
"resources/territories/NO.yml",
|
196
|
+
"resources/territories/NP.yml",
|
197
|
+
"resources/territories/NR.yml",
|
198
|
+
"resources/territories/NU.yml",
|
199
|
+
"resources/territories/NZ.yml",
|
200
|
+
"resources/territories/OM.yml",
|
201
|
+
"resources/territories/PA.yml",
|
202
|
+
"resources/territories/PE.yml",
|
203
|
+
"resources/territories/PF.yml",
|
204
|
+
"resources/territories/PG.yml",
|
205
|
+
"resources/territories/PH.yml",
|
206
|
+
"resources/territories/PK.yml",
|
207
|
+
"resources/territories/PL.yml",
|
208
|
+
"resources/territories/PM.yml",
|
209
|
+
"resources/territories/PR.yml",
|
210
|
+
"resources/territories/PS.yml",
|
211
|
+
"resources/territories/PT.yml",
|
212
|
+
"resources/territories/PW.yml",
|
213
|
+
"resources/territories/PY.yml",
|
214
|
+
"resources/territories/QA.yml",
|
215
|
+
"resources/territories/RE.yml",
|
216
|
+
"resources/territories/RO.yml",
|
217
|
+
"resources/territories/RS.yml",
|
218
|
+
"resources/territories/RU.yml",
|
219
|
+
"resources/territories/RW.yml",
|
220
|
+
"resources/territories/SA.yml",
|
221
|
+
"resources/territories/SB.yml",
|
222
|
+
"resources/territories/SC.yml",
|
223
|
+
"resources/territories/SD.yml",
|
224
|
+
"resources/territories/SE.yml",
|
225
|
+
"resources/territories/SG.yml",
|
226
|
+
"resources/territories/SH.yml",
|
227
|
+
"resources/territories/SI.yml",
|
228
|
+
"resources/territories/SJ.yml",
|
229
|
+
"resources/territories/SK.yml",
|
230
|
+
"resources/territories/SL.yml",
|
231
|
+
"resources/territories/SM.yml",
|
232
|
+
"resources/territories/SN.yml",
|
233
|
+
"resources/territories/SO.yml",
|
234
|
+
"resources/territories/SR.yml",
|
235
|
+
"resources/territories/ST.yml",
|
236
|
+
"resources/territories/SV.yml",
|
237
|
+
"resources/territories/SY.yml",
|
238
|
+
"resources/territories/SZ.yml",
|
239
|
+
"resources/territories/TC.yml",
|
240
|
+
"resources/territories/TD.yml",
|
241
|
+
"resources/territories/TF.yml",
|
242
|
+
"resources/territories/TG.yml",
|
243
|
+
"resources/territories/TH.yml",
|
244
|
+
"resources/territories/TJ.yml",
|
245
|
+
"resources/territories/TK.yml",
|
246
|
+
"resources/territories/TL.yml",
|
247
|
+
"resources/territories/TM.yml",
|
248
|
+
"resources/territories/TN.yml",
|
249
|
+
"resources/territories/TO.yml",
|
250
|
+
"resources/territories/TR.yml",
|
251
|
+
"resources/territories/TT.yml",
|
252
|
+
"resources/territories/TV.yml",
|
253
|
+
"resources/territories/TW.yml",
|
254
|
+
"resources/territories/TZ.yml",
|
255
|
+
"resources/territories/UA.yml",
|
256
|
+
"resources/territories/UG.yml",
|
257
|
+
"resources/territories/US.yml",
|
258
|
+
"resources/territories/UY.yml",
|
259
|
+
"resources/territories/UZ.yml",
|
260
|
+
"resources/territories/VA.yml",
|
261
|
+
"resources/territories/VC.yml",
|
262
|
+
"resources/territories/VE.yml",
|
263
|
+
"resources/territories/VG.yml",
|
264
|
+
"resources/territories/VI.yml",
|
265
|
+
"resources/territories/VN.yml",
|
266
|
+
"resources/territories/VU.yml",
|
267
|
+
"resources/territories/WF.yml",
|
268
|
+
"resources/territories/WS.yml",
|
269
|
+
"resources/territories/YE.yml",
|
270
|
+
"resources/territories/YT.yml",
|
271
|
+
"resources/territories/ZA.yml",
|
272
|
+
"resources/territories/ZM.yml",
|
273
|
+
"resources/territories/ZW.yml",
|
274
|
+
"tasks/as_dialed_from.rake",
|
275
|
+
"test/as_dialed_from/metadata_test.rb",
|
276
|
+
"test/as_dialed_from/number_test.rb",
|
277
|
+
"test/as_dialed_from_test.rb",
|
278
|
+
"test/test_helper.rb"
|
279
|
+
]
|
280
|
+
s.homepage = %q{http://github.com/Movitas/as_dialed_from}
|
281
|
+
s.licenses = ["Apache"]
|
282
|
+
s.require_paths = ["lib"]
|
283
|
+
s.rubygems_version = %q{1.6.2}
|
284
|
+
s.summary = %q{Figure out how a number should be dialed from another country}
|
285
|
+
|
286
|
+
if s.respond_to? :specification_version then
|
287
|
+
s.specification_version = 3
|
288
|
+
|
289
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
290
|
+
s.add_runtime_dependency(%q<rb-fsevent>, [">= 0"])
|
291
|
+
s.add_runtime_dependency(%q<growl>, [">= 0"])
|
292
|
+
s.add_development_dependency(%q<xml-simple>, [">= 0"])
|
293
|
+
s.add_development_dependency(%q<test-unit>, [">= 0"])
|
294
|
+
s.add_development_dependency(%q<guard-test>, [">= 0"])
|
295
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
296
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
297
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
298
|
+
else
|
299
|
+
s.add_dependency(%q<rb-fsevent>, [">= 0"])
|
300
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
301
|
+
s.add_dependency(%q<xml-simple>, [">= 0"])
|
302
|
+
s.add_dependency(%q<test-unit>, [">= 0"])
|
303
|
+
s.add_dependency(%q<guard-test>, [">= 0"])
|
304
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
305
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
306
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
307
|
+
end
|
308
|
+
else
|
309
|
+
s.add_dependency(%q<rb-fsevent>, [">= 0"])
|
310
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
311
|
+
s.add_dependency(%q<xml-simple>, [">= 0"])
|
312
|
+
s.add_dependency(%q<test-unit>, [">= 0"])
|
313
|
+
s.add_dependency(%q<guard-test>, [">= 0"])
|
314
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
315
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
316
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'xmlsimple'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module AsDialedFrom
|
6
|
+
|
7
|
+
class Metadata
|
8
|
+
RESOURCES_DIRECTORY = File.dirname(__FILE__) + "/../../resources/"
|
9
|
+
TERRITORIES_DIRECTORY = RESOURCES_DIRECTORY + "/territories"
|
10
|
+
LOCAL_XML_FILE = RESOURCES_DIRECTORY + "/PhoneNumberMetaData.xml"
|
11
|
+
COUNTRY_CODES_FILE = "#{RESOURCES_DIRECTORY}/country_codes.yml"
|
12
|
+
|
13
|
+
UPSTREAM_URL = "http://libphonenumber.googlecode.com/svn/trunk/resources/PhoneNumberMetaData.xml"
|
14
|
+
|
15
|
+
attr_accessor :data
|
16
|
+
|
17
|
+
def initialize; end
|
18
|
+
|
19
|
+
def self.for_region(region_code)
|
20
|
+
YAML::load_file "#{TERRITORIES_DIRECTORY}/#{region_code}.yml"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.country_code_to_region
|
24
|
+
YAML::load_file COUNTRY_CODES_FILE
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.download
|
28
|
+
file = File.new LOCAL_XML_FILE, "w"
|
29
|
+
file.write Net::HTTP.get(URI.parse(UPSTREAM_URL))
|
30
|
+
file.close
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.parse
|
34
|
+
puts "Parsing XML file"
|
35
|
+
|
36
|
+
xml = File.read LOCAL_XML_FILE
|
37
|
+
phone_number_meta_data = XmlSimple.xml_in xml, { 'KeyAttr' => 'id', 'ForceArray' => false }
|
38
|
+
territories = phone_number_meta_data['territories']['territory']
|
39
|
+
|
40
|
+
country_code_to_region_code_map = {}
|
41
|
+
|
42
|
+
print "Writing territories "
|
43
|
+
|
44
|
+
territories.each do |territory, data|
|
45
|
+
print "#{territory} "
|
46
|
+
|
47
|
+
hash ||= {}
|
48
|
+
|
49
|
+
%w[
|
50
|
+
countryCode
|
51
|
+
internationalPrefix
|
52
|
+
leadingZeroPossible
|
53
|
+
nationalPrefix
|
54
|
+
].each do |xml_attribute|
|
55
|
+
hash[underscore(xml_attribute).to_sym] = data[xml_attribute] if data[xml_attribute]
|
56
|
+
end
|
57
|
+
|
58
|
+
hash[:national_number_pattern] = data['generalDesc']['nationalNumberPattern'] if data['generalDesc'] and data['generalDesc']['nationalNumberPattern']
|
59
|
+
|
60
|
+
file = File.new "#{TERRITORIES_DIRECTORY}/#{territory}.yml", "w"
|
61
|
+
file.write hash.to_yaml
|
62
|
+
file.close
|
63
|
+
|
64
|
+
country_code_to_region_code_map[data['countryCode']] ||= []
|
65
|
+
|
66
|
+
if data['mainCountryForCode']
|
67
|
+
country_code_to_region_code_map[data['countryCode']].insert 0, territory
|
68
|
+
else
|
69
|
+
country_code_to_region_code_map[data['countryCode']].push territory
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
puts "\nWriting country code map"
|
74
|
+
|
75
|
+
file = File.new COUNTRY_CODES_FILE, "w"
|
76
|
+
file.write country_code_to_region_code_map.to_yaml
|
77
|
+
file.close
|
78
|
+
|
79
|
+
puts "Done!"
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.underscore(camel_cased_word)
|
83
|
+
word = camel_cased_word.to_s.dup
|
84
|
+
word.gsub!(/::/, '/')
|
85
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
86
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
87
|
+
word.tr!("-", "_")
|
88
|
+
word.downcase!
|
89
|
+
word
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module AsDialedFrom
|
4
|
+
|
5
|
+
class Number
|
6
|
+
|
7
|
+
attr_reader :number
|
8
|
+
|
9
|
+
def initialize(number)
|
10
|
+
@number = number
|
11
|
+
|
12
|
+
# Pre-compute stuff
|
13
|
+
country_code
|
14
|
+
metadata
|
15
|
+
|
16
|
+
@number
|
17
|
+
end
|
18
|
+
|
19
|
+
def as_dialed_from(from_country)
|
20
|
+
# Convert numeric country code to region id
|
21
|
+
from_country = Metadata.country_code_to_region[from_country][0] if from_country.is_a? Integer or from_country.to_i.nonzero?
|
22
|
+
|
23
|
+
from_metadata = Metadata.for_region(from_country)
|
24
|
+
raise "Could not find valid metadata for from_country" unless from_metadata
|
25
|
+
|
26
|
+
if from_country == Metadata.country_code_to_region[country_code][0]
|
27
|
+
# If we're calling within the same country, just prepend the national number with the national prefix
|
28
|
+
"#{leading_zero}#{metadata[:national_prefix]}#{national_number}"
|
29
|
+
else
|
30
|
+
# If we're calling out of country, we need to dial the exit code and the destination country code before the number
|
31
|
+
"#{exit_code(from_metadata[:international_prefix])}#{country_code}#{leading_zero}#{national_number}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def country_code
|
36
|
+
@country_code ||= determine_country_code
|
37
|
+
end
|
38
|
+
|
39
|
+
def determine_country_code
|
40
|
+
raise "+<country_code> is required at the beginning of the number" unless @number[0] == "+"
|
41
|
+
|
42
|
+
# Test the leading digits to find a valid country_code
|
43
|
+
# Country codes are not ambiguous (ex. 1 is valid, and there is no 1X or 1XX)
|
44
|
+
(1..3).each do |length|
|
45
|
+
possible_country_code = @number[1,length]
|
46
|
+
|
47
|
+
return possible_country_code if Metadata.country_code_to_region[possible_country_code]
|
48
|
+
end
|
49
|
+
|
50
|
+
raise "No valid country code was present"
|
51
|
+
end
|
52
|
+
|
53
|
+
def exit_code(international_prefix)
|
54
|
+
international_prefix.delete("[]").match international_prefix
|
55
|
+
end
|
56
|
+
|
57
|
+
def metadata
|
58
|
+
@metadata ||= Metadata.for_region(Metadata.country_code_to_region[country_code][0])
|
59
|
+
raise "Could not find valid metadata for number" unless @metadata
|
60
|
+
@metadata
|
61
|
+
end
|
62
|
+
|
63
|
+
def national_number
|
64
|
+
@national_number ||= determine_national_number
|
65
|
+
end
|
66
|
+
|
67
|
+
def determine_national_number
|
68
|
+
n = @number.gsub "+#{country_code}", ""
|
69
|
+
n.match metadata[:national_number_format] if metadata[:national_number_format]
|
70
|
+
n
|
71
|
+
end
|
72
|
+
|
73
|
+
def leading_zero
|
74
|
+
"0" if metadata[:leading_zero_possible]
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'as_dialed_from/metadata'
|
5
|
+
require 'as_dialed_from/number'
|
6
|
+
|
7
|
+
class String
|
8
|
+
def as_dialed_from(from_country)
|
9
|
+
AsDialedFrom::Number.new(self).as_dialed_from(from_country)
|
10
|
+
end
|
11
|
+
end
|