countries 3.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (615) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +37 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +122 -0
  5. data/Gemfile +5 -0
  6. data/README.markdown +50 -40
  7. data/Rakefile +8 -5
  8. data/countries.gemspec +10 -6
  9. data/lib/countries.rb +0 -1
  10. data/lib/countries/cache/countries.json +1 -1
  11. data/lib/countries/cache/locales/ab.json +1 -0
  12. data/lib/countries/cache/locales/af.json +1 -1
  13. data/lib/countries/cache/locales/ak.json +1 -0
  14. data/lib/countries/cache/locales/am.json +1 -1
  15. data/lib/countries/cache/locales/an.json +1 -0
  16. data/lib/countries/cache/locales/ar.json +1 -1
  17. data/lib/countries/cache/locales/as.json +1 -1
  18. data/lib/countries/cache/locales/ay.json +1 -0
  19. data/lib/countries/cache/locales/az.json +1 -1
  20. data/lib/countries/cache/locales/ba.json +1 -0
  21. data/lib/countries/cache/locales/be.json +1 -1
  22. data/lib/countries/cache/locales/bg.json +1 -1
  23. data/lib/countries/cache/locales/bi.json +1 -0
  24. data/lib/countries/cache/locales/bn-in.json +1 -0
  25. data/lib/countries/cache/locales/bn.json +1 -1
  26. data/lib/countries/cache/locales/br.json +1 -1
  27. data/lib/countries/cache/locales/bs.json +1 -1
  28. data/lib/countries/cache/locales/ca.json +1 -1
  29. data/lib/countries/cache/locales/ce.json +1 -0
  30. data/lib/countries/cache/locales/ch.json +1 -0
  31. data/lib/countries/cache/locales/cs.json +1 -1
  32. data/lib/countries/cache/locales/cv.json +1 -0
  33. data/lib/countries/cache/locales/cy.json +1 -1
  34. data/lib/countries/cache/locales/da.json +1 -1
  35. data/lib/countries/cache/locales/de.json +1 -1
  36. data/lib/countries/cache/locales/dv.json +1 -0
  37. data/lib/countries/cache/locales/dz.json +1 -1
  38. data/lib/countries/cache/locales/ee.json +1 -0
  39. data/lib/countries/cache/locales/el.json +1 -1
  40. data/lib/countries/cache/locales/en.json +1 -1
  41. data/lib/countries/cache/locales/eo.json +1 -1
  42. data/lib/countries/cache/locales/es.json +1 -1
  43. data/lib/countries/cache/locales/et.json +1 -1
  44. data/lib/countries/cache/locales/eu.json +1 -1
  45. data/lib/countries/cache/locales/fa.json +1 -1
  46. data/lib/countries/cache/locales/ff.json +1 -0
  47. data/lib/countries/cache/locales/fi.json +1 -1
  48. data/lib/countries/cache/locales/fo.json +1 -1
  49. data/lib/countries/cache/locales/fr.json +1 -1
  50. data/lib/countries/cache/locales/fy.json +1 -0
  51. data/lib/countries/cache/locales/ga.json +1 -1
  52. data/lib/countries/cache/locales/gl.json +1 -1
  53. data/lib/countries/cache/locales/gn.json +1 -0
  54. data/lib/countries/cache/locales/gu.json +1 -1
  55. data/lib/countries/cache/locales/gv.json +1 -0
  56. data/lib/countries/cache/locales/ha.json +1 -0
  57. data/lib/countries/cache/locales/he.json +1 -1
  58. data/lib/countries/cache/locales/hi.json +1 -1
  59. data/lib/countries/cache/locales/hr.json +1 -1
  60. data/lib/countries/cache/locales/ht.json +1 -0
  61. data/lib/countries/cache/locales/hu.json +1 -1
  62. data/lib/countries/cache/locales/hy.json +1 -1
  63. data/lib/countries/cache/locales/ia.json +1 -1
  64. data/lib/countries/cache/locales/id.json +1 -1
  65. data/lib/countries/cache/locales/io.json +1 -0
  66. data/lib/countries/cache/locales/is.json +1 -1
  67. data/lib/countries/cache/locales/it.json +1 -1
  68. data/lib/countries/cache/locales/iu.json +1 -0
  69. data/lib/countries/cache/locales/ja.json +1 -1
  70. data/lib/countries/cache/locales/ka.json +1 -1
  71. data/lib/countries/cache/locales/ki.json +1 -0
  72. data/lib/countries/cache/locales/kk.json +1 -1
  73. data/lib/countries/cache/locales/kl.json +1 -0
  74. data/lib/countries/cache/locales/km.json +1 -1
  75. data/lib/countries/cache/locales/kn.json +1 -1
  76. data/lib/countries/cache/locales/ko.json +1 -1
  77. data/lib/countries/cache/locales/ku.json +1 -1
  78. data/lib/countries/cache/locales/kv.json +1 -0
  79. data/lib/countries/cache/locales/kw.json +1 -0
  80. data/lib/countries/cache/locales/ky.json +1 -0
  81. data/lib/countries/cache/locales/lo.json +1 -0
  82. data/lib/countries/cache/locales/lt.json +1 -1
  83. data/lib/countries/cache/locales/lv.json +1 -1
  84. data/lib/countries/cache/locales/mi.json +1 -1
  85. data/lib/countries/cache/locales/mk.json +1 -1
  86. data/lib/countries/cache/locales/ml.json +1 -1
  87. data/lib/countries/cache/locales/mn.json +1 -1
  88. data/lib/countries/cache/locales/mr.json +1 -1
  89. data/lib/countries/cache/locales/ms.json +1 -1
  90. data/lib/countries/cache/locales/mt.json +1 -1
  91. data/lib/countries/cache/locales/my.json +1 -0
  92. data/lib/countries/cache/locales/na.json +1 -0
  93. data/lib/countries/cache/locales/nb.json +1 -1
  94. data/lib/countries/cache/locales/ne.json +1 -1
  95. data/lib/countries/cache/locales/nl.json +1 -1
  96. data/lib/countries/cache/locales/nn.json +1 -1
  97. data/lib/countries/cache/locales/nv.json +1 -0
  98. data/lib/countries/cache/locales/oc.json +1 -1
  99. data/lib/countries/cache/locales/or.json +1 -1
  100. data/lib/countries/cache/locales/pa.json +1 -1
  101. data/lib/countries/cache/locales/pi.json +1 -0
  102. data/lib/countries/cache/locales/pl.json +1 -1
  103. data/lib/countries/cache/locales/ps.json +1 -1
  104. data/lib/countries/cache/locales/pt-br.json +1 -0
  105. data/lib/countries/cache/locales/pt.json +1 -1
  106. data/lib/countries/cache/locales/ro.json +1 -1
  107. data/lib/countries/cache/locales/ru.json +1 -1
  108. data/lib/countries/cache/locales/rw.json +1 -1
  109. data/lib/countries/cache/locales/sc.json +1 -0
  110. data/lib/countries/cache/locales/sd.json +1 -0
  111. data/lib/countries/cache/locales/si.json +1 -1
  112. data/lib/countries/cache/locales/sk.json +1 -1
  113. data/lib/countries/cache/locales/sl.json +1 -1
  114. data/lib/countries/cache/locales/so.json +1 -1
  115. data/lib/countries/cache/locales/sq.json +1 -1
  116. data/lib/countries/cache/locales/sr.json +1 -1
  117. data/lib/countries/cache/locales/sv.json +1 -1
  118. data/lib/countries/cache/locales/sw.json +1 -1
  119. data/lib/countries/cache/locales/ta.json +1 -1
  120. data/lib/countries/cache/locales/te.json +1 -1
  121. data/lib/countries/cache/locales/tg.json +1 -0
  122. data/lib/countries/cache/locales/th.json +1 -1
  123. data/lib/countries/cache/locales/ti.json +1 -1
  124. data/lib/countries/cache/locales/tk.json +1 -1
  125. data/lib/countries/cache/locales/tl.json +1 -1
  126. data/lib/countries/cache/locales/tr.json +1 -1
  127. data/lib/countries/cache/locales/tt.json +1 -1
  128. data/lib/countries/cache/locales/ug.json +1 -1
  129. data/lib/countries/cache/locales/uk.json +1 -1
  130. data/lib/countries/cache/locales/ur.json +1 -0
  131. data/lib/countries/cache/locales/uz.json +1 -0
  132. data/lib/countries/cache/locales/ve.json +1 -1
  133. data/lib/countries/cache/locales/vi.json +1 -1
  134. data/lib/countries/cache/locales/wa.json +1 -1
  135. data/lib/countries/cache/locales/wo.json +1 -1
  136. data/lib/countries/cache/locales/xh.json +1 -1
  137. data/lib/countries/cache/locales/yo.json +1 -0
  138. data/lib/countries/cache/locales/zh-cn.json +1 -0
  139. data/lib/countries/cache/locales/zh-hk.json +1 -0
  140. data/lib/countries/cache/locales/zh-tw.json +1 -0
  141. data/lib/countries/cache/locales/zh.json +1 -1
  142. data/lib/countries/cache/locales/zu.json +1 -1
  143. data/lib/countries/country.rb +5 -0
  144. data/lib/countries/country/class_methods.rb +30 -3
  145. data/lib/countries/data.rb +47 -18
  146. data/lib/countries/data/countries/AD.yaml +1 -0
  147. data/lib/countries/data/countries/AF.yaml +1 -0
  148. data/lib/countries/data/countries/AG.yaml +1 -1
  149. data/lib/countries/data/countries/AI.yaml +1 -0
  150. data/lib/countries/data/countries/AL.yaml +4 -3
  151. data/lib/countries/data/countries/AM.yaml +3 -2
  152. data/lib/countries/data/countries/AO.yaml +10 -10
  153. data/lib/countries/data/countries/AQ.yaml +3 -3
  154. data/lib/countries/data/countries/AR.yaml +1 -0
  155. data/lib/countries/data/countries/AS.yaml +3 -2
  156. data/lib/countries/data/countries/AT.yaml +4 -3
  157. data/lib/countries/data/countries/AU.yaml +1 -0
  158. data/lib/countries/data/countries/AX.yaml +1 -0
  159. data/lib/countries/data/countries/AZ.yaml +1 -0
  160. data/lib/countries/data/countries/BA.yaml +5 -4
  161. data/lib/countries/data/countries/BB.yaml +1 -0
  162. data/lib/countries/data/countries/BD.yaml +3 -2
  163. data/lib/countries/data/countries/BE.yaml +2 -1
  164. data/lib/countries/data/countries/BF.yaml +8 -8
  165. data/lib/countries/data/countries/BG.yaml +5 -4
  166. data/lib/countries/data/countries/BH.yaml +6 -5
  167. data/lib/countries/data/countries/BI.yaml +6 -6
  168. data/lib/countries/data/countries/BJ.yaml +2 -2
  169. data/lib/countries/data/countries/BL.yaml +1 -0
  170. data/lib/countries/data/countries/BM.yaml +1 -0
  171. data/lib/countries/data/countries/BN.yaml +2 -1
  172. data/lib/countries/data/countries/BO.yaml +1 -1
  173. data/lib/countries/data/countries/BQ.yaml +1 -1
  174. data/lib/countries/data/countries/BR.yaml +7 -6
  175. data/lib/countries/data/countries/BT.yaml +7 -6
  176. data/lib/countries/data/countries/BV.yaml +11 -11
  177. data/lib/countries/data/countries/BW.yaml +4 -4
  178. data/lib/countries/data/countries/BY.yaml +1 -0
  179. data/lib/countries/data/countries/BZ.yaml +1 -1
  180. data/lib/countries/data/countries/CA.yaml +1 -0
  181. data/lib/countries/data/countries/CC.yaml +3 -2
  182. data/lib/countries/data/countries/CF.yaml +2 -2
  183. data/lib/countries/data/countries/CG.yaml +2 -2
  184. data/lib/countries/data/countries/CH.yaml +4 -3
  185. data/lib/countries/data/countries/CI.yaml +2 -2
  186. data/lib/countries/data/countries/CL.yaml +8 -2
  187. data/lib/countries/data/countries/CN.yaml +5 -4
  188. data/lib/countries/data/countries/CO.yaml +5 -4
  189. data/lib/countries/data/countries/CR.yaml +3 -2
  190. data/lib/countries/data/countries/CU.yaml +1 -0
  191. data/lib/countries/data/countries/CV.yaml +3 -2
  192. data/lib/countries/data/countries/CW.yaml +1 -1
  193. data/lib/countries/data/countries/CX.yaml +1 -0
  194. data/lib/countries/data/countries/CY.yaml +3 -2
  195. data/lib/countries/data/countries/CZ.yaml +5 -3
  196. data/lib/countries/data/countries/DE.yaml +3 -2
  197. data/lib/countries/data/countries/DJ.yaml +6 -6
  198. data/lib/countries/data/countries/DK.yaml +3 -2
  199. data/lib/countries/data/countries/DO.yaml +1 -0
  200. data/lib/countries/data/countries/DZ.yaml +7 -6
  201. data/lib/countries/data/countries/EC.yaml +5 -4
  202. data/lib/countries/data/countries/EE.yaml +4 -3
  203. data/lib/countries/data/countries/EG.yaml +1 -0
  204. data/lib/countries/data/countries/EH.yaml +1 -0
  205. data/lib/countries/data/countries/ES.yaml +2 -1
  206. data/lib/countries/data/countries/ET.yaml +1 -0
  207. data/lib/countries/data/countries/FI.yaml +6 -5
  208. data/lib/countries/data/countries/FK.yaml +3 -2
  209. data/lib/countries/data/countries/FM.yaml +3 -2
  210. data/lib/countries/data/countries/FO.yaml +6 -5
  211. data/lib/countries/data/countries/FR.yaml +4 -3
  212. data/lib/countries/data/countries/GA.yaml +1 -1
  213. data/lib/countries/data/countries/GB.yaml +6 -2
  214. data/lib/countries/data/countries/GE.yaml +5 -4
  215. data/lib/countries/data/countries/GF.yaml +1 -0
  216. data/lib/countries/data/countries/GG.yaml +11 -10
  217. data/lib/countries/data/countries/GH.yaml +4 -4
  218. data/lib/countries/data/countries/GI.yaml +3 -2
  219. data/lib/countries/data/countries/GL.yaml +8 -7
  220. data/lib/countries/data/countries/GM.yaml +4 -4
  221. data/lib/countries/data/countries/GN.yaml +4 -3
  222. data/lib/countries/data/countries/GP.yaml +1 -0
  223. data/lib/countries/data/countries/GR.yaml +3 -2
  224. data/lib/countries/data/countries/GS.yaml +3 -2
  225. data/lib/countries/data/countries/GT.yaml +3 -2
  226. data/lib/countries/data/countries/GU.yaml +1 -0
  227. data/lib/countries/data/countries/GW.yaml +1 -0
  228. data/lib/countries/data/countries/HK.yaml +4 -4
  229. data/lib/countries/data/countries/HM.yaml +2 -1
  230. data/lib/countries/data/countries/HN.yaml +3 -2
  231. data/lib/countries/data/countries/HR.yaml +4 -3
  232. data/lib/countries/data/countries/HT.yaml +1 -0
  233. data/lib/countries/data/countries/HU.yaml +8 -7
  234. data/lib/countries/data/countries/ID.yaml +1 -0
  235. data/lib/countries/data/countries/IE.yaml +12 -11
  236. data/lib/countries/data/countries/IL.yaml +1 -0
  237. data/lib/countries/data/countries/IM.yaml +9 -8
  238. data/lib/countries/data/countries/IN.yaml +3 -2
  239. data/lib/countries/data/countries/IO.yaml +4 -3
  240. data/lib/countries/data/countries/IQ.yaml +3 -2
  241. data/lib/countries/data/countries/IR.yaml +1 -0
  242. data/lib/countries/data/countries/IS.yaml +6 -5
  243. data/lib/countries/data/countries/IT.yaml +2 -1
  244. data/lib/countries/data/countries/JE.yaml +1 -0
  245. data/lib/countries/data/countries/JO.yaml +3 -2
  246. data/lib/countries/data/countries/JP.yaml +1 -0
  247. data/lib/countries/data/countries/KE.yaml +4 -3
  248. data/lib/countries/data/countries/KG.yaml +3 -2
  249. data/lib/countries/data/countries/KH.yaml +1 -0
  250. data/lib/countries/data/countries/KI.yaml +6 -6
  251. data/lib/countries/data/countries/KP.yaml +3 -2
  252. data/lib/countries/data/countries/KR.yaml +1 -0
  253. data/lib/countries/data/countries/KW.yaml +1 -0
  254. data/lib/countries/data/countries/KY.yaml +1 -0
  255. data/lib/countries/data/countries/KZ.yaml +3 -2
  256. data/lib/countries/data/countries/LA.yaml +7 -6
  257. data/lib/countries/data/countries/LB.yaml +1 -0
  258. data/lib/countries/data/countries/LI.yaml +1 -0
  259. data/lib/countries/data/countries/LK.yaml +1 -0
  260. data/lib/countries/data/countries/LR.yaml +1 -0
  261. data/lib/countries/data/countries/LS.yaml +1 -0
  262. data/lib/countries/data/countries/LT.yaml +7 -6
  263. data/lib/countries/data/countries/LU.yaml +1 -0
  264. data/lib/countries/data/countries/LV.yaml +11 -4
  265. data/lib/countries/data/countries/LY.yaml +1 -1
  266. data/lib/countries/data/countries/MA.yaml +5 -4
  267. data/lib/countries/data/countries/MC.yaml +1 -0
  268. data/lib/countries/data/countries/MD.yaml +9 -8
  269. data/lib/countries/data/countries/ME.yaml +3 -2
  270. data/lib/countries/data/countries/MF.yaml +1 -0
  271. data/lib/countries/data/countries/MG.yaml +1 -0
  272. data/lib/countries/data/countries/MH.yaml +3 -2
  273. data/lib/countries/data/countries/MK.yaml +5 -3
  274. data/lib/countries/data/countries/ML.yaml +4 -4
  275. data/lib/countries/data/countries/MM.yaml +1 -0
  276. data/lib/countries/data/countries/MN.yaml +9 -8
  277. data/lib/countries/data/countries/MP.yaml +1 -0
  278. data/lib/countries/data/countries/MQ.yaml +1 -0
  279. data/lib/countries/data/countries/MR.yaml +3 -3
  280. data/lib/countries/data/countries/MT.yaml +3 -2
  281. data/lib/countries/data/countries/MU.yaml +2 -1
  282. data/lib/countries/data/countries/MV.yaml +3 -2
  283. data/lib/countries/data/countries/MW.yaml +2 -2
  284. data/lib/countries/data/countries/MX.yaml +5 -4
  285. data/lib/countries/data/countries/MY.yaml +3 -2
  286. data/lib/countries/data/countries/MZ.yaml +1 -0
  287. data/lib/countries/data/countries/NA.yaml +5 -4
  288. data/lib/countries/data/countries/NC.yaml +1 -0
  289. data/lib/countries/data/countries/NE.yaml +5 -4
  290. data/lib/countries/data/countries/NF.yaml +1 -0
  291. data/lib/countries/data/countries/NG.yaml +2 -1
  292. data/lib/countries/data/countries/NI.yaml +3 -2
  293. data/lib/countries/data/countries/NL.yaml +4 -2
  294. data/lib/countries/data/countries/NO.yaml +3 -2
  295. data/lib/countries/data/countries/NP.yaml +7 -6
  296. data/lib/countries/data/countries/NZ.yaml +3 -2
  297. data/lib/countries/data/countries/OM.yaml +3 -2
  298. data/lib/countries/data/countries/PA.yaml +2 -2
  299. data/lib/countries/data/countries/PE.yaml +5 -4
  300. data/lib/countries/data/countries/PF.yaml +5 -4
  301. data/lib/countries/data/countries/PG.yaml +1 -0
  302. data/lib/countries/data/countries/PH.yaml +5 -4
  303. data/lib/countries/data/countries/PK.yaml +5 -4
  304. data/lib/countries/data/countries/PL.yaml +5 -4
  305. data/lib/countries/data/countries/PM.yaml +1 -0
  306. data/lib/countries/data/countries/PN.yaml +1 -0
  307. data/lib/countries/data/countries/PR.yaml +9 -8
  308. data/lib/countries/data/countries/PS.yaml +1 -1
  309. data/lib/countries/data/countries/PT.yaml +6 -5
  310. data/lib/countries/data/countries/PW.yaml +1 -0
  311. data/lib/countries/data/countries/PY.yaml +3 -2
  312. data/lib/countries/data/countries/QA.yaml +2 -2
  313. data/lib/countries/data/countries/RE.yaml +1 -0
  314. data/lib/countries/data/countries/RO.yaml +7 -6
  315. data/lib/countries/data/countries/RS.yaml +1 -0
  316. data/lib/countries/data/countries/RU.yaml +3 -2
  317. data/lib/countries/data/countries/RW.yaml +2 -2
  318. data/lib/countries/data/countries/SA.yaml +4 -3
  319. data/lib/countries/data/countries/SB.yaml +1 -1
  320. data/lib/countries/data/countries/SC.yaml +2 -2
  321. data/lib/countries/data/countries/SD.yaml +3 -2
  322. data/lib/countries/data/countries/SE.yaml +5 -4
  323. data/lib/countries/data/countries/SG.yaml +1 -0
  324. data/lib/countries/data/countries/SH.yaml +5 -4
  325. data/lib/countries/data/countries/SI.yaml +5 -4
  326. data/lib/countries/data/countries/SJ.yaml +6 -5
  327. data/lib/countries/data/countries/SK.yaml +7 -6
  328. data/lib/countries/data/countries/SL.yaml +2 -2
  329. data/lib/countries/data/countries/SM.yaml +1 -0
  330. data/lib/countries/data/countries/SN.yaml +5 -4
  331. data/lib/countries/data/countries/SO.yaml +2 -1
  332. data/lib/countries/data/countries/SS.yaml +2 -2
  333. data/lib/countries/data/countries/SV.yaml +1 -0
  334. data/lib/countries/data/countries/SX.yaml +1 -1
  335. data/lib/countries/data/countries/SZ.yaml +2 -1
  336. data/lib/countries/data/countries/TC.yaml +1 -0
  337. data/lib/countries/data/countries/TD.yaml +1 -1
  338. data/lib/countries/data/countries/TF.yaml +5 -5
  339. data/lib/countries/data/countries/TG.yaml +7 -7
  340. data/lib/countries/data/countries/TH.yaml +3 -1
  341. data/lib/countries/data/countries/TJ.yaml +1 -0
  342. data/lib/countries/data/countries/TM.yaml +1 -0
  343. data/lib/countries/data/countries/TN.yaml +1 -0
  344. data/lib/countries/data/countries/TR.yaml +1 -0
  345. data/lib/countries/data/countries/TV.yaml +3 -3
  346. data/lib/countries/data/countries/TW.yaml +1 -0
  347. data/lib/countries/data/countries/TZ.yaml +4 -3
  348. data/lib/countries/data/countries/UA.yaml +7 -6
  349. data/lib/countries/data/countries/UG.yaml +4 -4
  350. data/lib/countries/data/countries/UM.yaml +1 -0
  351. data/lib/countries/data/countries/US.yaml +2 -0
  352. data/lib/countries/data/countries/UY.yaml +3 -2
  353. data/lib/countries/data/countries/UZ.yaml +1 -0
  354. data/lib/countries/data/countries/VA.yaml +1 -0
  355. data/lib/countries/data/countries/VC.yaml +3 -2
  356. data/lib/countries/data/countries/VE.yaml +3 -2
  357. data/lib/countries/data/countries/VG.yaml +2 -1
  358. data/lib/countries/data/countries/VI.yaml +1 -0
  359. data/lib/countries/data/countries/VN.yaml +11 -4
  360. data/lib/countries/data/countries/WF.yaml +1 -0
  361. data/lib/countries/data/countries/WS.yaml +4 -4
  362. data/lib/countries/data/countries/YT.yaml +1 -0
  363. data/lib/countries/data/countries/ZA.yaml +5 -4
  364. data/lib/countries/data/countries/ZM.yaml +5 -4
  365. data/lib/countries/data/countries/ZW.yaml +4 -4
  366. data/lib/countries/data/subdivisions/AD.yaml +35 -28
  367. data/lib/countries/data/subdivisions/AE.yaml +142 -63
  368. data/lib/countries/data/subdivisions/AF.yaml +569 -298
  369. data/lib/countries/data/subdivisions/AG.yaml +141 -68
  370. data/lib/countries/data/subdivisions/AI.yaml +139 -125
  371. data/lib/countries/data/subdivisions/AL.yaml +472 -156
  372. data/lib/countries/data/subdivisions/AM.yaml +235 -99
  373. data/lib/countries/data/subdivisions/AO.yaml +344 -162
  374. data/lib/countries/data/subdivisions/AR.yaml +447 -210
  375. data/lib/countries/data/subdivisions/AS.yaml +64 -45
  376. data/lib/countries/data/subdivisions/AT.yaml +200 -81
  377. data/lib/countries/data/subdivisions/AU.yaml +211 -72
  378. data/lib/countries/data/subdivisions/AW.yaml +9 -0
  379. data/lib/countries/data/subdivisions/AX.yaml +38 -27
  380. data/lib/countries/data/subdivisions/AZ.yaml +1547 -666
  381. data/lib/countries/data/subdivisions/BA.yaml +198 -28
  382. data/lib/countries/data/subdivisions/BB.yaml +187 -99
  383. data/lib/countries/data/subdivisions/BD.yaml +1246 -585
  384. data/lib/countries/data/subdivisions/BE.yaml +276 -100
  385. data/lib/countries/data/subdivisions/BF.yaml +987 -418
  386. data/lib/countries/data/subdivisions/BG.yaml +599 -246
  387. data/lib/countries/data/subdivisions/BH.yaml +73 -40
  388. data/lib/countries/data/subdivisions/BI.yaml +299 -141
  389. data/lib/countries/data/subdivisions/BJ.yaml +214 -108
  390. data/lib/countries/data/subdivisions/BL.yaml +11 -0
  391. data/lib/countries/data/subdivisions/BM.yaml +110 -99
  392. data/lib/countries/data/subdivisions/BN.yaml +63 -36
  393. data/lib/countries/data/subdivisions/BO.yaml +157 -81
  394. data/lib/countries/data/subdivisions/BQ.yaml +61 -26
  395. data/lib/countries/data/subdivisions/BR.yaml +663 -243
  396. data/lib/countries/data/subdivisions/BS.yaml +637 -151
  397. data/lib/countries/data/subdivisions/BT.yaml +346 -180
  398. data/lib/countries/data/subdivisions/BW.yaml +291 -87
  399. data/lib/countries/data/subdivisions/BY.yaml +140 -59
  400. data/lib/countries/data/subdivisions/BZ.yaml +97 -54
  401. data/lib/countries/data/subdivisions/CA.yaml +356 -118
  402. data/lib/countries/data/subdivisions/CD.yaml +453 -97
  403. data/lib/countries/data/subdivisions/CF.yaml +289 -153
  404. data/lib/countries/data/subdivisions/CG.yaml +214 -98
  405. data/lib/countries/data/subdivisions/CH.yaml +593 -234
  406. data/lib/countries/data/subdivisions/CI.yaml +443 -90
  407. data/lib/countries/data/subdivisions/CK.yaml +110 -99
  408. data/lib/countries/data/subdivisions/CL.yaml +285 -134
  409. data/lib/countries/data/subdivisions/CM.yaml +186 -90
  410. data/lib/countries/data/subdivisions/CN.yaml +34 -34
  411. data/lib/countries/data/subdivisions/CO.yaml +610 -297
  412. data/lib/countries/data/subdivisions/CP.yaml +4 -0
  413. data/lib/countries/data/subdivisions/CR.yaml +119 -63
  414. data/lib/countries/data/subdivisions/CU.yaml +269 -144
  415. data/lib/countries/data/subdivisions/CV.yaml +416 -151
  416. data/lib/countries/data/subdivisions/CW.yaml +9 -0
  417. data/lib/countries/data/subdivisions/CY.yaml +102 -54
  418. data/lib/countries/data/subdivisions/CZ.yaml +2543 -197
  419. data/lib/countries/data/subdivisions/DE.yaml +450 -144
  420. data/lib/countries/data/subdivisions/DJ.yaml +108 -54
  421. data/lib/countries/data/subdivisions/DK.yaml +194 -109
  422. data/lib/countries/data/subdivisions/DM.yaml +159 -90
  423. data/lib/countries/data/subdivisions/DO.yaml +671 -289
  424. data/lib/countries/data/subdivisions/DZ.yaml +812 -435
  425. data/lib/countries/data/subdivisions/EC.yaml +390 -215
  426. data/lib/countries/data/subdivisions/EE.yaml +273 -135
  427. data/lib/countries/data/subdivisions/EG.yaml +472 -243
  428. data/lib/countries/data/subdivisions/EH.yaml +24 -16
  429. data/lib/countries/data/subdivisions/ER.yaml +109 -54
  430. data/lib/countries/data/subdivisions/ES.yaml +1696 -464
  431. data/lib/countries/data/subdivisions/ET.yaml +204 -99
  432. data/lib/countries/data/subdivisions/FI.yaml +408 -43
  433. data/lib/countries/data/subdivisions/FJ.yaml +312 -58
  434. data/lib/countries/data/subdivisions/FM.yaml +64 -36
  435. data/lib/countries/data/subdivisions/FO.yaml +60 -54
  436. data/lib/countries/data/subdivisions/FR.yaml +2790 -982
  437. data/lib/countries/data/subdivisions/GA.yaml +159 -81
  438. data/lib/countries/data/subdivisions/GB.yaml +4970 -1982
  439. data/lib/countries/data/subdivisions/GD.yaml +114 -63
  440. data/lib/countries/data/subdivisions/GE.yaml +236 -108
  441. data/lib/countries/data/subdivisions/GF.yaml +11 -0
  442. data/lib/countries/data/subdivisions/GG.yaml +110 -99
  443. data/lib/countries/data/subdivisions/GH.yaml +254 -88
  444. data/lib/countries/data/subdivisions/GL.yaml +87 -4
  445. data/lib/countries/data/subdivisions/GM.yaml +122 -54
  446. data/lib/countries/data/subdivisions/GN.yaml +706 -312
  447. data/lib/countries/data/subdivisions/GP.yaml +11 -0
  448. data/lib/countries/data/subdivisions/GQ.yaml +141 -81
  449. data/lib/countries/data/subdivisions/GR.yaml +642 -226
  450. data/lib/countries/data/subdivisions/GT.yaml +351 -198
  451. data/lib/countries/data/subdivisions/GU.yaml +198 -171
  452. data/lib/countries/data/subdivisions/GW.yaml +189 -79
  453. data/lib/countries/data/subdivisions/GY.yaml +163 -90
  454. data/lib/countries/data/subdivisions/HK.yaml +194 -162
  455. data/lib/countries/data/subdivisions/HN.yaml +275 -162
  456. data/lib/countries/data/subdivisions/HR.yaml +428 -189
  457. data/lib/countries/data/subdivisions/HT.yaml +178 -81
  458. data/lib/countries/data/subdivisions/HU.yaml +792 -381
  459. data/lib/countries/data/subdivisions/IC.yaml +4 -0
  460. data/lib/countries/data/subdivisions/ID.yaml +2303 -1868
  461. data/lib/countries/data/subdivisions/IE.yaml +634 -238
  462. data/lib/countries/data/subdivisions/IL.yaml +114 -54
  463. data/lib/countries/data/subdivisions/IM.yaml +240 -216
  464. data/lib/countries/data/subdivisions/IN.yaml +972 -337
  465. data/lib/countries/data/subdivisions/IQ.yaml +316 -157
  466. data/lib/countries/data/subdivisions/IR.yaml +591 -268
  467. data/lib/countries/data/subdivisions/IS.yaml +158 -76
  468. data/lib/countries/data/subdivisions/IT.yaml +2686 -1009
  469. data/lib/countries/data/subdivisions/JE.yaml +120 -108
  470. data/lib/countries/data/subdivisions/JM.yaml +243 -126
  471. data/lib/countries/data/subdivisions/JO.yaml +182 -97
  472. data/lib/countries/data/subdivisions/JP.yaml +950 -425
  473. data/lib/countries/data/subdivisions/KE.yaml +800 -79
  474. data/lib/countries/data/subdivisions/KG.yaml +186 -72
  475. data/lib/countries/data/subdivisions/KH.yaml +436 -216
  476. data/lib/countries/data/subdivisions/KI.yaml +57 -27
  477. data/lib/countries/data/subdivisions/KM.yaml +49 -27
  478. data/lib/countries/data/subdivisions/KN.yaml +307 -127
  479. data/lib/countries/data/subdivisions/KP.yaml +361 -67
  480. data/lib/countries/data/subdivisions/KR.yaml +376 -134
  481. data/lib/countries/data/subdivisions/KW.yaml +88 -54
  482. data/lib/countries/data/subdivisions/KY.yaml +36 -24
  483. data/lib/countries/data/subdivisions/KZ.yaml +360 -151
  484. data/lib/countries/data/subdivisions/LA.yaml +296 -157
  485. data/lib/countries/data/subdivisions/LB.yaml +130 -49
  486. data/lib/countries/data/subdivisions/LC.yaml +167 -10
  487. data/lib/countries/data/subdivisions/LI.yaml +154 -68
  488. data/lib/countries/data/subdivisions/LK.yaml +556 -233
  489. data/lib/countries/data/subdivisions/LR.yaml +253 -126
  490. data/lib/countries/data/subdivisions/LS.yaml +149 -90
  491. data/lib/countries/data/subdivisions/LT.yaml +1090 -149
  492. data/lib/countries/data/subdivisions/LU.yaml +198 -27
  493. data/lib/countries/data/subdivisions/LV.yaml +2332 -277
  494. data/lib/countries/data/subdivisions/LY.yaml +341 -184
  495. data/lib/countries/data/subdivisions/MA.yaml +1487 -562
  496. data/lib/countries/data/subdivisions/MC.yaml +265 -17
  497. data/lib/countries/data/subdivisions/MD.yaml +633 -127
  498. data/lib/countries/data/subdivisions/ME.yaml +429 -190
  499. data/lib/countries/data/subdivisions/MF.yaml +9 -0
  500. data/lib/countries/data/subdivisions/MG.yaml +93 -54
  501. data/lib/countries/data/subdivisions/MH.yaml +429 -213
  502. data/lib/countries/data/subdivisions/MK.yaml +3083 -425
  503. data/lib/countries/data/subdivisions/ML.yaml +185 -80
  504. data/lib/countries/data/subdivisions/MM.yaml +274 -126
  505. data/lib/countries/data/subdivisions/MN.yaml +420 -198
  506. data/lib/countries/data/subdivisions/MO.yaml +9 -0
  507. data/lib/countries/data/subdivisions/MP.yaml +54 -36
  508. data/lib/countries/data/subdivisions/MQ.yaml +11 -0
  509. data/lib/countries/data/subdivisions/MR.yaml +249 -115
  510. data/lib/countries/data/subdivisions/MS.yaml +30 -27
  511. data/lib/countries/data/subdivisions/MT.yaml +1059 -612
  512. data/lib/countries/data/subdivisions/MU.yaml +314 -147
  513. data/lib/countries/data/subdivisions/MV.yaml +466 -192
  514. data/lib/countries/data/subdivisions/MW.yaml +536 -246
  515. data/lib/countries/data/subdivisions/MX.yaml +707 -288
  516. data/lib/countries/data/subdivisions/MY.yaml +334 -144
  517. data/lib/countries/data/subdivisions/MZ.yaml +188 -93
  518. data/lib/countries/data/subdivisions/NA.yaml +221 -120
  519. data/lib/countries/data/subdivisions/NC.yaml +44 -27
  520. data/lib/countries/data/subdivisions/NE.yaml +161 -72
  521. data/lib/countries/data/subdivisions/NG.yaml +833 -333
  522. data/lib/countries/data/subdivisions/NI.yaml +260 -153
  523. data/lib/countries/data/subdivisions/NL.yaml +382 -113
  524. data/lib/countries/data/subdivisions/NO.yaml +633 -1096
  525. data/lib/countries/data/subdivisions/NP.yaml +389 -130
  526. data/lib/countries/data/subdivisions/NR.yaml +260 -126
  527. data/lib/countries/data/subdivisions/NZ.yaml +322 -151
  528. data/lib/countries/data/subdivisions/OM.yaml +205 -66
  529. data/lib/countries/data/subdivisions/PA.yaml +204 -113
  530. data/lib/countries/data/subdivisions/PE.yaml +418 -234
  531. data/lib/countries/data/subdivisions/PF.yaml +60 -45
  532. data/lib/countries/data/subdivisions/PG.yaml +383 -177
  533. data/lib/countries/data/subdivisions/PH.yaml +1867 -767
  534. data/lib/countries/data/subdivisions/PK.yaml +185 -63
  535. data/lib/countries/data/subdivisions/PL.yaml +1161 -143
  536. data/lib/countries/data/subdivisions/PM.yaml +30 -18
  537. data/lib/countries/data/subdivisions/PR.yaml +794 -702
  538. data/lib/countries/data/subdivisions/PS.yaml +265 -16
  539. data/lib/countries/data/subdivisions/PT.yaml +341 -180
  540. data/lib/countries/data/subdivisions/PW.yaml +265 -144
  541. data/lib/countries/data/subdivisions/PY.yaml +321 -162
  542. data/lib/countries/data/subdivisions/QA.yaml +165 -71
  543. data/lib/countries/data/subdivisions/RE.yaml +11 -0
  544. data/lib/countries/data/subdivisions/RO.yaml +731 -381
  545. data/lib/countries/data/subdivisions/RS.yaml +582 -261
  546. data/lib/countries/data/subdivisions/RU.yaml +1873 -750
  547. data/lib/countries/data/subdivisions/RW.yaml +100 -45
  548. data/lib/countries/data/subdivisions/SA.yaml +234 -117
  549. data/lib/countries/data/subdivisions/SB.yaml +169 -90
  550. data/lib/countries/data/subdivisions/SC.yaml +457 -208
  551. data/lib/countries/data/subdivisions/SD.yaml +142 -18
  552. data/lib/countries/data/subdivisions/SE.yaml +435 -258
  553. data/lib/countries/data/subdivisions/SG.yaml +117 -25
  554. data/lib/countries/data/subdivisions/SH.yaml +68 -18
  555. data/lib/countries/data/subdivisions/SI.yaml +3605 -1760
  556. data/lib/countries/data/subdivisions/SJ.yaml +20 -18
  557. data/lib/countries/data/subdivisions/SK.yaml +129 -72
  558. data/lib/countries/data/subdivisions/SL.yaml +80 -35
  559. data/lib/countries/data/subdivisions/SM.yaml +158 -81
  560. data/lib/countries/data/subdivisions/SN.yaml +232 -101
  561. data/lib/countries/data/subdivisions/SO.yaml +313 -161
  562. data/lib/countries/data/subdivisions/SR.yaml +158 -90
  563. data/lib/countries/data/subdivisions/SS.yaml +196 -10
  564. data/lib/countries/data/subdivisions/ST.yaml +30 -18
  565. data/lib/countries/data/subdivisions/SV.yaml +233 -126
  566. data/lib/countries/data/subdivisions/SX.yaml +9 -0
  567. data/lib/countries/data/subdivisions/SY.yaml +219 -124
  568. data/lib/countries/data/subdivisions/SZ.yaml +64 -35
  569. data/lib/countries/data/subdivisions/TA.yaml +4 -0
  570. data/lib/countries/data/subdivisions/TD.yaml +408 -161
  571. data/lib/countries/data/subdivisions/TF.yaml +34 -16
  572. data/lib/countries/data/subdivisions/TG.yaml +75 -45
  573. data/lib/countries/data/subdivisions/TH.yaml +1449 -694
  574. data/lib/countries/data/subdivisions/TJ.yaml +98 -28
  575. data/lib/countries/data/subdivisions/TK.yaml +30 -27
  576. data/lib/countries/data/subdivisions/TL.yaml +209 -117
  577. data/lib/countries/data/subdivisions/TM.yaml +116 -45
  578. data/lib/countries/data/subdivisions/TN.yaml +412 -216
  579. data/lib/countries/data/subdivisions/TO.yaml +76 -45
  580. data/lib/countries/data/subdivisions/TR.yaml +1818 -730
  581. data/lib/countries/data/subdivisions/TT.yaml +296 -131
  582. data/lib/countries/data/subdivisions/TV.yaml +130 -64
  583. data/lib/countries/data/subdivisions/TW.yaml +481 -187
  584. data/lib/countries/data/subdivisions/TZ.yaml +635 -237
  585. data/lib/countries/data/subdivisions/UA.yaml +504 -243
  586. data/lib/countries/data/subdivisions/UG.yaml +2237 -752
  587. data/lib/countries/data/subdivisions/UM.yaml +216 -80
  588. data/lib/countries/data/subdivisions/US.yaml +1570 -495
  589. data/lib/countries/data/subdivisions/UY.yaml +364 -170
  590. data/lib/countries/data/subdivisions/UZ.yaml +288 -127
  591. data/lib/countries/data/subdivisions/VC.yaml +96 -53
  592. data/lib/countries/data/subdivisions/VE.yaml +456 -225
  593. data/lib/countries/data/subdivisions/VI.yaml +44 -27
  594. data/lib/countries/data/subdivisions/VN.yaml +3583 -2980
  595. data/lib/countries/data/subdivisions/VU.yaml +98 -54
  596. data/lib/countries/data/subdivisions/WF.yaml +73 -3
  597. data/lib/countries/data/subdivisions/WS.yaml +200 -99
  598. data/lib/countries/data/subdivisions/YE.yaml +376 -173
  599. data/lib/countries/data/subdivisions/YT.yaml +178 -153
  600. data/lib/countries/data/subdivisions/ZA.yaml +230 -81
  601. data/lib/countries/data/subdivisions/ZM.yaml +156 -81
  602. data/lib/countries/data/subdivisions/ZW.yaml +153 -83
  603. data/lib/countries/data/translation_corrections.yaml +10 -1
  604. data/lib/countries/sources/cldr/downloader.rb +12 -13
  605. data/lib/countries/structure.rb +1 -0
  606. data/lib/countries/tasks/geocoding.rake +9 -16
  607. data/lib/countries/tasks/postal_codes.rake +48 -0
  608. data/lib/countries/translations.rb +1 -1
  609. data/lib/countries/version.rb +1 -1
  610. data/spec/country_spec.rb +86 -9
  611. data/spec/data_spec.rb +4 -4
  612. data/spec/subdivision_spec.rb +14 -0
  613. data/spec/thread_safety_spec.rb +46 -0
  614. metadata +75 -29
  615. data/.travis.yml +0 -16
