countries 2.0.0.rc → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/.rubocop_todo.yml +52 -0
  4. data/CHANGELOG.md +15 -0
  5. data/README.markdown +10 -3
  6. data/Rakefile +24 -75
  7. data/bin/console +3 -3
  8. data/countries.gemspec +0 -1
  9. data/lib/countries.rb +2 -2
  10. data/lib/countries/cache/countries.json +1 -1
  11. data/lib/countries/cache/locales/ar.json +1 -1
  12. data/lib/countries/configuration.rb +4 -4
  13. data/lib/countries/country.rb +18 -17
  14. data/lib/countries/country/class_methods.rb +40 -20
  15. data/lib/countries/country/emoji.rb +28 -27
  16. data/lib/countries/data.rb +7 -8
  17. data/lib/countries/data/countries/AD.yaml +13 -6
  18. data/lib/countries/data/countries/AE.yaml +13 -6
  19. data/lib/countries/data/countries/AF.yaml +13 -6
  20. data/lib/countries/data/countries/AG.yaml +14 -7
  21. data/lib/countries/data/countries/AI.yaml +14 -7
  22. data/lib/countries/data/countries/AL.yaml +13 -6
  23. data/lib/countries/data/countries/AM.yaml +13 -6
  24. data/lib/countries/data/countries/AO.yaml +13 -6
  25. data/lib/countries/data/countries/AQ.yaml +13 -6
  26. data/lib/countries/data/countries/AR.yaml +13 -6
  27. data/lib/countries/data/countries/AS.yaml +14 -7
  28. data/lib/countries/data/countries/AT.yaml +13 -6
  29. data/lib/countries/data/countries/AU.yaml +13 -6
  30. data/lib/countries/data/countries/AW.yaml +13 -6
  31. data/lib/countries/data/countries/AX.yaml +13 -6
  32. data/lib/countries/data/countries/AZ.yaml +13 -6
  33. data/lib/countries/data/countries/BA.yaml +13 -6
  34. data/lib/countries/data/countries/BB.yaml +14 -7
  35. data/lib/countries/data/countries/BD.yaml +13 -6
  36. data/lib/countries/data/countries/BE.yaml +13 -6
  37. data/lib/countries/data/countries/BF.yaml +13 -6
  38. data/lib/countries/data/countries/BG.yaml +13 -6
  39. data/lib/countries/data/countries/BH.yaml +13 -6
  40. data/lib/countries/data/countries/BI.yaml +13 -6
  41. data/lib/countries/data/countries/BJ.yaml +13 -6
  42. data/lib/countries/data/countries/BL.yaml +13 -6
  43. data/lib/countries/data/countries/BM.yaml +14 -7
  44. data/lib/countries/data/countries/BN.yaml +13 -6
  45. data/lib/countries/data/countries/BO.yaml +13 -6
  46. data/lib/countries/data/countries/BQ.yaml +13 -6
  47. data/lib/countries/data/countries/BR.yaml +13 -6
  48. data/lib/countries/data/countries/BS.yaml +14 -7
  49. data/lib/countries/data/countries/BT.yaml +13 -6
  50. data/lib/countries/data/countries/BV.yaml +13 -6
  51. data/lib/countries/data/countries/BW.yaml +13 -6
  52. data/lib/countries/data/countries/BY.yaml +13 -6
  53. data/lib/countries/data/countries/BZ.yaml +13 -6
  54. data/lib/countries/data/countries/CA.yaml +13 -6
  55. data/lib/countries/data/countries/CC.yaml +13 -6
  56. data/lib/countries/data/countries/CD.yaml +6 -6
  57. data/lib/countries/data/countries/CF.yaml +13 -6
  58. data/lib/countries/data/countries/CG.yaml +13 -6
  59. data/lib/countries/data/countries/CH.yaml +15 -8
  60. data/lib/countries/data/countries/CI.yaml +13 -6
  61. data/lib/countries/data/countries/CK.yaml +13 -6
  62. data/lib/countries/data/countries/CL.yaml +13 -6
  63. data/lib/countries/data/countries/CM.yaml +13 -6
  64. data/lib/countries/data/countries/CN.yaml +13 -6
  65. data/lib/countries/data/countries/CO.yaml +13 -6
  66. data/lib/countries/data/countries/CR.yaml +13 -6
  67. data/lib/countries/data/countries/CU.yaml +13 -6
  68. data/lib/countries/data/countries/CV.yaml +13 -6
  69. data/lib/countries/data/countries/CW.yaml +13 -6
  70. data/lib/countries/data/countries/CX.yaml +13 -6
  71. data/lib/countries/data/countries/CY.yaml +13 -6
  72. data/lib/countries/data/countries/CZ.yaml +13 -6
  73. data/lib/countries/data/countries/DE.yaml +13 -6
  74. data/lib/countries/data/countries/DJ.yaml +13 -6
  75. data/lib/countries/data/countries/DK.yaml +13 -6
  76. data/lib/countries/data/countries/DM.yaml +14 -7
  77. data/lib/countries/data/countries/DO.yaml +13 -6
  78. data/lib/countries/data/countries/DZ.yaml +13 -6
  79. data/lib/countries/data/countries/EC.yaml +13 -6
  80. data/lib/countries/data/countries/EE.yaml +13 -6
  81. data/lib/countries/data/countries/EG.yaml +13 -6
  82. data/lib/countries/data/countries/EH.yaml +13 -6
  83. data/lib/countries/data/countries/ER.yaml +13 -6
  84. data/lib/countries/data/countries/ES.yaml +13 -6
  85. data/lib/countries/data/countries/ET.yaml +13 -6
  86. data/lib/countries/data/countries/FI.yaml +13 -6
  87. data/lib/countries/data/countries/FJ.yaml +13 -6
  88. data/lib/countries/data/countries/FK.yaml +13 -6
  89. data/lib/countries/data/countries/FM.yaml +6 -6
  90. data/lib/countries/data/countries/FO.yaml +13 -6
  91. data/lib/countries/data/countries/FR.yaml +13 -6
  92. data/lib/countries/data/countries/GA.yaml +13 -6
  93. data/lib/countries/data/countries/GB.yaml +13 -6
  94. data/lib/countries/data/countries/GD.yaml +14 -7
  95. data/lib/countries/data/countries/GE.yaml +13 -6
  96. data/lib/countries/data/countries/GF.yaml +13 -6
  97. data/lib/countries/data/countries/GG.yaml +13 -6
  98. data/lib/countries/data/countries/GH.yaml +13 -6
  99. data/lib/countries/data/countries/GI.yaml +13 -6
  100. data/lib/countries/data/countries/GL.yaml +13 -6
  101. data/lib/countries/data/countries/GM.yaml +13 -6
  102. data/lib/countries/data/countries/GN.yaml +13 -6
  103. data/lib/countries/data/countries/GP.yaml +13 -6
  104. data/lib/countries/data/countries/GQ.yaml +13 -6
  105. data/lib/countries/data/countries/GR.yaml +13 -6
  106. data/lib/countries/data/countries/GS.yaml +13 -6
  107. data/lib/countries/data/countries/GT.yaml +13 -6
  108. data/lib/countries/data/countries/GU.yaml +14 -7
  109. data/lib/countries/data/countries/GW.yaml +13 -6
  110. data/lib/countries/data/countries/GY.yaml +13 -6
  111. data/lib/countries/data/countries/HK.yaml +13 -6
  112. data/lib/countries/data/countries/HM.yaml +6 -6
  113. data/lib/countries/data/countries/HN.yaml +13 -6
  114. data/lib/countries/data/countries/HR.yaml +13 -6
  115. data/lib/countries/data/countries/HT.yaml +13 -6
  116. data/lib/countries/data/countries/HU.yaml +13 -6
  117. data/lib/countries/data/countries/ID.yaml +13 -6
  118. data/lib/countries/data/countries/IE.yaml +13 -6
  119. data/lib/countries/data/countries/IL.yaml +13 -6
  120. data/lib/countries/data/countries/IM.yaml +13 -6
  121. data/lib/countries/data/countries/IN.yaml +13 -6
  122. data/lib/countries/data/countries/IO.yaml +13 -6
  123. data/lib/countries/data/countries/IQ.yaml +13 -6
  124. data/lib/countries/data/countries/IR.yaml +13 -6
  125. data/lib/countries/data/countries/IS.yaml +13 -6
  126. data/lib/countries/data/countries/IT.yaml +13 -6
  127. data/lib/countries/data/countries/JE.yaml +13 -6
  128. data/lib/countries/data/countries/JM.yaml +14 -7
  129. data/lib/countries/data/countries/JO.yaml +13 -6
  130. data/lib/countries/data/countries/JP.yaml +13 -6
  131. data/lib/countries/data/countries/KE.yaml +13 -6
  132. data/lib/countries/data/countries/KG.yaml +13 -6
  133. data/lib/countries/data/countries/KH.yaml +13 -6
  134. data/lib/countries/data/countries/KI.yaml +13 -6
  135. data/lib/countries/data/countries/KM.yaml +13 -6
  136. data/lib/countries/data/countries/KN.yaml +14 -7
  137. data/lib/countries/data/countries/KP.yaml +6 -6
  138. data/lib/countries/data/countries/KR.yaml +13 -6
  139. data/lib/countries/data/countries/KW.yaml +13 -6
  140. data/lib/countries/data/countries/KY.yaml +14 -7
  141. data/lib/countries/data/countries/KZ.yaml +13 -6
  142. data/lib/countries/data/countries/LA.yaml +13 -6
  143. data/lib/countries/data/countries/LB.yaml +13 -6
  144. data/lib/countries/data/countries/LC.yaml +14 -7
  145. data/lib/countries/data/countries/LI.yaml +13 -6
  146. data/lib/countries/data/countries/LK.yaml +13 -6
  147. data/lib/countries/data/countries/LR.yaml +13 -6
  148. data/lib/countries/data/countries/LS.yaml +13 -6
  149. data/lib/countries/data/countries/LT.yaml +13 -6
  150. data/lib/countries/data/countries/LU.yaml +13 -6
  151. data/lib/countries/data/countries/LV.yaml +13 -6
  152. data/lib/countries/data/countries/LY.yaml +13 -6
  153. data/lib/countries/data/countries/MA.yaml +13 -6
  154. data/lib/countries/data/countries/MC.yaml +13 -6
  155. data/lib/countries/data/countries/MD.yaml +13 -6
  156. data/lib/countries/data/countries/ME.yaml +13 -6
  157. data/lib/countries/data/countries/MF.yaml +13 -6
  158. data/lib/countries/data/countries/MG.yaml +13 -6
  159. data/lib/countries/data/countries/MH.yaml +13 -6
  160. data/lib/countries/data/countries/MK.yaml +6 -6
  161. data/lib/countries/data/countries/ML.yaml +13 -6
  162. data/lib/countries/data/countries/MM.yaml +13 -6
  163. data/lib/countries/data/countries/MN.yaml +13 -6
  164. data/lib/countries/data/countries/MO.yaml +13 -6
  165. data/lib/countries/data/countries/MP.yaml +13 -6
  166. data/lib/countries/data/countries/MQ.yaml +13 -6
  167. data/lib/countries/data/countries/MR.yaml +13 -6
  168. data/lib/countries/data/countries/MS.yaml +14 -7
  169. data/lib/countries/data/countries/MT.yaml +13 -6
  170. data/lib/countries/data/countries/MU.yaml +13 -6
  171. data/lib/countries/data/countries/MV.yaml +13 -6
  172. data/lib/countries/data/countries/MW.yaml +13 -6
  173. data/lib/countries/data/countries/MX.yaml +13 -6
  174. data/lib/countries/data/countries/MY.yaml +13 -6
  175. data/lib/countries/data/countries/MZ.yaml +13 -6
  176. data/lib/countries/data/countries/NA.yaml +13 -6
  177. data/lib/countries/data/countries/NC.yaml +13 -6
  178. data/lib/countries/data/countries/NE.yaml +13 -6
  179. data/lib/countries/data/countries/NF.yaml +13 -6
  180. data/lib/countries/data/countries/NG.yaml +13 -6
  181. data/lib/countries/data/countries/NI.yaml +13 -6
  182. data/lib/countries/data/countries/NL.yaml +13 -6
  183. data/lib/countries/data/countries/NO.yaml +13 -6
  184. data/lib/countries/data/countries/NP.yaml +13 -6
  185. data/lib/countries/data/countries/NR.yaml +13 -6
  186. data/lib/countries/data/countries/NU.yaml +13 -6
  187. data/lib/countries/data/countries/NZ.yaml +13 -6
  188. data/lib/countries/data/countries/OM.yaml +13 -6
  189. data/lib/countries/data/countries/PA.yaml +13 -6
  190. data/lib/countries/data/countries/PE.yaml +13 -6
  191. data/lib/countries/data/countries/PF.yaml +13 -6
  192. data/lib/countries/data/countries/PG.yaml +13 -6
  193. data/lib/countries/data/countries/PH.yaml +13 -6
  194. data/lib/countries/data/countries/PK.yaml +13 -6
  195. data/lib/countries/data/countries/PL.yaml +13 -6
  196. data/lib/countries/data/countries/PM.yaml +13 -6
  197. data/lib/countries/data/countries/PN.yaml +13 -6
  198. data/lib/countries/data/countries/PR.yaml +13 -6
  199. data/lib/countries/data/countries/PS.yaml +13 -6
  200. data/lib/countries/data/countries/PT.yaml +13 -6
  201. data/lib/countries/data/countries/PW.yaml +13 -6
  202. data/lib/countries/data/countries/PY.yaml +13 -6
  203. data/lib/countries/data/countries/QA.yaml +13 -6
  204. data/lib/countries/data/countries/RE.yaml +13 -6
  205. data/lib/countries/data/countries/RO.yaml +13 -6
  206. data/lib/countries/data/countries/RS.yaml +13 -6
  207. data/lib/countries/data/countries/RU.yaml +13 -6
  208. data/lib/countries/data/countries/RW.yaml +13 -6
  209. data/lib/countries/data/countries/SA.yaml +13 -6
  210. data/lib/countries/data/countries/SB.yaml +13 -6
  211. data/lib/countries/data/countries/SC.yaml +13 -6
  212. data/lib/countries/data/countries/SD.yaml +13 -6
  213. data/lib/countries/data/countries/SE.yaml +13 -6
  214. data/lib/countries/data/countries/SG.yaml +13 -6
  215. data/lib/countries/data/countries/SH.yaml +13 -6
  216. data/lib/countries/data/countries/SI.yaml +13 -6
  217. data/lib/countries/data/countries/SJ.yaml +13 -6
  218. data/lib/countries/data/countries/SK.yaml +13 -6
  219. data/lib/countries/data/countries/SL.yaml +13 -6
  220. data/lib/countries/data/countries/SM.yaml +13 -6
  221. data/lib/countries/data/countries/SN.yaml +13 -6
  222. data/lib/countries/data/countries/SO.yaml +13 -6
  223. data/lib/countries/data/countries/SR.yaml +13 -6
  224. data/lib/countries/data/countries/SS.yaml +13 -6
  225. data/lib/countries/data/countries/ST.yaml +13 -6
  226. data/lib/countries/data/countries/SV.yaml +13 -6
  227. data/lib/countries/data/countries/SX.yaml +14 -7
  228. data/lib/countries/data/countries/SY.yaml +13 -6
  229. data/lib/countries/data/countries/SZ.yaml +13 -6
  230. data/lib/countries/data/countries/TC.yaml +14 -7
  231. data/lib/countries/data/countries/TD.yaml +13 -6
  232. data/lib/countries/data/countries/TF.yaml +14 -7
  233. data/lib/countries/data/countries/TG.yaml +13 -6
  234. data/lib/countries/data/countries/TH.yaml +13 -6
  235. data/lib/countries/data/countries/TJ.yaml +13 -6
  236. data/lib/countries/data/countries/TK.yaml +13 -6
  237. data/lib/countries/data/countries/TL.yaml +13 -6
  238. data/lib/countries/data/countries/TM.yaml +13 -6
  239. data/lib/countries/data/countries/TN.yaml +13 -6
  240. data/lib/countries/data/countries/TO.yaml +13 -6
  241. data/lib/countries/data/countries/TR.yaml +13 -6
  242. data/lib/countries/data/countries/TT.yaml +14 -7
  243. data/lib/countries/data/countries/TV.yaml +13 -6
  244. data/lib/countries/data/countries/TW.yaml +13 -6
  245. data/lib/countries/data/countries/TZ.yaml +6 -6
  246. data/lib/countries/data/countries/UA.yaml +13 -6
  247. data/lib/countries/data/countries/UG.yaml +13 -6
  248. data/lib/countries/data/countries/UM.yaml +13 -6
  249. data/lib/countries/data/countries/US.yaml +15 -8
  250. data/lib/countries/data/countries/UY.yaml +13 -6
  251. data/lib/countries/data/countries/UZ.yaml +13 -6
  252. data/lib/countries/data/countries/VA.yaml +6 -6
  253. data/lib/countries/data/countries/VC.yaml +14 -7
  254. data/lib/countries/data/countries/VE.yaml +13 -6
  255. data/lib/countries/data/countries/VG.yaml +7 -7
  256. data/lib/countries/data/countries/VI.yaml +13 -6
  257. data/lib/countries/data/countries/VN.yaml +13 -6
  258. data/lib/countries/data/countries/VU.yaml +13 -6
  259. data/lib/countries/data/countries/WF.yaml +13 -6
  260. data/lib/countries/data/countries/WS.yaml +13 -6
  261. data/lib/countries/data/countries/YE.yaml +13 -6
  262. data/lib/countries/data/countries/YT.yaml +13 -6
  263. data/lib/countries/data/countries/ZA.yaml +13 -6
  264. data/lib/countries/data/countries/ZM.yaml +13 -6
  265. data/lib/countries/data/countries/ZW.yaml +14 -7
  266. data/lib/countries/data/translation_corrections.yaml +4 -1
  267. data/lib/countries/iso3166.rb +1 -0
  268. data/lib/countries/kwarg_struct.rb +2 -2
  269. data/lib/countries/mongoid.rb +22 -22
  270. data/lib/countries/setup.rb +1 -1
  271. data/lib/countries/structure.rb +59 -50
  272. data/lib/countries/tasks/geocoding.rake +94 -0
  273. data/lib/countries/translations.rb +12 -0
  274. data/lib/countries/version.rb +1 -1
  275. data/spec/country_spec.rb +98 -29
  276. data/spec/data_spec.rb +28 -32
  277. data/spec/global_spec.rb +19 -19
  278. data/spec/mongoid_spec.rb +1 -1
  279. data/spec/perf_spec.rb +2 -1
  280. data/spec/timezone_spec.rb +1 -1
  281. metadata +9 -6
  282. data/lib/countries/data/countries/AN.yaml +0 -46
