as_dialed_from 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. data/.rvmrc +3 -0
  2. data/Gemfile +19 -0
  3. data/Guardfile +5 -0
  4. data/LICENSE +13 -0
  5. data/README.md +41 -0
  6. data/Rakefile +45 -0
  7. data/VERSION +1 -0
  8. data/as_dialed_from.gemspec +319 -0
  9. data/lib/as_dialed_from/metadata.rb +94 -0
  10. data/lib/as_dialed_from/number.rb +79 -0
  11. data/lib/as_dialed_from.rb +11 -0
  12. data/resources/PhoneNumberMetaData.xml +20321 -0
  13. data/resources/country_codes.yml +446 -0
  14. data/resources/territories/.gitkeep +0 -0
  15. data/resources/territories/AC.yml +4 -0
  16. data/resources/territories/AD.yml +4 -0
  17. data/resources/territories/AE.yml +5 -0
  18. data/resources/territories/AF.yml +5 -0
  19. data/resources/territories/AG.yml +5 -0
  20. data/resources/territories/AI.yml +5 -0
  21. data/resources/territories/AL.yml +5 -0
  22. data/resources/territories/AM.yml +5 -0
  23. data/resources/territories/AN.yml +4 -0
  24. data/resources/territories/AO.yml +4 -0
  25. data/resources/territories/AR.yml +5 -0
  26. data/resources/territories/AS.yml +5 -0
  27. data/resources/territories/AT.yml +5 -0
  28. data/resources/territories/AU.yml +5 -0
  29. data/resources/territories/AW.yml +4 -0
  30. data/resources/territories/AX.yml +5 -0
  31. data/resources/territories/AZ.yml +5 -0
  32. data/resources/territories/BA.yml +5 -0
  33. data/resources/territories/BB.yml +5 -0
  34. data/resources/territories/BD.yml +5 -0
  35. data/resources/territories/BE.yml +5 -0
  36. data/resources/territories/BF.yml +4 -0
  37. data/resources/territories/BG.yml +5 -0
  38. data/resources/territories/BH.yml +4 -0
  39. data/resources/territories/BI.yml +4 -0
  40. data/resources/territories/BJ.yml +4 -0
  41. data/resources/territories/BL.yml +5 -0
  42. data/resources/territories/BM.yml +5 -0
  43. data/resources/territories/BN.yml +5 -0
  44. data/resources/territories/BO.yml +5 -0
  45. data/resources/territories/BR.yml +5 -0
  46. data/resources/territories/BS.yml +5 -0
  47. data/resources/territories/BT.yml +4 -0
  48. data/resources/territories/BW.yml +4 -0
  49. data/resources/territories/BY.yml +5 -0
  50. data/resources/territories/BZ.yml +5 -0
  51. data/resources/territories/CA.yml +5 -0
  52. data/resources/territories/CC.yml +5 -0
  53. data/resources/territories/CD.yml +5 -0
  54. data/resources/territories/CF.yml +4 -0
  55. data/resources/territories/CG.yml +5 -0
  56. data/resources/territories/CH.yml +5 -0
  57. data/resources/territories/CI.yml +5 -0
  58. data/resources/territories/CK.yml +4 -0
  59. data/resources/territories/CL.yml +5 -0
  60. data/resources/territories/CM.yml +4 -0
  61. data/resources/territories/CN.yml +5 -0
  62. data/resources/territories/CO.yml +5 -0
  63. data/resources/territories/CR.yml +4 -0
  64. data/resources/territories/CU.yml +5 -0
  65. data/resources/territories/CV.yml +4 -0
  66. data/resources/territories/CX.yml +5 -0
  67. data/resources/territories/CY.yml +4 -0
  68. data/resources/territories/CZ.yml +4 -0
  69. data/resources/territories/DE.yml +5 -0
  70. data/resources/territories/DJ.yml +4 -0
  71. data/resources/territories/DK.yml +4 -0
  72. data/resources/territories/DM.yml +5 -0
  73. data/resources/territories/DO.yml +5 -0
  74. data/resources/territories/DZ.yml +5 -0
  75. data/resources/territories/EC.yml +5 -0
  76. data/resources/territories/EE.yml +4 -0
  77. data/resources/territories/EG.yml +5 -0
  78. data/resources/territories/ER.yml +5 -0
  79. data/resources/territories/ES.yml +4 -0
  80. data/resources/territories/ET.yml +5 -0
  81. data/resources/territories/FI.yml +5 -0
  82. data/resources/territories/FJ.yml +5 -0
  83. data/resources/territories/FK.yml +4 -0
  84. data/resources/territories/FM.yml +4 -0
  85. data/resources/territories/FO.yml +4 -0
  86. data/resources/territories/FR.yml +5 -0
  87. data/resources/territories/GA.yml +5 -0
  88. data/resources/territories/GB.yml +5 -0
  89. data/resources/territories/GD.yml +5 -0
  90. data/resources/territories/GE.yml +5 -0
  91. data/resources/territories/GF.yml +5 -0
  92. data/resources/territories/GG.yml +5 -0
  93. data/resources/territories/GH.yml +5 -0
  94. data/resources/territories/GI.yml +4 -0
  95. data/resources/territories/GL.yml +4 -0
  96. data/resources/territories/GM.yml +4 -0
  97. data/resources/territories/GN.yml +4 -0
  98. data/resources/territories/GP.yml +5 -0
  99. data/resources/territories/GQ.yml +4 -0
  100. data/resources/territories/GR.yml +4 -0
  101. data/resources/territories/GT.yml +4 -0
  102. data/resources/territories/GU.yml +5 -0
  103. data/resources/territories/GW.yml +4 -0
  104. data/resources/territories/GY.yml +4 -0
  105. data/resources/territories/HK.yml +4 -0
  106. data/resources/territories/HN.yml +4 -0
  107. data/resources/territories/HR.yml +5 -0
  108. data/resources/territories/HT.yml +4 -0
  109. data/resources/territories/HU.yml +5 -0
  110. data/resources/territories/ID.yml +5 -0
  111. data/resources/territories/IE.yml +5 -0
  112. data/resources/territories/IL.yml +5 -0
  113. data/resources/territories/IM.yml +5 -0
  114. data/resources/territories/IN.yml +5 -0
  115. data/resources/territories/IO.yml +4 -0
  116. data/resources/territories/IQ.yml +5 -0
  117. data/resources/territories/IR.yml +5 -0
  118. data/resources/territories/IS.yml +4 -0
  119. data/resources/territories/IT.yml +5 -0
  120. data/resources/territories/JE.yml +5 -0
  121. data/resources/territories/JM.yml +5 -0
  122. data/resources/territories/JO.yml +5 -0
  123. data/resources/territories/JP.yml +5 -0
  124. data/resources/territories/KE.yml +5 -0
  125. data/resources/territories/KG.yml +5 -0
  126. data/resources/territories/KH.yml +5 -0
  127. data/resources/territories/KI.yml +5 -0
  128. data/resources/territories/KM.yml +4 -0
  129. data/resources/territories/KN.yml +5 -0
  130. data/resources/territories/KP.yml +5 -0
  131. data/resources/territories/KR.yml +5 -0
  132. data/resources/territories/KW.yml +4 -0
  133. data/resources/territories/KY.yml +5 -0
  134. data/resources/territories/KZ.yml +5 -0
  135. data/resources/territories/LA.yml +5 -0
  136. data/resources/territories/LB.yml +5 -0
  137. data/resources/territories/LC.yml +5 -0
  138. data/resources/territories/LI.yml +4 -0
  139. data/resources/territories/LK.yml +5 -0
  140. data/resources/territories/LR.yml +5 -0
  141. data/resources/territories/LS.yml +4 -0
  142. data/resources/territories/LT.yml +5 -0
  143. data/resources/territories/LU.yml +4 -0
  144. data/resources/territories/LV.yml +4 -0
  145. data/resources/territories/LY.yml +5 -0
  146. data/resources/territories/MA.yml +5 -0
  147. data/resources/territories/MC.yml +5 -0
  148. data/resources/territories/MD.yml +5 -0
  149. data/resources/territories/ME.yml +5 -0
  150. data/resources/territories/MF.yml +5 -0
  151. data/resources/territories/MG.yml +5 -0
  152. data/resources/territories/MH.yml +4 -0
  153. data/resources/territories/MK.yml +5 -0
  154. data/resources/territories/ML.yml +5 -0
  155. data/resources/territories/MM.yml +4 -0
  156. data/resources/territories/MN.yml +5 -0
  157. data/resources/territories/MO.yml +4 -0
  158. data/resources/territories/MP.yml +5 -0
  159. data/resources/territories/MQ.yml +5 -0
  160. data/resources/territories/MR.yml +4 -0
  161. data/resources/territories/MS.yml +5 -0
  162. data/resources/territories/MT.yml +4 -0
  163. data/resources/territories/MU.yml +4 -0
  164. data/resources/territories/MV.yml +4 -0
  165. data/resources/territories/MW.yml +5 -0
  166. data/resources/territories/MX.yml +5 -0
  167. data/resources/territories/MY.yml +5 -0
  168. data/resources/territories/MZ.yml +4 -0
  169. data/resources/territories/NA.yml +5 -0
  170. data/resources/territories/NC.yml +4 -0
  171. data/resources/territories/NE.yml +5 -0
  172. data/resources/territories/NF.yml +4 -0
  173. data/resources/territories/NG.yml +5 -0
  174. data/resources/territories/NI.yml +4 -0
  175. data/resources/territories/NL.yml +5 -0
  176. data/resources/territories/NO.yml +5 -0
  177. data/resources/territories/NP.yml +5 -0
  178. data/resources/territories/NR.yml +4 -0
  179. data/resources/territories/NU.yml +4 -0
  180. data/resources/territories/NZ.yml +5 -0
  181. data/resources/territories/OM.yml +4 -0
  182. data/resources/territories/PA.yml +5 -0
  183. data/resources/territories/PE.yml +5 -0
  184. data/resources/territories/PF.yml +4 -0
  185. data/resources/territories/PG.yml +4 -0
  186. data/resources/territories/PH.yml +5 -0
  187. data/resources/territories/PK.yml +5 -0
  188. data/resources/territories/PL.yml +4 -0
  189. data/resources/territories/PM.yml +4 -0
  190. data/resources/territories/PR.yml +5 -0
  191. data/resources/territories/PS.yml +5 -0
  192. data/resources/territories/PT.yml +4 -0
  193. data/resources/territories/PW.yml +4 -0
  194. data/resources/territories/PY.yml +5 -0
  195. data/resources/territories/QA.yml +4 -0
  196. data/resources/territories/RE.yml +5 -0
  197. data/resources/territories/RO.yml +5 -0
  198. data/resources/territories/RS.yml +5 -0
  199. data/resources/territories/RU.yml +5 -0
  200. data/resources/territories/RW.yml +5 -0
  201. data/resources/territories/SA.yml +5 -0
  202. data/resources/territories/SB.yml +4 -0
  203. data/resources/territories/SC.yml +4 -0
  204. data/resources/territories/SD.yml +5 -0
  205. data/resources/territories/SE.yml +5 -0
  206. data/resources/territories/SG.yml +4 -0
  207. data/resources/territories/SH.yml +4 -0
  208. data/resources/territories/SI.yml +5 -0
  209. data/resources/territories/SJ.yml +5 -0
  210. data/resources/territories/SK.yml +5 -0
  211. data/resources/territories/SL.yml +5 -0
  212. data/resources/territories/SM.yml +5 -0
  213. data/resources/territories/SN.yml +4 -0
  214. data/resources/territories/SO.yml +4 -0
  215. data/resources/territories/SR.yml +4 -0
  216. data/resources/territories/ST.yml +4 -0
  217. data/resources/territories/SV.yml +4 -0
  218. data/resources/territories/SY.yml +5 -0
  219. data/resources/territories/SZ.yml +5 -0
  220. data/resources/territories/TC.yml +5 -0
  221. data/resources/territories/TD.yml +4 -0
  222. data/resources/territories/TF.yml +4 -0
  223. data/resources/territories/TG.yml +5 -0
  224. data/resources/territories/TH.yml +5 -0
  225. data/resources/territories/TJ.yml +5 -0
  226. data/resources/territories/TK.yml +3 -0
  227. data/resources/territories/TL.yml +4 -0
  228. data/resources/territories/TM.yml +5 -0
  229. data/resources/territories/TN.yml +4 -0
  230. data/resources/territories/TO.yml +5 -0
  231. data/resources/territories/TR.yml +5 -0
  232. data/resources/territories/TT.yml +5 -0
  233. data/resources/territories/TV.yml +4 -0
  234. data/resources/territories/TW.yml +5 -0
  235. data/resources/territories/TZ.yml +5 -0
  236. data/resources/territories/UA.yml +5 -0
  237. data/resources/territories/UG.yml +5 -0
  238. data/resources/territories/US.yml +5 -0
  239. data/resources/territories/UY.yml +5 -0
  240. data/resources/territories/UZ.yml +5 -0
  241. data/resources/territories/VA.yml +5 -0
  242. data/resources/territories/VC.yml +5 -0
  243. data/resources/territories/VE.yml +5 -0
  244. data/resources/territories/VG.yml +5 -0
  245. data/resources/territories/VI.yml +5 -0
  246. data/resources/territories/VN.yml +5 -0
  247. data/resources/territories/VU.yml +4 -0
  248. data/resources/territories/WF.yml +4 -0
  249. data/resources/territories/WS.yml +5 -0
  250. data/resources/territories/YE.yml +5 -0
  251. data/resources/territories/YT.yml +5 -0
  252. data/resources/territories/ZA.yml +5 -0
  253. data/resources/territories/ZM.yml +5 -0
  254. data/resources/territories/ZW.yml +5 -0
  255. data/tasks/as_dialed_from.rake +20 -0
  256. data/test/as_dialed_from/metadata_test.rb +26 -0
  257. data/test/as_dialed_from/number_test.rb +78 -0
  258. data/test/as_dialed_from_test.rb +11 -0
  259. data/test/test_helper.rb +1 -0
  260. metadata +405 -0
data/.rvmrc ADDED
@@ -0,0 +1,3 @@
1
+ rvm 1.9.2@phone_number
2
+ rvm_project_rvmrc_default=1
3
+
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
@@ -0,0 +1,5 @@
1
+ guard 'test' do
2
+ watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
3
+ watch(%r{^test/.+_test\.rb$})
4
+ watch('test/test_helper.rb') { "test" }
5
+ end
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