@@ -1,6 +1,6 @@
1
1
  # Contains fixes for upstream pkg-iso-codes
2
2
  # Any change here should have an upstream bug report
3
- # https://alioth.debian.org/projects/pkg-iso-codes/
3
+ # https://salsa.debian.org/iso-codes-team/iso-codes
4
4
  #
5
5
  # These changes are applied during `rake update_cache`
6
6
  #
@@ -21,8 +21,12 @@ ar:
21
21
  SY: "سوريا"
22
22
  BQ: "بونير، سينت أوستاتيوس وسابا"
23
23
  CW: "كوراساو"
24
+ nn:
25
+ PT: Portugal
24
26
  zh:
25
27
  KH: '柬埔寨'
28
+ zh_cn:
29
+ KH: '柬埔寨'
26
30
  fa:
27
31
  IR: "ایران"
28
32
  he:
@@ -30,3 +34,8 @@ he:
30
34
  VI: "איי הבתולה (ארה)"
31
35
  sv:
32
36
  GB: "Storbritannien"
37
+ RU: "Ryssland"
38
+ pt:
39
+ CZ: 'República Checa'
40
+ da:
41
+ CZ: 'Tjekkiet'
@@ -2,6 +2,8 @@ require 'uri'
2
2
  require 'net/http'