@@ -30,12 +30,19 @@ ZM:
30
30
  languages_spoken:
31
31
  - en
32
32
  geo:
33
- latitude: 15 00 S
33
+ latitude: -13.133897
34
34
  latitude_dec: "-13.458845138549805"
35
- longitude: 30 00 E
35
+ longitude: 27.849332
36
36
  longitude_dec: '27.788097381591797'
37
- max_latitude: '5'
38
- max_longitude: '39.283333'
39
- min_latitude: "-18.05"
40
- min_longitude: '22'
37
+ max_latitude: -8.203284
38
+ max_longitude: 33.7090305
39
+ min_latitude: -18.0767539
40
+ min_longitude: 21.9993509
41
+ bounds:
42
+ northeast:
43
+ lat: -8.203284
44
+ lng: 33.7090305
45
+ southwest:
46
+ lat: -18.0767539
47
+ lng: 21.9993509
41
48
  currency_code: ZMW
@@ -37,12 +37,19 @@ ZW:
37
37
  - sn
38
38
  - nd
39
39
  geo:
40
- latitude: 20 00 S
40
+ latitude: -19.015438
41
41
  latitude_dec: "-19.000280380249023"
42
- longitude: 30 00 E
42
+ longitude: 29.154857
43
43
  longitude_dec: '29.86876106262207'
