@tricoteuses/senat 2.22.16 → 3.0.0

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 (345) hide show
  1. package/README.md +168 -0
  2. package/lib/aggregates.d.ts +52 -0
  3. package/lib/aggregates.js +930 -0
  4. package/lib/aggregates.mjs +713 -0
  5. package/lib/aggregates.ts +833 -0
  6. package/lib/config.d.ts +10 -0
  7. package/lib/config.js +16 -0
  8. package/lib/config.mjs +16 -0
  9. package/lib/config.ts +26 -0
  10. package/lib/databases.d.ts +2 -0
  11. package/lib/databases.js +26 -0
  12. package/lib/databases.mjs +57 -0
  13. package/lib/databases.ts +71 -0
  14. package/lib/datasets.d.ts +34 -0
  15. package/lib/datasets.js +233 -0
  16. package/lib/datasets.mjs +78 -0
  17. package/lib/datasets.ts +118 -0
  18. package/lib/fields.d.ts +10 -0
  19. package/lib/fields.js +68 -0
  20. package/lib/fields.mjs +22 -0
  21. package/lib/fields.ts +29 -0
  22. package/lib/git.d.ts +26 -0
  23. package/lib/git.js +167 -0
  24. package/lib/index.d.ts +13 -0
  25. package/lib/index.js +1 -0
  26. package/lib/index.mjs +7 -0
  27. package/lib/index.ts +64 -0
  28. package/lib/inserters.d.ts +98 -0
  29. package/lib/inserters.js +500 -0
  30. package/lib/inserters.mjs +360 -0
  31. package/lib/inserters.ts +521 -0
  32. package/lib/legislatures.json +38 -0
  33. package/lib/loaders.d.ts +58 -0
  34. package/lib/loaders.js +286 -0
  35. package/lib/loaders.mjs +158 -0
  36. package/lib/loaders.ts +271 -0
  37. package/lib/model/agenda.d.ts +6 -0
  38. package/lib/model/agenda.js +148 -0
  39. package/lib/model/ameli.d.ts +51 -0
  40. package/lib/model/ameli.js +149 -0
  41. package/lib/model/ameli.mjs +84 -0
  42. package/lib/model/ameli.ts +100 -0
  43. package/lib/model/commission.d.ts +18 -0
  44. package/lib/model/commission.js +269 -0
  45. package/lib/model/debats.d.ts +67 -0
  46. package/lib/model/debats.js +95 -0
  47. package/lib/model/debats.mjs +43 -0
  48. package/lib/model/debats.ts +68 -0
  49. package/lib/model/documents.d.ts +12 -0
  50. package/lib/model/documents.js +151 -0
  51. package/lib/model/dosleg.d.ts +7 -0
  52. package/lib/model/dosleg.js +326 -0
  53. package/lib/model/dosleg.mjs +196 -0
  54. package/lib/model/dosleg.ts +240 -0
  55. package/lib/model/index.d.ts +7 -0
  56. package/lib/model/index.js +7 -0
  57. package/lib/model/index.mjs +5 -0
  58. package/lib/model/index.ts +15 -0
  59. package/lib/model/questions.d.ts +45 -0
  60. package/lib/model/questions.js +89 -0
  61. package/lib/model/questions.mjs +71 -0
  62. package/lib/model/questions.ts +93 -0
  63. package/lib/model/scrutins.d.ts +13 -0
  64. package/lib/model/scrutins.js +114 -0
  65. package/lib/model/seance.d.ts +3 -0
  66. package/lib/model/seance.js +267 -0
  67. package/lib/model/sens.d.ts +146 -0
  68. package/lib/model/sens.js +454 -0
  69. package/lib/model/sens.mjs +415 -0
  70. package/lib/model/sens.ts +516 -0
  71. package/lib/model/texte.d.ts +7 -0
  72. package/lib/model/texte.js +256 -0
  73. package/lib/model/texte.mjs +208 -0
  74. package/lib/model/texte.ts +229 -0
  75. package/lib/model/util.d.ts +9 -0
  76. package/lib/model/util.js +38 -0
  77. package/lib/model/util.mjs +19 -0
  78. package/lib/model/util.ts +32 -0
  79. package/lib/parsers/texte.d.ts +7 -0
  80. package/lib/parsers/texte.js +228 -0
  81. package/lib/raw_types/ameli.d.ts +914 -0
  82. package/lib/raw_types/ameli.js +5 -0
  83. package/lib/raw_types/ameli.mjs +163 -0
  84. package/lib/raw_types/debats.d.ts +207 -0
  85. package/lib/raw_types/debats.js +5 -0
  86. package/lib/raw_types/debats.mjs +58 -0
  87. package/lib/raw_types/dosleg.d.ts +1619 -0
  88. package/lib/raw_types/dosleg.js +5 -0
  89. package/lib/raw_types/dosleg.mjs +438 -0
  90. package/lib/raw_types/questions.d.ts +419 -0
  91. package/lib/raw_types/questions.js +5 -0
  92. package/lib/raw_types/questions.mjs +11 -0
  93. package/lib/raw_types/senat.d.ts +11368 -0
  94. package/lib/raw_types/senat.js +5 -0
  95. package/lib/raw_types/sens.d.ts +8248 -0
  96. package/lib/raw_types/sens.js +5 -0
  97. package/lib/raw_types/sens.mjs +508 -0
  98. package/lib/raw_types_kysely/ameli.d.ts +915 -0
  99. package/lib/raw_types_kysely/ameli.js +7 -0
  100. package/lib/raw_types_kysely/ameli.mjs +5 -0
  101. package/lib/raw_types_kysely/ameli.ts +951 -0
  102. package/lib/raw_types_kysely/debats.d.ts +207 -0
  103. package/lib/raw_types_kysely/debats.js +7 -0
  104. package/lib/raw_types_kysely/debats.mjs +5 -0
  105. package/lib/raw_types_kysely/debats.ts +222 -0
  106. package/lib/raw_types_kysely/dosleg.d.ts +3532 -0
  107. package/lib/raw_types_kysely/dosleg.js +7 -0
  108. package/lib/raw_types_kysely/dosleg.mjs +5 -0
  109. package/lib/raw_types_kysely/dosleg.ts +3621 -0
  110. package/lib/raw_types_kysely/questions.d.ts +414 -0
  111. package/lib/raw_types_kysely/questions.js +7 -0
  112. package/lib/raw_types_kysely/questions.mjs +5 -0
  113. package/lib/raw_types_kysely/questions.ts +426 -0
  114. package/lib/raw_types_kysely/sens.d.ts +4394 -0
  115. package/lib/raw_types_kysely/sens.js +7 -0
  116. package/lib/raw_types_kysely/sens.mjs +5 -0
  117. package/lib/raw_types_kysely/sens.ts +4499 -0
  118. package/lib/raw_types_schemats/ameli.d.ts +539 -0
  119. package/lib/raw_types_schemats/ameli.js +2 -0
  120. package/lib/raw_types_schemats/ameli.mjs +2 -0
  121. package/lib/raw_types_schemats/ameli.ts +601 -0
  122. package/lib/raw_types_schemats/debats.d.ts +127 -0
  123. package/lib/raw_types_schemats/debats.js +2 -0
  124. package/lib/raw_types_schemats/debats.mjs +2 -0
  125. package/lib/raw_types_schemats/debats.ts +145 -0
  126. package/lib/raw_types_schemats/dosleg.d.ts +977 -0
  127. package/lib/raw_types_schemats/dosleg.js +2 -0
  128. package/lib/raw_types_schemats/dosleg.mjs +2 -0
  129. package/lib/raw_types_schemats/dosleg.ts +2193 -0
  130. package/lib/raw_types_schemats/questions.d.ts +235 -0
  131. package/lib/raw_types_schemats/questions.js +2 -0
  132. package/lib/raw_types_schemats/questions.mjs +2 -0
  133. package/lib/raw_types_schemats/questions.ts +249 -0
  134. package/lib/raw_types_schemats/sens.d.ts +6915 -0
  135. package/lib/raw_types_schemats/sens.js +2 -0
  136. package/lib/raw_types_schemats/sens.mjs +2 -0
  137. package/lib/raw_types_schemats/sens.ts +2907 -0
  138. package/lib/scripts/convert_data.d.ts +1 -0
  139. package/lib/scripts/convert_data.js +354 -0
  140. package/lib/scripts/convert_data.mjs +181 -0
  141. package/lib/scripts/convert_data.ts +243 -0
  142. package/lib/scripts/data-download.d.ts +1 -0
  143. package/lib/scripts/data-download.js +12 -0
  144. package/lib/scripts/datautil.d.ts +8 -0
  145. package/lib/scripts/datautil.js +34 -0
  146. package/lib/scripts/datautil.mjs +16 -0
  147. package/lib/scripts/datautil.ts +19 -0
  148. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  149. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  150. package/lib/scripts/parse_textes.d.ts +1 -0
  151. package/lib/scripts/parse_textes.js +44 -0
  152. package/lib/scripts/parse_textes.mjs +46 -0
  153. package/lib/scripts/parse_textes.ts +65 -0
  154. package/lib/scripts/retrieve_agenda.d.ts +1 -0
  155. package/lib/scripts/retrieve_agenda.js +132 -0
  156. package/lib/scripts/retrieve_cr_commission.d.ts +1 -0
  157. package/lib/scripts/retrieve_cr_commission.js +364 -0
  158. package/lib/scripts/retrieve_cr_seance.d.ts +6 -0
  159. package/lib/scripts/retrieve_cr_seance.js +347 -0
  160. package/lib/scripts/retrieve_documents.d.ts +3 -0
  161. package/lib/scripts/retrieve_documents.js +219 -0
  162. package/lib/scripts/retrieve_documents.mjs +249 -0
  163. package/lib/scripts/retrieve_documents.ts +298 -0
  164. package/lib/scripts/retrieve_open_data.d.ts +1 -0
  165. package/lib/scripts/retrieve_open_data.js +315 -0
  166. package/lib/scripts/retrieve_open_data.mjs +217 -0
  167. package/lib/scripts/retrieve_open_data.ts +268 -0
  168. package/lib/scripts/retrieve_senateurs_photos.d.ts +1 -0
  169. package/lib/scripts/retrieve_senateurs_photos.js +147 -0
  170. package/lib/scripts/retrieve_senateurs_photos.mjs +147 -0
  171. package/lib/scripts/retrieve_senateurs_photos.ts +177 -0
  172. package/lib/scripts/retrieve_videos.d.ts +1 -0
  173. package/lib/scripts/retrieve_videos.js +461 -0
  174. package/lib/scripts/shared/cli_helpers.d.ts +95 -0
  175. package/lib/scripts/shared/cli_helpers.js +91 -0
  176. package/lib/scripts/shared/cli_helpers.ts +36 -0
  177. package/lib/scripts/shared/util.d.ts +4 -0
  178. package/lib/scripts/shared/util.js +35 -0
  179. package/lib/scripts/shared/util.ts +33 -0
  180. package/lib/scripts/test_iter_load.d.ts +1 -0
  181. package/lib/scripts/test_iter_load.js +12 -0
  182. package/lib/src/config.d.ts +22 -0
  183. package/lib/src/config.js +17 -7
  184. package/lib/src/conversion_textes.js +5 -1
  185. package/lib/src/databases.d.ts +2 -1
  186. package/lib/src/databases_postgres.d.ts +4 -0
  187. package/lib/src/databases_postgres.js +23 -0
  188. package/lib/src/datasets.d.ts +4 -0
  189. package/lib/src/datasets.js +16 -2
  190. package/lib/src/git.d.ts +1 -0
  191. package/lib/src/git.js +45 -11
  192. package/lib/src/index.d.ts +19 -8
  193. package/lib/src/index.js +6 -1
  194. package/lib/src/loaders.js +10 -4
  195. package/lib/src/model/agenda.js +2 -2
  196. package/lib/src/model/ameli.d.ts +64 -52
  197. package/lib/src/model/ameli.js +147 -145
  198. package/lib/src/model/ameli_postgres.d.ts +67 -0
  199. package/lib/src/model/ameli_postgres.js +150 -0
  200. package/lib/src/model/commission.d.ts +3 -2
  201. package/lib/src/model/commission.js +2 -2
  202. package/lib/src/model/debats.d.ts +38 -66
  203. package/lib/src/model/debats.js +110 -93
  204. package/lib/src/model/documents.d.ts +32 -12
  205. package/lib/src/model/documents.js +171 -130
  206. package/lib/src/model/dosleg.d.ts +142 -5
  207. package/lib/src/model/dosleg.js +298 -156
  208. package/lib/src/model/questions.d.ts +54 -45
  209. package/lib/src/model/questions.js +89 -87
  210. package/lib/src/model/scrutins.d.ts +48 -13
  211. package/lib/src/model/scrutins.js +118 -111
  212. package/lib/src/model/seance.js +3 -3
  213. package/lib/src/model/sens.d.ts +109 -179
  214. package/lib/src/model/sens.js +384 -484
  215. package/lib/src/model/util.d.ts +0 -8
  216. package/lib/src/model/util.js +0 -23
  217. package/lib/src/parsers/texte.js +7 -7
  218. package/lib/src/raw_types/ameli.d.ts +1651 -803
  219. package/lib/src/raw_types/ameli.js +1816 -5
  220. package/lib/src/raw_types/debats.d.ts +353 -180
  221. package/lib/src/raw_types/debats.js +517 -5
  222. package/lib/src/raw_types/dosleg.d.ts +2862 -1527
  223. package/lib/src/raw_types/dosleg.js +4354 -5
  224. package/lib/src/raw_types/questions.d.ts +671 -395
  225. package/lib/src/raw_types/questions.js +1303 -5
  226. package/lib/src/raw_types/sens.d.ts +7743 -8148
  227. package/lib/src/raw_types/sens.js +10429 -5
  228. package/lib/src/raw_types_schemats/ameli.d.ts +4 -2
  229. package/lib/src/raw_types_schemats/debats.d.ts +2 -2
  230. package/lib/src/raw_types_schemats/dosleg.d.ts +2 -2
  231. package/lib/src/raw_types_schemats/questions.d.ts +2 -2
  232. package/lib/src/raw_types_schemats/sens.d.ts +10 -4216
  233. package/lib/src/scripts/convert_data.js +7 -6
  234. package/lib/src/scripts/convert_xml_to_html.js +2 -2
  235. package/lib/src/scripts/data-download.js +3 -2
  236. package/lib/src/scripts/retrieve_agenda.js +21 -9
  237. package/lib/src/scripts/retrieve_cr_commission.js +17 -17
  238. package/lib/src/scripts/retrieve_cr_seance.d.ts +14 -1
  239. package/lib/src/scripts/retrieve_cr_seance.js +10 -11
  240. package/lib/src/scripts/retrieve_documents.d.ts +11 -2
  241. package/lib/src/scripts/retrieve_documents.js +25 -14
  242. package/lib/src/scripts/retrieve_open_data.js +514 -153
  243. package/lib/src/scripts/retrieve_senateurs_photos.js +25 -11
  244. package/lib/src/scripts/retrieve_videos.js +12 -11
  245. package/lib/src/scripts/shared/cli_helpers.d.ts +1 -6
  246. package/lib/src/scripts/shared/cli_helpers.js +9 -8
  247. package/lib/src/scripts/shared/incremental_import_sql.d.ts +2 -0
  248. package/lib/src/scripts/shared/incremental_import_sql.js +894 -0
  249. package/lib/src/scripts/shared/prefixed_tables.d.ts +10 -0
  250. package/lib/src/scripts/shared/prefixed_tables.js +36 -0
  251. package/lib/src/scripts/shared/schema_version.d.ts +3 -0
  252. package/lib/src/scripts/shared/schema_version.js +97 -0
  253. package/lib/src/scripts/shared/staging_import.d.ts +3 -0
  254. package/lib/src/scripts/shared/staging_import.js +80 -0
  255. package/lib/src/scripts/shared/staging_metadata_sql.d.ts +1 -0
  256. package/lib/src/scripts/shared/staging_metadata_sql.js +221 -0
  257. package/lib/src/scripts/validate_prefixed_tables.d.ts +1 -0
  258. package/lib/src/scripts/validate_prefixed_tables.js +101 -0
  259. package/lib/src/types/ameli.d.ts +4 -4
  260. package/lib/src/types/debats.d.ts +2 -2
  261. package/lib/src/types/dosleg.d.ts +39 -39
  262. package/lib/src/types/questions.d.ts +2 -2
  263. package/lib/src/types/sens.d.ts +0 -2
  264. package/lib/src/types/texte.d.ts +1 -1
  265. package/lib/src/utils/cr_spliting.d.ts +9 -6
  266. package/lib/src/utils/cr_spliting.js +6 -101
  267. package/lib/src/utils/reunion_odj_building.d.ts +7 -3
  268. package/lib/src/utils/reunion_parsing.d.ts +2 -1
  269. package/lib/src/utils/reunion_parsing.js +2 -2
  270. package/lib/src/videos/match.js +8 -5
  271. package/lib/src/videos/pipeline.d.ts +6 -2
  272. package/lib/src/videos/pipeline.js +21 -8
  273. package/lib/src/videos/search.js +6 -2
  274. package/lib/strings.d.ts +1 -0
  275. package/lib/strings.js +18 -0
  276. package/lib/strings.mjs +18 -0
  277. package/lib/strings.ts +26 -0
  278. package/lib/tests/incrementalImportSql.test.d.ts +1 -0
  279. package/lib/tests/incrementalImportSql.test.js +155 -0
  280. package/lib/tests/prefixedTables.test.d.ts +1 -0
  281. package/lib/tests/prefixedTables.test.js +22 -0
  282. package/lib/tests/schemaVersion.test.d.ts +1 -0
  283. package/lib/tests/schemaVersion.test.js +23 -0
  284. package/lib/tests/validatePrefixedTables.test.d.ts +1 -0
  285. package/lib/tests/validatePrefixedTables.test.js +14 -0
  286. package/lib/types/agenda.d.ts +44 -0
  287. package/lib/types/agenda.js +1 -0
  288. package/lib/types/ameli.d.ts +5 -0
  289. package/lib/types/ameli.js +1 -0
  290. package/lib/types/ameli.mjs +13 -0
  291. package/lib/types/ameli.ts +21 -0
  292. package/lib/types/compte_rendu.d.ts +83 -0
  293. package/lib/types/compte_rendu.js +1 -0
  294. package/lib/types/debats.d.ts +2 -0
  295. package/lib/types/debats.js +1 -0
  296. package/lib/types/debats.mjs +2 -0
  297. package/lib/types/debats.ts +6 -0
  298. package/lib/types/dosleg.d.ts +70 -0
  299. package/lib/types/dosleg.js +1 -0
  300. package/lib/types/dosleg.mjs +151 -0
  301. package/lib/types/dosleg.ts +284 -0
  302. package/lib/types/questions.d.ts +2 -0
  303. package/lib/types/questions.js +1 -0
  304. package/lib/types/questions.mjs +1 -0
  305. package/lib/types/questions.ts +3 -0
  306. package/lib/types/sens.d.ts +10 -0
  307. package/lib/types/sens.js +1 -0
  308. package/lib/types/sens.mjs +1 -0
  309. package/lib/types/sens.ts +12 -0
  310. package/lib/types/sessions.d.ts +5 -0
  311. package/lib/types/sessions.js +84 -0
  312. package/lib/types/sessions.mjs +43 -0
  313. package/lib/types/sessions.ts +42 -0
  314. package/lib/types/texte.d.ts +74 -0
  315. package/lib/types/texte.js +16 -0
  316. package/lib/types/texte.mjs +16 -0
  317. package/lib/types/texte.ts +76 -0
  318. package/lib/typings/windows-1252.d.js +2 -0
  319. package/lib/typings/windows-1252.d.mjs +2 -0
  320. package/lib/typings/windows-1252.d.ts +11 -0
  321. package/lib/utils/cr_spliting.d.ts +28 -0
  322. package/lib/utils/cr_spliting.js +265 -0
  323. package/lib/utils/date.d.ts +10 -0
  324. package/lib/utils/date.js +100 -0
  325. package/lib/utils/nvs-timecode.d.ts +7 -0
  326. package/lib/utils/nvs-timecode.js +79 -0
  327. package/lib/utils/reunion_grouping.d.ts +9 -0
  328. package/lib/utils/reunion_grouping.js +361 -0
  329. package/lib/utils/reunion_odj_building.d.ts +5 -0
  330. package/lib/utils/reunion_odj_building.js +154 -0
  331. package/lib/utils/reunion_parsing.d.ts +23 -0
  332. package/lib/utils/reunion_parsing.js +209 -0
  333. package/lib/utils/scoring.d.ts +14 -0
  334. package/lib/utils/scoring.js +147 -0
  335. package/lib/utils/string_cleaning.d.ts +7 -0
  336. package/lib/utils/string_cleaning.js +57 -0
  337. package/lib/validators/config.d.ts +9 -0
  338. package/lib/validators/config.js +10 -0
  339. package/lib/validators/config.mjs +54 -0
  340. package/lib/validators/config.ts +79 -0
  341. package/lib/validators/senat.d.ts +0 -0
  342. package/lib/validators/senat.js +28 -0
  343. package/lib/validators/senat.mjs +24 -0
  344. package/lib/validators/senat.ts +26 -0
  345. package/package.json +11 -11