3
3
  require 'nokogiri'
4
4
  require 'fileutils'
5
+ require 'json'
6
+
5
7
  module Sources
6
8
  module CLDR
7
9
  module Downloader
@@ -14,22 +16,19 @@ module Sources
14
16
  def download_folder(type)
15
17
  folder = File.join(ISO3166_ROOT_PATH, 'tmp', 'cldr', 'trunk', 'common', type)
16
18
  FileUtils.mkdir_p(folder)
17
- doc = Nokogiri::HTML get(type + '/')
18
- doc.css('a[href]').map { |e| e.attributes['href'].value }.each do |href|
19
- next if href == '../'
20
- File.write(File.join(folder, href), get([type, href].join('/')))
19
+ url = URI.parse("https://api.github.com/repos/unicode-org/cldr/contents/common/" + type)
20
+ path_listing = JSON.parse(Net::HTTP.get_response(url).body)
21
+ path_listing.each do |path|
22
+ if path['name'] =~ /\.xml$/
23
+ File.open(File.join(folder, path['name']), 'w') do |f|
24
+ raw_url = URI.parse(path['download_url'])
25
+ f.write(Net::HTTP.get_response(raw_url).body)
26
+ end
27
+ end
21
28
  end
22
29
  end
23
30
 
24
- def get(path)
25
- url = URI("http://www.unicode.org/repos/cldr/trunk/common/#{path}")
26
-
27
- http = Net::HTTP.new(url.host, url.port)
28
-
29
- request = Net::HTTP::Get.new(url)
30
- response = http.request(request)
31
- response.read_body
32
- end
33
31
  end
34
32
  end
35
33
  end
34
+
@@ -42,6 +42,7 @@ module ISO3166
42
42
  'languages_spoken' => [],
43
43
  'translations' => {},
44
44
  'postal_code' => nil,
45
+ 'postal_code_format' => nil,
45
46
  'region' => nil,
46
47
  'unofficial_names' => [],
47
48
  'start_of_week' => 'monday',
@@ -2,7 +2,9 @@ require 'geocoder'
2
2
  require 'retryable'
3
3
 
4
4
  Geocoder.configure(
5
- timeout: 10
5
+ lookup: :google,
6
+ timeout: 10,
7
+ api_key: GOOGLE_API_KEY
6
8
  )
7
9
 
8
10
  # raise on geocoding errors such as query limit exceeded
@@ -10,9 +12,9 @@ Geocoder.configure(always_raise: :all)
10
12
  # Try to geocode a given query, on exceptions it retries up to 3 times then gives up.
11
13
  # @param [String] query string to geocode
12
14
  # @return [Hash] first valid result or nil
13
- def geocode(query)
15
+ def geocode(query, params)
14
16
  Retryable.retryable(tries: 3, sleep: ->(n) { 2**n }) do
15
- Geocoder.search(query).first
17
+ Geocoder.search(query, params: params).first
16
18
  end
