@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
140 lines (133 loc) • 15.5 kB
JavaScript
import assert from "assert";
// import { execSync } from "child_process"
import commandLineArgs from "command-line-args";
import fs from "fs-extra";
import path from "path";
// import { EnabledDatasets } from "../datasets"
// import { loadAssembleeData } from "../loaders"
import { parseTexteLoi } from "../parsers/documents.mjs"; // import { Document, TypeDocument } from "../types/dossiers_legislatifs"
// import { DocumentUrlFormat, urlFromDocument } from "../urls"
import { commitOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption } from "./shared/cli_helpers.mjs";
const optionsDefinitions = [commitOption, remoteOption, legislatureOption, silentOption, verboseOption, dataDirDefaultOption, {
alias: "f",
help: "Filename of Assemblée's document to parse",
name: "filename",
type: String
}];
const options = commandLineArgs(optionsDefinitions);
function parseTextesLois() {
assert(!options.commit || options.filename, 'Options "commit" & "filename" are incompatible');
const dataDir = options.dataDir;
// const { documentByUid } = loadAssembleeData(
// dataDir,
// EnabledDatasets.DossiersLegislatifs,
// options.legislature,
// )
const textesLoisDir = path.join(dataDir, "www.assemblee-nationale.fr", options.legislature, "textes");
for (const filename of fs.readdirSync(textesLoisDir)) {
if (filename[0] === ".") {
continue;
}
if (!filename.endsWith(".asp")) {
continue;
}
if (options.filename && !filename.startsWith(options.filename)) {
continue;
}
const texteLoiPath = path.join(textesLoisDir, filename);
if (!options.silent) {
console.log(`Parsing "texte de loi" ${texteLoiPath}…`);
}
const texteLoiPage = fs.readFileSync(texteLoiPath, {
encoding: "utf-8"
});
const texteLoiUrl = `http://www.assemblee-nationale.fr/${options.legislature}/textes/${filename}`;
const texteLoiParsed = parseTexteLoi(texteLoiUrl, texteLoiPage);
if (options.filename && options.verbose) {
console.log(JSON.stringify(texteLoiParsed.subdivisions, null, 2));
}
const {
error
} = texteLoiParsed;
if (error) {
console.error(` Error while parsing page "${texteLoiPath}":\n\nError:\n${JSON.stringify(error, null, 2)}`);
continue;
}
}
// fs.ensureDirSync(textesLoisDir)
// if (!options.uid) {
// for (const filename of fs.readdirSync(textesLoisDir)) {
// if (filename[0] === ".") {
// continue
// }
// fs.removeSync(path.join(textesLoisDir, filename))
// }
// }
// const textesLois = Object.values(documentByUid)
// .filter(document => document.xsiType === TypeDocument.TexteLoiType)
// .filter(
// document => document.uid.startsWith("PIONAN") || document.uid.startsWith("PRJLAN"),
// )
// .map(document => {
// return {
// ...document,
// rawDocumentAssembleeUrl: urlFromDocument(document, DocumentUrlFormat.RawHtml),
// }
// })
// .sort((a, b) =>
// a.rawDocumentAssembleeUrl === null
// ? -1
// : b.rawDocumentAssembleeUrl === null
// ? 1
// : a.rawDocumentAssembleeUrl.localeCompare(b.rawDocumentAssembleeUrl),
// )
// const firstUid = options.uid
// let skip = !!firstUid
// for (const texteLoi of textesLois) {
// if (skip) {
// if (texteLoi.uid === firstUid) {
// skip = false
// } else {
// continue
// }
// }
// if (!options.silent) {
// console.log(
// `Retrieving bill ${texteLoi.uid} at ${texteLoi.rawDocumentAssembleeUrl}`,
// )
// }
// if (texteLoi.rawDocumentAssembleeUrl === null) {
// continue
// }
// const url = new URL(texteLoi.rawDocumentAssembleeUrl)
// const filePath = path.join(dataDir, url.hostname, ...url.pathname.split("/"))
// assert.strictEqual(textesLoisDir, path.dirname(filePath))
// let page = undefined
// try {
// page = fs.readFileSync(filePath, { encoding: "utf-8" })
// } catch (e) {
// if (e.code === "ENOENT") {
// continue
// }
// throw e
// }
// if (options.parse) {
// const texteLoiParsed = parseTexteLoi(texteLoi.rawDocumentAssembleeUrl, page)
// const { error } = texteLoiParsed
// if (error) {
// console.error(
// `Error while parsing page "${texteLoi.rawDocumentAssembleeUrl}" (uid: ${
// texteLoi.uid
// }):\n\nError:\n${JSON.stringify(error, null, 2)}`,
// )
// continue
// }
// }
// }
// if (options.commit) {
// return git.commitAndPush(textesLoisDir, "Nouvelle moisson", options.remote)
// }
return 0;
}
process.exit(parseTextesLois());
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJwYXJzZVRleHRlTG9pIiwiY29tbWl0T3B0aW9uIiwibGVnaXNsYXR1cmVPcHRpb24iLCJyZW1vdGVPcHRpb24iLCJzaWxlbnRPcHRpb24iLCJ2ZXJib3NlT3B0aW9uIiwiZGF0YURpckRlZmF1bHRPcHRpb24iLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIm9wdGlvbnMiLCJwYXJzZVRleHRlc0xvaXMiLCJjb21taXQiLCJmaWxlbmFtZSIsImRhdGFEaXIiLCJ0ZXh0ZXNMb2lzRGlyIiwiam9pbiIsImxlZ2lzbGF0dXJlIiwicmVhZGRpclN5bmMiLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJ0ZXh0ZUxvaVBhdGgiLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwidGV4dGVMb2lQYWdlIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJ0ZXh0ZUxvaVVybCIsInRleHRlTG9pUGFyc2VkIiwidmVyYm9zZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdWJkaXZpc2lvbnMiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcGFyc2VfdGV4dGVzX2xvaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbi8vIGltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbi8vIGltcG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG4vLyBpbXBvcnQgeyBsb2FkQXNzZW1ibGVlRGF0YSB9IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IHBhcnNlVGV4dGVMb2kgfSBmcm9tIFwiLi4vcGFyc2Vycy9kb2N1bWVudHNcIlxuLy8gaW1wb3J0IHsgRG9jdW1lbnQsIFR5cGVEb2N1bWVudCB9IGZyb20gXCIuLi90eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG4vLyBpbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgdXJsRnJvbURvY3VtZW50IH0gZnJvbSBcIi4uL3VybHNcIlxuaW1wb3J0IHtcbiAgY29tbWl0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIGNvbW1pdE9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAge1xuICAgIGFsaWFzOiBcImZcIixcbiAgICBoZWxwOiBcIkZpbGVuYW1lIG9mIEFzc2VtYmzDqWUncyBkb2N1bWVudCB0byBwYXJzZVwiLFxuICAgIG5hbWU6IFwiZmlsZW5hbWVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gcGFyc2VUZXh0ZXNMb2lzKCk6IG51bWJlciB7XG4gIGFzc2VydChcbiAgICAhb3B0aW9ucy5jb21taXQgfHwgb3B0aW9ucy5maWxlbmFtZSxcbiAgICAnT3B0aW9ucyBcImNvbW1pdFwiICYgXCJmaWxlbmFtZVwiIGFyZSBpbmNvbXBhdGlibGUnLFxuICApXG5cbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICAvLyBjb25zdCB7IGRvY3VtZW50QnlVaWQgfSA9IGxvYWRBc3NlbWJsZWVEYXRhKFxuICAvLyAgIGRhdGFEaXIsXG4gIC8vICAgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMsXG4gIC8vICAgb3B0aW9ucy5sZWdpc2xhdHVyZSxcbiAgLy8gKVxuXG4gIGNvbnN0IHRleHRlc0xvaXNEaXIgPSBwYXRoLmpvaW4oXG4gICAgZGF0YURpcixcbiAgICBcInd3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyXCIsXG4gICAgb3B0aW9ucy5sZWdpc2xhdHVyZSxcbiAgICBcInRleHRlc1wiLFxuICApXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmModGV4dGVzTG9pc0RpcikpIHtcbiAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKFwiLmFzcFwiKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsZW5hbWUgJiYgIWZpbGVuYW1lLnN0YXJ0c1dpdGgob3B0aW9ucy5maWxlbmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHRleHRlTG9pUGF0aCA9IHBhdGguam9pbih0ZXh0ZXNMb2lzRGlyLCBmaWxlbmFtZSlcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhgUGFyc2luZyBcInRleHRlIGRlIGxvaVwiICR7dGV4dGVMb2lQYXRofeKApmApXG4gICAgfVxuICAgIGNvbnN0IHRleHRlTG9pUGFnZSA9IGZzLnJlYWRGaWxlU3luYyh0ZXh0ZUxvaVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KVxuICAgIGNvbnN0IHRleHRlTG9pVXJsID0gYGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8ke29wdGlvbnMubGVnaXNsYXR1cmV9L3RleHRlcy8ke2ZpbGVuYW1lfWBcbiAgICBjb25zdCB0ZXh0ZUxvaVBhcnNlZCA9IHBhcnNlVGV4dGVMb2kodGV4dGVMb2lVcmwsIHRleHRlTG9pUGFnZSlcbiAgICBpZiAob3B0aW9ucy5maWxlbmFtZSAmJiBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRleHRlTG9pUGFyc2VkLnN1YmRpdmlzaW9ucywgbnVsbCwgMikpXG4gICAgfVxuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRleHRlTG9pUGFyc2VkXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgICBFcnJvciB3aGlsZSBwYXJzaW5nIHBhZ2UgXCIke3RleHRlTG9pUGF0aH1cIjpcXG5cXG5FcnJvcjpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMixcbiAgICAgICAgKX1gLFxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cblxuICAvLyBmcy5lbnN1cmVEaXJTeW5jKHRleHRlc0xvaXNEaXIpXG4gIC8vIGlmICghb3B0aW9ucy51aWQpIHtcbiAgLy8gICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKHRleHRlc0xvaXNEaXIpKSB7XG4gIC8vICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gIC8vICAgICAgIGNvbnRpbnVlXG4gIC8vICAgICB9XG4gIC8vICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0ZXh0ZXNMb2lzRGlyLCBmaWxlbmFtZSkpXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gY29uc3QgdGV4dGVzTG9pcyA9IE9iamVjdC52YWx1ZXMoZG9jdW1lbnRCeVVpZClcbiAgLy8gICAuZmlsdGVyKGRvY3VtZW50ID0+IGRvY3VtZW50LnhzaVR5cGUgPT09IFR5cGVEb2N1bWVudC5UZXh0ZUxvaVR5cGUpXG4gIC8vICAgLmZpbHRlcihcbiAgLy8gICAgIGRvY3VtZW50ID0+IGRvY3VtZW50LnVpZC5zdGFydHNXaXRoKFwiUElPTkFOXCIpIHx8IGRvY3VtZW50LnVpZC5zdGFydHNXaXRoKFwiUFJKTEFOXCIpLFxuICAvLyAgIClcbiAgLy8gICAubWFwKGRvY3VtZW50ID0+IHtcbiAgLy8gICAgIHJldHVybiB7XG4gIC8vICAgICAgIC4uLmRvY3VtZW50LFxuICAvLyAgICAgICByYXdEb2N1bWVudEFzc2VtYmxlZVVybDogdXJsRnJvbURvY3VtZW50KGRvY3VtZW50LCBEb2N1bWVudFVybEZvcm1hdC5SYXdIdG1sKSxcbiAgLy8gICAgIH1cbiAgLy8gICB9KVxuICAvLyAgIC5zb3J0KChhLCBiKSA9PlxuICAvLyAgICAgYS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybCA9PT0gbnVsbFxuICAvLyAgICAgICA/IC0xXG4gIC8vICAgICAgIDogYi5yYXdEb2N1bWVudEFzc2VtYmxlZVVybCA9PT0gbnVsbFxuICAvLyAgICAgICA/IDFcbiAgLy8gICAgICAgOiBhLnJhd0RvY3VtZW50QXNzZW1ibGVlVXJsLmxvY2FsZUNvbXBhcmUoYi5yYXdEb2N1bWVudEFzc2VtYmxlZVVybCksXG4gIC8vICAgKVxuXG4gIC8vIGNvbnN0IGZpcnN0VWlkID0gb3B0aW9ucy51aWRcbiAgLy8gbGV0IHNraXAgPSAhIWZpcnN0VWlkXG4gIC8vIGZvciAoY29uc3QgdGV4dGVMb2kgb2YgdGV4dGVzTG9pcykge1xuICAvLyAgIGlmIChza2lwKSB7XG4gIC8vICAgICBpZiAodGV4dGVMb2kudWlkID09PSBmaXJzdFVpZCkge1xuICAvLyAgICAgICBza2lwID0gZmFsc2VcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIGNvbnRpbnVlXG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKFxuICAvLyAgICAgICBgUmV0cmlldmluZyBiaWxsICR7dGV4dGVMb2kudWlkfSBhdCAke3RleHRlTG9pLnJhd0RvY3VtZW50QXNzZW1ibGVlVXJsfWAsXG4gIC8vICAgICApXG4gIC8vICAgfVxuICAvLyAgIGlmICh0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybCA9PT0gbnVsbCkge1xuICAvLyAgICAgY29udGludWVcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgdXJsID0gbmV3IFVSTCh0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybClcbiAgLy8gICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkYXRhRGlyLCB1cmwuaG9zdG5hbWUsIC4uLnVybC5wYXRobmFtZS5zcGxpdChcIi9cIikpXG4gIC8vICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRleHRlc0xvaXNEaXIsIHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG5cbiAgLy8gICBsZXQgcGFnZSA9IHVuZGVmaW5lZFxuICAvLyAgIHRyeSB7XG4gIC8vICAgICBwYWdlID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSlcbiAgLy8gICB9IGNhdGNoIChlKSB7XG4gIC8vICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gIC8vICAgICAgIGNvbnRpbnVlXG4gIC8vICAgICB9XG4gIC8vICAgICB0aHJvdyBlXG4gIC8vICAgfVxuXG4gIC8vICAgaWYgKG9wdGlvbnMucGFyc2UpIHtcbiAgLy8gICAgIGNvbnN0IHRleHRlTG9pUGFyc2VkID0gcGFyc2VUZXh0ZUxvaSh0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybCwgcGFnZSlcbiAgLy8gICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRleHRlTG9pUGFyc2VkXG4gIC8vICAgICBpZiAoZXJyb3IpIHtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcihcbiAgLy8gICAgICAgICBgRXJyb3Igd2hpbGUgcGFyc2luZyBwYWdlIFwiJHt0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybH1cIiAodWlkOiAke1xuICAvLyAgICAgICAgICAgdGV4dGVMb2kudWlkXG4gIC8vICAgICAgICAgfSk6XFxuXFxuRXJyb3I6XFxuJHtKU09OLnN0cmluZ2lmeShlcnJvciwgbnVsbCwgMil9YCxcbiAgLy8gICAgICAgKVxuICAvLyAgICAgICBjb250aW51ZVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuICAvLyBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgLy8gICByZXR1cm4gZ2l0LmNvbW1pdEFuZFB1c2godGV4dGVzTG9pc0RpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIsIG9wdGlvbnMucmVtb3RlKVxuICAvLyB9XG4gIHJldHVybiAwXG59XG5cbnByb2Nlc3MuZXhpdChwYXJzZVRleHRlc0xvaXMoKSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0I7QUFDQSxPQUFPQyxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxNQUFNOztBQUV2QjtBQUNBO0FBQUEsU0FDU0MsYUFBYSxvQ0FDdEI7QUFDQTtBQUFBLFNBRUVDLFlBQVksRUFDWkMsaUJBQWlCLEVBQ2pCQyxZQUFZLEVBQ1pDLFlBQVksRUFDWkMsYUFBYSxFQUNiQyxvQkFBb0I7QUFHdEIsTUFBTUMsa0JBQWtCLEdBQUcsQ0FDekJOLFlBQVksRUFDWkUsWUFBWSxFQUNaRCxpQkFBaUIsRUFDakJFLFlBQVksRUFDWkMsYUFBYSxFQUNiQyxvQkFBb0IsRUFDcEI7RUFDRUUsS0FBSyxFQUFFLEdBQUc7RUFDVkMsSUFBSSxFQUFFLDJDQUEyQztFQUNqREMsSUFBSSxFQUFFLFVBQVU7RUFDaEJDLElBQUksRUFBRUM7QUFDUixDQUFDLENBQ0Y7QUFDRCxNQUFNQyxPQUFPLEdBQUdoQixlQUFlLENBQUNVLGtCQUFrQixDQUFDO0FBRW5ELFNBQVNPLGVBQWVBLENBQUEsRUFBVztFQUNqQ2xCLE1BQU0sQ0FDSixDQUFDaUIsT0FBTyxDQUFDRSxNQUFNLElB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