@tricoteuses/senat
Version:
Handle French Sénat's open data
234 lines (233 loc) • 11.1 kB
JavaScript
import fs from "fs-extra";
import path from "path";
import assert from "assert";
export var EnabledDatasets;
(function (EnabledDatasets) {
EnabledDatasets[EnabledDatasets["None"] = 0] = "None";
EnabledDatasets[EnabledDatasets["Ameli"] = 1] = "Ameli";
EnabledDatasets[EnabledDatasets["Debats"] = 2] = "Debats";
EnabledDatasets[EnabledDatasets["DosLeg"] = 4] = "DosLeg";
EnabledDatasets[EnabledDatasets["Questions"] = 8] = "Questions";
EnabledDatasets[EnabledDatasets["Sens"] = 16] = "Sens";
EnabledDatasets[EnabledDatasets["PhotosSenateurs"] = 32] = "PhotosSenateurs";
EnabledDatasets[EnabledDatasets["Agenda"] = 64] = "Agenda";
EnabledDatasets[EnabledDatasets["All"] = 127] = "All";
})(EnabledDatasets || (EnabledDatasets = {}));
export const datasets = {
ameli: {
database: "ameli",
repairEncoding: true,
repairZip: (dataset, dataDir) => {
const sqlFilename = `${dataset.database}.sql`;
const sqlFilePath = path.join(dataDir, sqlFilename);
fs.removeSync(sqlFilePath);
fs.moveSync(path.join(dataDir, "var", "opt", "opendata", sqlFilename), sqlFilePath);
},
title: "Amendements",
url: "https://data.senat.fr/data/ameli/ameli.zip",
indexes: {
amdsen: [
{ name: "idx_amdid", columns: ["amdid"] },
{ name: "idx_senid", columns: ["senid"] },
{ name: "idx_grpid", columns: ["grpid"] },
],
sen_ameli: [{ name: "idx_entid", columns: ["entid"] }],
grppol_ameli: [{ name: "idx_entid", columns: ["entid"] }],
sub: [
{ name: "idx_id", columns: ["id"] },
{ name: "idx_typid", columns: ["typid"] },
{ name: "idx_merid", columns: ["merid"] },
{ name: "idx_comdelid", columns: ["comdelid"] },
],
typsub: [{ name: "idx_id", columns: ["id"] }],
typrect: [{ name: "idx_id", columns: ["id"] }],
txt_ameli: [
{ name: "idx_id", columns: ["id"] },
{ name: "idx_txtetaid", columns: ["txtetaid"] },
{ name: "idx_sesdepid", columns: ["sesdepid"] },
{ name: "idx_natid", columns: ["natid"] },
{ name: "idx_lecid", columns: ["lecid"] },
],
etatxt: [{ name: "idx_id", columns: ["id"] }],
ses: [
{ name: "idx_id", columns: ["id"] },
{ name: "idx_typid", columns: ["typid"] },
{ name: "idx_ann", columns: ["ann"] },
],
typses: [{ name: "idx_id", columns: ["id"] }],
nat: [{ name: "idx_id", columns: ["id"] }],
lec_ameli: [{ name: "idx_id", columns: ["id"] }],
mot: [{ name: "idx_id", columns: ["id"] }],
avicom: [{ name: "idx_id", columns: ["id"] }],
avigvt: [{ name: "idx_id", columns: ["id"] }],
sor: [{ name: "idx_id", columns: ["id"] }],
irr: [{ name: "idx_id", columns: ["id"] }],
com_ameli: [{ name: "idx_entid", columns: ["entid"] }],
cab: [{ name: "idx_entid", columns: ["entid"] }],
amd: [
{ name: "idx_subid", columns: ["subid"] },
{ name: "idx_typrectid", columns: ["typrectid"] },
{ name: "idx_txtid", columns: ["txtid"] },
{ name: "idx_motid", columns: ["motid"] },
{ name: "idx_avcid", columns: ["avcid"] },
{ name: "idx_avgid", columns: ["avgid"] },
{ name: "idx_sorid", columns: ["sorid"] },
{ name: "idx_irrid", columns: ["irrid"] },
{ name: "idx_nomentid", columns: ["nomentid"] },
],
},
},
debats: {
database: "debats",
repairEncoding: false,
title: "Informations relatives aux comptes rendus intégraux de la séance publique",
url: "https://data.senat.fr/data/debats/debats.zip",
indexes: {
secdis: [
{ name: "idx_datsea", columns: ["datsea"] },
{ name: "idx_typseccod", columns: ["typseccod"] },
],
intpjl: [{ name: "idx_secdiscle", columns: ["secdiscle"] }],
secdivers: [
{ name: "idx_datsea", columns: ["datsea"] },
{ name: "idx_typseccod", columns: ["typseccod"] },
],
intdivers: [{ name: "idx_intdiverscle", columns: ["intdiverscle"] }],
lecassdeb: [{ name: "idx_datsea", columns: ["datsea"] }],
},
},
dosleg: {
database: "dosleg",
repairEncoding: false,
title: "Dossiers législatifs",
url: "https://data.senat.fr/data/dosleg/dosleg.zip",
indexes: {
amescr: [{ name: "idx_scrnum", columns: ["scrnum"] }],
auteur: [{ name: "idx_autcod", columns: ["autcod"] }],
corscr: [{ name: "idx_scrnum", columns: ["scrnum"] }],
date_seance: [
{ name: "idx_code", columns: ["code"] },
{ name: "idx_lecidt", columns: ["lecidt"] },
],
deccoc: [{ name: "idx_deccoccod", columns: ["deccoccod"] }],
etaloi: [{ name: "idx_etaloicod", columns: ["etaloicod"] }],
lecass: [
{ name: "idx_lecidt", columns: ["lecidt"] },
{ name: "idx_codass", columns: ["codass"] },
{ name: "idx_orgcod", columns: ["orgcod"] },
{ name: "idx_orippr", columns: ["orippr"] },
],
lecassrap: [
{ name: "idx_rapcod", columns: ["rapcod"] },
{ name: "idx_lecassidt", columns: ["lecassidt"] },
],
lecture: [
{ name: "idx_loicod", columns: ["loicod"] },
{ name: "idx_typleccod", columns: ["typleccod"] },
{ name: "idx_lecidt", columns: ["lecidt"] },
],
loi: [
{ name: "idx_typloicod", columns: ["typloicod"] },
{ name: "idx_etaloicod", columns: ["etaloicod"] },
{ name: "idx_deccoccod", columns: ["deccoccod"] },
{ name: "idx_loicod", columns: ["loicod"] },
],
loithe: [
{ name: "idx_thecle", columns: ["thecle"] },
{ name: "idx_loicod", columns: ["loicod"] },
],
posvot: [{ name: "idx_posvotcod", columns: ["posvotcod"] }],
rap: [
{ name: "idx_rapcod", columns: ["rapcod"] },
{ name: "idx_coddenrap", columns: ["coddenrap"] },
],
rolsig: [{ name: "idx_signataire", columns: ["signataire"] }],
scr: [
{ name: "idx_code", columns: ["code"] },
{ name: "idx_scrnum", columns: ["scrnum"] },
{ name: "idx_sesann", columns: ["sesann"] },
],
stavot: [{ name: "idx_stavotidt", columns: ["stavotidt"] }],
texte: [
{ name: "idx_lecassidt", columns: ["lecassidt"] },
{ name: "idx_oritxtcod", columns: ["oritxtcod"] },
{ name: "idx_typtxtcod", columns: ["typtxtcod"] },
{ name: "idx_texcod", columns: ["texcod"] },
],
the: [{ name: "idx_thecle", columns: ["thecle"] }],
titsen: [{ name: "idx_titsencod", columns: ["titsencod"] }],
typloi: [{ name: "idx_typloicod", columns: ["typloicod"] }],
typtxt: [{ name: "idx_typtxtcod", columns: ["typtxtcod"] }],
votsen: [
{ name: "idx_scrnum", columns: ["scrnum"] },
{ name: "idx_sesann", columns: ["sesann"] },
{ name: "idx_titsencod", columns: ["titsencod"] },
{ name: "idx_stavotidt", columns: ["stavotidt"] },
{ name: "idx_posvotcod", columns: ["posvotcod"] },
{ name: "idx_senmat", columns: ["senmat"] },
],
},
},
questions: {
database: "questions",
repairEncoding: false,
title: "Questions écrites et orales posées par les sénateurs au Gouvernement",
url: "https://data.senat.fr/data/questions/questions.zip",
indexes: {
tam_reponses: [{ name: "idx_idque", columns: ["idque"] }],
tam_questions: [
{ name: "idx_sorquecod", columns: ["sorquecod"] },
{ name: "idx_etaquecod", columns: ["etaquecod"] },
],
the: [{ name: "idx_thenouidt", columns: ["thenouidt"] }],
sortquestion: [{ name: "idx_sorquecod", columns: ["sorquecod"] }],
etatquestion: [{ name: "idx_etaquecod", columns: ["etaquecod"] }],
},
},
sens: {
database: "sens",
repairEncoding: false,
repairZip: (dataset, dataDir) => {
const sqlFilename = `${dataset.database}.sql`;
const sqlFilePath = path.join(dataDir, sqlFilename);
fs.removeSync(sqlFilePath);
fs.moveSync(path.join(dataDir, "export_sens.sql"), sqlFilePath);
},
title: "Sénateurs (y compris organes et présence)",
url: "https://data.senat.fr/data/senateurs/export_sens.zip",
indexes: {
dpt: [
{ name: "idx_dptnum", columns: ["dptnum"] },
{ name: "idx_regcod", columns: ["regcod"] },
],
activite_loi: [{ name: "idx_actid", columns: ["actid"] }],
activite_delegation: [{ name: "idx_actid", columns: ["actid"] }],
activite_participant: [{ name: "idx_senmat", columns: ["senmat"] }],
activite_senateur: [{ name: "idx_senmat", columns: ["senmat"] }],
senbur: [
{ name: "idx_senmat", columns: ["senmat"] },
{ name: "idx_burcod", columns: ["burcod"] },
],
elucan: [
{ name: "idx_senmat", columns: ["senmat"] },
{ name: "idx_typmancod", columns: ["typmancod"] },
],
},
},
};
export function getEnabledDatasets(categories) {
categories.map((datasetName) => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
return categories.reduce((enabledDatasets, datasetName) => {
const enabledDataset = EnabledDatasets[datasetName];
return enabledDatasets | (enabledDataset || EnabledDatasets.None);
}, EnabledDatasets.None);
}
export function getChosenDatasets(enabledDatasets) {
return [
enabledDatasets & EnabledDatasets.Ameli ? datasets.ameli : null,
enabledDatasets & EnabledDatasets.Debats ? datasets.debats : null,
enabledDatasets & EnabledDatasets.DosLeg ? datasets.dosleg : null,
enabledDatasets & EnabledDatasets.Questions ? datasets.questions : null,
enabledDatasets & EnabledDatasets.Sens ? datasets.sens : null,
].filter((dataset) => dataset !== null);
}