17
19
  rescue => e
18
20
  warn "Attempts exceeded for query #{query}, last error was #{e.message}"
@@ -41,12 +43,8 @@ namespace :geocode do
41
43
  # Load unmutated yaml file.
42
44
  data = load_country_yaml(country.alpha2)
43
45
 
44
- lookup = "#{country.alpha2} country"
45
- # LU country lookup appears to match to Los Angeles
46
- lookup = country.name if country.alpha2 == 'LU'
47
-
48
- next unless (result = geocode(lookup))
49
- puts 'WARNING:: Geocoder returned something that was not a country' unless result.types.include?('country')
46
+ next unless (result = geocode(country.name, {region: country.alpha2}))
47
+ puts "WARNING:: Geocoder returned something that was not a country for #{country.alpha2}" unless result.types.include?('country')
50
48
  geometry = result.geometry
51
49
 
52
50
  # Extract center point data
@@ -76,15 +74,10 @@ namespace :geocode do
76
74
  # Iterate subdivisions
77
75
  state_data = c.subdivisions.dup
78
76
  state_data.reject { |_, data| data['geo'] }.each do |code, data|
79
- location = "#{data['name']}, #{c.name}"
77
+ location = "#{c.alpha2}-#{code}"
80
78
 
81
- # Handle special geocoding cases where Google defaults to well known
82
- # cities, instead of the states.
83
- if c.alpha2 == 'US' && %w(NY WA OK).include?(code)
84
- location = "#{data['name']} State, United States"
85
- end
79
+ next unless (result = geocode(location, {region: c.alpha2}))
86
80
 
87
- next unless (result = geocode(location))
88
81
  geometry = result.geometry
89
82
  if geometry['location']
90
83
  state_data[code]['geo'] ||= {}
@@ -0,0 +1,48 @@
1
+ namespace :postal_codes do
2
+ desc 'Retrieve and update postal codes and their format'
3
+ task :update do
4
+ require 'json'
5
+ require 'open-uri'
6
+ require 'yaml'
7
+
8
+ country_files = Dir['lib/countries/data/countries/*.yaml'].sort
9
+
10
+ country_files.each do |country_file|
11
+ yaml = YAML.load_file(country_file)
12
+ country_code = File.basename(country_file, File.extname(country_file))
13
+ print "\rUpdating #{country_code}"
14
+
15
+ data = yaml[country_code].to_a
16
+ postal_code_index = data.find_index { |d| d[0] == 'postal_code' }
17
+ postal_code_format_index = data.find_index { |d| d[0] == 'postal_code_format' }
18
+
19
+ response = URI.open("https://chromium-i18n.appspot.com/ssl-address/data/#{country_code}").read
20
+ json = JSON.parse(response) rescue {}
21
+ puts ' - Returned empty data. Skipping ' and next if json.empty?
22
+
23
+ postal_code = ['postal_code', !!json['zip']]
24
+ postal_code_format = ['postal_code_format', json['zip']]
25
+
26
+ if postal_code_index
27
+ data[postal_code_index] = postal_code
28
+ else
29
+ postal_code_index = data.find_index { |d| d[0] == 'nationality' } + 1 || data.size
30
+ data.insert(postal_code_index, postal_code)
31
+ end
32
+
33
+ if json['zip']
34
+ if postal_code_format_index
35
+ data[postal_code_format_index] = postal_code_format
36
+ else
37
+ data.insert(postal_code_index + 1, postal_code_format)
38
+ end
39
+ elsif postal_code_format_index
40
+ data.delete_at(postal_code_format_index)
41
+ end
42
+
43
+ yaml[country_code] = data.to_h
44
+
45
+ File.open(country_file, 'w') { |file| file.write(yaml.to_yaml) }
46
+ end
47
+ end
48
+ end
@@ -6,7 +6,7 @@ module ISO3166
6
6
  # to `pt` to prevent from showing nil values
