UNPKG

@tricoteuses/assemblee

Version:

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

85 lines (83 loc) 14.7 kB
/// Deprecated: Use script retrieve_documents.ts instead. import assert from "assert"; import commandLineArgs from "command-line-args"; import fs from "fs-extra"; import path from "path"; import { EnabledDatasets } from "../datasets.mjs"; import * as git from "../git.mjs"; import { loadAssembleeData } from "../loaders.mjs"; import { TypeDocument } from "../types/dossiers_legislatifs.mjs"; import { DocumentUrlFormat, urlFromDocument } from "../urls.mjs"; import { commitOption, dataDirDefaultOption, legislatureOption, remoteOption, silentOption, verboseOption } from "./shared/cli_helpers.mjs"; const optionsDefinitions = [commitOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, { alias: "u", help: "UID of first Assemblée's document to retrieve", name: "uid", type: String }]; const options = commandLineArgs(optionsDefinitions); /// Deprecated: Use script retrieve_documents.ts instead. async function retrieveDocuments() { assert(!options.commit || options.uid, 'Options "commit" & "uid" 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"); 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)); const response = await fetch(texteLoi.rawDocumentAssembleeUrl); const page = await response.text(); if (!response.ok) { if (response.status !== 404) { console.error(`Error while getting page "${texteLoi.rawDocumentAssembleeUrl}" (uid: ${texteLoi.uid}):\n\nError:\n${JSON.stringify({ code: response.status, message: response.statusText }, null, 2)}`); } continue; } fs.writeFileSync(filePath, page); } if (options.commit) { return git.commitAndPush(textesLoisDir, "Nouvelle moisson", options.remote); } return 0; } retrieveDocuments().then(exitCode => process.exit(exitCode)).catch(error => { console.log(error); process.exit(1); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJFbmFibGVkRGF0YXNldHMiLCJnaXQiLCJsb2FkQXNzZW1ibGVlRGF0YSIsIlR5cGVEb2N1bWVudCIsIkRvY3VtZW50VXJsRm9ybWF0IiwidXJsRnJvbURvY3VtZW50IiwiY29tbWl0T3B0aW9uIiwiZGF0YURpckRlZmF1bHRPcHRpb24iLCJsZWdpc2xhdHVyZU9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIm9wdGlvbnMiLCJyZXRyaWV2ZURvY3VtZW50cyIsImNvbW1pdCIsInVpZCIsImRhdGFEaXIiLCJkb2N1bWVudEJ5VWlkIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImxlZ2lzbGF0dXJlIiwidGV4dGVzTG9pc0RpciIsImpvaW4iLCJlbnN1cmVEaXJTeW5jIiwiZmlsZW5hbWUiLCJyZWFkZGlyU3luYyIsInJlbW92ZVN5bmMiLCJ0ZXh0ZXNMb2lzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiZG9jdW1lbnQiLCJ4c2lUeXBlIiwiVGV4dGVMb2lUeXBlIiwic3RhcnRzV2l0aCIsIm1hcCIsInJhd0RvY3VtZW50QXNzZW1ibGVlVXJsIiwiUmF3SHRtbCIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaXJzdFVpZCIsInNraXAiLCJ0ZXh0ZUxvaSIsInNpbGVudCIsImNvbnNvbGUiLCJsb2ciLCJ1cmwiLCJVUkwiLCJmaWxlUGF0aCIsImhvc3RuYW1lIiwicGF0aG5hbWUiLCJzcGxpdCIsInN0cmljdEVxdWFsIiwiZGlybmFtZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJwYWdlIiwidGV4dCIsIm9rIiwic3RhdHVzIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiY29kZSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwid3JpdGVGaWxlU3luYyIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJ0aGVuIiwiZXhpdENvZGUiLCJwcm9jZXNzIiwiZXhpdCIsImNhdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfdGV4dGVzX2xvaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8vIERlcHJlY2F0ZWQ6IFVzZSBzY3JpcHQgcmV0cmlldmVfZG9jdW1lbnRzLnRzIGluc3RlYWQuXG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7IGxvYWRBc3NlbWJsZWVEYXRhIH0gZnJvbSBcIi4uL2xvYWRlcnNcIlxuaW1wb3J0IHsgVHlwZURvY3VtZW50IH0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IERvY3VtZW50VXJsRm9ybWF0LCB1cmxGcm9tRG9jdW1lbnQgfSBmcm9tIFwiLi4vdXJsc1wiXG5pbXBvcnQge1xuICBjb21taXRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgY29tbWl0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICB7XG4gICAgYWxpYXM6IFwidVwiLFxuICAgIGhlbHA6IFwiVUlEIG9mIGZpcnN0IEFzc2VtYmzDqWUncyBkb2N1bWVudCB0byByZXRyaWV2ZVwiLFxuICAgIG5hbWU6IFwidWlkXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbi8vLyBEZXByZWNhdGVkOiBVc2Ugc2NyaXB0IHJldHJpZXZlX2RvY3VtZW50cy50cyBpbnN0ZWFkLlxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVEb2N1bWVudHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgYXNzZXJ0KFxuICAgICFvcHRpb25zLmNvbW1pdCB8fCBvcHRpb25zLnVpZCxcbiAgICAnT3B0aW9ucyBcImNvbW1pdFwiICYgXCJ1aWRcIiBhcmUgaW5jb21wYXRpYmxlJyxcbiAgKVxuXG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgeyBkb2N1bWVudEJ5VWlkIH0gPSBsb2FkQXNzZW1ibGVlRGF0YShcbiAgICBkYXRhRGlyLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gIClcblxuICBjb25zdCB0ZXh0ZXNMb2lzRGlyID0gcGF0aC5qb2luKFxuICAgIGRhdGFEaXIsXG4gICAgXCJ3d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mclwiLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gICAgXCJ0ZXh0ZXNcIixcbiAgKVxuICBmcy5lbnN1cmVEaXJTeW5jKHRleHRlc0xvaXNEaXIpXG4gIGlmICghb3B0aW9ucy51aWQpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKHRleHRlc0xvaXNEaXIpKSB7XG4gICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0ZXh0ZXNMb2lzRGlyLCBmaWxlbmFtZSkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGV4dGVzTG9pcyA9IE9iamVjdC52YWx1ZXMoZG9jdW1lbnRCeVVpZClcbiAgICAuZmlsdGVyKChkb2N1bWVudCkgPT4gZG9jdW1lbnQueHNpVHlwZSA9PT0gVHlwZURvY3VtZW50LlRleHRlTG9pVHlwZSlcbiAgICAuZmlsdGVyKFxuICAgICAgKGRvY3VtZW50KSA9PlxuICAgICAgICBkb2N1bWVudC51aWQuc3RhcnRzV2l0aChcIlBJT05BTlwiKSB8fCBkb2N1bWVudC51aWQuc3RhcnRzV2l0aChcIlBSSkxBTlwiKSxcbiAgICApXG4gICAgLm1hcCgoZG9jdW1lbnQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRvY3VtZW50LFxuICAgICAgICByYXdEb2N1bWVudEFzc2VtYmxlZVVybDogdXJsRnJvbURvY3VtZW50KFxuICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgIERvY3VtZW50VXJsRm9ybWF0LlJhd0h0bWwsXG4gICAgICAgICksXG4gICAgICB9XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgIGEucmF3RG9jdW1lbnRBc3NlbWJsZWVVcmwgPT09IG51bGxcbiAgICAgICAgPyAtMVxuICAgICAgICA6IGIucmF3RG9jdW1lbnRBc3NlbWJsZWVVcmwgPT09IG51bGxcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IGEucmF3RG9jdW1lbnRBc3NlbWJsZWVVcmwubG9jYWxlQ29tcGFyZShiLnJhd0RvY3VtZW50QXNzZW1ibGVlVXJsKSxcbiAgICApXG5cbiAgY29uc3QgZmlyc3RVaWQgPSBvcHRpb25zLnVpZFxuICBsZXQgc2tpcCA9ICEhZmlyc3RVaWRcbiAgZm9yIChjb25zdCB0ZXh0ZUxvaSBvZiB0ZXh0ZXNMb2lzKSB7XG4gICAgaWYgKHNraXApIHtcbiAgICAgIGlmICh0ZXh0ZUxvaS51aWQgPT09IGZpcnN0VWlkKSB7XG4gICAgICAgIHNraXAgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBSZXRyaWV2aW5nIGJpbGwgJHt0ZXh0ZUxvaS51aWR9IGF0ICR7dGV4dGVMb2kucmF3RG9jdW1lbnRBc3NlbWJsZWVVcmx9YCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHRleHRlTG9pLnJhd0RvY3VtZW50QXNzZW1ibGVlVXJsID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRleHRlTG9pLnJhd0RvY3VtZW50QXNzZW1ibGVlVXJsKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgZGF0YURpcixcbiAgICAgIHVybC5ob3N0bmFtZSxcbiAgICAgIC4uLnVybC5wYXRobmFtZS5zcGxpdChcIi9cIiksXG4gICAgKVxuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZXh0ZXNMb2lzRGlyLCBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybClcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoaWxlIGdldHRpbmcgcGFnZSBcIiR7XG4gICAgICAgICAgICB0ZXh0ZUxvaS5yYXdEb2N1bWVudEFzc2VtYmxlZVVybFxuICAgICAgICAgIH1cIiAodWlkOiAke3RleHRlTG9pLnVpZH0pOlxcblxcbkVycm9yOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7IGNvZGU6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBwYWdlKVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgcmV0dXJuIGdpdC5jb21taXRBbmRQdXNoKHRleHRlc0xvaXNEaXIsIFwiTm91dmVsbGUgbW9pc3NvblwiLCBvcHRpb25zLnJlbW90ZSlcbiAgfVxuICByZXR1cm4gMFxufVxuXG5yZXRyaWV2ZURvY3VtZW50cygpXG4gIC50aGVuKChleGl0Q29kZSkgPT4gcHJvY2Vzcy5leGl0KGV4aXRDb2RlKSlcbiAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9KVxuIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxPQUFPQSxNQUFNLE1BQU0sUUFBUTtBQUMzQixPQUFPQyxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQUEsU0FFZEMsZUFBZTtBQUFBLE9BQ2pCLEtBQUtDLEdBQUc7QUFBQSxTQUNOQyxpQkFBaUI7QUFBQSxTQUNqQkMsWUFBWTtBQUFBLFNBQ1pDLGlCQUFpQixFQUFFQyxlQUFlO0FBQUEsU0FFekNDLFlBQVksRUFDWkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsRUFDakJDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhO0FBR2YsTUFBTUMsa0JBQWtCLEdBQUcsQ0FDekJOLFlBQVksRUFDWkUsaUJBQWlCLEVBQ2pCQyxZQUFZLEVBQ1pDLFlBQVksRUFDWkMsYUFB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QSxJQUFJUSxRQUFRLENBQUNSLHVCQUF1QixLQUFLLElBQUksRUFBRTtNQUM3QztJQUNGO0lBQ0EsTUFBTVksR0FBRyxHQUFHLElBQUlDLEdBQUcsQ0FBQ0wsUUFBUSxDQUFDUix1QkFBdUIsQ0FBQztJQUNyRCxNQUFNYyxRQUFRLEdBQUd4RCxJQUFJLENBQUM0QixJQUFJLENBQ3hCTCxPQUFPLEVBQ1ArQixHQUFHLENBQUNHLFFBQVEsRUFDWixHQUFHSCxHQUFHLENBQUNJLFFBQVEsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FDM0IsQ0FBQztJQUNEOUQsTUFBTSxDQUFDK0QsV0FBVyxDQUFDakMsYUFBYSxFQUFFM0IsSUFBSSxDQUFDNkQsT0FBTyxDQUFDTCxRQUFRLENBQUMsQ0FBQztJQUV6RCxNQUFNTSxRQUFRLEdBQUcsTUFBTUMsS0FBSyxDQUFDYixRQUFRLENBQUNSLHVCQUF1QixDQUFDO0lBQzlELE1BQU1zQixJQUFJLEdBQUcsTUFBTUYsUUFBUSxDQUFDRyxJQUFJLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUNILFFBQVEsQ0FBQ0ksRUFBRSxFQUFFO01BQ2hCLElBQUlKLFFBQVEsQ0FBQ0ssTUFBTSxLQUFLLEdBQUcsRUFBRTtRQUMzQmYsT0FBTyxDQUFDZ0IsS0FBSyxDQUNYLDZCQUNFbEIsUUFBUSxDQUFDUix1QkFBdUIsV0FDdkJRLFFBQVEsQ0FBQzVCLEdBQUcsaUJBQWlCK0MsSUFBSSxDQUFDQyxTQUFTLENBQ3BEO1VBQUVDLElBQUksRUFBRVQsUUFBUSxDQUFDSyxNQUFNO1VBQUVLLE9BQU8sRUFBRVYsUUFBUSxDQUFDVztRQUFXLENBQUMsRUFDdkQsSUFBSSxFQUNKLENBQ0YsQ0FBQyxFQUNILENBQUM7TUFDSDtNQUNBO0lBQ0Y7SUFDQTFFLEVBQUUsQ0FBQzJFLGFBQWEsQ0FBQ2xCLFFBQVEsRUFBRVEsSUFBSSxDQUFDO0VBQ2xDO0VBRUEsSUFBSTdDLE9BQU8sQ0FBQ0UsTUFBTSxFQUFFO0lBQ2xCLE9BQU9uQixHQUFHLENBQUN5RSxhQUFhLENBQUNoRCxhQUFhLEVBQUUsa0JBQWtCLEVBQUVSLE9BQU8sQ0FBQ3lELE1BQU0sQ0FBQztFQUM3RTtFQUNBLE9BQU8sQ0FBQztBQUNWO0FBRUF4RCxpQkFBaUIsQ0FBQyxDQUFDLENBQ2hCeUQsSUFBSSxDQUFFQyxRQUFRLElBQUtDLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDRixRQUFRLENBQUMsQ0FBQyxDQUMxQ0csS0FBSyxDQUFFYixLQUFLLElBQUs7RUFDaEJoQixPQUFPLENBQUNDLEdBQUcsQ0FBQ2UsS0FBSyxDQUFDO0VBQ2xCVyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119