as_dialed_from 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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