44
- max_latitude: "-15.6"
45
- max_longitude: '33.05'
46
- min_latitude: "-22.316667"
47
- min_longitude: '25.333333'
48
- currency_code: ZWD
44
+ max_latitude: -15.6107883
45
+ max_longitude: 33.068236
46
+ min_latitude: -22.4223538
47
+ min_longitude: 25.237368
48
+ bounds:
49
+ northeast:
50
+ lat: -15.6107883
51
+ lng: 33.068236
52
+ southwest:
53
+ lat: -22.4223538
54
+ lng: 25.237368
55
+ currency_code: USD
@@ -20,4 +20,7 @@ ar:
20
20
  SO: "الصومال‎"
21
21
  SY: "سوريا"
22
22
  zh:
23
- KH: '柬埔寨'
23
+ KH: '柬埔寨'
24
+ ar:
25
+ BQ: "بونير، سينت أوستاتيوس وسابا"
26
+ CW: "كوراساو"
@@ -6,6 +6,7 @@ require 'countries/kwarg_struct'
6
6
  require 'countries/configuration'
7
7
  require 'countries/data'
8
8
  require 'countries/structure'
9
+ require 'countries/translations'
9
10
  require 'countries/country/class_methods'
10
11
  require 'countries/country/emoji'
11
12
  require 'countries/country'
