Skip to content

Instantly share code, notes, and snippets.

@rossdakin
Created January 28, 2019 20:49
Show Gist options
  • Save rossdakin/54c8857b181d8809a2f70933bbcde7b9 to your computer and use it in GitHub Desktop.
Save rossdakin/54c8857b181d8809a2f70933bbcde7b9 to your computer and use it in GitHub Desktop.
Vera URL generator.
const BASE_URL = 'https://arresttrends.vera.org/';
const MAX_DEPTH = 2;
const PARAMS = {
AMOUNT: {
name: 'amount',
values: ['some', 'all']
},
DATASET: {
name: 'dataset',
values: ['police', 'fbi']
},
ESTIMATED: {
name: 'estimated',
values: [0, 1]
},
LOCATION: {
name: 'location',
values: [2, 3, 4, 5]
},
OFFENSE_1: {
name: 'offense',
values: ['part1', 'violent', 'property', '01', '02', '03', '04', '05', '06', '07']
},
OFFENSE_ALL: {
name: 'offense',
values: [
'part1', 'part2', 'violent', 'property',
'01', '02', '03', '04', '05', '06', '07', '08', '09', '10',
'11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
'21', '22', '23', '24', '25', '26', '27', '28', '29',
]
},
REPORTED: {
name: 'reported',
values: ['clearance', 'race', 'ethnicity']
},
START_1964_2016: {
name: 'start',
values: getRange(1964, 2016)
},
START_1980_2016: {
name: 'start',
values: getRange(1980, 2016)
},
START_1993_2016: {
name: 'start',
values: getRange(1993, 2016)
},
TYPE: {
name: 'type',
values: ['national', 'region', 'state', 'county']
},
UNIT: {
name: 'unit',
values: ['rate']
},
YEAR_1964_2016: {
name: 'year',
values: getRange(1964, 2016)
},
YEAR_1980_2016: {
name: 'year',
values: getRange(1980, 2016)
},
YEAR_1993_2016: {
name: 'year',
values: getRange(1993, 2016)
},
};
const PAGES = {
'arrests': [
PARAMS.ESTIMATED,
PARAMS.LOCATION,
PARAMS.OFFENSE_ALL,
PARAMS.START_1980_2016,
PARAMS.TYPE,
PARAMS.UNIT,
PARAMS.YEAR_1980_2016,
],
'demographics': [
PARAMS.ESTIMATED,
PARAMS.LOCATION,
PARAMS.OFFENSE_ALL,
PARAMS.START_1980_2016,
PARAMS.TYPE,
PARAMS.UNIT,
PARAMS.YEAR_1980_2016,
],
'clearance-rates': [
PARAMS.LOCATION,
PARAMS.OFFENSE_1,
PARAMS.START_1964_2016,
PARAMS.TYPE,
PARAMS.YEAR_1964_2016,
],
'victimizations': [
PARAMS.DATASET,
PARAMS.LOCATION,
PARAMS.OFFENSE_1,
PARAMS.START_1993_2016,
PARAMS.TYPE,
PARAMS.UNIT,
PARAMS.YEAR_1993_2016,
],
'data-reported': [
PARAMS.AMOUNT,
PARAMS.LOCATION,
PARAMS.REPORTED,
PARAMS.START_1980_2016,
PARAMS.YEAR_1980_2016,
],
};
function getRange(start, end) {
var ans = [];
for (let i = start; i <= end; i++) {
ans.push(i);
}
return ans;
}
function generateURLs(prefix, params, urlFunc, maxDepth, depth = 0, concat = '?') {
// BAIL -- over depth
if (maxDepth != null && depth > maxDepth) {
return;
}
if (params.length === 0) {
urlFunc(prefix);
return;
}
let headParam = params[0];
let tailParams = params.slice(1);
generateURLs(prefix, tailParams, urlFunc, maxDepth, depth, concat);
headParam.values.forEach(value => {
generateURLs(prefix + concat + headParam.name + '=' + value, tailParams, urlFunc, maxDepth, depth + 1, '&');
});
}
function isValid(url) {
url = new URL(url);
let start = url.searchParams.get('start');
if (start) {
let year = url.searchParams.get('year');
// FAIL -- start without year (UI disallows)
if (!year) {
return false;
}
// FAIL -- start > year (UI disallows)
if (parseInt(start) > parseInt(year)) {
return false;
}
}
return true;
}
function main() {
let count = 0;
let urlFunc = function(url) {
if (isValid(url)) {
console.debug(url);
count++;
}
}
for (const path in PAGES) {
generateURLs(BASE_URL + path, PAGES[path], urlFunc, MAX_DEPTH);
}
console.debug(count);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment