countries 1.2.2 → 4.2.3

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 (645) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/tests.yml +39 -0
  3. data/.gitignore +4 -1
  4. data/.rubocop.yml +1 -0
  5. data/.rubocop_todo.yml +52 -0
  6. data/CHANGELOG.md +570 -1
  7. data/Gemfile +7 -0
  8. data/LICENSE +3 -1
  9. data/README.markdown +261 -136
  10. data/Rakefile +44 -74
  11. data/bin/console +14 -0
  12. data/countries.gemspec +15 -9
  13. data/lib/countries/cache/countries.json +1 -0
  14. data/lib/countries/cache/locales/ab.json +1 -0
  15. data/lib/countries/cache/locales/af.json +1 -0
  16. data/lib/countries/cache/locales/ak.json +1 -0
  17. data/lib/countries/cache/locales/am.json +1 -0
  18. data/lib/countries/cache/locales/an.json +1 -0
  19. data/lib/countries/cache/locales/ar.json +1 -0
  20. data/lib/countries/cache/locales/as.json +1 -0
  21. data/lib/countries/cache/locales/ay.json +1 -0
  22. data/lib/countries/cache/locales/az.json +1 -0
  23. data/lib/countries/cache/locales/ba.json +1 -0
  24. data/lib/countries/cache/locales/be.json +1 -0
  25. data/lib/countries/cache/locales/bg.json +1 -0
  26. data/lib/countries/cache/locales/bi.json +1 -0
  27. data/lib/countries/cache/locales/bn-in.json +1 -0
  28. data/lib/countries/cache/locales/bn.json +1 -0
  29. data/lib/countries/cache/locales/br.json +1 -0
  30. data/lib/countries/cache/locales/bs.json +1 -0
  31. data/lib/countries/cache/locales/ca.json +1 -0
  32. data/lib/countries/cache/locales/ce.json +1 -0
  33. data/lib/countries/cache/locales/ch.json +1 -0
  34. data/lib/countries/cache/locales/cs.json +1 -0
  35. data/lib/countries/cache/locales/cv.json +1 -0
  36. data/lib/countries/cache/locales/cy.json +1 -0
  37. data/lib/countries/cache/locales/da.json +1 -0
  38. data/lib/countries/cache/locales/de.json +1 -0
  39. data/lib/countries/cache/locales/dv.json +1 -0
  40. data/lib/countries/cache/locales/dz.json +1 -0
  41. data/lib/countries/cache/locales/ee.json +1 -0
  42. data/lib/countries/cache/locales/el.json +1 -0
  43. data/lib/countries/cache/locales/en.json +1 -0
  44. data/lib/countries/cache/locales/eo.json +1 -0
  45. data/lib/countries/cache/locales/es.json +1 -0
  46. data/lib/countries/cache/locales/et.json +1 -0
  47. data/lib/countries/cache/locales/eu.json +1 -0
  48. data/lib/countries/cache/locales/fa.json +1 -0
  49. data/lib/countries/cache/locales/ff.json +1 -0
  50. data/lib/countries/cache/locales/fi.json +1 -0
  51. data/lib/countries/cache/locales/fo.json +1 -0
  52. data/lib/countries/cache/locales/fr.json +1 -0
  53. data/lib/countries/cache/locales/fy.json +1 -0
  54. data/lib/countries/cache/locales/ga.json +1 -0
  55. data/lib/countries/cache/locales/gl.json +1 -0
  56. data/lib/countries/cache/locales/gn.json +1 -0
  57. data/lib/countries/cache/locales/gu.json +1 -0
  58. data/lib/countries/cache/locales/gv.json +1 -0
  59. data/lib/countries/cache/locales/ha.json +1 -0
  60. data/lib/countries/cache/locales/he.json +1 -0
  61. data/lib/countries/cache/locales/hi.json +1 -0
  62. data/lib/countries/cache/locales/hr.json +1 -0
  63. data/lib/countries/cache/locales/ht.json +1 -0
  64. data/lib/countries/cache/locales/hu.json +1 -0
  65. data/lib/countries/cache/locales/hy.json +1 -0
  66. data/lib/countries/cache/locales/ia.json +1 -0
  67. data/lib/countries/cache/locales/id.json +1 -0
  68. data/lib/countries/cache/locales/io.json +1 -0
  69. data/lib/countries/cache/locales/is.json +1 -0
  70. data/lib/countries/cache/locales/it.json +1 -0
  71. data/lib/countries/cache/locales/iu.json +1 -0
  72. data/lib/countries/cache/locales/ja.json +1 -0
  73. data/lib/countries/cache/locales/ka.json +1 -0
  74. data/lib/countries/cache/locales/ki.json +1 -0
  75. data/lib/countries/cache/locales/kk.json +1 -0
  76. data/lib/countries/cache/locales/kl.json +1 -0
  77. data/lib/countries/cache/locales/km.json +1 -0
  78. data/lib/countries/cache/locales/kn.json +1 -0
  79. data/lib/countries/cache/locales/ko.json +1 -0
  80. data/lib/countries/cache/locales/ku.json +1 -0
  81. data/lib/countries/cache/locales/kv.json +1 -0
  82. data/lib/countries/cache/locales/kw.json +1 -0
  83. data/lib/countries/cache/locales/ky.json +1 -0
  84. data/lib/countries/cache/locales/lo.json +1 -0
  85. data/lib/countries/cache/locales/lt.json +1 -0
  86. data/lib/countries/cache/locales/lv.json +1 -0
  87. data/lib/countries/cache/locales/mi.json +1 -0
  88. data/lib/countries/cache/locales/mk.json +1 -0
  89. data/lib/countries/cache/locales/ml.json +1 -0
  90. data/lib/countries/cache/locales/mn.json +1 -0
  91. data/lib/countries/cache/locales/mr.json +1 -0
  92. data/lib/countries/cache/locales/ms.json +1 -0
  93. data/lib/countries/cache/locales/mt.json +1 -0
  94. data/lib/countries/cache/locales/my.json +1 -0
  95. data/lib/countries/cache/locales/na.json +1 -0
  96. data/lib/countries/cache/locales/nb.json +1 -0
  97. data/lib/countries/cache/locales/ne.json +1 -0
  98. data/lib/countries/cache/locales/nl.json +1 -0
  99. data/lib/countries/cache/locales/nn.json +1 -0
  100. data/lib/countries/cache/locales/nv.json +1 -0
  101. data/lib/countries/cache/locales/oc.json +1 -0
  102. data/lib/countries/cache/locales/or.json +1 -0
  103. data/lib/countries/cache/locales/pa.json +1 -0
  104. data/lib/countries/cache/locales/pi.json +1 -0
  105. data/lib/countries/cache/locales/pl.json +1 -0
  106. data/lib/countries/cache/locales/ps.json +1 -0
  107. data/lib/countries/cache/locales/pt-br.json +1 -0
  108. data/lib/countries/cache/locales/pt.json +1 -0
  109. data/lib/countries/cache/locales/ro.json +1 -0
  110. data/lib/countries/cache/locales/ru.json +1 -0
  111. data/lib/countries/cache/locales/rw.json +1 -0
  112. data/lib/countries/cache/locales/sc.json +1 -0
  113. data/lib/countries/cache/locales/sd.json +1 -0
  114. data/lib/countries/cache/locales/si.json +1 -0
  115. data/lib/countries/cache/locales/sk.json +1 -0
  116. data/lib/countries/cache/locales/sl.json +1 -0
  117. data/lib/countries/cache/locales/so.json +1 -0
  118. data/lib/countries/cache/locales/sq.json +1 -0
  119. data/lib/countries/cache/locales/sr.json +1 -0
  120. data/lib/countries/cache/locales/sv.json +1 -0
  121. data/lib/countries/cache/locales/sw.json +1 -0
  122. data/lib/countries/cache/locales/ta.json +1 -0
  123. data/lib/countries/cache/locales/te.json +1 -0
  124. data/lib/countries/cache/locales/tg.json +1 -0
  125. data/lib/countries/cache/locales/th.json +1 -0
  126. data/lib/countries/cache/locales/ti.json +1 -0
  127. data/lib/countries/cache/locales/tk.json +1 -0
  128. data/lib/countries/cache/locales/tl.json +1 -0
  129. data/lib/countries/cache/locales/tr.json +1 -0
  130. data/lib/countries/cache/locales/tt.json +1 -0
  131. data/lib/countries/cache/locales/ug.json +1 -0
  132. data/lib/countries/cache/locales/uk.json +1 -0
  133. data/lib/countries/cache/locales/ur.json +1 -0
  134. data/lib/countries/cache/locales/uz.json +1 -0
  135. data/lib/countries/cache/locales/ve.json +1 -0
  136. data/lib/countries/cache/locales/vi.json +1 -0
  137. data/lib/countries/cache/locales/wa.json +1 -0
  138. data/lib/countries/cache/locales/wo.json +1 -0
  139. data/lib/countries/cache/locales/xh.json +1 -0
  140. data/lib/countries/cache/locales/yo.json +1 -0
  141. data/lib/countries/cache/locales/zh-cn.json +1 -0
  142. data/lib/countries/cache/locales/zh-hk.json +1 -0
  143. data/lib/countries/cache/locales/zh-tw.json +1 -0
  144. data/lib/countries/cache/locales/zh.json +1 -0
  145. data/lib/countries/cache/locales/zu.json +1 -0
  146. data/lib/countries/configuration.rb +57 -0
  147. data/lib/countries/country/class_methods.rb +196 -0
  148. data/lib/countries/country/currency_methods.rb +13 -0
  149. data/lib/countries/country/emoji.rb +42 -0
  150. data/lib/countries/country.rb +214 -158
  151. data/lib/countries/data/countries/AD.yaml +32 -21
  152. data/lib/countries/data/countries/AE.yaml +40 -25
  153. data/lib/countries/data/countries/AF.yaml +36 -23
  154. data/lib/countries/data/countries/AG.yaml +36 -25
  155. data/lib/countries/data/countries/AI.yaml +33 -21
  156. data/lib/countries/data/countries/AL.yaml +35 -24
  157. data/lib/countries/data/countries/AM.yaml +36 -24
  158. data/lib/countries/data/countries/AO.yaml +30 -20
  159. data/lib/countries/data/countries/AQ.yaml +31 -22
  160. data/lib/countries/data/countries/AR.yaml +36 -24
  161. data/lib/countries/data/countries/AS.yaml +38 -25
  162. data/lib/countries/data/countries/AT.yaml +37 -25
  163. data/lib/countries/data/countries/AU.yaml +39 -23
  164. data/lib/countries/data/countries/AW.yaml +30 -20
  165. data/lib/countries/data/countries/AX.yaml +33 -22
  166. data/lib/countries/data/countries/AZ.yaml +37 -25
  167. data/lib/countries/data/countries/BA.yaml +40 -27
  168. data/lib/countries/data/countries/BB.yaml +33 -21
  169. data/lib/countries/data/countries/BD.yaml +32 -21
  170. data/lib/countries/data/countries/BE.yaml +42 -28
  171. data/lib/countries/data/countries/BF.yaml +32 -21
  172. data/lib/countries/data/countries/BG.yaml +38 -26
  173. data/lib/countries/data/countries/BH.yaml +35 -24
  174. data/lib/countries/data/countries/BI.yaml +32 -21
  175. data/lib/countries/data/countries/BJ.yaml +31 -21
  176. data/lib/countries/data/countries/BL.yaml +33 -22
  177. data/lib/countries/data/countries/BM.yaml +34 -22
  178. data/lib/countries/data/countries/BN.yaml +32 -21
  179. data/lib/countries/data/countries/BO.yaml +37 -25
  180. data/lib/countries/data/countries/BQ.yaml +33 -22
  181. data/lib/countries/data/countries/BR.yaml +42 -24
  182. data/lib/countries/data/countries/BS.yaml +32 -21
  183. data/lib/countries/data/countries/BT.yaml +33 -22
  184. data/lib/countries/data/countries/BV.yaml +32 -23
  185. data/lib/countries/data/countries/BW.yaml +32 -21
  186. data/lib/countries/data/countries/BY.yaml +38 -26
  187. data/lib/countries/data/countries/BZ.yaml +34 -23
  188. data/lib/countries/data/countries/CA.yaml +35 -23
  189. data/lib/countries/data/countries/CC.yaml +34 -23
  190. data/lib/countries/data/countries/CD.yaml +44 -28
  191. data/lib/countries/data/countries/CF.yaml +36 -25
  192. data/lib/countries/data/countries/CG.yaml +35 -23
  193. data/lib/countries/data/countries/CH.yaml +47 -26
  194. data/lib/countries/data/countries/CI.yaml +35 -24
  195. data/lib/countries/data/countries/CK.yaml +34 -24
  196. data/lib/countries/data/countries/CL.yaml +37 -21
  197. data/lib/countries/data/countries/CM.yaml +36 -25
  198. data/lib/countries/data/countries/CN.yaml +32 -21
  199. data/lib/countries/data/countries/CO.yaml +33 -22
  200. data/lib/countries/data/countries/CR.yaml +31 -20
  201. data/lib/countries/data/countries/CU.yaml +32 -21
  202. data/lib/countries/data/countries/CV.yaml +35 -24
  203. data/lib/countries/data/countries/CW.yaml +31 -21
  204. data/lib/countries/data/countries/CX.yaml +38 -25
  205. data/lib/countries/data/countries/CY.yaml +42 -28
  206. data/lib/countries/data/countries/CZ.yaml +42 -28
  207. data/lib/countries/data/countries/DE.yaml +39 -27
  208. data/lib/countries/data/countries/DJ.yaml +34 -23
  209. data/lib/countries/data/countries/DK.yaml +39 -27
  210. data/lib/countries/data/countries/DM.yaml +31 -20
  211. data/lib/countries/data/countries/DO.yaml +35 -24
  212. data/lib/countries/data/countries/DZ.yaml +36 -25
  213. data/lib/countries/data/countries/EC.yaml +32 -21
  214. data/lib/countries/data/countries/EE.yaml +37 -26
  215. data/lib/countries/data/countries/EG.yaml +36 -25
  216. data/lib/countries/data/countries/EH.yaml +38 -26
  217. data/lib/countries/data/countries/ER.yaml +36 -24
  218. data/lib/countries/data/countries/ES.yaml +38 -26
  219. data/lib/countries/data/countries/ET.yaml +35 -24
  220. data/lib/countries/data/countries/FI.yaml +40 -27
  221. data/lib/countries/data/countries/FJ.yaml +38 -25
  222. data/lib/countries/data/countries/FK.yaml +36 -25
  223. data/lib/countries/data/countries/FM.yaml +34 -23
  224. data/lib/countries/data/countries/FO.yaml +35 -24
  225. data/lib/countries/data/countries/FR.yaml +38 -26
  226. data/lib/countries/data/countries/GA.yaml +32 -22
  227. data/lib/countries/data/countries/GB.yaml +46 -28
  228. data/lib/countries/data/countries/GD.yaml +31 -20
  229. data/lib/countries/data/countries/GE.yaml +34 -23
  230. data/lib/countries/data/countries/GF.yaml +35 -23
  231. data/lib/countries/data/countries/GG.yaml +38 -26
  232. data/lib/countries/data/countries/GH.yaml +30 -20
  233. data/lib/countries/data/countries/GI.yaml +32 -21
  234. data/lib/countries/data/countries/GL.yaml +35 -24
  235. data/lib/countries/data/countries/GM.yaml +30 -20
  236. data/lib/countries/data/countries/GN.yaml +35 -23
  237. data/lib/countries/data/countries/GP.yaml +33 -22
  238. data/lib/countries/data/countries/GQ.yaml +36 -25
  239. data/lib/countries/data/countries/GR.yaml +41 -29
  240. data/lib/countries/data/countries/GS.yaml +34 -22
  241. data/lib/countries/data/countries/GT.yaml +31 -20
  242. data/lib/countries/data/countries/GU.yaml +36 -22
  243. data/lib/countries/data/countries/GW.yaml +34 -22
  244. data/lib/countries/data/countries/GY.yaml +30 -20
  245. data/lib/countries/data/countries/HK.yaml +33 -22
  246. data/lib/countries/data/countries/HM.yaml +35 -24
  247. data/lib/countries/data/countries/HN.yaml +31 -20
  248. data/lib/countries/data/countries/HR.yaml +40 -28
  249. data/lib/countries/data/countries/HT.yaml +34 -22
  250. data/lib/countries/data/countries/HU.yaml +39 -27
  251. data/lib/countries/data/countries/ID.yaml +34 -23
  252. data/lib/countries/data/countries/IE.yaml +39 -26
  253. data/lib/countries/data/countries/IL.yaml +39 -22
  254. data/lib/countries/data/countries/IM.yaml +37 -25
  255. data/lib/countries/data/countries/IN.yaml +35 -23
  256. data/lib/countries/data/countries/IO.yaml +35 -24
  257. data/lib/countries/data/countries/IQ.yaml +33 -22
  258. data/lib/countries/data/countries/IR.yaml +34 -23
  259. data/lib/countries/data/countries/IS.yaml +42 -24
  260. data/lib/countries/data/countries/IT.yaml +38 -26
  261. data/lib/countries/data/countries/JE.yaml +34 -22
  262. data/lib/countries/data/countries/JM.yaml +33 -22
  263. data/lib/countries/data/countries/JO.yaml +36 -25
  264. data/lib/countries/data/countries/JP.yaml +33 -22
  265. data/lib/countries/data/countries/KE.yaml +34 -22
  266. data/lib/countries/data/countries/KG.yaml +38 -26
  267. data/lib/countries/data/countries/KH.yaml +35 -24
  268. data/lib/countries/data/countries/KI.yaml +30 -20
  269. data/lib/countries/data/countries/KM.yaml +35 -24
  270. data/lib/countries/data/countries/KN.yaml +38 -25
  271. data/lib/countries/data/countries/KP.yaml +37 -26
  272. data/lib/countries/data/countries/KR.yaml +37 -26
  273. data/lib/countries/data/countries/KW.yaml +34 -23
  274. data/lib/countries/data/countries/KY.yaml +36 -24
  275. data/lib/countries/data/countries/KZ.yaml +36 -24
  276. data/lib/countries/data/countries/LA.yaml +32 -21
  277. data/lib/countries/data/countries/LB.yaml +37 -25
  278. data/lib/countries/data/countries/LC.yaml +35 -22
  279. data/lib/countries/data/countries/LI.yaml +32 -20
  280. data/lib/countries/data/countries/LK.yaml +33 -21
  281. data/lib/countries/data/countries/LR.yaml +31 -20
  282. data/lib/countries/data/countries/LS.yaml +33 -21
  283. data/lib/countries/data/countries/LT.yaml +41 -28
  284. data/lib/countries/data/countries/LU.yaml +39 -25
  285. data/lib/countries/data/countries/LV.yaml +45 -27
  286. data/lib/countries/data/countries/LY.yaml +36 -26
  287. data/lib/countries/data/countries/MA.yaml +35 -24
  288. data/lib/countries/data/countries/MC.yaml +32 -21
  289. data/lib/countries/data/countries/MD.yaml +36 -25
  290. data/lib/countries/data/countries/ME.yaml +38 -24
  291. data/lib/countries/data/countries/MF.yaml +37 -24
  292. data/lib/countries/data/countries/MG.yaml +35 -23
  293. data/lib/countries/data/countries/MH.yaml +37 -25
  294. data/lib/countries/data/countries/MK.yaml +37 -25
  295. data/lib/countries/data/countries/ML.yaml +30 -20
  296. data/lib/countries/data/countries/MM.yaml +31 -20
  297. data/lib/countries/data/countries/MN.yaml +34 -23
  298. data/lib/countries/data/countries/MO.yaml +33 -22
  299. data/lib/countries/data/countries/MP.yaml +38 -26
  300. data/lib/countries/data/countries/MQ.yaml +33 -22
  301. data/lib/countries/data/countries/MR.yaml +36 -25
  302. data/lib/countries/data/countries/MS.yaml +32 -21
  303. data/lib/countries/data/countries/MT.yaml +38 -25
  304. data/lib/countries/data/countries/MU.yaml +33 -22
  305. data/lib/countries/data/countries/MV.yaml +34 -23
  306. data/lib/countries/data/countries/MW.yaml +32 -21
  307. data/lib/countries/data/countries/MX.yaml +39 -23
  308. data/lib/countries/data/countries/MY.yaml +36 -24
  309. data/lib/countries/data/countries/MZ.yaml +32 -21
  310. data/lib/countries/data/countries/NA.yaml +35 -23
  311. data/lib/countries/data/countries/NC.yaml +36 -25
  312. data/lib/countries/data/countries/NE.yaml +32 -21
  313. data/lib/countries/data/countries/NF.yaml +36 -25
  314. data/lib/countries/data/countries/NG.yaml +39 -23
  315. data/lib/countries/data/countries/NI.yaml +31 -20
  316. data/lib/countries/data/countries/NL.yaml +41 -28
  317. data/lib/countries/data/countries/NO.yaml +43 -25
  318. data/lib/countries/data/countries/NP.yaml +43 -22
  319. data/lib/countries/data/countries/NR.yaml +32 -21
  320. data/lib/countries/data/countries/NU.yaml +30 -20
  321. data/lib/countries/data/countries/NZ.yaml +41 -24
  322. data/lib/countries/data/countries/OM.yaml +33 -22
  323. data/lib/countries/data/countries/PA.yaml +31 -21
  324. data/lib/countries/data/countries/PE.yaml +33 -22
  325. data/lib/countries/data/countries/PF.yaml +36 -25
  326. data/lib/countries/data/countries/PG.yaml +35 -24
  327. data/lib/countries/data/countries/PH.yaml +41 -24
  328. data/lib/countries/data/countries/PK.yaml +34 -22
  329. data/lib/countries/data/countries/PL.yaml +38 -26
  330. data/lib/countries/data/countries/PM.yaml +36 -25
  331. data/lib/countries/data/countries/PN.yaml +35 -23
  332. data/lib/countries/data/countries/PR.yaml +33 -21
  333. data/lib/countries/data/countries/PS.yaml +41 -28
  334. data/lib/countries/data/countries/PT.yaml +34 -22
  335. data/lib/countries/data/countries/PW.yaml +31 -20
  336. data/lib/countries/data/countries/PY.yaml +33 -21
  337. data/lib/countries/data/countries/QA.yaml +32 -22
  338. data/lib/countries/data/countries/RE.yaml +34 -23
  339. data/lib/countries/data/countries/RO.yaml +40 -28
  340. data/lib/countries/data/countries/RS.yaml +34 -23
  341. data/lib/countries/data/countries/RU.yaml +37 -26
  342. data/lib/countries/data/countries/RW.yaml +35 -23
  343. data/lib/countries/data/countries/SA.yaml +42 -25
  344. data/lib/countries/data/countries/SB.yaml +35 -25
  345. data/lib/countries/data/countries/SC.yaml +33 -22
  346. data/lib/countries/data/countries/SD.yaml +37 -25
  347. data/lib/countries/data/countries/SE.yaml +39 -27
  348. data/lib/countries/data/countries/SG.yaml +38 -25
  349. data/lib/countries/data/countries/SH.yaml +37 -25
  350. data/lib/countries/data/countries/SI.yaml +39 -27
  351. data/lib/countries/data/countries/SJ.yaml +36 -25
  352. data/lib/countries/data/countries/SK.yaml +39 -27
  353. data/lib/countries/data/countries/SL.yaml +30 -20
  354. data/lib/countries/data/countries/SM.yaml +32 -21
  355. data/lib/countries/data/countries/SN.yaml +32 -21
  356. data/lib/countries/data/countries/SO.yaml +35 -23
  357. data/lib/countries/data/countries/SR.yaml +31 -21
  358. data/lib/countries/data/countries/SS.yaml +35 -23
  359. data/lib/countries/data/countries/ST.yaml +34 -24
  360. data/lib/countries/data/countries/SV.yaml +32 -21
  361. data/lib/countries/data/countries/SX.yaml +34 -22
  362. data/lib/countries/data/countries/SY.yaml +36 -26
  363. data/lib/countries/data/countries/SZ.yaml +35 -23
  364. data/lib/countries/data/countries/TC.yaml +38 -25
  365. data/lib/countries/data/countries/TD.yaml +36 -25
  366. data/lib/countries/data/countries/TF.yaml +39 -28
  367. data/lib/countries/data/countries/TG.yaml +30 -20
  368. data/lib/countries/data/countries/TH.yaml +39 -22
  369. data/lib/countries/data/countries/TJ.yaml +37 -25
  370. data/lib/countries/data/countries/TK.yaml +33 -23
  371. data/lib/countries/data/countries/TL.yaml +34 -24
  372. data/lib/countries/data/countries/TM.yaml +35 -23
  373. data/lib/countries/data/countries/TN.yaml +38 -26
  374. data/lib/countries/data/countries/TO.yaml +32 -21
  375. data/lib/countries/data/countries/TR.yaml +35 -24
  376. data/lib/countries/data/countries/TT.yaml +35 -24
  377. data/lib/countries/data/countries/TV.yaml +30 -20
  378. data/lib/countries/data/countries/TW.yaml +33 -22
  379. data/lib/countries/data/countries/TZ.yaml +36 -24
  380. data/lib/countries/data/countries/UA.yaml +42 -25
  381. data/lib/countries/data/countries/UG.yaml +33 -22
  382. data/lib/countries/data/countries/UM.yaml +37 -26
  383. data/lib/countries/data/countries/US.yaml +37 -24
  384. data/lib/countries/data/countries/UY.yaml +31 -20
  385. data/lib/countries/data/countries/UZ.yaml +37 -25
  386. data/lib/countries/data/countries/VA.yaml +39 -27
  387. data/lib/countries/data/countries/VC.yaml +38 -24
  388. data/lib/countries/data/countries/VE.yaml +31 -20
  389. data/lib/countries/data/countries/VG.yaml +38 -26
  390. data/lib/countries/data/countries/VI.yaml +37 -25
  391. data/lib/countries/data/countries/VN.yaml +38 -21
  392. data/lib/countries/data/countries/VU.yaml +34 -22
  393. data/lib/countries/data/countries/WF.yaml +36 -25
  394. data/lib/countries/data/countries/WS.yaml +32 -21
  395. data/lib/countries/data/countries/YE.yaml +33 -23
  396. data/lib/countries/data/countries/YT.yaml +32 -21
  397. data/lib/countries/data/countries/ZA.yaml +52 -32
  398. data/lib/countries/data/countries/ZM.yaml +33 -22
  399. data/lib/countries/data/countries/ZW.yaml +36 -24
  400. data/lib/countries/data/subdivisions/AD.yaml +85 -50
  401. data/lib/countries/data/subdivisions/AE.yaml +513 -55
  402. data/lib/countries/data/subdivisions/AF.yaml +2239 -234
  403. data/lib/countries/data/subdivisions/AG.yaml +451 -57
  404. data/lib/countries/data/subdivisions/AI.yaml +197 -0
  405. data/lib/countries/data/subdivisions/AL.yaml +746 -316
  406. data/lib/countries/data/subdivisions/AM.yaml +788 -68
  407. data/lib/countries/data/subdivisions/AO.yaml +1145 -126
  408. data/lib/countries/data/subdivisions/AR.yaml +1668 -168
  409. data/lib/countries/data/subdivisions/AT.yaml +714 -63
  410. data/lib/countries/data/subdivisions/AU.yaml +673 -56
  411. data/lib/countries/data/subdivisions/AZ.yaml +4508 -536
  412. data/lib/countries/data/subdivisions/BA.yaml +359 -14
  413. data/lib/countries/data/subdivisions/BB.yaml +589 -79
  414. data/lib/countries/data/subdivisions/BD.yaml +2593 -400
  415. data/lib/countries/data/subdivisions/BE.yaml +943 -77
  416. data/lib/countries/data/subdivisions/BF.yaml +2917 -311
  417. data/lib/countries/data/subdivisions/BG.yaml +1965 -199
  418. data/lib/countries/data/subdivisions/BH.yaml +184 -31
  419. data/lib/countries/data/subdivisions/BI.yaml +982 -112
  420. data/lib/countries/data/subdivisions/BJ.yaml +691 -84
  421. data/lib/countries/data/subdivisions/BM.yaml +155 -0
  422. data/lib/countries/data/subdivisions/BN.yaml +225 -24
  423. data/lib/countries/data/subdivisions/BO.yaml +561 -63
  424. data/lib/countries/data/subdivisions/BQ.yaml +217 -21
  425. data/lib/countries/data/subdivisions/BR.yaml +2154 -185
  426. data/lib/countries/data/subdivisions/BS.yaml +1821 -143
  427. data/lib/countries/data/subdivisions/BT.yaml +1087 -140
  428. data/lib/countries/data/subdivisions/BW.yaml +923 -63
  429. data/lib/countries/data/subdivisions/BY.yaml +528 -31
  430. data/lib/countries/data/subdivisions/BZ.yaml +309 -42
  431. data/lib/countries/data/subdivisions/CA.yaml +1105 -92
  432. data/lib/countries/data/subdivisions/CD.yaml +1187 -78
  433. data/lib/countries/data/subdivisions/CF.yaml +961 -119
  434. data/lib/countries/data/subdivisions/CG.yaml +640 -77
  435. data/lib/countries/data/subdivisions/CH.yaml +1946 -182
  436. data/lib/countries/data/subdivisions/CI.yaml +859 -125
  437. data/lib/countries/data/subdivisions/CK.yaml +155 -0
  438. data/lib/countries/data/subdivisions/CL.yaml +968 -105
  439. data/lib/countries/data/subdivisions/CM.yaml +582 -70
  440. data/lib/countries/data/subdivisions/CN.yaml +2618 -274
  441. data/lib/countries/data/subdivisions/CO.yaml +2102 -227
  442. data/lib/countries/data/subdivisions/CR.yaml +393 -49
  443. data/lib/countries/data/subdivisions/CU.yaml +926 -119
  444. data/lib/countries/data/subdivisions/CV.yaml +1198 -119
  445. data/lib/countries/data/subdivisions/CY.yaml +328 -42
  446. data/lib/countries/data/subdivisions/CZ.yaml +2892 -129
  447. data/lib/countries/data/subdivisions/DE.yaml +1420 -112
  448. data/lib/countries/data/subdivisions/DJ.yaml +375 -42
  449. data/lib/countries/data/subdivisions/DK.yaml +344 -180
  450. data/lib/countries/data/subdivisions/DM.yaml +512 -72
  451. data/lib/countries/data/subdivisions/DO.yaml +1763 -219
  452. data/lib/countries/data/subdivisions/DZ.yaml +2869 -334
  453. data/lib/countries/data/subdivisions/EC.yaml +1348 -168
  454. data/lib/countries/data/subdivisions/EE.yaml +1368 -118
  455. data/lib/countries/data/subdivisions/EG.yaml +1628 -190
  456. data/lib/countries/data/subdivisions/EH.yaml +48 -28
  457. data/lib/countries/data/subdivisions/ER.yaml +348 -42
  458. data/lib/countries/data/subdivisions/ES.yaml +4875 -375
  459. data/lib/countries/data/subdivisions/ET.yaml +735 -77
  460. data/lib/countries/data/subdivisions/FI.yaml +890 -36
  461. data/lib/countries/data/subdivisions/FJ.yaml +720 -35
  462. data/lib/countries/data/subdivisions/FM.yaml +202 -24
  463. data/lib/countries/data/subdivisions/FR.yaml +8250 -684
  464. data/lib/countries/data/subdivisions/GA.yaml +526 -63
  465. data/lib/countries/data/subdivisions/GB.yaml +12522 -1516
  466. data/lib/countries/data/subdivisions/GD.yaml +354 -49
  467. data/lib/countries/data/subdivisions/GE.yaml +833 -85
  468. data/lib/countries/data/subdivisions/GH.yaml +658 -70
  469. data/lib/countries/data/subdivisions/GL.yaml +262 -0
  470. data/lib/countries/data/subdivisions/GM.yaml +381 -42
  471. data/lib/countries/data/subdivisions/GN.yaml +1919 -234
  472. data/lib/countries/data/subdivisions/GQ.yaml +459 -59
  473. data/lib/countries/data/subdivisions/GR.yaml +871 -527
  474. data/lib/countries/data/subdivisions/GT.yaml +1270 -150
  475. data/lib/countries/data/subdivisions/GW.yaml +563 -59
  476. data/lib/countries/data/subdivisions/GY.yaml +498 -70
  477. data/lib/countries/data/subdivisions/HN.yaml +1019 -126
  478. data/lib/countries/data/subdivisions/HR.yaml +1419 -151
  479. data/lib/countries/data/subdivisions/HT.yaml +525 -63
  480. data/lib/countries/data/subdivisions/HU.yaml +2949 -302
  481. data/lib/countries/data/subdivisions/ID.yaml +2679 -243
  482. data/lib/countries/data/subdivisions/IE.yaml +2027 -177
  483. data/lib/countries/data/subdivisions/IL.yaml +376 -42
  484. data/lib/countries/data/subdivisions/IN.yaml +3110 -252
  485. data/lib/countries/data/subdivisions/IQ.yaml +1105 -126
  486. data/lib/countries/data/subdivisions/IR.yaml +2092 -215
  487. data/lib/countries/data/subdivisions/IS.yaml +830 -59
  488. data/lib/countries/data/subdivisions/IT.yaml +8525 -790
  489. data/lib/countries/data/subdivisions/JM.yaml +732 -100
  490. data/lib/countries/data/subdivisions/JO.yaml +662 -48
  491. data/lib/countries/data/subdivisions/JP.yaml +3562 -327
  492. data/lib/countries/data/subdivisions/KE.yaml +1449 -56
  493. data/lib/countries/data/subdivisions/KG.yaml +624 -57
  494. data/lib/countries/data/subdivisions/KH.yaml +1332 -147
  495. data/lib/countries/data/subdivisions/KI.yaml +163 -17
  496. data/lib/countries/data/subdivisions/KM.yaml +189 -21
  497. data/lib/countries/data/subdivisions/KN.yaml +835 -100
  498. data/lib/countries/data/subdivisions/KP.yaml +922 -80
  499. data/lib/countries/data/subdivisions/KR.yaml +1225 -88
  500. data/lib/countries/data/subdivisions/KW.yaml +280 -42
  501. data/lib/countries/data/subdivisions/KZ.yaml +1213 -122
  502. data/lib/countries/data/subdivisions/LA.yaml +947 -120
  503. data/lib/countries/data/subdivisions/LB.yaml +386 -22
  504. data/lib/countries/data/subdivisions/LC.yaml +470 -0
  505. data/lib/countries/data/subdivisions/LI.yaml +557 -39
  506. data/lib/countries/data/subdivisions/LK.yaml +1546 -175
  507. data/lib/countries/data/subdivisions/LR.yaml +857 -105
  508. data/lib/countries/data/subdivisions/LS.yaml +529 -70
  509. data/lib/countries/data/subdivisions/LT.yaml +2616 -71
  510. data/lib/countries/data/subdivisions/LU.yaml +490 -24
  511. data/lib/countries/data/subdivisions/LV.yaml +2501 -178
  512. data/lib/countries/data/subdivisions/LY.yaml +1188 -262
  513. data/lib/countries/data/subdivisions/MA.yaml +3375 -437
  514. data/lib/countries/data/subdivisions/MC.yaml +484 -0
  515. data/lib/countries/data/subdivisions/MD.yaml +2240 -71
  516. data/lib/countries/data/subdivisions/ME.yaml +1136 -151
  517. data/lib/countries/data/subdivisions/MG.yaml +253 -42
  518. data/lib/countries/data/subdivisions/MH.yaml +995 -151
  519. data/lib/countries/data/subdivisions/MK.yaml +3964 -752
  520. data/lib/countries/data/subdivisions/ML.yaml +569 -63
  521. data/lib/countries/data/subdivisions/MM.yaml +849 -98
  522. data/lib/countries/data/subdivisions/MN.yaml +1389 -160
  523. data/lib/countries/data/subdivisions/MR.yaml +702 -94
  524. data/lib/countries/data/subdivisions/MT.yaml +3726 -478
  525. data/lib/countries/data/subdivisions/MU.yaml +923 -115
  526. data/lib/countries/data/subdivisions/MV.yaml +1219 -148
  527. data/lib/countries/data/subdivisions/MW.yaml +1646 -189
  528. data/lib/countries/data/subdivisions/MX.yaml +2414 -222
  529. data/lib/countries/data/subdivisions/MY.yaml +1071 -114
  530. data/lib/countries/data/subdivisions/MZ.yaml +665 -77
  531. data/lib/countries/data/subdivisions/NA.yaml +736 -98
  532. data/lib/countries/data/subdivisions/NE.yaml +475 -56
  533. data/lib/countries/data/subdivisions/NG.yaml +2370 -259
  534. data/lib/countries/data/subdivisions/NI.yaml +952 -119
  535. data/lib/countries/data/subdivisions/NL.yaml +1205 -84
  536. data/lib/countries/data/subdivisions/NO.yaml +856 -164
  537. data/lib/countries/data/subdivisions/NP.yaml +982 -90
  538. data/lib/countries/data/subdivisions/NR.yaml +827 -100
  539. data/lib/countries/data/subdivisions/NZ.yaml +946 -122
  540. data/lib/countries/data/subdivisions/OM.yaml +633 -63
  541. data/lib/countries/data/subdivisions/PA.yaml +708 -69
  542. data/lib/countries/data/subdivisions/PE.yaml +1489 -179
  543. data/lib/countries/data/subdivisions/PG.yaml +1211 -140
  544. data/lib/countries/data/subdivisions/PH.yaml +5089 -572
  545. data/lib/countries/data/subdivisions/PK.yaml +566 -56
  546. data/lib/countries/data/subdivisions/PL.yaml +1042 -150
  547. data/lib/countries/data/subdivisions/PS.yaml +747 -0
  548. data/lib/countries/data/subdivisions/PT.yaml +1124 -145
  549. data/lib/countries/data/subdivisions/PW.yaml +832 -108
  550. data/lib/countries/data/subdivisions/PY.yaml +1045 -127
  551. data/lib/countries/data/subdivisions/QA.yaml +469 -64
  552. data/lib/countries/data/subdivisions/RO.yaml +2746 -294
  553. data/lib/countries/data/subdivisions/RS.yaml +1786 -195
  554. data/lib/countries/data/subdivisions/RU.yaml +6570 -655
  555. data/lib/countries/data/subdivisions/RW.yaml +327 -35
  556. data/lib/countries/data/subdivisions/SA.yaml +768 -102
  557. data/lib/countries/data/subdivisions/SB.yaml +550 -70
  558. data/lib/countries/data/subdivisions/SC.yaml +1286 -163
  559. data/lib/countries/data/subdivisions/SD.yaml +1002 -254
  560. data/lib/countries/data/subdivisions/SE.yaml +1416 -149
  561. data/lib/countries/data/subdivisions/SG.yaml +108 -31
  562. data/lib/countries/data/subdivisions/SH.yaml +197 -21
  563. data/lib/countries/data/subdivisions/SI.yaml +10997 -1403
  564. data/lib/countries/data/subdivisions/SJ.yaml +29 -0
  565. data/lib/countries/data/subdivisions/SK.yaml +533 -57
  566. data/lib/countries/data/subdivisions/SL.yaml +231 -28
  567. data/lib/countries/data/subdivisions/SM.yaml +577 -65
  568. data/lib/countries/data/subdivisions/SN.yaml +761 -77
  569. data/lib/countries/data/subdivisions/SO.yaml +914 -126
  570. data/lib/countries/data/subdivisions/SR.yaml +512 -70
  571. data/lib/countries/data/subdivisions/SS.yaml +624 -0
  572. data/lib/countries/data/subdivisions/ST.yaml +73 -14
  573. data/lib/countries/data/subdivisions/SV.yaml +747 -98
  574. data/lib/countries/data/subdivisions/SY.yaml +806 -91
  575. data/lib/countries/data/subdivisions/SZ.yaml +217 -28
  576. data/lib/countries/data/subdivisions/TD.yaml +1242 -126
  577. data/lib/countries/data/subdivisions/TG.yaml +264 -35
  578. data/lib/countries/data/subdivisions/TH.yaml +4535 -539
  579. data/lib/countries/data/subdivisions/TJ.yaml +356 -0
  580. data/lib/countries/data/subdivisions/TK.yaml +43 -0
  581. data/lib/countries/data/subdivisions/TL.yaml +682 -91
  582. data/lib/countries/data/subdivisions/TM.yaml +390 -46
  583. data/lib/countries/data/subdivisions/TN.yaml +1301 -168
  584. data/lib/countries/data/subdivisions/TO.yaml +260 -36
  585. data/lib/countries/data/subdivisions/TR.yaml +5858 -624
  586. data/lib/countries/data/subdivisions/TT.yaml +865 -112
  587. data/lib/countries/data/subdivisions/TV.yaml +382 -44
  588. data/lib/countries/data/subdivisions/TW.yaml +1281 -145
  589. data/lib/countries/data/subdivisions/TZ.yaml +1868 -184
  590. data/lib/countries/data/subdivisions/UA.yaml +1988 -192
  591. data/lib/countries/data/subdivisions/UG.yaml +6150 -544
  592. data/lib/countries/data/subdivisions/UM.yaml +710 -59
  593. data/lib/countries/data/subdivisions/US.yaml +4789 -404
  594. data/lib/countries/data/subdivisions/UY.yaml +1163 -112
  595. data/lib/countries/data/subdivisions/UZ.yaml +902 -99
  596. data/lib/countries/data/subdivisions/VC.yaml +289 -38
  597. data/lib/countries/data/subdivisions/VE.yaml +1559 -175
  598. data/lib/countries/data/subdivisions/VN.yaml +3799 -550
  599. data/lib/countries/data/subdivisions/VU.yaml +333 -43
  600. data/lib/countries/data/subdivisions/WF.yaml +201 -0
  601. data/lib/countries/data/subdivisions/WS.yaml +587 -77
  602. data/lib/countries/data/subdivisions/YE.yaml +1262 -135
  603. data/lib/countries/data/subdivisions/ZA.yaml +712 -63
  604. data/lib/countries/data/subdivisions/ZM.yaml +568 -65
  605. data/lib/countries/data/subdivisions/ZW.yaml +520 -70
  606. data/lib/countries/data/translation_corrections.yaml +38 -1
  607. data/lib/countries/data.rb +161 -16
  608. data/lib/countries/global.rb +13 -3
  609. data/lib/countries/iso3166.rb +9 -2
  610. data/lib/countries/kwarg_struct.rb +12 -0
  611. data/lib/countries/mongoid.rb +25 -22
  612. data/lib/countries/setup.rb +7 -7
  613. data/lib/countries/sources/cldr/downloader.rb +37 -0
  614. data/lib/countries/sources/cldr/subdivision.rb +35 -0
  615. data/lib/countries/sources/cldr/subdivision_updater.rb +35 -0
  616. data/lib/countries/sources/local/cached_loader.rb +29 -0
  617. data/lib/countries/sources/local/subdivision.rb +33 -0
  618. data/lib/countries/sources.rb +6 -0
  619. data/lib/countries/structure.rb +72 -0
  620. data/lib/countries/subdivision.rb +10 -0
  621. data/lib/countries/tasks/geocoding.rake +97 -0
  622. data/lib/countries/tasks/postal_codes.rake +48 -0
  623. data/lib/countries/timezones.rb +13 -0
  624. data/lib/countries/translations.rb +11 -0
  625. data/lib/countries/version.rb +1 -1
  626. data/lib/countries.rb +2 -0
  627. data/spec/00_global_spec.rb +56 -0
  628. data/spec/configuration_spec.rb +54 -0
  629. data/spec/country_spec.rb +473 -87
  630. data/spec/data_spec.rb +181 -0
  631. data/spec/mongoid_spec.rb +2 -2
  632. data/spec/perf_spec.rb +74 -0
  633. data/spec/spec_helper.rb +12 -0
  634. data/spec/subdivision_spec.rb +32 -0
  635. data/spec/thread_safety_spec.rb +46 -0
  636. data/spec/timezone_spec.rb +32 -0
  637. metadata +206 -30
  638. data/.travis.yml +0 -6
  639. data/lib/countries/cache/countries +0 -0
  640. data/lib/countries/data/countries/AN.yaml +0 -42
  641. data/lib/countries/data/countries.yaml +0 -251
  642. data/lib/countries/data/subdivisions/Ky.yaml +0 -55
  643. data/lib/countries/data/subdivisions/TF.yaml +0 -27
  644. data/lib/countries/data/subdivisions/Tj.yaml +0 -38
  645. data/spec/setup_spec.rb +0 -14
