@tricoteuses/senat 3.2.1 → 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE.md +32 -32
  2. package/README.md +326 -326
  3. package/lib/src/config.d.ts +43 -0
  4. package/lib/src/config.js +37 -0
  5. package/lib/src/conversion_textes.d.ts +11 -0
  6. package/lib/src/conversion_textes.js +320 -0
  7. package/lib/src/databases_postgres.d.ts +4 -0
  8. package/lib/src/databases_postgres.js +23 -0
  9. package/lib/src/datasets.d.ts +38 -0
  10. package/lib/src/datasets.js +247 -0
  11. package/lib/src/git.d.ts +27 -0
  12. package/lib/src/git.js +251 -0
  13. package/lib/src/index.d.ts +1 -1
  14. package/lib/src/loaders.d.ts +52 -0
  15. package/lib/src/loaders.js +260 -0
  16. package/lib/src/model/agenda.d.ts +6 -0
  17. package/lib/src/model/agenda.js +148 -0
  18. package/lib/src/model/ameli.d.ts +67 -0
  19. package/lib/src/model/ameli.js +150 -0
  20. package/lib/src/model/commission.d.ts +19 -0
  21. package/lib/src/model/commission.js +269 -0
  22. package/lib/src/model/debats.d.ts +39 -0
  23. package/lib/src/model/debats.js +112 -0
  24. package/lib/src/model/documents.d.ts +32 -0
  25. package/lib/src/model/documents.js +182 -0
  26. package/lib/src/model/dosleg.d.ts +144 -0
  27. package/lib/src/model/dosleg.js +468 -0
  28. package/lib/src/model/index.d.ts +7 -0
  29. package/lib/src/model/index.js +7 -0
  30. package/lib/src/model/questions.d.ts +54 -0
  31. package/lib/src/model/questions.js +91 -0
  32. package/lib/src/model/scrutins.d.ts +48 -0
  33. package/lib/src/model/scrutins.js +121 -0
  34. package/lib/src/model/seance.d.ts +3 -0
  35. package/lib/src/model/seance.js +267 -0
  36. package/lib/src/model/sens.d.ts +112 -0
  37. package/lib/src/model/sens.js +385 -0
  38. package/lib/src/model/util.d.ts +1 -0
  39. package/lib/src/model/util.js +15 -0
  40. package/lib/src/parsers/plf/amendement.d.ts +3 -0
  41. package/lib/src/parsers/plf/amendement.js +152 -0
  42. package/lib/src/raw_types/ameli.d.ts +1762 -0
  43. package/lib/src/raw_types/ameli.js +1074 -0
  44. package/lib/src/raw_types/debats.d.ts +380 -0
  45. package/lib/src/raw_types/debats.js +266 -0
  46. package/lib/src/raw_types/dosleg.d.ts +2954 -0
  47. package/lib/src/raw_types/dosleg.js +2005 -0
  48. package/lib/src/raw_types/questions.d.ts +699 -0
  49. package/lib/src/raw_types/questions.js +493 -0
  50. package/lib/src/raw_types/sens.d.ts +7843 -0
  51. package/lib/src/raw_types/sens.js +4691 -0
  52. package/lib/src/raw_types_schemats/ameli.d.ts +541 -0
  53. package/lib/src/raw_types_schemats/ameli.js +2 -0
  54. package/lib/src/raw_types_schemats/debats.d.ts +127 -0
  55. package/lib/src/raw_types_schemats/debats.js +2 -0
  56. package/lib/src/raw_types_schemats/dosleg.d.ts +977 -0
  57. package/lib/src/raw_types_schemats/dosleg.js +2 -0
  58. package/lib/src/raw_types_schemats/questions.d.ts +237 -0
  59. package/lib/src/raw_types_schemats/questions.js +2 -0
  60. package/lib/src/raw_types_schemats/sens.d.ts +2709 -0
  61. package/lib/src/raw_types_schemats/sens.js +2 -0
  62. package/lib/src/rich_types/ameli.d.ts +12 -0
  63. package/lib/src/scripts/data-download.js +13 -13
  64. package/lib/src/scripts/debug_dosleg_query.d.ts +6 -0
  65. package/lib/src/scripts/debug_dosleg_query.js +50 -0
  66. package/lib/src/scripts/retrieve_open_data.js +2 -1
  67. package/lib/src/scripts/shared/data_download.d.ts +43 -0
  68. package/lib/src/scripts/shared/data_download.js +175 -0
  69. package/lib/src/scripts/shared/incremental_import_sql.js +866 -866
  70. package/lib/src/scripts/shared/schema_version.js +85 -84
  71. package/lib/src/scripts/shared/staging_metadata_sql.js +214 -214
  72. package/lib/src/scripts/validate_prefixed_tables.js +12 -12
  73. package/lib/src/server/ameli.js +18 -11
  74. package/lib/src/server/conversion_textes.js +106 -106
  75. package/lib/src/server/datasets.js +1 -0
  76. package/lib/src/server/debats.js +10 -10
  77. package/lib/src/server/documents.js +22 -22
  78. package/lib/src/server/dosleg.js +33 -33
  79. package/lib/src/server/questions.js +10 -10
  80. package/lib/src/server/scrutins.js +3 -3
  81. package/lib/src/server/sens.js +19 -19
  82. package/lib/src/types/agenda.d.ts +45 -0
  83. package/lib/src/types/ameli.d.ts +5 -0
  84. package/lib/src/types/ameli.js +1 -0
  85. package/lib/src/types/compte_rendu.d.ts +83 -0
  86. package/lib/src/types/compte_rendu.js +1 -0
  87. package/lib/src/types/debats.d.ts +2 -0
  88. package/lib/src/types/debats.js +1 -0
  89. package/lib/src/types/dosleg.d.ts +70 -0
  90. package/lib/src/types/dosleg.js +1 -0
  91. package/lib/src/types/questions.d.ts +2 -0
  92. package/lib/src/types/questions.js +1 -0
  93. package/lib/src/types/sens.d.ts +8 -0
  94. package/lib/src/types/sens.js +1 -0
  95. package/lib/src/types/sessions.d.ts +6 -0
  96. package/lib/src/types/sessions.js +19 -0
  97. package/lib/src/types/texte.d.ts +72 -0
  98. package/lib/src/types/texte.js +15 -0
  99. package/lib/src/validators/config.d.ts +9 -0
  100. package/lib/src/validators/config.js +10 -0
  101. package/lib/src/videos/match.js +4 -4
  102. package/lib/tests/dataDownload.test.d.ts +1 -0
  103. package/lib/tests/dataDownload.test.js +217 -0
  104. package/lib/tests/parsers/plf/amendement.test.d.ts +1 -0
  105. package/lib/tests/parsers/plf/amendement.test.js +153 -0
  106. package/lib/tests/parsers/plf/credits.test.js +72 -72
  107. package/lib/tests/parsers/plf/test_utils.js +13 -13
  108. package/lib/tests/parsers/texte.test_utils.js +22 -22
  109. package/package.json +123 -123
  110. package/lib/src/scripts/extract_plf_fixtures.d.ts +0 -1
  111. package/lib/src/scripts/extract_plf_fixtures.js +0 -101
  112. package/lib/tests/plf/credits.test.js +0 -458
  113. package/lib/tests/plf/test_utils.d.ts +0 -20
  114. package/lib/tests/plf/test_utils.js +0 -85
  115. /package/lib/{tests/plf/credits.test.d.ts → src/types/agenda.js} +0 -0