7
7
  class Translations < Hash
8
8
  def [](locale)
9
- super(locale) || super(locale.sub(/-.*/, ''))
9
+ super(locale) || super(locale.to_s.sub(/-.*/, ''))
10
10
  end
11
11
  end
12
12
  end
@@ -1,3 +1,3 @@
1
1
  module Countries
2
- VERSION = '3.0.0'.freeze
2
+ VERSION = '4.0.1'.freeze
3
3
  end
data/spec/country_spec.rb CHANGED
@@ -48,7 +48,7 @@ describe ISO3166::Country do
48
48
  end
49
49
 
50
50
  it 'should return alternate names' do
51
- expect(country.names).to eq(['United States', 'Vereinigte Staaten von Amerika', 'États-Unis', 'Estados Unidos', 'アメリカ合衆国', 'Verenigde Staten'])
51
+ expect(country.names).to eq(['United States', 'Murica', 'Vereinigte Staaten von Amerika', 'États-Unis', 'Estados Unidos', 'アメリカ合衆国', 'Verenigde Staten'])
52
52
  end
53
53
 
54
54
  it 'should return translations' do
@@ -85,8 +85,18 @@ describe ISO3166::Country do
85
85
  end
86
86
 
87
87
  it 'knows when a country does not require postal codes' do
88
- ireland = ISO3166::Country.search('IE')
89
- expect(ireland.postal_code).to eq(false)
88
+ antarctica = ISO3166::Country.search('AQ')
89
+ expect(antarctica.postal_code).to eq(false)
90
+ end
91
+
92
+ it 'knows about the country postal code format' do
93
+ expect(country.postal_code_format).to_not be_nil
94
+
95
+ regex = Regexp.new(country.postal_code_format)
96
+ expect(regex).to match("12345-6789")
97
+
98
+ antarctica = ISO3166::Country.search('AQ')
99
+ expect(antarctica.postal_code_format).to be_nil
90
100
  end
91
101
 
92
102
  it 'should return region' do
@@ -322,7 +332,7 @@ describe ISO3166::Country do
322
332
  countries = ISO3166::Country.all_translated('fr')
323
333
  expect(countries).to be_an(Array)
324
334
  expect(countries.first).to be_a(String)
325
- expect(countries.first).to eq('Afghanistan')
335
+ expect(countries.first).to eq('Aruba')
326
336
  # countries missing the desired locale will not be added to the list
327
337
  # so all 250 countries may not be returned, 'fr' returns 249, for example
328
338
  expect(countries.size).to eq(NUM_OF_COUNTRIES)
@@ -332,9 +342,29 @@ describe ISO3166::Country do
332
342
  countries = ISO3166::Country.all_translated
333
343
  expect(countries).to be_an(Array)
334
344
  expect(countries.first).to be_a(String)
335
- expect(countries.first).to eq('Afghanistan')
345
+ expect(countries.first).to eq('Aruba')
336
346
  expect(countries.size).to eq(NUM_OF_COUNTRIES)
337
347
  end
348
+
349
+ context 'with custom countries' do
350
+ before do
351
+ ISO3166::Data.register(
352
+ alpha2: 'XX',
353
+ name: 'Custom Country',
354
+ translations: { 'en' => 'Custom Country' }
355
+ )
356
+ end
357
+
358
+ it 'should include custom registered countries' do
359
+ custom_country = ISO3166::Country.find_by_alpha2('XX')[1]
360
+ countries = ISO3166::Country.all_translated
361
+ expect(countries).to include(custom_country['name'])
362
+ end
363
+
364
+ after do
365
+ ISO3166::Data.unregister('XX')
366
+ end
367
+ end
338
368
  end
339
369
 
340
370
  describe 'all_names_with_codes' do
@@ -397,14 +427,31 @@ describe ISO3166::Country do
397
427
  countries = ISO3166::Country.new(:de).translation('xxx')
398
428
  expect(countries).to be_nil
399
429
  end