@@ -1,33 +1,178 @@
1
1
  module ISO3166
2
- ##
3
2
  # Handles building the in memory store of countries data
4
3
  class Data
5
- @@cache = nil
4
+ @@cache_dir = [File.dirname(__FILE__), 'cache']
5
+ @@cache = {}
6
+ @@registered_data = {}
7
+ @@mutex = Mutex.new
8
+
6
9
  def initialize(alpha2)
7
10
  @alpha2 = alpha2.to_s.upcase
8
- Data.load_cache unless @@cache
9
11
  end
10
12
 
11
13
  def call
12
- @@cache[@alpha2]
14
+ self.class.update_cache[@alpha2]
13
15
  end
14
16
 
15
- def self.codes
16
- @@codes ||= Data.load_yaml(['countries', 'data', 'countries.yaml']).freeze
17
- end
17
+ class << self
18
+ def cache_dir
19
+ @@cache_dir
20
+ end
18
21
 
19
- private
22
+ def cache_dir=(value)
23
+ @@cache_dir = value
24
+ end
20
25
 
21
- def self.datafile_path(file_array)
22
- File.join([File.dirname(__FILE__), '..'] + file_array)
23
- end
26
+ # Registers a new Country with custom data.
27
+ # If you are overriding an existing country, this does not perform a deep merge so you will need to __bring in all data you wish to be available__.
28
+ # Overriding an existing country will also remove it from the internal management of translations.
29
+ def register(data)
30
+ alpha2 = data[:alpha2].upcase
31
+ @@registered_data[alpha2] = deep_stringify_keys(data)
32
+ @@registered_data[alpha2]['translations'] = \
33
+ Translations.new.merge(data['translations'] || {})
34
+ @@cache = cache.merge(@@registered_data)
35
+ end
24
36
 
25
- def self.load_yaml(file_array)
26
- YAML.load_file(datafile_path(file_array))
27
- end
37
+ # Removes a country from the loaded data
38
+ def unregister(alpha2)
39
+ alpha2 = alpha2.to_s.upcase
40
+ @@cache.delete(alpha2)
41
+ @@registered_data.delete(alpha2)
42
+ end
43
+
44
+ def cache
45
+ update_cache
46
+ end
47
+
48
+ # Resets the loaded data and cache
49
+ def reset
50
+ @@cache = {}
51
+ @@registered_data = {}
52
+ ISO3166.configuration.loaded_locales = []
53
+ end
54
+
55
+ def codes
56
+ load_data!
57
+ loaded_codes
58
+ end
59
+
60
+ def update_cache
61
+ load_data!
62
+ sync_translations!
63
+ @@cache
64
+ end
65
+
66
+ def load_data!
67
+ return @@cache unless load_required?
68
+ synchronized do
69
+ @@cache = load_cache %w(countries.json)
70
+ @@_country_codes = @@cache.keys
71
+ @@cache = @@cache.merge(@@registered_data)
72
+ @@cache
73
+ end
74
+ end
75
+
76
+ def sync_translations!
77
+ return unless cache_flush_required?
78
+
79
+ locales_to_remove.each do |locale|
80
+ unload_translations(locale)
81
+ end
82
+
83
+ locales_to_load.each do |locale|
84
+ load_translations(locale)
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def synchronized(&block)
91
+ if use_mutex?
92
+ @@mutex.synchronize(&block)
93
+ else
94
+ block.call
95
+ end
96
+ end
97
+
98
+ def use_mutex?
99
+ # Stubbed in testing
100
+ true
101
+ end
102
+
103
+ def load_required?
104
+ synchronized do
105
+ @@cache.empty?
106
+ end
107
+ end
108
+
109
+ def loaded_codes
110
+ @@cache.keys
111
+ end
112
+
113
+ # Codes that we have translations for in dataset
114
+ def internal_codes
115
+ @@_country_codes - @@registered_data.keys
116
+ end
117
+
118
+ def cache_flush_required?
119
+ !locales_to_load.empty? || !locales_to_remove.empty?
120
+ end
121
+
122
+ def locales_to_load
123
+ requested_locales - loaded_locales
124
+ end
125
+
126
+ def locales_to_remove
127
+ loaded_locales - requested_locales
128
+ end
129
+
130
+ def requested_locales
131
+ ISO3166.configuration.locales.map { |l| l.to_s.downcase }
132
+ end
133
+
134
+ def loaded_locales
135
+ ISO3166.configuration.loaded_locales.map { |l| l.to_s.downcase }
136
+ end
137
+
138
+ def load_translations(locale)
139
+ synchronized do
140
+ locale_names = load_cache(['locales', "#{locale}.json"])
141
+ internal_codes.each do |alpha2|
142
+ @@cache[alpha2]['translations'] ||= Translations.new
143
+ @@cache[alpha2]['translations'][locale] = locale_names[alpha2].freeze
144
+ @@cache[alpha2]['translated_names'] = @@cache[alpha2]['translations'].values.freeze
145
+ end
146
+ ISO3166.configuration.loaded_locales << locale
147
+ end
148
+ end
149
+
150
+ def unload_translations(locale)
151
+ synchronized do
152
+ internal_codes.each do |alpha2|
153
+ @@cache[alpha2]['translations'].delete(locale)
154
+ @@cache[alpha2]['translated_names'] = @@cache[alpha2]['translations'].values.freeze
155
+ end
156
+ ISO3166.configuration.loaded_locales.delete(locale)
157
+ end
158
+ end
159
+
160
+ def load_cache(file_array)
161
+ file_path = datafile_path(file_array)
162
+ File.exist?(file_path) ? JSON.parse(File.binread(file_path)) : {}
163
+ end
164
+
165
+ def datafile_path(file_array)
166
+ File.join([@@cache_dir] + file_array)
167
+ end
28
168
 