package/package.json CHANGED
@@ -1,123 +1,123 @@
1
- {
2
- "name": "@tricoteuses/senat",
3
- "version": "3.2.1",
4
- "description": "Handle French Sénat's open data",
5
- "keywords": [
6
- "France",
7
- "open data",
8
- "Parliament",
9
- "Sénat"
10
- ],
11
- "author": "Emmanuel Raviart <emmanuel@raviart.com>",
12
- "contributors": [
13
- "Henry Boisgibault <henry.boisgibault@proton.me>",
14
- "Pierre Drege <dregop@proton.me>",
15
- "Hélène Jonin <helene.jonin@gmail.com>",
16
- "Paul-Henry Ngounou <ngpaulhenry@gmail.com>"
17
- ],
18
- "bugs": {
19
- "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat/issues"
20
- },
21
- "homepage": "https://tricoteuses.fr/",
22
- "license": "AGPL-3.0-or-later",
23
- "repository": {
24
- "type": "git",
25
- "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat.git"
26
- },
27
- "type": "module",
28
- "engines": {
29
- "node": ">=22"
30
- },
31
- "files": [
32
- "lib"
33
- ],
34
- "exports": {
35
- ".": {
36
- "import": "./lib/src/index.js",
37
- "types": "./lib/src/index.d.ts"
38
- },
39
- "./kysely": {
40
- "import": "./lib/src/kysely/index.js",
41
- "types": "./lib/src/kysely/index.d.ts"
42
- },
43
- "./server": {
44
- "import": "./lib/src/server/index.js",
45
- "types": "./lib/src/server/index.d.ts"
46
- },
47
- "./package.json": "./package.json"
48
- },
49
- "publishConfig": {
50
- "access": "public"
51
- },
52
- "scripts": {
53
- "build": "tsc",
54
- "build:types": "tsc --emitDeclarationOnly",
55
- "data:convert_data": "tsx src/scripts/convert_data.ts",
56
- "data:download": "tsx src/scripts/data-download.ts",
57
- "data:generate_schemas": "tsx src/scripts/retrieve_open_data.ts --schema",
58
- "data:retrieve_agenda": "cross-env TZ='Etc/UTC' tsx src/scripts/retrieve_agenda.ts",
59
- "data:retrieve_cr_seance": "tsx src/scripts/retrieve_cr_seance.ts",
60
- "data:retrieve_cr_commission": "tsx src/scripts/retrieve_cr_commission.ts",
61
- "data:retrieve_documents": "tsx src/scripts/retrieve_documents.ts",
62
- "data:retrieve_open_data": "tsx src/scripts/retrieve_open_data.ts --all",
63
- "data:retrieve_collaborateurs": "tsx src/scripts/retrieve_collaborateurs.ts",
64
- "data:retrieve_senateurs_photos": "tsx src/scripts/retrieve_senateurs_photos.ts --fetch",
65
- "data:retrieve_videos": "tsx src/scripts/retrieve_videos.ts",
66
- "data:validate_prefixed_tables": "tsx src/scripts/validate_prefixed_tables.ts",
67
- "lint": "eslint src",
68
- "lint:fix": "eslint src --fix",
69
- "prepare": "npm run build",
70
- "prepublishOnly": "npm run build",
71
- "prettier": "prettier --write 'src/**/*.ts'",
72
- "test": "vitest run",
73
- "test:iter_load": "vitest tests/test_iter_load.test.ts",
74
- "type-check": "tsc --noEmit",
75
- "type-check:watch": "npm run type-check -- --watch",
76
- "test:video-matching": "vitest tests/videoMatching.test.ts",
77
- "test:texte": "vitest tests/parsers/texte.test.ts",
78
- "test:prefixed-tables": "vitest tests/prefixedTables.test.ts tests/validatePrefixedTables.test.ts"
79
- },
80
- "dependencies": {
81
- "cheerio": "^1.2.0",
82
- "command-line-args": "^6.0.2",
83
- "domhandler": "^6.0.1",
84
- "dotenv": "^17.4.2",
85
- "fast-xml-parser": "^5.9.3",
86
- "fs-extra": "^11.3.6",
87
- "jsdom": "^29.1.1",
88
- "luxon": "^3.7.2",
89
- "node-stream-zip": "^1.15.0",
90
- "p-limit": "^7.3.0",
91
- "pg": "^8.22.0",
92
- "pg-cursor": "^2.21.0",
93
- "slug": "^11.0.1",
94
- "unpdf": "^1.8.0",
95
- "windows-1252": "^3.0.4",
96
- "zod": "^4.4.3"
97
- },
98
- "devDependencies": {
99
- "@eslint/js": "^10.0.1",
100
- "@types/command-line-args": "^5.2.3",
101
- "@types/fs-extra": "^11.0.4",
102
- "@types/jsdom": "^28.0.3",
103
- "@types/luxon": "^3.7.2",
104
- "@types/node": "^26.1.1",
105
- "@types/pg": "^8.20.0",
106
- "@types/pg-cursor": "^2.7.2",
107
- "@types/slug": "^5.0.9",
108
- "@typescript-eslint/eslint-plugin": "^8.63.0",
109
- "@typescript-eslint/parser": "^8.63.0",
110
- "cross-env": "^10.1.0",
111
- "eslint": "^10.6.0",
112
- "extract-pg-schema": "^5.8.2",
113
- "globals": "^17.7.0",
114
- "kanel": "^4.0.2",
115
- "kanel-kysely": "^4.0.0",
116
- "kanel-zod": "^4.0.0",
117
- "kysely": "^0.29.3",
118
- "prettier": "^3.9.4",
119
- "tsx": "^4.23.0",
120
- "typescript": "^6.0.3",
121
- "vitest": "^4.1.10"
122
- }
123
- }
1
+ {
2
+ "name": "@tricoteuses/senat",
3
+ "version": "3.2.3",
4
+ "description": "Handle French Sénat's open data",
5
+ "keywords": [
6
+ "France",
7
+ "open data",
8
+ "Parliament",
9
+ "Sénat"
10
+ ],
11
+ "author": "Emmanuel Raviart <emmanuel@raviart.com>",
12
+ "contributors": [
13
+ "Henry Boisgibault <henry.boisgibault@proton.me>",
14
+ "Pierre Drege <dregop@proton.me>",
15
+ "Hélène Jonin <helene.jonin@gmail.com>",
16
+ "Paul-Henry Ngounou <ngpaulhenry@gmail.com>"
17
+ ],
18
+ "bugs": {
19
+ "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat/issues"
20
+ },
21
+ "homepage": "https://tricoteuses.fr/",
22
+ "license": "AGPL-3.0-or-later",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat.git"
26
+ },
27
+ "type": "module",
28
+ "engines": {
29
+ "node": ">=22"
30
+ },
31
+ "files": [
32
+ "lib"
33
+ ],
34
+ "exports": {
35
+ ".": {
36
+ "import": "./lib/src/index.js",
37
+ "types": "./lib/src/index.d.ts"
38
+ },
39
+ "./kysely": {
40
+ "import": "./lib/src/kysely/index.js",
41
+ "types": "./lib/src/kysely/index.d.ts"
42
+ },
43
+ "./server": {
44
+ "import": "./lib/src/server/index.js",
45
+ "types": "./lib/src/server/index.d.ts"
46
+ },
47
+ "./package.json": "./package.json"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc",
54
+ "build:types": "tsc --emitDeclarationOnly",
55
+ "data:convert_data": "tsx src/scripts/convert_data.ts",
56
+ "data:download": "tsx src/scripts/data-download.ts",
57
+ "data:generate_schemas": "tsx src/scripts/retrieve_open_data.ts --schema",
58
+ "data:retrieve_agenda": "cross-env TZ='Etc/UTC' tsx src/scripts/retrieve_agenda.ts",
59
+ "data:retrieve_cr_seance": "tsx src/scripts/retrieve_cr_seance.ts",
60
+ "data:retrieve_cr_commission": "tsx src/scripts/retrieve_cr_commission.ts",
61
+ "data:retrieve_documents": "tsx src/scripts/retrieve_documents.ts",
62
+ "data:retrieve_open_data": "tsx src/scripts/retrieve_open_data.ts --all",
63
+ "data:retrieve_collaborateurs": "tsx src/scripts/retrieve_collaborateurs.ts",
64
+ "data:retrieve_senateurs_photos": "tsx src/scripts/retrieve_senateurs_photos.ts --fetch",
65
+ "data:retrieve_videos": "tsx src/scripts/retrieve_videos.ts",
66
+ "data:validate_prefixed_tables": "tsx src/scripts/validate_prefixed_tables.ts",
67
+ "lint": "eslint src",
68
+ "lint:fix": "eslint src --fix",
69
+ "prepare": "npm run build",
70
+ "prepublishOnly": "npm run build",
71
+ "prettier": "prettier --write 'src/**/*.ts'",
72
+ "test": "vitest run",
73
+ "test:iter_load": "vitest tests/test_iter_load.test.ts",
74
+ "type-check": "tsc --noEmit",
75
+ "type-check:watch": "npm run type-check -- --watch",
76
+ "test:video-matching": "vitest tests/videoMatching.test.ts",
77
+ "test:texte": "vitest tests/parsers/texte.test.ts",
78
+ "test:prefixed-tables": "vitest tests/prefixedTables.test.ts tests/validatePrefixedTables.test.ts"
79
+ },
80
+ "dependencies": {
81
+ "cheerio": "^1.2.0",
82
+ "command-line-args": "^6.0.2",
83
+ "domhandler": "^6.0.1",
84
+ "dotenv": "^17.4.2",
85
+ "fast-xml-parser": "^5.9.3",
86
+ "fs-extra": "^11.3.6",
87
+ "jsdom": "^29.1.1",
88
+ "luxon": "^3.7.2",
89
+ "node-stream-zip": "^1.15.0",
90
+ "p-limit": "^7.3.0",
91
+ "pg": "^8.22.0",
92
+ "pg-cursor": "^2.21.0",
93
+ "slug": "^11.0.1",
94
+ "unpdf": "^1.8.0",
95
+ "windows-1252": "^3.0.4",
96
+ "zod": "^4.4.3"
97
+ },
98
+ "devDependencies": {
99
+ "@eslint/js": "^10.0.1",
100
+ "@types/command-line-args": "^5.2.3",
101
+ "@types/fs-extra": "^11.0.4",
102
+ "@types/jsdom": "^28.0.3",
103
+ "@types/luxon": "^3.7.2",
104
+ "@types/node": "^26.1.1",
105
+ "@types/pg": "^8.20.0",
106
+ "@types/pg-cursor": "^2.7.2",
107
+ "@types/slug": "^5.0.9",
108
+ "@typescript-eslint/eslint-plugin": "^8.63.0",
109
+ "@typescript-eslint/parser": "^8.63.0",
110
+ "cross-env": "^10.1.0",
111
+ "eslint": "^10.6.0",
112
+ "extract-pg-schema": "^5.8.2",
113
+ "globals": "^17.7.0",
114
+ "kanel": "^4.0.2",
115
+ "kanel-kysely": "^4.0.0",
116
+ "kanel-zod": "^4.0.0",
117
+ "kysely": "^0.29.3",
118
+ "prettier": "^3.9.4",
119
+ "tsx": "^4.23.0",
120
+ "typescript": "^6.0.3",
121
+ "vitest": "^4.1.10"
122
+ }
123
+ }
@@ -1 +0,0 @@
1
- export declare function extractEtats(srcPath: string): Promise<Element[]>;
@@ -1,101 +0,0 @@
1
- import fs from "fs-extra";
2
- import { JSDOM } from "jsdom";
3
- import path from "path";
4
- import { commonOptions } from "./shared/cli_helpers.js";
5
- const optionsDefinitions = [
6
- { name: "src", type: String },
7
- {
8
- help: [
9
- "extract the 'etat' articles of a real Sénat AKN XML into a minimal fixture",
10
- "named <name>.xml under tests/fixtures/plf/",
11
- ].join(" "),
12
- name: "name",
13
- type: String,
14
- },
15
- {
16
- help: "keep only the parsed budget states (B, C, D); drop the large A/G tables",
17
- name: "only-parsed",
18
- type: Boolean,
19
- },
20
- ...commonOptions,
21
- ];
22
- const KEEP_DATA_ROWS = 6;
23
- function trimTable(table) {
24
- const rows = [...table.querySelectorAll("tr")];
25
- // Les 2 premières lignes sont les en-têtes réels : « (En euros) » puis « Mission / Programme ».
26
- const headerCount = Math.min(2, rows.length);
27
- const dataRows = rows.slice(headerCount);
28
- const dataStartIndex = rows.length - dataRows.length;
29
- const totalRows = dataRows.filter((row) => {
30
- const firstTd = row.querySelector("td");
31
- return /^total/i.test(firstTd?.textContent?.trim() ?? "");
32
- });
33
- const totalIndexes = new Set(totalRows.map((row) => rows.indexOf(row)));
34
- let kept = 0;
35
- for (const row of rows) {
36
- const index = rows.indexOf(row);
37
- if (index < dataStartIndex)
38
- continue; // en-têtes conservés
39
- if (totalIndexes.has(index))
40
- continue; // lignes Total conservées
41
- if (kept < KEEP_DATA_ROWS) {
42
- kept++;
43
- continue;
44
- }
45
- row.parentNode?.removeChild(row);
46
- }
47
- }
48
- export async function extractEtats(srcPath) {
49
- const xml = await fs.readFile(srcPath, "utf-8");
50
- const { document } = new JSDOM(xml, { contentType: "text/xml" }).window;
51
- const body = document.querySelector("body");
52
- if (!body)
53
- throw new Error(`No <body> found in ${srcPath}`);
54
- return [...body.querySelectorAll('article[class="etat"]')];
55
- }
56
- async function main() {
57
- const commandLineArgs = (await import("command-line-args")).default;
58
- const options = commandLineArgs(optionsDefinitions);
59
- const srcPath = options.src;
60
- const fixtureName = options.name;
61
- if (!srcPath)
62
- throw new Error("Missing <src> path to a Sénat AKN XML");
63
- if (!fixtureName)
64
- throw new Error("Missing --name");
65
- const etatArticles = await extractEtats(srcPath);
66
- const kept = options["only-parsed"]
67
- ? etatArticles.filter((article) => {
68
- const num = article.querySelector(":scope > num")?.textContent?.trim();
69
- return num === "État B" || num === "État C" || num === "État D";
70
- })
71
- : etatArticles;
72
- if (kept.length === 0)
73
- throw new Error(`No B/C/D etat articles found in ${srcPath}`);
74
- for (const article of kept) {
75
- for (const table of article.querySelectorAll("table.alinea-table.etat-tableau")) {
76
- trimTable(table);
77
- }
78
- }
79
- const outDir = path.join("tests", "fixtures", "plf");
80
- await fs.ensureDir(outDir);
81
- const outPath = path.join(outDir, `${fixtureName}.xml`);
82
- const fixture = `<?xml version="1.0" encoding="UTF-8"?>
83
- <akomaNtoso xmlns="http://docs.oasis-open.org/legaldocml/ns/akn/3.0" xmlns:data="http://data.parlement.fr/v1">
84
- <bill contains="singleVersion" name="plf">
85
- <body>${kept.map((el) => el.outerHTML).join("\n")}</body>
86
- </bill>
87
- </akomaNtoso>
88
- `;
89
- await fs.writeFile(outPath, fixture);
90
- if (!options.silent) {
91
- const sizeKb = (Buffer.byteLength(fixture) / 1024).toFixed(1);
92
- console.log(`Wrote ${outPath} (${kept.length} etat articles, ${sizeKb} KB)`);
93
- }
94
- }
95
- if (process.argv[1].endsWith("extract_plf_fixtures.ts")) {
96
- main()
97
- .catch((error) => {
98
- console.error(error);
99
- process.exit(1);
100
- });
101
- }