UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

140 lines (133 loc) 15.5 kB
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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