29
- def self.load_cache
30
- @@cache ||= Marshal.load(File.binread(datafile_path %w(countries cache countries )))
169
+ def deep_stringify_keys(data)
170
+ data.transform_keys!(&:to_s)
171
+ data.transform_values! do |v|
172
+ v.is_a?(Hash) ? deep_stringify_keys(v) : v
173
+ end
174
+ return data
175
+ end
31
176
  end
32
177
  end
33
178
  end
@@ -1,7 +1,17 @@
1
1
  require 'countries'
2
2
 
3
+ # Some apps might not want to constantly call +ISO3166::Country+. This gem has a helper that can provide a Country class
4
+ #
5
+ # With global Country Helper enabled
6
+ #
7
+ # c = Country['US']
8
+ #
9
+ # This will conflict with any existing Country constant
10
+ #
11
+ # To Use
12
+ #
13
+ # gem 'countries', require: 'countries/global'
14
+ #
3
15
  class Country < ISO3166::Country
4
- def to_s
5
- name
6
- end
16
+
7
17
  end
@@ -1,7 +1,14 @@
1
1
  require 'yaml'
2
- require 'iso4217'
2
+ require 'json'
3
3
  require 'i18n_data'
4
4
 
5
- require 'countries/setup'
5
+ require 'countries/kwarg_struct'
6
+ require 'countries/configuration'
6
7
  require 'countries/data'