430
+
431
+ context 'should return variant locales' do
432
+ it 'should return different value for Chinese variants' do
433
+ ISO3166.configuration.locales = [:'zh-cn', :'zh-hk', :'zh-tw']
434
+ name_cn = ISO3166::Country['TW'].translation('zh-cn')
435
+ name_hk = ISO3166::Country['TW'].translation('zh-hk')
436
+ name_tw = ISO3166::Country['TW'].translation('zh-tw')
437
+ expect([name_cn, name_hk, name_tw].uniq.size).to eql 3
438
+ end
439
+
440
+ it 'should return different value for Portuguese variants' do
441
+ ISO3166.configuration.locales = [:pt, :'pt-br']
442
+ name_pt = ISO3166::Country['SG'].translation('pt')
443
+ name_br = ISO3166::Country['SG'].translation('pt-br')
444
+ expect([name_pt, name_br].uniq.size).to eql 2
445
+ end
446
+ end
400
447
  end
401
448
 
402
449
  describe 'translations' do
403
450
  it 'should return an hash of all country names translated to the selected locale' do
404
451
  countries = ISO3166::Country.translations('fr')
405
452
  expect(countries).to be_an(Hash)
406
- expect(countries.first[0]).to eq('AF')
407
- expect(countries.first).to eq(%w(AF Afghanistan))
453
+ expect(countries.first[0]).to eq('AW')
454
+ expect(countries.first).to eq(%w(AW Aruba))
408
455
  # countries missing the desired locale will not be added to the list
409
456
  # so all 250 countries may not be returned, 'fr' returns 249, for example
410
457
  expect(countries.size).to eq(NUM_OF_COUNTRIES)
@@ -413,8 +460,8 @@ describe ISO3166::Country do
413
460
  it 'should return an hash of all country names in English if no locale is passed' do
414
461
  countries = ISO3166::Country.translations
415
462
  expect(countries).to be_an(Hash)
416
- expect(countries.first[0]).to eq('AF')
417
- expect(countries.first).to eq(%w(AF Afghanistan))
463
+ expect(countries.first[0]).to eq('AW')
464
+ expect(countries.first).to eq(%w(AW Aruba))
418
465
  expect(countries.size).to eq(NUM_OF_COUNTRIES)
419
466
  end
420
467
  end
@@ -502,6 +549,19 @@ describe ISO3166::Country do
502
549
  expect(spain_data).to be_a Hash
503
550
  expect(spain_data.keys).to eq(['ES'])
504
551
  end
552
+
553
+ it 'performs reasonably' do
554
+ start = Time.now
555
+ 250.times do
556
+ lookup = ['ZM', 'ZMB', 'Zambia', 'US', 'USA', 'United States'].sample
557
+ case lookup.length
558
+ when 2 then ISO3166::Country.find_all_by(:alpha2, lookup)
559
+ when 3 then ISO3166::Country.find_all_by(:alpha3, lookup)
560
+ else ISO3166::Country.find_all_by(:name, lookup)
561
+ end
562
+ end
563
+ expect(Time.now - start).to be < 1
564
+ end
505
565
  end
506
566
 
507
567
  describe 'hash finder methods' do
@@ -798,6 +858,23 @@ describe ISO3166::Country do
798
858
  end
799
859
  end
800
860
 
861
+ describe 'in_esm?' do
862
+ let(:netherlands) { ISO3166::Country.search('NL') }
863
+ let(:switzerland) { ISO3166::Country.search('CH') }
864
+
865
+ it 'should return false for countries without esm_member or eea_member flag' do
866
+ expect(country.in_esm?).to be_falsey
867
+ end
868
+
869
+ it 'should return true for countries with eea_member flag set to true' do
870
+ expect(netherlands.in_esm?).to be_truthy
871
+ end
872
+
873
+ it 'should return true for countries with esm_member flag set to true' do
874
+ expect(switzerland.in_esm?).to be_truthy
875
+ end
876
+ end
877
+
801
878
  describe 'gec' do
802
879
  it 'should return the country\'s GEC code' do
803
880
  expect(ISO3166::Country.new('NA').gec).to eql 'WA'
data/spec/data_spec.rb CHANGED
@@ -116,8 +116,8 @@ describe ISO3166::Data do
116
116
  expect(subject.name).to eq 'NEW Taiwan'
117
117
  expect(subject.translations).to eq('en' => 'NEW Taiwan',
118
118
  'de' => 'NEW Taiwan')
119
- expect(subject.subdivisions).to eq(CHA: ISO3166::Subdivision.new({name: 'New Changhua'}),
120
- CYI: ISO3166::Subdivision.new({name: 'New Municipality'}))
119
+ expect(subject.subdivisions).to eq('CHA' => ISO3166::Subdivision.new({name: 'New Changhua'}),
120
+ 'CYI' => ISO3166::Subdivision.new({name: 'New Municipality'}))
121
121
  end
122
122
  end
123
123
 
@@ -143,8 +143,8 @@ describe ISO3166::Data do
143
143
  data = ISO3166::Data.new('LOL').call
144
144
  expect(data['name']).to eq 'Happy Country'
145
145
  expect(subject.name).to eq 'Happy Country'
146
- expect(subject.subdivisions).to eq(LOL1: ISO3166::Subdivision.new({name: 'Happy sub1'}),
147
- LOL2: ISO3166::Subdivision.new({name: 'Happy sub2'}))
146
+ expect(subject.subdivisions).to eq('LOL1' => ISO3166::Subdivision.new({name: 'Happy sub1'}),
147
+ 'LOL2' => ISO3166::Subdivision.new({name: 'Happy sub2'}))
148
148
  end
149
149
 
150
150
  it 'detect a stale cache' do
@@ -3,6 +3,10 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe ISO3166::Subdivision do
6
+ before do
7
+ ISO3166::Data.reset
8
+ end
9
+
6
10
  let(:countries) { ISO3166::Country.all }
7
11
  let(:available_types) { [Hash, NilClass] }
8
12
 
@@ -15,4 +19,14 @@ describe ISO3166::Subdivision do
15
19
  end
16
20
  end
17
21
  end
22
+
23
+ describe 'state codes' do
24
+ it 'should all be strings' do
25
+ countries.each do |country|
26
+ expect(country.subdivisions.keys).to all(be_a(String)), \
27
+ "Expected #{country.alpha2.inspect} to have string subdivision" \
28
+ "codes but had #{country.subdivisions.keys.inspect}"
29
+ end
30
+ end
31
+ end
18
32
  end
@@ -0,0 +1,46 @@
1
+ describe 'Accessing ISO3166::Country instances data in multiple threads' do
2
+ before do
3
+ if Thread.respond_to?(:report_on_exception)
4
+ @report_on_exception_value = Thread.report_on_exception
5
+ Thread.report_on_exception = false
6
+ end
7
+
8
+ ISO3166::Data.reset
9
+ end
10
+
11
+ def create_countries_threaded
12
+ nthreads = 100
13
+ threads = []
14
+
15
+ alpha2_codes = ['us', 'es', 'nl', 'ca', 'de', 'fr', 'mx', 'ru', 'ch', 'jp']
16
+
17
+ nthreads.times do
18
+ threads << Thread.new do
19
+ alpha2_codes.each do |a2|
20
+ country = ISO3166::Country[a2]
21
+ # This will fail if data['translations'] has been
22
+ # left nil due to a race condition
23
+ country.translation
24
+ end
25
+ end
26
+ end
27
+ threads.map(&:join)
28
+ end
29
+
30
+ it "doesn't raise any exceptions when using a mutex" do
31
+ expect { create_countries_threaded }.to_not raise_error
32
+ end
33
+
34
+ it "raises NoMethodError when not using a mutex" do
35
+ allow(ISO3166::Data).to receive(:use_mutex?).and_return(false)
36
+
37
+ expect { create_countries_threaded }.to raise_error(NoMethodError)
38
+ end
39
+
40
+ after do
41
+ if Thread.respond_to?(:report_on_exception)
42
+ Thread.report_on_exception = @report_on_exception_value
43
+ end
44
+ end
45
+ end
46
+