@@ -2,10 +2,10 @@ module ISO3166
2
2
  class KwargStruct < Struct
3
3
  # Override the initialize to handle hashes of named parameters
4
4
  def initialize(*args)
5
- opts = args.last.is_a?(Hash) ? args.pop : Hash.new
5
+ opts = args.last.is_a?(Hash) ? args.pop : {}
6
6
  super(*args)
7
7
  opts.each_pair do |k, v|
8
- self.send "#{k}=", v
8
+ send "#{k}=", v
9
9
  end
10
10
  end
11
11
  end
@@ -1,31 +1,31 @@
1
- module ISO3166; end
2
-
3
- class ISO3166::Country
4
- def mongoize
5
- ISO3166::Country.mongoize(self)
6
- end
1
+ module ISO3166
2
+ class Country
3
+ def mongoize
4
+ ISO3166::Country.mongoize(self)
5
+ end
7
6
 
8
- class << self
9
- def mongoize(country)
10
- if country.is_a?(self) && !country.data.nil?
11
- country.alpha2
12
- elsif send(:valid_alpha2?, country)
13
- new(country).alpha2
7
+ class << self
8
+ def mongoize(country)
9
+ if country.is_a?(self) && !country.data.nil?
10
+ country.alpha2
11
+ elsif send(:valid_alpha2?, country)
12
+ new(country).alpha2
13
+ end
14
14
  end