8
+ require 'countries/structure'
9
+ require 'countries/translations'
10
+ require 'countries/country/class_methods'
11
+ require 'countries/country/emoji'
7
12
  require 'countries/country'
13
+ require 'countries/subdivision'
14
+ require 'countries/timezones'
@@ -0,0 +1,12 @@
1
+ module ISO3166
2
+ class KwargStruct < Struct
3
+ # Override the initialize to handle hashes of named parameters
4
+ def initialize(*args)
5
+ opts = args.last.is_a?(Hash) ? args.pop : {}
6
+ super(*args)
7
+ opts.each_pair do |k, v|
8
+ send "#{k}=", v
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,31 +1,34 @@
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
+ # Convert an +ISO3166::Country+ to the data that is stored by Mongoid.
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
14
+ end
14
15
  end
15
- end
16
16
 
17
- def demongoize(alpha2)
18
- new(alpha2)
19
- end
17
+ # Get the object as it was stored with Mongoid, and instantiate an +ISO3166::Country+.
18
+ def demongoize(alpha2)
19
+ new(alpha2)
20
+ end
20
21
 
21
- def evolve(country)
22
- mongoize(country)
23
- end
22
+ # Convert an +ISO3166::Country+ to the data that is stored by Mongoid.
23
+ def evolve(country)
24
+ mongoize(country)
25
+ end
24
26
 