@@ -0,0 +1,95 @@
1
+ export declare const categoriesOption: {
2
+ alias: string;
3
+ defaultValue: string[];
4
+ help: string;
5
+ multiple: boolean;
6
+ name: string;
7
+ type: StringConstructor;
8
+ };
9
+ export declare const dataDirDefaultOption: {
10
+ defaultOption: boolean;
11
+ help: string;
12
+ name: string;
13
+ type: StringConstructor;
14
+ };
15
+ export declare const fromSessionOption: {
16
+ defaultValue: number;
17
+ help: string;
18
+ name: string;
19
+ type: NumberConstructor;
20
+ };
21
+ export declare const silentOption: {
22
+ alias: string;
23
+ help: string;
24
+ name: string;
25
+ type: BooleanConstructor;
26
+ };
27
+ export declare const verboseOption: {
28
+ alias: string;
29
+ help: string;
30
+ name: string;
31
+ type: BooleanConstructor;
32
+ };
33
+ export declare const onlyRecentOption: {
34
+ help: string;
35
+ name: string;
36
+ type: NumberConstructor;
37
+ };
38
+ export declare const keepDirOption: {
39
+ help: string;
40
+ name: string;
41
+ type: BooleanConstructor;
42
+ };
43
+ export declare const cloneOption: {
44
+ alias: string;
45
+ help: string;
46
+ name: string;
47
+ type: StringConstructor;
48
+ };
49
+ export declare const commitOption: {
50
+ help: string;
51
+ name: string;
52
+ type: BooleanConstructor;
53
+ };
54
+ export declare const remoteOption: {
55
+ alias: string;
56
+ help: string;
57
+ multiple: boolean;
58
+ name: string;
59
+ type: StringConstructor;
60
+ };
61
+ export declare const pullOption: {
62
+ alias: string;
63
+ help: string;
64
+ name: string;
65
+ type: BooleanConstructor;
66
+ };
67
+ export declare const fetchDocumentsOption: {
68
+ help: string;
69
+ name: string;
70
+ type: BooleanConstructor;
71
+ };
72
+ export declare const parseDocumentsOption: {
73
+ help: string;
74
+ name: string;
75
+ type: BooleanConstructor;
76
+ };
77
+ export declare const commonOptions: ({
78
+ defaultOption: boolean;
79
+ help: string;
80
+ name: string;
81
+ type: StringConstructor;
82
+ } | {
83
+ help: string;
84
+ name: string;
85
+ type: NumberConstructor;
86
+ } | {
87
+ help: string;
88
+ name: string;
89
+ type: BooleanConstructor;
90
+ } | {
91
+ alias: string;
92
+ help: string;
93
+ name: string;
94
+ type: StringConstructor;
95
+ })[];
@@ -0,0 +1,91 @@
1
+ export const categoriesOption = {
2
+ alias: "k",
3
+ defaultValue: ["All"],
4
+ help: "categories of datasets to reorganize; default All",
5
+ multiple: true,
6
+ name: "categories",
7
+ type: String,
8
+ };
9
+ export const dataDirDefaultOption = {
10
+ defaultOption: true,
11
+ help: "directory containing Sénat open data files",
12
+ name: "dataDir",
13
+ type: String,
14
+ };
15
+ export const fromSessionOption = {
16
+ defaultValue: 2022,
17
+ help: "session year to retrieve data from; default 2022",
18
+ name: "fromSession",
19
+ type: Number,
20
+ };
21
+ export const silentOption = {
22
+ alias: "s",
23
+ help: "don't log anything",
24
+ name: "silent",
25
+ type: Boolean,
26
+ };
27
+ export const verboseOption = {
28
+ alias: "v",
29
+ help: "verbose logs",
30
+ name: "verbose",
31
+ type: Boolean,
32
+ };
33
+ export const onlyRecentOption = {
34
+ help: "retrieve only documents created within the last N days (that are not already downloaded)",
35
+ name: "only-recent",
36
+ type: Number,
37
+ };
38
+ export const keepDirOption = {
39
+ help: "keep directories when cleaning data",
40
+ name: "keepDir",
41
+ type: Boolean,
42
+ };
43
+ export const cloneOption = {
44
+ alias: "C",
45
+ help: "clone repositories from given group (or organization) git URL",
46
+ name: "clone",
47
+ type: String,
48
+ };
49
+ export const commitOption = {
50
+ help: "commit clean files",
51
+ name: "commit",
52
+ type: Boolean,
53
+ };
54
+ export const remoteOption = {
55
+ alias: "r",
56
+ help: "push commit to given remote",
57
+ multiple: true,
58
+ name: "remote",
59
+ type: String,
60
+ };
61
+ export const pullOption = {
62
+ alias: "p",
63
+ help: "pull repositories before proceeding",
64
+ name: "pull",
65
+ type: Boolean,
66
+ };
67
+ export const fetchDocumentsOption = {
68
+ help: "download documents",
69
+ name: "fetchDocuments",
70
+ type: Boolean,
71
+ };
72
+ export const parseDocumentsOption = {
73
+ help: "parse documents",
74
+ name: "parseDocuments",
75
+ type: Boolean,
76
+ };
77
+ export const commonOptions = [
78
+ categoriesOption,
79
+ dataDirDefaultOption,
80
+ fromSessionOption,
81
+ silentOption,
82
+ verboseOption,
83
+ onlyRecentOption,
84
+ keepDirOption,
85
+ cloneOption,
86
+ commitOption,
87
+ remoteOption,
88
+ pullOption,
89
+ fetchDocumentsOption,
90
+ parseDocumentsOption,
91
+ ];
@@ -0,0 +1,36 @@
1
+ export const categoriesOption = {
2
+ alias: "k",
3
+ defaultValue: ["All"],
4
+ help: "categories of datasets to reorganize",
5
+ multiple: true,
6
+ name: "categories",
7
+ type: String,
8
+ }
9
+
10
+ export const dataDirDefaultOption = {
11
+ defaultOption: true,
12
+ help: "directory containing Sénat open data files",
13
+ name: "dataDir",
14
+ type: String,
15
+ }
16
+
17
+ export const silentOption = {
18
+ alias: "s",
19
+ help: "don't log anything",
20
+ name: "silent",
21
+ type: Boolean,
22
+ }
23
+
24
+ export const verboseOption = {
25
+ alias: "v",
26
+ help: "verbose logs",
27
+ name: "verbose",
28
+ type: Boolean,
29
+ }
30
+
31
+ export const commonOptions = [
32
+ categoriesOption,
33
+ dataDirDefaultOption,
34
+ silentOption,
35
+ verboseOption,
36
+ ]
@@ -0,0 +1,4 @@
1
+ export declare function isOptionEmptyOrHasValue(option: string, value: string): boolean;
2
+ export declare function ensureAndClearDirSync(dir: string): void;
3
+ export declare function ensureAndClearDir(path: string): void;
4
+ export declare function fetchWithRetry(url: string, retries?: number, backoff?: number): Promise<Response>;
@@ -0,0 +1,35 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ export function isOptionEmptyOrHasValue(option, value) {
4
+ return !option || option.length === 0 || option.includes(value);
5
+ }
6
+ export function ensureAndClearDirSync(dir) {
7
+ fs.ensureDirSync(dir);
8
+ for (const name of fs.readdirSync(dir)) {
9
+ fs.rmSync(path.join(dir, name), { recursive: true, force: true });
10
+ }
11
+ }
12
+ export function ensureAndClearDir(path) {
13
+ if (!fs.existsSync(path)) {
14
+ fs.mkdirSync(path, { recursive: true });
15
+ }
16
+ else {
17
+ fs.emptyDirSync(path);
18
+ }
19
+ }
20
+ export async function fetchWithRetry(url, retries = 3, backoff = 300) {
21
+ for (let attempt = 0; attempt < retries; attempt++) {
22
+ try {
23
+ return await fetch(url);
24
+ }
25
+ catch (error) {
26
+ if (attempt === retries - 1) {
27
+ throw error;
28
+ }
29
+ console.warn(`Fetch attempt ${attempt + 1} for ${url} failed. Retrying in ${backoff}ms…`);
30
+ await new Promise((resolve) => setTimeout(resolve, backoff));
31
+ backoff *= 2;
32
+ }
33
+ }
34
+ throw new Error(`Failed to fetch ${url} after ${retries} attempts`);
35
+ }
@@ -0,0 +1,33 @@
1
+ import fs from "fs-extra"
2
+
3
+ export function isOptionEmptyOrHasValue (option: string, value: string) {
4
+ return !option || option.length === 0 || option.includes(value)
5
+ }
6
+
7
+ export function ensureAndClearDir (path: string) {
8
+ if (!fs.existsSync(path)) {
9
+ fs.mkdirSync(path, { recursive: true })
10
+ } else {
11
+ fs.emptyDirSync(path)
12
+ }
13
+ }
14
+
15
+ export async function fetchWithRetry (
16
+ url: string,
17
+ retries: number = 3,
18
+ backoff: number = 300,
19
+ ): Promise<Response> {
20
+ for (let attempt = 0; attempt < retries; attempt++) {
21
+ try {
22
+ return await fetch(url)
23
+ } catch (error) {
24
+ if (attempt === retries - 1) {
25
+ throw error
26
+ }
27
+ console.warn(`Fetch attempt ${attempt + 1} for ${url} failed. Retrying in ${backoff}ms…`)
28
+ await new Promise((resolve) => setTimeout(resolve, backoff))
29
+ backoff *= 2
30
+ }
31
+ }
32
+ throw new Error(`Failed to fetch ${url} after ${retries} attempts`)
33
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { iterLoadSenatRapports } from "../loaders";
2
+ import commandLineArgs from "command-line-args";
3
+ import { dataDirDefaultOption } from "./shared/cli_helpers";
4
+ const optionsDefinitions = [dataDirDefaultOption];
5
+ const options = commandLineArgs(optionsDefinitions);
6
+ const session = 2024;
7
+ const sinceCommit = undefined;
8
+ for (const { item: rapport } of iterLoadSenatRapports(options["dataDir"], session, {
9
+ sinceCommit: sinceCommit,
10
+ })) {
11
+ console.log(rapport);
12
+ }
@@ -1,5 +1,13 @@
1
1
  import "dotenv/config";
2
2
  import { z } from "zod";
3
+ export declare const dbSchema: z.ZodObject<{
4
+ host: z.ZodString;
5
+ name: z.ZodString;
6
+ password: z.ZodString;
7
+ port: z.ZodCoercedNumber<unknown>;
8
+ user: z.ZodString;
9
+ }, z.core.$strip>;
10
+ export type DbConfig = z.infer<typeof dbSchema>;
3
11
  export declare const configSchema: z.ZodObject<{
4
12
  db: z.ZodObject<{
5
13
  host: z.ZodString;
@@ -8,6 +16,13 @@ export declare const configSchema: z.ZodObject<{
8
16
  port: z.ZodCoercedNumber<unknown>;
9
17
  user: z.ZodString;
10
18
  }, z.core.$strip>;
19
+ stagingDb: z.ZodObject<{
20
+ host: z.ZodString;
21
+ name: z.ZodString;
22
+ password: z.ZodString;
23
+ port: z.ZodCoercedNumber<unknown>;
24
+ user: z.ZodString;
25
+ }, z.core.$strip>;
11
26
  }, z.core.$strip>;
12
27
  declare const _default: {
13
28
  db: {
@@ -17,5 +32,12 @@ declare const _default: {
17
32
  port: number;
18
33
  user: string;
19
34
  };
35
+ stagingDb: {
36
+ host: string;
37
+ name: string;
38
+ password: string;
39
+ port: number;
40
+ user: string;
41
+ };
20
42
  };
21
43
  export default _default;
package/lib/src/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "dotenv/config";
2
2
  import { z } from "zod";
3
- const dbSchema = z.object({
3
+ export const dbSchema = z.object({
4
4
  host: z.string().trim().min(1, "Must not be empty"),
5
5
  name: z.string().trim().min(1, "Must not be empty"),
6
6
  password: z.string().trim().min(1, "Must not be empty"),
@@ -9,19 +9,29 @@ const dbSchema = z.object({
9
9
  });
10
10
  export const configSchema = z.object({
11
11
  db: dbSchema,
12
+ stagingDb: dbSchema,
12
13
  });
13
14
  const config = {
14
15
  db: {
15
- host: process.env["TRICOTEUSES_SENAT_DB_HOST"] || "localhost",
16
- name: process.env["TRICOTEUSES_SENAT_DB_NAME"] || "postgres",
17
- password: process.env["TRICOTEUSES_SENAT_DB_PASSWORD"] || "opendata",
18
- port: process.env["TRICOTEUSES_SENAT_DB_PORT"] || 5432,
19
- user: process.env["TRICOTEUSES_SENAT_DB_USER"] || "opendata",
16
+ host: process.env["DB_HOST"] || "localhost",
17
+ name: process.env["DB_NAME"] || "senat",
18
+ password: process.env["DB_PASSWORD"] || "opendata",
19
+ port: process.env["DB_PORT"] || 5432,
20
+ user: process.env["DB_USER"] || "opendata",
21
+ },
22
+ stagingDb: {
23
+ host: process.env["STAGING_DB_HOST"] || process.env["DB_HOST"] || "localhost",
24
+ name: process.env["STAGING_DB_NAME"] || "senat_staging",
25
+ password: process.env["STAGING_DB_PASSWORD"] || process.env["DB_PASSWORD"] || "opendata",
26
+ port: process.env["STAGING_DB_PORT"] || process.env["DB_PORT"] || 5432,
27
+ user: process.env["STAGING_DB_USER"] || process.env["DB_USER"] || "opendata",
20
28
  },
21
29
  };
22
30
  const result = configSchema.safeParse(config);
23
31
  if (!result.success) {
24
- console.error(`Error in configuration:\n${JSON.stringify(config, null, 2)}\nError:\n${JSON.stringify(result.error.issues, null, 2)}`);
32
+ const issues = JSON.stringify(result.error.issues, null, 2);
33
+ const serializedConfig = JSON.stringify(config, null, 2);
34
+ console.error(`Error in configuration:\n${serializedConfig}\nError:\n${issues}`);
25
35
  process.exit(-1);
26
36
  }
27
37
  export default result.data;
@@ -186,7 +186,11 @@ p.has-alinea {
186
186
  <div class="header-type">${metadata.type || ""}</div>
187
187
  <div class="header-authors">${metadata.authors || ""}</div>
188
188
  ${metadata.commission
189
- ? `<div class="header-commission">Envoyée à la ${metadata.commission.toLowerCase()}, sous réserve de la constitution éventuelle d'une commission spéciale dans les conditions prévues par le Règlement.</div>`
189
+ ? [
190
+ `<div class="header-commission">Envoyée à la ${metadata.commission.toLowerCase()},`,
191
+ "sous réserve de la constitution éventuelle d'une commission spéciale dans les conditions prévues",
192
+ "par le Règlement.</div>",
193
+ ].join(" ")
190
194
  : ""}
191
195
  </div>
192
196
  <h1>${metadata.title || ""}</h1>
@@ -1,2 +1,3 @@
1
1
  import { Kysely } from "kysely";
2
- export declare const dbSenat: Kysely<any>;
2
+ import type { LooseKyselyDatabase } from "./typings/kysely-loose";
3
+ export declare const dbSenat: Kysely<LooseKyselyDatabase>;
@@ -0,0 +1,4 @@
1
+ import postgres from "postgres";
2
+ export type SqlValue = postgres.ParameterOrJSON<never>;
3
+ export declare const sql: postgres.Sql<{}>;
4
+ export declare function streamUnsafeQuery<T>(query: string, params?: readonly unknown[], batchSize?: number): AsyncGenerator<T, void, unknown>;
@@ -0,0 +1,23 @@
1
+ import postgres from "postgres";
2
+ import config from "./config";
3
+ export const sql = postgres({
4
+ database: config.db.name,
5
+ host: config.db.host,
6
+ password: config.db.password,
7
+ port: config.db.port,
8
+ transform: {
9
+ undefined: null,
10
+ },
11
+ user: config.db.user,
12
+ });
13
+ function toSqlValue(value) {
14
+ return value;
15
+ }
16
+ export async function* streamUnsafeQuery(query, params = [], batchSize = 100) {
17
+ const values = params.map(toSqlValue);
18
+ for await (const rows of sql.unsafe(query, values).cursor(batchSize)) {
19
+ for (const row of rows) {
20
+ yield row;
21
+ }
22
+ }
23
+ }
@@ -10,6 +10,10 @@ export interface Dataset {
10
10
  columns: string[];
11
11
  }>;
12
12
  };
13
+ mergeKeys?: {
14
+ [table: string]: string[];
15
+ };
16
+ rowMultisetMergeTables?: string[];
13
17
  }
14
18
  export interface Datasets {
15
19
  ameli: Dataset;
@@ -167,6 +167,12 @@ export const datasets = {
167
167
  { name: "idx_senmat", columns: ["senmat"] },
168
168
  ],
169
169
  },
170
+ mergeKeys: {
171
+ corscr: ["sesann", "scrnum", "corscrord"],
172
+ docsea: ["evtseacle", "docseaord"],
173
+ gen: ["gencod"],
174
+ },
175
+ rowMultisetMergeTables: ["amescr"],
170
176
  },
171
177
  questions: {
172
178
  database: "questions",
@@ -183,6 +189,7 @@ export const datasets = {
183
189
  sortquestion: [{ name: "idx_sorquecod", columns: ["sorquecod"] }],
184
190
  etatquestion: [{ name: "idx_etaquecod", columns: ["etaquecod"] }],
185
191
  },
192
+ rowMultisetMergeTables: ["tam_reponses"],
186
193
  },
187
194
  sens: {
188
195
  database: "sens",
@@ -213,12 +220,19 @@ export const datasets = {
213
220
  { name: "idx_typmancod", columns: ["typmancod"] },
214
221
  ],
215
222
  },
223
+ mergeKeys: {
224
+ activite: ["actid"],
225
+ },
216
226
  },
217
227
  };
228
+ function getEnabledDatasetByName(datasetName) {
229
+ const enabledDataset = EnabledDatasets[datasetName];
230
+ return typeof enabledDataset === "number" ? enabledDataset : undefined;
231
+ }
218
232
  export function getEnabledDatasets(categories) {
219
- categories.map((datasetName) => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
233
+ categories.map((datasetName) => assert.notStrictEqual(getEnabledDatasetByName(datasetName), undefined, `Unknown name of dataset: ${datasetName}`));
220
234
  return categories.reduce((enabledDatasets, datasetName) => {
221
- const enabledDataset = EnabledDatasets[datasetName];
235
+ const enabledDataset = getEnabledDatasetByName(datasetName);
222
236
  return enabledDatasets | (enabledDataset || EnabledDatasets.None);
223
237
  }, EnabledDatasets.None);
224
238
  }
package/lib/src/git.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare function initRepo(repositoryDir: string): void;
2
2
  export declare function commit(repositoryDir: string, message: string): boolean;
3
3
  export declare function commitAndPush(repositoryDir: string, message: string, remotes?: string[]): number;
4
+ export declare function pull(repositoryDir: string, remote?: string, branch?: string): boolean;
4
5
  export declare function resetAndPull(gitDir: string): boolean;
5
6
  export declare function clone(gitGroupUrl: string | undefined, gitName: string, workingDir: string): void;
6
7
  export declare function run(repositoryDir: string, args: string, verbose?: boolean): string;
package/lib/src/git.js CHANGED
@@ -5,6 +5,15 @@ const MAXBUFFER = 50 * 1024 * 1024;
5
5
  const GIT_LOCK_RETRY_DELAY_MS = 1000;
6
6
  const GIT_LOCK_RETRY_COUNT = 5;
7
7
  const GIT_LOCK_STALE_AFTER_MS = 2 * 60 * 1000;
8
+ function asExecSyncError(error) {
9
+ return error;
10
+ }
11
+ function outputToString(output) {
12
+ if (output == null) {
13
+ return "";
14
+ }
15
+ return Buffer.isBuffer(output) ? output.toString("utf-8") : output;
16
+ }
8
17
  function sleep(ms) {
9
18
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
10
19
  }
@@ -12,7 +21,7 @@ function getIndexLockPath(repositoryDir) {
12
21
  return path.join(repositoryDir, ".git", "index.lock");
13
22
  }
14
23
  function isIndexLockError(error) {
15
- const stderr = String(error?.stderr || "");
24
+ const stderr = error instanceof Error ? outputToString(asExecSyncError(error).stderr) : "";
16
25
  return /index\.lock': File exists\./.test(stderr);
17
26
  }
18
27
  function removeStaleIndexLock(repositoryDir) {
@@ -81,9 +90,9 @@ export function commit(repositoryDir, message) {
81
90
  });
82
91
  return true;
83
92
  }
84
- catch (childProcess) {
85
- if (childProcess.stdout === null ||
86
- !/nothing to commit|rien à valider/.test(childProcess.stdout)) {
93
+ catch (error) {
94
+ const childProcess = asExecSyncError(error);
95
+ if (childProcess.stdout === null || !/nothing to commit|rien à valider/.test(outputToString(childProcess.stdout))) {
87
96
  console.error(childProcess.output);
88
97
  throw childProcess;
89
98
  }
@@ -102,10 +111,11 @@ export function commitAndPush(repositoryDir, message, remotes) {
102
111
  stdio: ["ignore", "ignore", "pipe"],
103
112
  });
104
113
  }
105
- catch (childProcess) {
114
+ catch (error) {
115
+ const childProcess = asExecSyncError(error);
106
116
  // Don't stop when push fails.
107
117
  console.error(childProcess.output);
108
- exitCode = childProcess.status;
118
+ exitCode = childProcess.status ?? 1;
109
119
  }
110
120
  }
111
121
  }
@@ -115,6 +125,27 @@ export function commitAndPush(repositoryDir, message, remotes) {
115
125
  }
116
126
  return exitCode;
117
127
  }
128
+ export function pull(repositoryDir, remote = "origin", branch = "master") {
129
+ initRepo(repositoryDir);
130
+ const statusOutput = execSync("git status --porcelain", {
131
+ cwd: repositoryDir,
132
+ env: process.env,
133
+ encoding: "utf-8",
134
+ stdio: ["ignore", "pipe", "pipe"],
135
+ maxBuffer: MAXBUFFER,
136
+ }).trim();
137
+ if (statusOutput.length > 0) {
138
+ return false;
139
+ }
140
+ execSync(`git pull --rebase ${remote} ${branch}`, {
141
+ cwd: repositoryDir,
142
+ env: process.env,
143
+ encoding: "utf-8",
144
+ stdio: ["ignore", "ignore", "pipe"],
145
+ maxBuffer: MAXBUFFER,
146
+ });
147
+ return true;
148
+ }
118
149
  export function resetAndPull(gitDir) {
119
150
  execSync("git reset --hard origin/master", {
120
151
  cwd: gitDir,
@@ -154,9 +185,11 @@ export function run(repositoryDir, args, verbose) {
154
185
  console.log(output);
155
186
  return output;
156
187
  }
157
- catch (childProcess) {
158
- for (const output of ["stdout", "stderr"])
159
- console.error(`${output}: ${childProcess[output]}`);
188
+ catch (error) {
189
+ const childProcess = asExecSyncError(error);
190
+ for (const output of ["stdout", "stderr"]) {
191
+ console.error(`${output}: ${outputToString(childProcess[output])}`);
192
+ }
160
193
  throw childProcess;
161
194
  }
162
195
  }
@@ -175,8 +208,9 @@ export function test(repositoryDir, args, verbose) {
175
208
  console.log(output);
176
209
  return true;
177
210
  }
178
- catch (childProcess) {
179
- if (childProcess.status != 0)
211
+ catch (error) {
212
+ const childProcess = asExecSyncError(error);
213
+ if (childProcess.status !== 0)
180
214
  return false;
181
215
  throw childProcess;
182
216
  }