15
- end
16
15
 
17
- def demongoize(alpha2)
18
- new(alpha2)
19
- end
16
+ def demongoize(alpha2)
17
+ new(alpha2)
18
+ end
20
19
 
21
- def evolve(country)
22
- mongoize(country)
23
- end
20
+ def evolve(country)
21
+ mongoize(country)
22
+ end
24
23
 
25
- private
24
+ private
26
25
 
27
- def valid_alpha2?(country)
28
- country.is_a?(String) && !ISO3166::Country.new(country).nil?
26
+ def valid_alpha2?(country)
27
+ country.is_a?(String) && !ISO3166::Country.new(country).nil?
28
+ end
29
29
  end
30
30
  end
31
31
  end
@@ -6,7 +6,7 @@ module ISO3166
6
6
  class Setup
7
7
  # <b>DEPRECATED:</b> Please use <tt>Data.codes</tt> instead.
8
8
  def codes
9
- warn "[DEPRECATION] `Setup.codes` is deprecated. Please use `Data.codes` instead."
9
+ warn '[DEPRECATION] `Setup.codes` is deprecated. Please use `Data.codes` instead.'
10
10
  Data.codes
11
11
  end
12
12
 
@@ -2,62 +2,71 @@
2
2
  #
3
3
  module ISO3166
4
4
  DEFAULT_COUNTRY_HASH = {
5
- "address_format" => nil,
6
- "alpha2" => nil,
7
- "alpha3" => nil,
8
- "continent" => nil,
9
- "country_code" => nil,
10
- "currency_code" => nil,
11
- "gec" => nil,
12
- "geo" => {
13
- "latitude" => nil,
14
- "latitude_dec" => nil,
15
- "longitude" => nil,
16
- "longitude_dec" => nil,
17
- "max_latitude" => nil,
18
- "max_longitude" => nil,
19
- "min_latitude" => nil,
20
- "min_longitude" => nil,
5
+ 'address_format' => nil,
6
+ 'alpha2' => nil,
7
+ 'alpha3' => nil,
8
+ 'continent' => nil,
9
+ 'country_code' => nil,
10
+ 'currency_code' => nil,
11
+ 'gec' => nil,
12
+ 'geo' => {
13
+ 'latitude' => nil,
14
+ 'latitude_dec' => nil,
15
+ 'longitude' => nil,
16
+ 'longitude_dec' => nil,
17
+ 'max_latitude' => nil,
18
+ 'max_longitude' => nil,
19
+ 'min_latitude' => nil,
20
+ 'min_longitude' => nil,
21
+ 'bounds' => {
22
+ 'northeast' => {
23
+ 'lat' => nil,
24
+ 'lng' => nil
25
+ },
26
+ 'southwest' => {
27
+ 'lat' => nil,
28
+ 'lng' => nil
29
+ }
30
+ }
21
31
  },
22
- "international_prefix" => nil,
23
- "ioc" => nil,
24
- "name" => nil,
25
- "national_destination_code_lengths" => [],
26
- "national_number_lengths" => [],
27
- "national_prefix" => nil,
28
- "nationality" => nil,
29
- "number" => nil,
30
- "languages_official" => [],
31
- "languages_spoken" => [],
32
- "translations" => {},
33
- "postal_code" => nil,
34
- "region" => nil,
35
- "unofficial_names" => [],
36
- "subregion" => nil,
37
- "un_locode" => nil,
38
- "vat_rates" => {
39
- "standard" => nil,
40
- "reduced" => [ nil, nil ],
41
- "super_reduced" => nil,
42
- "parking" => nil
32
+ 'international_prefix' => nil,
33
+ 'ioc' => nil,
34
+ 'name' => nil,
35
+ 'national_destination_code_lengths' => [],
36
+ 'national_number_lengths' => [],
37
+ 'national_prefix' => nil,
38
+ 'nationality' => nil,
39
+ 'number' => nil,
40
+ 'languages_official' => [],
41
+ 'languages_spoken' => [],
42
+ 'translations' => {},
43
+ 'postal_code' => nil,
44
+ 'region' => nil,
45
+ 'unofficial_names' => [],
46
+ 'subregion' => nil,
47
+ 'un_locode' => nil,
48
+ 'vat_rates' => {
49
+ 'standard' => nil,
50
+ 'reduced' => [nil, nil],
51
+ 'super_reduced' => nil,
52
+ 'parking' => nil
43
53
  },
44
- "world_region" => nil
45
- }
54
+ 'world_region' => nil
55
+ }.freeze
46
56
 
47
57
  DEFAULT_SUBDIVISION_HASH = {
48
58
  'name' => nil,
49
59
  'unofficial_names' => [],
50
60
  'translations' => {},
51
- "geo" => {
52
- "latitude" => nil,
53
- "latitude_dec" => nil,
54
- "longitude" => nil,
55
- "longitude_dec" => nil,
56
- "max_latitude" => nil,
57
- "max_longitude" => nil,
58
- "min_latitude" => nil,
59
- "min_longitude" => nil,
61
+ 'geo' => {
62
+ 'latitude' => nil,
63
+ 'latitude_dec' => nil,
64
+ 'longitude' => nil,
65
+ 'longitude_dec' => nil,
66
+ 'max_latitude' => nil,
67
+ 'max_longitude' => nil,
68
+ 'min_latitude' => nil,
69
+ 'min_longitude' => nil
60
70
  }
61
- }
62
-
71
+ }.freeze
63
72
  end
@@ -0,0 +1,94 @@
1
+ require 'geocoder'
2
+ require 'retryable'
3
+ # raise on geocoding errors such as query limit exceeded
4
+ Geocoder.configure(always_raise: :all)
5
+ # Try to geocode a given query, on exceptions it retries up to 3 times then gives up.
6
+ # @param [String] query string to geocode
7
+ # @return [Hash] first valid result or nil
8
+ def geocode(query)
9
+ Retryable.retryable(tries: 3, sleep: ->(n) { 2**n }) do
10
+ Geocoder.search(query).first
11
+ end
12
+ rescue => e
13
+ warn "Attempts exceeded for query #{query}, last error was #{e.message}"
14
+ nil
15
+ end
16
+
17
+ def load_country_yaml(alpha2)
18
+ YAML.load_file(File.join(ISO3166_ROOT_PATH, 'lib', 'countries', 'data', 'countries', "#{alpha2}.yaml"))
19
+ end
20
+
21
+ def save_country_yaml(alpha2, data)
22
+ File.open(File.join(ISO3166_ROOT_PATH, 'lib', 'countries', 'data', 'countries', "#{alpha2}.yaml"), 'w+') { |f| f.write data.to_yaml }
23
+ end
24
+
25
+ def country_codes
26
+ @country_codes ||= Dir['lib/countries/data/countries/*.yaml'].map { |x| File.basename(x, File.extname(x)) }.uniq
27
+ end
28
+
29
+ namespace :geocode do
30
+ desc 'Retrieve and store subdivisions coordinates'
31
+ task :fetch_countries do
32
+ require 'countries'
33
+ # Iterate over countries
34
+ ISO3166::Country.all.each do |country|
35
+ code = country.alpha2
36
+ # Load unmutated yaml file.
37
+ data = load_country_yaml(country.alpha2)
38
+
39
+ next unless (result = geocode(country.name))
40
+
41
+ geometry = result.geometry
42
+
43
+ # Extract center point data
44
+ if geometry['location']
45
+ data[code]['geo']['latitude'] = geometry['location']['lat']
46
+ data[code]['geo']['longitude'] = geometry['location']['lng']
47
+ end
48
+
49
+ # Extract bounding box data
50
+ next unless geometry['bounds']
51
+ data[code]['geo']['bounds'] = geometry['bounds']
52
+ data[code]['geo']['min_latitude'] = geometry['bounds']['southwest']['lat']
53
+ data[code]['geo']['min_longitude'] = geometry['bounds']['southwest']['lng']
54
+ data[code]['geo']['max_latitude'] = geometry['bounds']['northeast']['lat']
55
+ data[code]['geo']['max_longitude'] = geometry['bounds']['northeast']['lng']
56
+
57
+ # Persist
58
+ save_country_yaml(code, data)
59
+ end
60
+ end
61
+
62
+ desc 'Retrieve and store subdivisions coordinates'
63
+ task :fetch_subdivisions do
64
+ require 'countries'
65
+ # Iterate all countries with subdivisions
66
+ ISO3166::Country.all.select(&:subdivisions?).each do |c|
67
+ # Iterate subdivisions
68
+ state_data = c.subdivisions.dup
69
+ state_data.reject { |_, data| data['latitude'] }.each do |code, data|
70
+ location = "#{data['name']}, #{c.name}"
71
+
72
+ # Handle special geocoding cases where Google defaults to well known
73
+ # cities, instead of the states.
74
+ if c.alpha2 == 'US' && %w(NY WA OK).include?(code)
75
+ location = "#{data['name']} State, United States"
76
+ end
77
+
78
+ next unless (result = geocode(location))
79
+ geometry = result.geometry
80
+ if geometry['location']
81
+ state_data[code]['geo']['latitude'] = geometry['location']['lat']
82
+ state_data[code]['geo']['longitude'] = geometry['location']['lng']
83
+ end
84
+ next unless geometry['bounds']
85
+ state_data[code]['geo']['min_latitude'] = geometry['bounds']['southwest']['lat']
86
+ state_data[code]['geo']['min_longitude'] = geometry['bounds']['southwest']['lng']
87
+ state_data[code]['geo']['max_latitude'] = geometry['bounds']['northeast']['lat']
88
+ state_data[code]['geo']['max_longitude'] = geometry['bounds']['northeast']['lng']
89
+ end
90
+ # Write updated YAML for current country
91
+ File.open(File.join(ISO3166_ROOT_PATH, 'lib', 'countries', 'data', 'subdivisions', "#{c.alpha2}.yaml"), 'w+') { |f| f.write state_data.to_yaml }
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,12 @@
1
+ module ISO3166
2
+ # Extend the hash class to allow locale lookup fall back behavior
3
+ #
4
+ # ex:
5
+ # if a country has translations for pt, and the user looks up `pt-br` fallback
6
+ # to `pt` to prevent from showing nil values
7
+ class Translations < Hash
8
+ def [](locale)
9
+ super(locale) || super(locale.sub(/-.*/, ''))
10
+ end
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module Countries
2
- VERSION = '2.0.0.rc'
2
+ VERSION = '2.0.0'.freeze
3
3
  end
data/spec/country_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
-
4
+ NUM_OF_COUNTRIES = 249
5
5
  describe ISO3166::Country do
6
6
  let(:country) { ISO3166::Country.search('US') }
7
7
 
@@ -28,11 +28,11 @@ describe ISO3166::Country do
28
28
  end
29
29
 
30
30
  it 'should return 3166 name' do
31
- expect(country.name).to eq('United States')
31
+ expect(country.name).to eq('United States of America')
32
32
  end
33
33
 
34
34
  it 'should return alternate names' do
35
- expect(country.names).to eq(['United States of America', 'Vereinigte Staaten von Amerika', 'États-Unis', 'Estados Unidos', 'アメリカ合衆国', 'Verenigde Staten'])
35
+ expect(country.names).to eq(['United States', 'Vereinigte Staaten von Amerika', 'États-Unis', 'Estados Unidos', 'アメリカ合衆国', 'Verenigde Staten'])
36
36
  end
37
37
 
38
38
  it 'should return translations' do
@@ -41,11 +41,15 @@ describe ISO3166::Country do
41
41
  end
42
42
 
43
43
  it 'should return latitude' do
44
- expect(country.latitude).to eq('38 00 N')
44
+ expect(country.latitude).to eq(37.09024)
45
45
  end
46
46
 
47
47
  it 'should return longitude' do
48
- expect(country.longitude).to eq('97 00 W')
48
+ expect(country.longitude).to eq(-95.712891)
49
+ end
50
+
51
+ it 'should return bounds' do
52
+ expect(country.bounds['northeast']['lat']).to eq(71.3867745)
49
53
  end
50
54
 
51
55
  it 'should return the decimal Latitude' do
@@ -109,6 +113,55 @@ describe ISO3166::Country do
109
113
  end
110
114
  end
111
115
 
116
+ context 'with Brazil' do
117
+ context 'with pt-BR translation' do
118
+ before do
119
+ ISO3166::Data.register(
120
+ alpha2: 'BR2',
121
+ name: 'Brazil',
122
+ languages_official: %w(pt-BR),
123
+ translations: {
124
+ 'pt-BR' => 'Translation for pt-BR',
125
+ 'pt' => 'Translation for pt'
126
+ }
127
+ )
128
+ end
129
+
130
+ let(:country) { ISO3166::Country.search('BR2') }
131
+
132
+ it 'should return its local name based on its language' do
133
+ expect(country.local_names).to match_array(['Translation for pt-BR'])
134
+ end
135
+
136
+ after do
137
+ ISO3166::Data.unregister('BR2')
138
+ end
139
+ end
140
+
141
+ context 'without pt-BR translation' do
142
+ before do
143
+ ISO3166::Data.register(
144
+ alpha2: 'BR2',
145
+ name: 'Brazil',
146
+ languages_official: %w(pt-BR),
147
+ translations: {
148
+ 'pt' => 'Translation for pt'
149
+ }
150
+ )
151
+ end
152
+
153
+ let(:country) { ISO3166::Country.search('BR2') }
154
+
155
+ it 'should return its local name based on its language' do
156
+ expect(country.local_names).to match_array(['Translation for pt'])
157
+ end
158
+
159
+ after do
160
+ ISO3166::Data.unregister('BR2')
161
+ end
162
+ end
163
+ end
164
+
112
165
  it 'should return ioc code' do
113
166
  expect(country.ioc).to eq('USA')
114
167
  end
@@ -166,11 +219,11 @@ describe ISO3166::Country do
166
219
  end
167
220
 
168
221
  it 'should have a name' do
169
- expect(virginia.name).to eq("Virginia")
222
+ expect(virginia.name).to eq('Virginia')
170
223
  end
171
224
 
172
225
  it 'should behave like a hash' do
173
- expect(virginia["name"]).to eq("Virginia")
226
+ expect(virginia['name']).to eq('Virginia')
174
227
  end
175
228
  end
176
229
 
@@ -216,7 +269,7 @@ describe ISO3166::Country do
216
269
  countries = ISO3166::Country.all
217
270
  expect(countries).to be_an(Array)
218
271
  expect(countries.first).to be_an(ISO3166::Country)
219
- expect(countries.size).to eq(250)
272
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
220
273
  end
221
274
 
222
275
  it 'should allow to customize each country representation passing a block to the method' do
@@ -224,7 +277,7 @@ describe ISO3166::Country do
224
277
  expect(countries).to be_an(Array)
225
278
  expect(countries.first).to be_an(Array)
226
279
  expect(countries.first.size).to eq(3)
227
- expect(countries.size).to eq(250)
280
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
228
281
  end
229
282
  end
230
283
 
@@ -236,7 +289,7 @@ describe ISO3166::Country do
236
289
  expect(countries.first).to eq('Afghanistan')
237
290
  # countries missing the desired locale will not be added to the list
238
291
  # so all 250 countries may not be returned, 'fr' returns 249, for example
239
- expect(countries.size).to eq(249)
292
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
240
293
  end
241
294
 
242
295
  it 'should return an alphabetized list of all country names in English if no locale is passed' do
@@ -244,7 +297,7 @@ describe ISO3166::Country do
244
297
  expect(countries).to be_an(Array)
245
298
  expect(countries.first).to be_a(String)
246
299
  expect(countries.first).to eq('Afghanistan')
247
- expect(countries.size).to eq(249)
300
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
248
301
  end
249
302
  end
250
303
 
@@ -255,7 +308,7 @@ describe ISO3166::Country do
255
308
  expect(countries).to be_an(Array)
256
309
  expect(countries.first[0]).to be_a(String)
257
310
  expect(countries.first[0]).to eq('Afghanistan')
258
- expect(countries.size).to eq(250)
311
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
259
312
  end
260
313
 
261
314
  it 'should return an alphabetized list of all country names translated to current locale with ISOCODE alpha2' do
@@ -265,7 +318,7 @@ describe ISO3166::Country do
265
318
  expect(countries).to be_an(Array)
266
319
  expect(countries.first[0]).to be_a(String)
267
320
  expect(countries.first[0]).to eq('Afganistán')
268
- expect(countries.size).to eq(250)
321
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
269
322
  end
270
323
  end
271
324
 
@@ -297,7 +350,7 @@ describe ISO3166::Country do
297
350
  expect(countries.first).to eq(%w(AF Afghanistan))
298
351
  # countries missing the desired locale will not be added to the list
299
352
  # so all 250 countries may not be returned, 'fr' returns 249, for example
300
- expect(countries.size).to eq(249)
353
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
301
354
  end
302
355
 
303
356
  it 'should return an hash of all country names in English if no locale is passed' do
@@ -305,7 +358,7 @@ describe ISO3166::Country do
305
358
  expect(countries).to be_an(Hash)
306
359
  expect(countries.first[0]).to eq('AF')
307
360
  expect(countries.first).to eq(%w(AF Afghanistan))
308
- expect(countries.size).to eq(249)
361
+ expect(countries.size).to eq(NUM_OF_COUNTRIES)
309
362
  end
310
363
  end
311
364
 
@@ -346,7 +399,7 @@ describe ISO3166::Country do
346
399
  describe 'codes' do
347
400
  it 'returns a hash with the data of the country' do
348
401
  expect(ISO3166::Country.codes).to be_a Array
349
- expect(ISO3166::Country.codes.size).to eq(250)
402
+ expect(ISO3166::Country.codes.size).to eq(NUM_OF_COUNTRIES)
350
403
  end
351
404
  end
352
405
 
@@ -409,28 +462,28 @@ describe ISO3166::Country do
409
462
  end
410
463
  end
411
464
 
412
- context "when search lowercase multibyte name found" do
413
- subject { ISO3166::Country.find_country_by_name("россия") }
465
+ context 'when search lowercase multibyte name found' do
466
+ subject { ISO3166::Country.find_country_by_name('россия') }
414
467
 
415
- it "should be a country instance" do
468
+ it 'should be a country instance' do
416
469
  expect(subject).to be_a(ISO3166::Country)
417
470
  expect(subject.alpha2).to eq('RU')
418
471
  end
419
472
  end
420
473
 
421
- context "when search lowercase multibyte name found" do
474
+ context 'when search lowercase multibyte name found' do
422
475
  subject { ISO3166::Country.find_country_by_name(/россия/) }
423
476
 
424
- it "should be a country instance" do
477
+ it 'should be a country instance' do
425
478
  expect(subject).to be_a(ISO3166::Country)
426
479
  expect(subject.alpha2).to eq('RU')
427
480
  end
428
481
  end
429
482
 
430
- context "when accents are not used" do
431
- subject { ISO3166::Country.find_country_by_name("emirats Arabes Unis") }
483
+ context 'when accents are not used' do
484
+ subject { ISO3166::Country.find_country_by_name('emirats Arabes Unis') }
432
485
 
433
- it "should be a country instance" do
486
+ it 'should be a country instance' do
434
487
  expect(subject).to be_a(ISO3166::Country)
435
488
  expect(subject.alpha2).to eq('AE')
436
489
  end
@@ -501,6 +554,22 @@ describe ISO3166::Country do
501
554
  end
502
555
  end
503
556
 
557
+ context 'regression test for #388' do
558
+ let(:no_country) { ISO3166::Country.find_country_by_translated_names(nil) }
559
+
560
+ it 'should be a country instance' do
561
+ expect(no_country).to_not be_a(ISO3166::Country)
562
+ expect(no_country).to eq nil
563
+ end
564
+ end
565
+
566
+ context 'when attempting to search by translations hash' do
567
+ let(:uk) { ISO3166::Country.find_country_by_translations({}) }
568
+
569
+ it 'should be a country instance' do
570
+ expect { uk }.to raise_error(RuntimeError)
571
+ end
572
+ end
504
573
  context 'when search name not found' do
505
574
  let(:bogus) { ISO3166::Country.find_country_by_name('Does not exist') }
506
575
 
@@ -644,7 +713,7 @@ describe ISO3166::Country do
644
713
  end
645
714
 
646
715
  it 'should return nil if the country does not have a GEC code' do
647
- expect(ISO3166::Country.new('AN').gec).to eql nil
716
+ expect(ISO3166::Country.new('UM').gec).to eql nil
648
717
  end
649
718
  end
650
719
 
@@ -690,7 +759,7 @@ describe ISO3166::Country do
690
759
 
691
760
  describe 'Added country names to search by' do
692
761
  it 'should return country code for Democratic Republic of the Congo' do
693
- expect(ISO3166::Country.find_country_by_name('Democratic Republic of the Congo').alpha2).to eq 'CG'
762
+ expect(ISO3166::Country.find_country_by_name('Democratic Republic of the Congo').alpha2).to eq 'CD'
694
763
  end
695
764
  it 'should return country code for Ivory Coast' do
696
765
  expect(ISO3166::Country.find_country_by_name('Ivory Coast').alpha2).to eq 'CI'
@@ -717,9 +786,9 @@ describe ISO3166::Country do
717
786
  end
718
787
  end
719
788
 
720
- describe 'Emjoi' do
721
- it 'has an emjoi flag' do
722
- expect(country.emoji_flag).to eq "🇺🇸"
789
+ describe 'Emoji' do
790
+ it 'has an emoji flag' do
791
+ expect(country.emoji_flag).to eq '🇺🇸'
723
792
  end
724
793
  end
725
794
  end