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