Skip to content

Commit 09ac3fd

Browse files
author
Zork
committed
v1.1.0 Gulp task to generate everything from countries.json: .min.json, .minimal.json, .sql
1 parent 03d756a commit 09ac3fd

File tree

5 files changed

+187
-31
lines changed

5 files changed

+187
-31
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "annexare/countries-list",
3-
"version": "1.0.4",
3+
"version": "1.1.0",
44
"description": "Continents & countries: ISO 3166-1 alpha-2 code, name, languages, capital and currency, native name, calling codes. Available in JSON and SQL formats.",
55
"type": "library",
66
"keywords": [

countries.min.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

countries.sql

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
CREATE TABLE IF NOT EXISTS `continents` (
1+
DROP TABLE IF EXISTS `continents`;
2+
CREATE TABLE `continents` (
23
`code` VARCHAR(2) NOT NULL DEFAULT '',
3-
`name` VARCHAR(15) NOT NULL DEFAULT ''
4-
)
5-
ENGINE =MyISAM
6-
DEFAULT CHARSET =utf8;
4+
`name` VARCHAR(15) NOT NULL DEFAULT '',
5+
UNIQUE KEY `code` (`code`)
6+
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
77

88
INSERT INTO `continents` (`code`, `name`) VALUES
99
('AF', 'Africa'),
@@ -14,21 +14,21 @@ INSERT INTO `continents` (`code`, `name`) VALUES
1414
('OC', 'Oceania'),
1515
('SA', 'South America');
1616

17-
CREATE TABLE IF NOT EXISTS `countries` (
18-
`code` VARCHAR(2) NOT NULL DEFAULT '',
19-
`name` VARCHAR(50) NOT NULL DEFAULT '',
20-
`native` VARCHAR(50) NOT NULL DEFAULT '',
21-
`phone` VARCHAR(15) NOT NULL DEFAULT '',
22-
`continent` VARCHAR(2) NOT NULL DEFAULT '',
23-
`capital` VARCHAR(50) NOT NULL DEFAULT '',
24-
`currency` VARCHAR(30) NOT NULL DEFAULT '',
25-
`languages` VARCHAR(30) NOT NULL DEFAULT ''
26-
)
27-
ENGINE =MyISAM
28-
DEFAULT CHARSET =utf8;
17+
DROP TABLE IF EXISTS `countries`;
18+
CREATE TABLE `countries` (
19+
`code` VARCHAR(2) NOT NULL DEFAULT '',
20+
`name` VARCHAR(50) NOT NULL DEFAULT '',
21+
`native` VARCHAR(50) NOT NULL DEFAULT '',
22+
`phone` VARCHAR(15) NOT NULL DEFAULT '',
23+
`continent` VARCHAR(2) NOT NULL DEFAULT '',
24+
`capital` VARCHAR(50) NOT NULL DEFAULT '',
25+
`currency` VARCHAR(30) NOT NULL DEFAULT '',
26+
`languages` VARCHAR(30) NOT NULL DEFAULT '',
27+
UNIQUE KEY `code` (`code`),
28+
KEY `continent` (`continent`)
29+
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
2930

30-
INSERT INTO `countries` (`code`, `name`, `native`, `phone`, `continent`, `capital`, `currency`, `languages`)
31-
VALUES
31+
INSERT INTO `countries` (`code`, `name`) VALUES
3232
('AD', 'Andorra', 'Andorra', '376', 'EU', 'Andorra la Vella', 'EUR', 'ca'),
3333
('AE', 'United Arab Emirates', 'دولة الإمارات العربية المتحدة', '971', 'AS', 'Abu Dhabi', 'AED', 'ar'),
3434
('AF', 'Afghanistan', 'افغانستان', '93', 'AS', 'Kabul', 'AFN', 'ps,uz,tk'),
@@ -276,14 +276,6 @@ VALUES
276276
('XK', 'Kosovo', 'Republika e Kosovës', '377,381,386', 'EU', 'Pristina', 'EUR', 'sq,sr'),
277277
('YE', 'Yemen', 'اليَمَن', '967', 'AS', 'Sana''a', 'YER', 'ar'),
278278
('YT', 'Mayotte', 'Mayotte', '262', 'AF', 'Mamoudzou', 'EUR', 'fr'),
279-
('ZA', 'South Africa', 'South Africa', '27', 'AF', 'Pretoria', 'ZAR',
280-
'af,en,nr,st,ss,tn,ts,ve,xh,zu'),
279+
('ZA', 'South Africa', 'South Africa', '27', 'AF', 'Pretoria', 'ZAR', 'af,en,nr,st,ss,tn,ts,ve,xh,zu'),
281280
('ZM', 'Zambia', 'Zambia', '260', 'AF', 'Lusaka', 'ZMK', 'en'),
282281
('ZW', 'Zimbabwe', 'Zimbabwe', '263', 'AF', 'Harare', 'ZWL', 'en,sn,nd');
283-
284-
285-
ALTER TABLE `continents`
286-
ADD UNIQUE KEY `code` (`code`);
287-
288-
ALTER TABLE `countries`
289-
ADD UNIQUE KEY `code` (`code`), ADD KEY `continent` (`continent`);

gulpfile.js

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
'use strict';
2+
3+
const
4+
NAME = 'countries',
5+
LF = "\n",
6+
DO_MIN = 'min',
7+
DO_MINIMAL = 'minimal',
8+
DO_SQL = 'sql',
9+
fs = require('fs'),
10+
gulp = require('gulp'),
11+
countries = require('./' + NAME + '.json');
12+
13+
gulp.task(DO_MIN, function (callback) {
14+
fs.writeFile(`./${NAME}.${DO_MIN}.json`, JSON.stringify(countries) + LF, callback);
15+
});
16+
17+
gulp.task(DO_MINIMAL, function (callback) {
18+
let minimal = {},
19+
codes = Object.keys(countries.countries);
20+
21+
for (let code of codes) {
22+
minimal[code] = countries.countries[code].name;
23+
}
24+
25+
fs.writeFile(`./${NAME}.${DO_MINIMAL}.json`, JSON.stringify(minimal) + LF, callback);
26+
});
27+
28+
gulp.task(DO_SQL, function (callback) {
29+
let continentFields = [{
30+
name: 'code',
31+
type: 'VARCHAR(2) NOT NULL DEFAULT \'\'',
32+
unique: true
33+
}, {
34+
name: 'name',
35+
type: 'VARCHAR(15) NOT NULL DEFAULT \'\''
36+
}],
37+
countryFields = [{
38+
name: 'code',
39+
type: 'VARCHAR(2) NOT NULL DEFAULT \'\'',
40+
unique: true
41+
}, {
42+
name: 'name',
43+
type: 'VARCHAR(50) NOT NULL DEFAULT \'\''
44+
}, {
45+
name: 'native',
46+
type: 'VARCHAR(50) NOT NULL DEFAULT \'\''
47+
}, {
48+
name: 'phone',
49+
type: 'VARCHAR(15) NOT NULL DEFAULT \'\''
50+
}, {
51+
name: 'continent',
52+
type: 'VARCHAR(2) NOT NULL DEFAULT \'\'',
53+
key: true
54+
}, {
55+
name: 'capital',
56+
type: 'VARCHAR(50) NOT NULL DEFAULT \'\''
57+
}, {
58+
name: 'currency',
59+
type: 'VARCHAR(30) NOT NULL DEFAULT \'\''
60+
}, {
61+
name: 'languages',
62+
type: 'VARCHAR(30) NOT NULL DEFAULT \'\''
63+
}],
64+
65+
continentList = Object.keys(countries.continents)
66+
.map(key => {
67+
return [key, countries.continents[key]];
68+
}),
69+
countryList = Object.keys(countries.countries)
70+
.map(key => {
71+
let country = countries.countries[key],
72+
values = [key];
73+
74+
Object.keys(country).forEach(field => {
75+
values.push(country[field]);
76+
});
77+
78+
return values;
79+
}),
80+
sql;
81+
82+
sql = sqlHeader('continents', continentFields)
83+
+ LF + LF
84+
+ sqlValues('continents', continentFields, continentList)
85+
+ LF + LF
86+
+ sqlHeader('countries', countryFields)
87+
+ LF + LF
88+
+ sqlValues('countries', continentFields, countryList);
89+
90+
fs.writeFile(`./${NAME}.${DO_SQL}`, sql + LF, callback);
91+
});
92+
93+
gulp.task('default', [DO_MIN, DO_MINIMAL, DO_SQL]);
94+
95+
96+
function objectValues(item) {
97+
return Object.keys(item)
98+
.map(key => item[key]);
99+
}
100+
function sqlHeader(table, fields) {
101+
let lines = [
102+
'DROP TABLE IF EXISTS `' + table + '`;',
103+
'CREATE TABLE `' + table + '` (',
104+
' '
105+
+ fields
106+
.map(field => '`' + field.name + '` ' + field.type)
107+
.join(',' + LF + ' ')
108+
+ sqlKeys(fields),
109+
') ENGINE=MyISAM DEFAULT CHARSET=utf8;'
110+
];
111+
112+
return lines.join(LF);
113+
}
114+
function sqlKeys(fields) {
115+
let keys = [];
116+
117+
fields.forEach(field => {
118+
let key = false;
119+
if (field.key || field.unique) {
120+
let name = '`' + field.name + '`';
121+
key = 'KEY ' + name + ' (' + name + ')';
122+
123+
if (field.unique) {
124+
key = 'UNIQUE ' + key;
125+
}
126+
127+
keys.push(key);
128+
}
129+
});
130+
131+
return (keys ? ',' + LF + ' ' : '')
132+
+ keys.join(',' + LF + ' ');
133+
}
134+
function sqlValues(table, fields, values) {
135+
if (!values || !values.length) {
136+
return '';
137+
}
138+
139+
let lines = [
140+
'INSERT INTO `' + table + '` (`'
141+
+ fields
142+
.map(field => field.name)
143+
.join('`, `')
144+
+ '`) VALUES'
145+
],
146+
valueLines = [];
147+
148+
values.forEach(values => {
149+
valueLines.push(
150+
' (\''
151+
+ values
152+
.map(value => value.replace(/'/g, "''"))
153+
.join('\', \'')
154+
+ '\')');
155+
});
156+
157+
return lines.join(LF)
158+
+ LF
159+
+ valueLines.join(',' + LF)
160+
+ ';';
161+
}

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "countries-list",
3-
"version": "1.0.4",
3+
"version": "1.1.0",
44
"description": "Continents & countries: ISO 3166-1 alpha-2 code, name, languages, capital and currency, native name, calling codes. Available in JSON and SQL formats.",
55
"main": "countries.json",
66
"repository": {
@@ -25,6 +25,9 @@
2525
"email": "[email protected]",
2626
"url": "https://github.com/z-ax"
2727
},
28+
"devDependencies": {
29+
"gulp": "*"
30+
},
2831
"license": "MIT",
2932
"bugs": {
3033
"url": "https://github.com/annexare/Countries/issues"

0 commit comments

Comments
 (0)