-
Notifications
You must be signed in to change notification settings - Fork 149
/
export.js
111 lines (91 loc) · 3.52 KB
/
export.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import path from 'node:path';
import { writeFile } from 'node:fs/promises';
import { without, compact } from 'lodash-es';
import pluralize from 'pluralize';
import { stringify } from 'csv-stringify';
import sqlString from 'sqlstring-sqlite';
import mapSeries from 'promise-map-series';
import untildify from 'untildify';
import models from '../models/models.js';
import { openDb } from './db.js';
import { prepDirectory, generateFolderName } from './file-utils.js';
import { log as _log, logWarning as _logWarning } from './log-utils.js';
import { setDefaultConfig } from './utils.js';
const exportGtfs = async (initialConfig) => {
const config = setDefaultConfig(initialConfig);
const log = _log(config);
const logWarning = _logWarning(config);
const db = await openDb(config);
// Get agency name for export folder from first line of agency.txt
const agencies = await db.all('SELECT agency_name FROM agency;').catch(() => {
if (config.sqlitePath === ':memory:') {
throw new Error(
'No agencies found in SQLite. You are using an in-memory database - if running this from command line be sure to specify a value for `sqlitePath` in config.json other than ":memory:".'
);
}
throw new Error(
'No agencies found in SQLite. Be sure to first import data into SQLite using `gtfs-import` or `importGtfs(config);`'
);
});
const agencyCount = agencies.length;
if (agencyCount === 0) {
throw new Error(
'No agencies found in SQLite. Be sure to first import data into SQLite using `gtfs-import` or `importGtfs(config);`'
);
} else if (agencyCount > 1) {
logWarning(
'More than one agency is defined in config.json. Export will merge all into one GTFS file.'
);
}
log(
`Starting GTFS export for ${pluralize(
'agency',
agencyCount,
true
)} using SQLite database at ${config.sqlitePath}`
);
const folderName = generateFolderName(agencies[0].agency_name);
const defaultExportPath = path.join(process.cwd(), 'gtfs-export', folderName);
const exportPath = untildify(config.exportPath || defaultExportPath);
await prepDirectory(exportPath);
// Loop through each GTFS file
const exportedFiles = await mapSeries(models, async (model) => {
const filepath = path.join(exportPath, `${model.filenameBase}.txt`);
const tableName = sqlString.escapeId(model.filenameBase);
const lines = await db.all(`SELECT * FROM ${tableName};`);
if (!lines || lines.length === 0) {
if (!model.nonstandard) {
log(`Skipping (no data) - ${model.filenameBase}.txt\r`);
}
return;
}
const excludeColumns = [
'id',
'arrival_timestamp',
'departure_timestamp',
'start_timestamp',
'end_timestamp',
'service_arrival_timestamp',
'service_departure_timestamp',
'boarding_timestamp',
'alighting_timestamp',
'ridership_start_timestamp',
'ridership_end_timestamp',
];
const columns = without(
model.schema.map((column) => column.name),
...excludeColumns
);
const fileText = await stringify(lines, { columns, header: true });
await writeFile(filepath, fileText);
log(`Exporting - ${model.filenameBase}.txt\r`);
return `${model.filenameBase}.txt`;
});
if (compact(exportedFiles).length === 0) {
log('No GTFS data exported. Be sure to first import data into SQLite.');
return;
}
log(`Completed GTFS export to ${exportPath}`);
log(`Completed GTFS export for ${pluralize('agency', agencyCount, true)}\n`);
};
export default exportGtfs;