25
- private
27
+ private
26
28
 
27
- def valid_alpha2?(country)
28
- country.is_a?(String) && !ISO3166::Country.new(country).nil?
29
+ def valid_alpha2?(country)
30
+ country.is_a?(String) && !ISO3166::Country.new(country).nil?
31
+ end
29
32
  end
30
33
  end
31
34
  end
@@ -1,18 +1,18 @@
1
1
  module ISO3166
2
2
  ##
3
+ # <b>DEPRECATED:</b> Please use <tt>Data</tt> instead.
4
+ # TODO: Remove at version 2.1
3
5
  # Handles building the in memory store of countries data
4
6
  class Setup
7
+ # <b>DEPRECATED:</b> Please use <tt>Data.codes</tt> instead.
5
8
  def codes
6
- @codes ||= Data.codes
9
+ warn '[DEPRECATION] `Setup.codes` is deprecated. Please use `Data.codes` instead.'
10
+ Data.codes
7
11
  end
8
12
 
9
13
  def data
10
- return @data if instance_variable_defined?('@data')
11
- @data = {}
12
- codes.each do |alpha2|
13
- @data[alpha2] = Data.new(alpha2).call
14
- end
15
- @data.freeze
14
+ warn "[DEPRECATION] `Setup.new.data` is deprecated without replacement
15
+ data is now loaded per locale Data.new(:en).call"
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,37 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'nokogiri'
4
+ require 'fileutils'
5
+ require 'json'
6
+
7
+ # Support code to allow updating subdivision data from the Unicode CLDR repository
8
+ module Sources
9
+ # Support code to allow updating subdivision data from the Unicode CLDR repository
10
+ module CLDR
11
+ # Downloads data from the Unicode CLDR repository
12
+ module Downloader
13
+ module_function
14
+
15
+ def subdivisions
16
+ download_folder('subdivisions')
17
+ end
18
+
19
+ def download_folder(type)
20
+ folder = File.join(ISO3166_ROOT_PATH, 'tmp', 'cldr', 'trunk', 'common', type)
21
+ FileUtils.mkdir_p(folder)
22
+ url = URI.parse("https://api.github.com/repos/unicode-org/cldr/contents/common/" + type)
23
+ path_listing = JSON.parse(Net::HTTP.get_response(url).body)
24
+ path_listing.each do |path|
25
+ if path['name'] =~ /\.xml$/
26
+ File.open(File.join(folder, path['name']), 'w') do |f|
27
+ raw_url = URI.parse(path['download_url'])
28
+ f.write(Net::HTTP.get_response(raw_url).body)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,35 @@
1
+ module Sources
2
+ module CLDR
3
+ # Auxiliary Subdivision class to support loading Unicode CLDR data to update local files
4
+ class Subdivision
5
+ attr_reader :xml, :language_code
6
+ def initialize(language_code:, xml:)
7
+ @language_code = language_code
8
+ @xml = xml
9
+ end
10
+
11
+ def text
12
+ xml.text
13
+ end
14
+
15
+ def country_code
16
+ type[0..1].upcase
17
+ end
18
+
19
+ def code
20
+ type[2..-1].upcase
21
+ end
22
+
23
+ def type
24
+ xml.attributes['type'].value.delete('-')
25
+ end
26
+
27
+ def to_h
28
+ data = {}
29
+ data['translations'] ||= {}
30
+ data['translations'][language_code] = text
31
+ data
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/hash/deep_merge'
3
+ require 'nokogiri'
4
+ require 'pry'
5
+
6
+ module Sources
7
+ module CLDR
8
+ # Updates local subdivision files with data from the Unicode CLDR repository
9
+ class SubdivisionUpdater
10
+ def call
11
+ d = Dir['./tmp/cldr/trunk/common/subdivisions/*.xml']
12
+ loader = Sources::Local::CachedLoader.new(Sources::Local::Subdivision)
13
+ d.each do |file_path|
14
+ language_data = Nokogiri::XML(File.read(file_path))
15
+ language_code = File.basename(file_path, '.*')
16
+ subdivisions = language_data.css('subdivision')
17
+ next if subdivisions.empty?
18
+ last_country_code_seen = nil
19
+
20
+ subdivisions.each_with_index do |subdivision, index|
21
+ subdivision = Sources::CLDR::Subdivision.new(language_code: language_code, xml: subdivision)
22
+ data = loader.load(subdivision.country_code)
23
+ data[subdivision.code] ||= {}
24
+ data[subdivision.code] = data[subdivision.code].deep_merge(subdivision.to_h)
25
+ if (last_country_code_seen && last_country_code_seen != subdivision.country_code) || index == subdivisions.size - 1
26
+ puts "Updated #{subdivision.country_code} with language_code #{language_code}"
27
+ loader.save(subdivision.country_code, data)
28
+ end
29
+ last_country_code_seen = subdivision.country_code
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ module Sources
2
+ # Support code to allow updating subdivision data from the Unicode CLDR repository
3
+ module Local
4
+ # Loader for locally-cached data, to allow merging Unicode CLDR data with existing local data
5
+ class CachedLoader
6
+ attr_reader :klass
7
+ def initialize(klass)
8
+ @klass = klass
9
+ @loaded_countries = {}
10
+ end
11
+
12
+ def from_cache(country_code)
13
+ @loaded_countries[country_code]
14
+ end
15
+
16
+ def load(country_code)
17
+ if (data = from_cache(country_code))
18
+ data
19
+ else
20
+ @loaded_countries[country_code] = klass.load(country_code)
21
+ end
22
+ end
23
+
24
+ def save(country_code, data)
25
+ klass.new(country_code).save(data)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ module Sources
2
+ module Local
3
+ # Auxiliary Subdivision class to support loading the local subdivision data to be updated with Unicode CLDR data
4
+ class Subdivision
5
+ attr_reader :code
6
+ def initialize(code)
7
+ @code = code
8
+ end
9
+
10
+ def load
11
+ if File.exist?(file_path)
12
+ YAML.load_file(file_path) || {}
13
+ else
14
+ {}
15
+ end
16
+ end
17
+
18
+ def save(data)
19
+ File.open(file_path, 'w') { |f| f.write data.to_yaml }
20
+ rescue
21
+ puts "failed to read #{file}: #{$ERROR_INFO}"
22
+ end
23
+
24
+ def file_path
25
+ "lib/countries/data/subdivisions/#{code}.yaml"
26
+ end
27
+
28
+ def self.load(code)
29
+ new(code).load
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ require_relative './sources/local/cached_loader'
2
+ require_relative './sources/local/subdivision'
3
+
4
+ require_relative './sources/cldr/downloader'
5
+ require_relative './sources/cldr/subdivision'
6
+ require_relative './sources/cldr/subdivision_updater'
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ module ISO3166
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
+ 'longitude' => nil,
15
+ 'max_latitude' => nil,
16
+ 'max_longitude' => nil,
17
+ 'min_latitude' => nil,
18
+ 'min_longitude' => nil,
19
+ 'bounds' => {
20
+ 'northeast' => {
21
+ 'lat' => nil,
22
+ 'lng' => nil
23
+ },
24
+ 'southwest' => {
25
+ 'lat' => nil,
26
+ 'lng' => nil
27
+ }
28
+ }
29
+ },
30
+ 'international_prefix' => nil,
31
+ 'ioc' => nil,
32
+ 'iso_long_name' => nil,
33
+ 'iso_short_name' => nil,
34
+ 'national_destination_code_lengths' => [],
35
+ 'national_number_lengths' => [],
36
+ 'national_prefix' => nil,
37
+ 'nanp_prefix' => nil,
38
+ 'nationality' => nil,
39
+ 'number' => nil,
40
+ 'languages_official' => [],
41
+ 'languages_spoken' => [],
42
+ 'translations' => {},
43
+ 'postal_code' => nil,
44
+ 'postal_code_format' => nil,
45
+ 'region' => nil,
46
+ 'unofficial_names' => [],
47
+ 'start_of_week' => 'monday',
48
+ 'subregion' => nil,
49
+ 'un_locode' => nil,
50
+ 'vat_rates' => {
51
+ 'standard' => nil,
52
+ 'reduced' => [nil, nil],
53
+ 'super_reduced' => nil,
54
+ 'parking' => nil
55
+ },
56
+ 'world_region' => nil
57
+ }.freeze
58
+
59
+ DEFAULT_SUBDIVISION_HASH = {
60
+ 'name' => nil,
61
+ 'unofficial_names' => [],
62
+ 'translations' => {},
63
+ 'geo' => {
64
+ 'latitude' => nil,
65
+ 'longitude' => nil,
66
+ 'max_latitude' => nil,
67
+ 'max_longitude' => nil,
68
+ 'min_latitude' => nil,
69
+ 'min_longitude' => nil
70
+ }
71
+ }.freeze
72
+ end
@@ -0,0 +1,10 @@
1
+ module ISO3166
2
+ Subdivision = KwargStruct.new(
3
+ :name,
4
+ :code,
5
+ :unofficial_names,
6
+ :geo,
7
+ :translations,
8
+ :comments
9
+ )
10
+ end