@dra2020/district-analytics 1.0.7 → 1.0.10

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 (94) hide show
  1. package/dist/cli.js +761 -594
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +2 -1
  4. package/.prettierrc +0 -5
  5. package/jestconfig.json +0 -14
  6. package/lib/HelloWorld.d.ts +0 -3
  7. package/lib/HelloWorld.js +0 -11
  8. package/lib/_api.js +0 -91
  9. package/lib/_api.js.map +0 -1
  10. package/lib/_cli.js +0 -434
  11. package/lib/_cli.js.map +0 -1
  12. package/lib/_data.js +0 -425
  13. package/lib/_data.js.map +0 -1
  14. package/lib/analyze.d.ts +0 -3
  15. package/lib/analyze.js +0 -69
  16. package/lib/analyze.js.map +0 -1
  17. package/lib/api.d.ts +0 -34
  18. package/lib/api.js +0 -117
  19. package/lib/api.js.map +0 -1
  20. package/lib/cli.d.ts +0 -1
  21. package/lib/cli.js +0 -386
  22. package/lib/cli.js.map +0 -1
  23. package/lib/cohesive.d.ts +0 -4
  24. package/lib/cohesive.js +0 -132
  25. package/lib/cohesive.js.map +0 -1
  26. package/lib/compact.d.ts +0 -4
  27. package/lib/compact.js +0 -183
  28. package/lib/compact.js.map +0 -1
  29. package/lib/constants.js +0 -367
  30. package/lib/constants.js.map +0 -1
  31. package/lib/data.js +0 -188
  32. package/lib/data.js.map +0 -1
  33. package/lib/equal.d.ts +0 -4
  34. package/lib/equal.js +0 -59
  35. package/lib/equal.js.map +0 -1
  36. package/lib/features.js +0 -19
  37. package/lib/features.js.map +0 -1
  38. package/lib/geofeature.js +0 -112
  39. package/lib/geofeature.js.map +0 -1
  40. package/lib/index.d.ts +0 -5
  41. package/lib/index.js +0 -11
  42. package/lib/index.js.map +0 -1
  43. package/lib/minority.d.ts +0 -3
  44. package/lib/minority.js +0 -61
  45. package/lib/minority.js.map +0 -1
  46. package/lib/political.d.ts +0 -7
  47. package/lib/political.js +0 -88
  48. package/lib/political.js.map +0 -1
  49. package/lib/preprocess.d.ts +0 -4
  50. package/lib/preprocess.js +0 -101
  51. package/lib/preprocess.js.map +0 -1
  52. package/lib/report.d.ts +0 -14
  53. package/lib/report.js +0 -817
  54. package/lib/report.js.map +0 -1
  55. package/lib/sample.d.ts +0 -1
  56. package/lib/sample.js +0 -32
  57. package/lib/sample.js.map +0 -1
  58. package/lib/scorecard.d.ts +0 -4
  59. package/lib/scorecard.js +0 -237
  60. package/lib/scorecard.js.map +0 -1
  61. package/lib/settings.d.ts +0 -5
  62. package/lib/settings.js +0 -18
  63. package/lib/settings.js.map +0 -1
  64. package/lib/types.d.ts +0 -125
  65. package/lib/types.js +0 -7
  66. package/lib/types.js.map +0 -1
  67. package/lib/utils.d.ts +0 -20
  68. package/lib/utils.js +0 -223
  69. package/lib/utils.js.map +0 -1
  70. package/lib/valid.d.ts +0 -5
  71. package/lib/valid.js +0 -230
  72. package/lib/valid.js.map +0 -1
  73. package/main.js +0 -4
  74. package/src/_api.ts +0 -121
  75. package/src/_data.ts +0 -595
  76. package/src/analyze.ts +0 -92
  77. package/src/cohesive.ts +0 -156
  78. package/src/compact.ts +0 -208
  79. package/src/constants.ts +0 -371
  80. package/src/equal.ts +0 -75
  81. package/src/geofeature.ts +0 -138
  82. package/src/index.ts +0 -6
  83. package/src/minority.ts +0 -70
  84. package/src/political.ts +0 -114
  85. package/src/preprocess.ts +0 -132
  86. package/src/report.ts +0 -1022
  87. package/src/settings.ts +0 -20
  88. package/src/types.ts +0 -185
  89. package/src/utils.ts +0 -245
  90. package/src/valid.ts +0 -275
  91. package/tsconfig.json +0 -25
  92. package/tslint.json +0 -3
  93. package/types/polygon-clipping/index.d.ts +0 -1
  94. package/webpack.config.js +0 -73
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@dra2020/district-analytics",
3
- "version": "1.0.7",
3
+ "version": "1.0.10",
4
4
  "description": "District analytics TypeScript package",
5
5
  "main": "dist/district-analytics.js",
6
6
  "types": "dist/index.d.ts",
7
+ "files": [ "dist/" ],
7
8
  "scripts": {
8
9
  "test": "echo test not configured",
9
10
  "build": "webpack",
package/.prettierrc DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "printWidth": 120,
3
- "trailingComma": "es5",
4
- "singleQuote": true
5
- }
package/jestconfig.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "transform": {
3
- "^.+\\.(t|j)sx?$": "ts-jest"
4
- },
5
- "testRegex": "(/_tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
6
- "moduleFileExtensions": [
7
- "ts",
8
- "tsx",
9
- "js",
10
- "jsx",
11
- "json",
12
- "node"
13
- ]
14
- }
@@ -1,3 +0,0 @@
1
- declare class Startup {
2
- static main(): number;
3
- }
package/lib/HelloWorld.js DELETED
@@ -1,11 +0,0 @@
1
- "use strict";
2
- var Startup = /** @class */ (function () {
3
- function Startup() {
4
- }
5
- Startup.main = function () {
6
- console.log('Hello World');
7
- return 0;
8
- };
9
- return Startup;
10
- }());
11
- Startup.main();
package/lib/_api.js DELETED
@@ -1,91 +0,0 @@
1
- "use strict";
2
- //
3
- // THE NODE PACKAGE API
4
- //
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const preprocess_1 = require("./preprocess");
7
- const analyze_1 = require("./analyze");
8
- const report_1 = require("./report");
9
- const D = require("./_data");
10
- const U = require("./utils");
11
- class AnalyticsSession {
12
- constructor(SessionRequest) {
13
- this.config = {};
14
- this.bOneTimeProcessingDone = false;
15
- this.bPlanAnalyzed = false;
16
- this.bPostProcessingDone = false;
17
- this.testScales = {};
18
- this.tests = {};
19
- this.scorecard = {};
20
- this.title = SessionRequest['title'];
21
- this.legislativeDistricts = SessionRequest['legislativeDistricts'];
22
- this.config = this.processConfig(SessionRequest['config']);
23
- this.state = new D.State(this, SessionRequest['stateXX'], SessionRequest['nDistricts']);
24
- this.counties = new D.Counties(this, SessionRequest['counties']);
25
- this.graph = new D.Graph(this, SessionRequest['graph']);
26
- this.features = new D.Features(this, SessionRequest['data'], this.config['datasets']);
27
- this.plan = new D.Plan(this, SessionRequest['plan']);
28
- this.districts = new D.Districts(this, SessionRequest['districtShapes']);
29
- // NOTE: I've pulled these out of the individual analytics to here. Eventually,
30
- // we could want them to passed into an analytics session as data, along with
31
- // everything else. For now, this keeps branching out of the main code.
32
- report_1.doConfigureScales(this);
33
- }
34
- processConfig(config) {
35
- // NOTE - Session settings are required:
36
- // - Analytics suites can be defaulted to all with [], but
37
- // - Dataset keys must be explicitly specified with 'dataset'
38
- let defaultSuites = [0 /* Legal */, 1 /* Fair */, 2 /* Best */];
39
- // If the config passed in has no suites = [], use the default suites
40
- if (U.isArrayEmpty(config['suites'])) {
41
- config['suites'] = defaultSuites;
42
- }
43
- // Default the Census & redistricting cycle to 2010
44
- if (!(U.keyExists('cycle', config)))
45
- config['cycle'] = 2010;
46
- return config;
47
- }
48
- // Using the the data in the analytics session, calculate all the
49
- // analytics & validations, saving/updating the individual test results.
50
- analyzePlan(bLog = false) {
51
- try {
52
- preprocess_1.doPreprocessData(this);
53
- analyze_1.doAnalyzeDistricts(this, bLog);
54
- analyze_1.doAnalyzePlan(this, bLog);
55
- report_1.doAnalyzePostProcessing(this);
56
- }
57
- catch (_a) {
58
- return false;
59
- }
60
- return true;
61
- }
62
- // Get an individual test, so you can drive UI with the results.
63
- getTest(testID) {
64
- // Get the existing test entries
65
- // T.Test is a numeric enum, so convert the string keys to numbers
66
- let testValues = U.getNumericObjectKeys(this.tests);
67
- // If there's no entry for this test, create & initialize one
68
- if (!(testValues.includes(testID))) {
69
- this.tests[testID] = {};
70
- this.tests[testID]['score'] = undefined;
71
- this.tests[testID]['details'] = {};
72
- }
73
- // Return a pointer to the the test entry for this test
74
- return this.tests[testID];
75
- }
76
- // Prepare a scorecard for rendering
77
- // NOTE - This assumes that analyzePlan() has been run!
78
- prepareScorecard() {
79
- return report_1.doPrepareScorecard(this);
80
- }
81
- // Prepare test results for rendering
82
- // NOTE - This assumes that analyzePlan() has been run!
83
- prepareTestLog() {
84
- return report_1.doPrepareTestLog(this);
85
- }
86
- populationDeviationThreshold() {
87
- return 1 - this.testScales[4 /* PopulationDeviation */]['testScale'][0];
88
- }
89
- }
90
- exports.AnalyticsSession = AnalyticsSession;
91
- //# sourceMappingURL=_api.js.map
package/lib/_api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"_api.js","sourceRoot":"","sources":["../src/_api.ts"],"names":[],"mappings":"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"}
package/lib/_cli.js DELETED
@@ -1,434 +0,0 @@
1
- "use strict";
2
- //
3
- // A SIMPLE COMMAND-LINE INTERFACE FOR EXERCISING THE ANALYTICS & VALIDATIONS
4
- //
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const yargs = require("yargs");
7
- const PC = require("polygon-clipping");
8
- const Poly = require("@dra2020/poly");
9
- const fs = require("fs");
10
- const path = require("path");
11
- const parse = require("csv-parse/lib/sync");
12
- const _api_1 = require("./_api");
13
- const preprocess_1 = require("./preprocess");
14
- const analyze_1 = require("./analyze");
15
- const valid_1 = require("./valid");
16
- const equal_1 = require("./equal");
17
- const compact_1 = require("./compact");
18
- const cohesive_1 = require("./cohesive");
19
- const political_1 = require("./political");
20
- const minority_1 = require("./minority");
21
- const U = require("./utils");
22
- const S = require("./settings");
23
- // Simulate DRA unioning district shapes in the background
24
- function addToPoly(poly, polys) {
25
- return PC.union(poly, ...polys);
26
- }
27
- console.log("Starting command @ ", new Date());
28
- // COMMAND LINE
29
- let argv = yargs
30
- .usage('Usage: $0 command [options]')
31
- .example('$0 equal -f foo.geojson', 'Calculate population deviation')
32
- .demandCommand(1, 'You must specify a command to execute.')
33
- .command('valid', 'Perform validations.')
34
- .command('equal', 'Calculate population deviation.')
35
- .command('compact', 'Calculate compactness.')
36
- .command('cohesive', 'Calculate cohesiveness.')
37
- .command('political', 'Assess fairness.')
38
- .command('minority', 'Count majority-minority districts.')
39
- .command('analyze', 'API call to analyze a plan.')
40
- .command('scorecard', 'Analyze plan & generate a scorecard.')
41
- .command('testlog', 'Analyze plan & generate a testlog.')
42
- .command('report', 'API call to generate a scorecard.')
43
- .option('state', {
44
- alias: 'x',
45
- describe: 'Specify the state.',
46
- type: 'string'
47
- })
48
- .option('number', {
49
- alias: 'n',
50
- describe: 'Specify the number of districts.',
51
- type: 'number'
52
- })
53
- .option('legislative', {
54
- alias: 'l',
55
- describe: 'Specify that districts are legislative.',
56
- type: 'boolean',
57
- default: false
58
- })
59
- .option('plan', {
60
- alias: 'p',
61
- describe: 'Specify the plan to evaluate.',
62
- type: 'string'
63
- })
64
- .option('data', {
65
- alias: 'd',
66
- describe: 'Specify the census & election data to use.',
67
- type: 'string'
68
- })
69
- .option('shapes', {
70
- alias: 's',
71
- describe: 'Specify the shapes to use.',
72
- type: 'string'
73
- })
74
- .option('graph', {
75
- alias: 'g',
76
- describe: 'Specify the contiguity graph to use.',
77
- type: 'string'
78
- })
79
- .option('counties', {
80
- alias: 'c',
81
- describe: 'Specify the FIPS-to-county-name map to use.',
82
- type: 'string'
83
- })
84
- .option('empty', {
85
- describe: 'Specify whether a district should be empty.',
86
- type: 'boolean',
87
- default: false
88
- })
89
- .option('suites', {
90
- describe: 'Specify the test suites to run.',
91
- type: 'array',
92
- default: []
93
- })
94
- .option('verbose', {
95
- alias: 'v',
96
- describe: 'Specify whether code should log to STDOUT.',
97
- type: 'boolean',
98
- default: false
99
- })
100
- .demandOption(['number', 'plan', 'data', 'shapes', 'counties'], 'Please specify all the args.')
101
- .help()
102
- .argv;
103
- // PROCESS COMMAND LINE ARGS
104
- let command = argv._[0];
105
- let xx = argv.state;
106
- let bLegislativeDistricts = argv.legislative;
107
- let nDistricts = argv.n;
108
- let planByGeoID = readPlanCSV(argv.plan);
109
- let graph = {};
110
- let data = {};
111
- let counties = {};
112
- // Don't load other datasets, if just calculating compactness
113
- if (command != 'compact') {
114
- graph = readJSON(argv.graph);
115
- data = readJSON(argv.data);
116
- counties = readJSON(argv.counties);
117
- }
118
- let shapes = readJSON(argv.shapes);
119
- let bEmpty = argv.empty;
120
- let suites = argv.suites;
121
- // Some default dataset keys
122
- let datasetKeys = {
123
- CENSUS: "D16F",
124
- VAP: "D16T",
125
- ELECTION: "E16GPR"
126
- };
127
- // Session settings are required:
128
- // - Analytics suites can be defaulted to all with [], but
129
- // - Dataset must be explicitly specified
130
- let sessionSettings = {
131
- 'suites': suites,
132
- 'datasets': datasetKeys
133
- };
134
- let bLog = argv.verbose;
135
- // Invert the plan, so you can create the district shapes for the SessionRequest.
136
- let planByDistrictID = U.invertPlan(planByGeoID);
137
- // SIMULATE THE HOST
138
- // 1 - Create district shapes & extract properties (area, diameter, perimeter)
139
- const polyOptions = {
140
- noLatitudeCorrection: false
141
- };
142
- // Index the shapes by geoID
143
- let shapesByGeoID = {};
144
- let idStr = "GEOID";
145
- // TODO - Terry: But sometimes "GEOID10" hasn't been set to "GEOID"
146
- let firstFeature = shapes.features[0];
147
- if (!(firstFeature.properties == null)) {
148
- if (U.keyExists("GEOID10", firstFeature.properties))
149
- idStr = "GEOID10";
150
- }
151
- for (let f of shapes.features) {
152
- if (!(f.properties == null)) {
153
- // let idStr = "GEOID";
154
- // TODO - Terry: Sometimes "GEOID10" hasn't been => to "GEOID!"
155
- // if (U.keyExists("GEOID10", f.properties)) idStr = "GEOID10";
156
- let geoID = f.properties[idStr];
157
- shapesByGeoID[geoID] = f;
158
- }
159
- }
160
- // Find the smallest Feature
161
- // COPIED from dra-client/geodistrict.ts, and lightly modified
162
- let geo = shapes;
163
- let minFeatureArea = Poly.polyArea(geo.features[0], polyOptions);
164
- for (let i = 1; i < geo.features.length; i++) {
165
- let a = Poly.polyArea(geo.features[i], polyOptions);
166
- if (a < minFeatureArea)
167
- minFeatureArea = a;
168
- }
169
- // Eliminate anomalous holes
170
- // COPIED from dra-client/geodistrict.ts, and lightly modified
171
- // This is a bit of a hack in the sense that it is still an open question as to whether this is a problem
172
- // with either the underlying shape data or a problem in our simplification of that shape data.
173
- // But in any case, what this does is eliminate any holes that are smaller than the smallest feature. Such
174
- // a hole must be an anomaly. CA/2010_VT in particular seems to have many such issues.
175
- function eliminateAnomalousHoles(mp) {
176
- // Normalize to multipolygon
177
- if (U.depthof(mp) == 4)
178
- mp = [mp];
179
- for (let i = 0; i < mp.length; i++) {
180
- let p = mp[i];
181
- let cleanp = [p[0]];
182
- for (let j = 1; j < p.length; j++) {
183
- let a = Poly.polyArea(p[j], polyOptions);
184
- if (a >= minFeatureArea)
185
- cleanp.push(p[j]);
186
- }
187
- if (cleanp.length < p.length)
188
- mp[i] = cleanp;
189
- }
190
- }
191
- // Create district shapes
192
- let districtShapes = {};
193
- districtShapes['type'] = "FeatureCollection";
194
- districtShapes['features'] = [];
195
- for (let districtID = 1; districtID <= nDistricts; districtID++) {
196
- let districtFeatures = [];
197
- // Collect Features by district
198
- planByDistrictID[districtID].forEach(function (geoID) {
199
- districtFeatures.push(shapesByGeoID[geoID]);
200
- });
201
- // Union them together
202
- let poly1Coordinates = Poly.polyNormalize(districtFeatures[0], polyOptions);
203
- let polyNCoordinates = districtFeatures.slice(1).map((i) => Poly.polyNormalize(i, polyOptions));
204
- let poly = addToPoly(poly1Coordinates, polyNCoordinates);
205
- // Convert the result to a Feature
206
- let bPolygon = U.depthof(poly) == 4;
207
- if (!bPolygon && poly.length == 1) {
208
- bPolygon = true;
209
- poly = poly[0];
210
- }
211
- eliminateAnomalousHoles(poly);
212
- let f = {
213
- type: 'Feature',
214
- properties: { districtID: `${districtID}` },
215
- geometry: {
216
- type: bPolygon ? 'Polygon' : 'MultiPolygon',
217
- coordinates: poly
218
- }
219
- };
220
- districtShapes.features.push(f);
221
- }
222
- // CONSTRUCT A SESSION REQUEST
223
- let SessionRequest = {};
224
- SessionRequest['title'] = "CLI Test";
225
- SessionRequest['stateXX'] = xx;
226
- SessionRequest['nDistricts'] = nDistricts;
227
- SessionRequest['legislativeDistricts'] = bLegislativeDistricts;
228
- SessionRequest['data'] = data;
229
- SessionRequest['counties'] = counties;
230
- SessionRequest['graph'] = graph;
231
- SessionRequest['plan'] = planByGeoID;
232
- SessionRequest['districtShapes'] = districtShapes;
233
- SessionRequest['config'] = sessionSettings;
234
- // CREATE AND INITIALIZE AN ANALYTICS SESSION
235
- let s = new _api_1.AnalyticsSession(SessionRequest);
236
- // DISPATCH TO REQUESTED COMMAND W/ NEEDED SCAFFOLDING
237
- let t;
238
- let text;
239
- function echoTestResult(test, t) {
240
- console.log("");
241
- console.log("Test:", test);
242
- console.log("Score:", t['score']);
243
- let keys = U.getObjectKeys(t['details']);
244
- if (keys.length > 0) {
245
- console.log("Details:");
246
- for (let i in keys) {
247
- let key = keys[i];
248
- console.log("-", key, "=", t['details'][key]);
249
- }
250
- }
251
- console.log("___");
252
- }
253
- switch (command) {
254
- case 'valid': {
255
- preprocess_1.doPreprocessData(s);
256
- if (bEmpty) {
257
- // Make one random district empty
258
- let randomDistrict = Math.floor(Math.random() * s.state.nDistricts) + 1;
259
- let reassignFeatures = s.plan._planByDistrictID[randomDistrict];
260
- s.plan._planByDistrictID[S.NOT_ASSIGNED] = reassignFeatures;
261
- s.plan.initializeDistrict(randomDistrict);
262
- }
263
- analyze_1.doAnalyzeDistricts(s);
264
- t = valid_1.doIsComplete(s);
265
- echoTestResult("Complete:", t);
266
- t = valid_1.doIsContiguous(s);
267
- echoTestResult("Contiguous:", t);
268
- t = valid_1.doIsFreeOfHoles(s);
269
- echoTestResult("Free of holes:", t);
270
- t = equal_1.doPopulationDeviation(s);
271
- echoTestResult("Population deviation (%):", t);
272
- t = equal_1.doHasEqualPopulations(s);
273
- echoTestResult("Equal populations:", t);
274
- break;
275
- }
276
- case 'equal': {
277
- preprocess_1.doPreprocessData(s);
278
- analyze_1.doAnalyzeDistricts(s);
279
- t = equal_1.doPopulationDeviation(s);
280
- echoTestResult("Population deviation (%):", t);
281
- break;
282
- }
283
- case 'compact': {
284
- preprocess_1.doPreprocessData(s);
285
- analyze_1.doAnalyzeDistricts(s);
286
- t = compact_1.doReock(s, bLog);
287
- echoTestResult("Reock:", t);
288
- t = compact_1.doPolsbyPopper(s, bLog);
289
- echoTestResult("Polsby-Popper:", t);
290
- break;
291
- }
292
- case 'cohesive': {
293
- preprocess_1.doPreprocessData(s);
294
- analyze_1.doAnalyzeDistricts(s);
295
- t = cohesive_1.doCountySplits(s);
296
- echoTestResult("County splits:", t);
297
- cohesive_1.doPlanComplexity(s);
298
- break;
299
- }
300
- case 'political': {
301
- preprocess_1.doPreprocessData(s);
302
- analyze_1.doAnalyzeDistricts(s);
303
- political_1.doSeatsBias(s);
304
- political_1.doVotesBias(s);
305
- political_1.doResponsiveness(s);
306
- political_1.doResponsiveDistricts(s);
307
- t = political_1.doEfficiencyGap(s);
308
- echoTestResult("Efficiency gap (%):", t);
309
- break;
310
- }
311
- case 'minority': {
312
- preprocess_1.doPreprocessData(s);
313
- analyze_1.doAnalyzeDistricts(s);
314
- minority_1.doMajorityMinorityDistricts(s);
315
- break;
316
- }
317
- case 'analyze': {
318
- console.log("");
319
- console.log("Analyzing a plan ...");
320
- console.log("");
321
- s.analyzePlan(bLog);
322
- break;
323
- }
324
- case 'scorecard': {
325
- s.analyzePlan(bLog);
326
- text = s.prepareScorecard();
327
- console.log("");
328
- for (let line of text.data) {
329
- switch (line['variant']) {
330
- case 'beginTable':
331
- case 'endTable':
332
- console.log(line['variant']);
333
- break;
334
- case 'row':
335
- console.log(line['variant'], line['cells']);
336
- break;
337
- default:
338
- console.log(line['variant'], line['text']);
339
- break;
340
- }
341
- }
342
- console.log("");
343
- break;
344
- }
345
- case 'testlog': {
346
- s.analyzePlan(bLog);
347
- text = s.prepareTestLog();
348
- console.log("");
349
- for (let line of text.data) {
350
- console.log(line['variant'], line['text']);
351
- }
352
- console.log("");
353
- break;
354
- }
355
- case 'limit': {
356
- s.analyzePlan(bLog);
357
- text = s.prepareScorecard();
358
- console.log("");
359
- for (let line of text.data) {
360
- console.log(line['variant'], line['text']);
361
- }
362
- console.log("");
363
- text = s.prepareTestLog();
364
- console.log("");
365
- for (let line of text.data) {
366
- console.log(line['variant'], line['text']);
367
- }
368
- console.log("");
369
- break;
370
- }
371
- }
372
- console.log("Ending command @ ", new Date());
373
- // HELPERS TO LOAD SAMPLE DATA FROM DISK
374
- // A clone of 'carefulRead' in DRA-CLI
375
- function readJSONcareful(file) {
376
- try {
377
- let s = fs.readFileSync(file, 'utf8');
378
- let o = JSON.parse(s);
379
- return o;
380
- }
381
- catch (err) {
382
- console.log("Error reading JSON file ...");
383
- return null;
384
- }
385
- }
386
- exports.readJSONcareful = readJSONcareful;
387
- function readJSON(file) {
388
- let fullPath;
389
- if (path.isAbsolute(file)) {
390
- fullPath = file;
391
- }
392
- else {
393
- fullPath = path.join(__dirname, file);
394
- }
395
- return readJSONcareful(fullPath);
396
- }
397
- exports.readJSON = readJSON;
398
- // Following the clone above, except for CSV, using the csv-parse/sync API
399
- function readCSV(file) {
400
- try {
401
- let input = fs.readFileSync(file, 'utf8');
402
- let dictRows = parse(input, {
403
- columns: true,
404
- skip_empty_lines: true
405
- });
406
- return dictRows;
407
- }
408
- catch (err) {
409
- console.log("Error reading CSV file ...");
410
- return null;
411
- }
412
- }
413
- exports.readCSV = readCSV;
414
- // Read a plan from a .csv file
415
- function readPlanCSV(file) {
416
- var plan = {};
417
- let fullPath;
418
- if (path.isAbsolute(file)) {
419
- fullPath = file;
420
- }
421
- else {
422
- fullPath = path.join(__dirname, file);
423
- }
424
- var csvArray = readCSV(fullPath);
425
- for (let dictRow of csvArray) {
426
- let geoID = dictRow['GEOID'];
427
- let districtID = Number(dictRow['DISTRICT']);
428
- plan[geoID] = districtID;
429
- }
430
- return plan;
431
- }
432
- exports.readPlanCSV = readPlanCSV;
433
- // FIN
434
- //# sourceMappingURL=_cli.js.map
package/lib/_cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"_cli.js","sourceRoot":"","sources":["../src/_cli.ts"],"names":[],"mappings":"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"}