@tricoteuses/senat 2.22.15 → 2.23.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 (328) 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/loaders.js +10 -4
  193. package/lib/src/model/agenda.js +2 -2
  194. package/lib/src/model/ameli.d.ts +64 -52
  195. package/lib/src/model/ameli.js +147 -145
  196. package/lib/src/model/ameli_postgres.d.ts +67 -0
  197. package/lib/src/model/ameli_postgres.js +150 -0
  198. package/lib/src/model/commission.d.ts +3 -2
  199. package/lib/src/model/commission.js +2 -2
  200. package/lib/src/model/debats.d.ts +38 -66
  201. package/lib/src/model/debats.js +110 -93
  202. package/lib/src/model/documents.d.ts +32 -12
  203. package/lib/src/model/documents.js +171 -130
  204. package/lib/src/model/dosleg.d.ts +142 -5
  205. package/lib/src/model/dosleg.js +298 -156
  206. package/lib/src/model/questions.d.ts +54 -45
  207. package/lib/src/model/questions.js +89 -87
  208. package/lib/src/model/scrutins.d.ts +48 -13
  209. package/lib/src/model/scrutins.js +118 -111
  210. package/lib/src/model/seance.js +3 -3
  211. package/lib/src/model/sens.d.ts +109 -179
  212. package/lib/src/model/sens.js +384 -484
  213. package/lib/src/model/util.d.ts +0 -8
  214. package/lib/src/model/util.js +0 -23
  215. package/lib/src/parsers/texte.js +7 -7
  216. package/lib/src/raw_types_schemats/ameli.d.ts +4 -2
  217. package/lib/src/raw_types_schemats/debats.d.ts +2 -2
  218. package/lib/src/raw_types_schemats/dosleg.d.ts +2 -2
  219. package/lib/src/raw_types_schemats/questions.d.ts +2 -2
  220. package/lib/src/raw_types_schemats/sens.d.ts +10 -4216
  221. package/lib/src/scripts/convert_data.js +7 -6
  222. package/lib/src/scripts/convert_xml_to_html.js +2 -2
  223. package/lib/src/scripts/data-download.js +3 -2
  224. package/lib/src/scripts/retrieve_agenda.js +21 -9
  225. package/lib/src/scripts/retrieve_cr_commission.js +17 -17
  226. package/lib/src/scripts/retrieve_cr_seance.d.ts +14 -1
  227. package/lib/src/scripts/retrieve_cr_seance.js +10 -11
  228. package/lib/src/scripts/retrieve_documents.d.ts +11 -2
  229. package/lib/src/scripts/retrieve_documents.js +25 -14
  230. package/lib/src/scripts/retrieve_open_data.js +400 -145
  231. package/lib/src/scripts/retrieve_senateurs_photos.js +25 -11
  232. package/lib/src/scripts/retrieve_videos.js +12 -11
  233. package/lib/src/scripts/shared/cli_helpers.d.ts +1 -6
  234. package/lib/src/scripts/shared/cli_helpers.js +9 -8
  235. package/lib/src/scripts/shared/incremental_import_sql.d.ts +2 -0
  236. package/lib/src/scripts/shared/incremental_import_sql.js +894 -0
  237. package/lib/src/scripts/shared/prefixed_tables.d.ts +7 -0
  238. package/lib/src/scripts/shared/prefixed_tables.js +30 -0
  239. package/lib/src/scripts/shared/schema_version.d.ts +3 -0
  240. package/lib/src/scripts/shared/schema_version.js +97 -0
  241. package/lib/src/scripts/shared/staging_import.d.ts +3 -0
  242. package/lib/src/scripts/shared/staging_import.js +80 -0
  243. package/lib/src/scripts/shared/staging_metadata_sql.d.ts +1 -0
  244. package/lib/src/scripts/shared/staging_metadata_sql.js +221 -0
  245. package/lib/src/scripts/validate_prefixed_tables.d.ts +1 -0
  246. package/lib/src/scripts/validate_prefixed_tables.js +102 -0
  247. package/lib/src/types/texte.d.ts +1 -1
  248. package/lib/src/utils/cr_spliting.d.ts +9 -6
  249. package/lib/src/utils/cr_spliting.js +6 -101
  250. package/lib/src/utils/reunion_odj_building.d.ts +7 -3
  251. package/lib/src/utils/reunion_parsing.d.ts +2 -1
  252. package/lib/src/utils/reunion_parsing.js +2 -2
  253. package/lib/src/videos/match.js +8 -5
  254. package/lib/src/videos/pipeline.d.ts +6 -2
  255. package/lib/src/videos/pipeline.js +21 -8
  256. package/lib/src/videos/search.js +6 -2
  257. package/lib/strings.d.ts +1 -0
  258. package/lib/strings.js +18 -0
  259. package/lib/strings.mjs +18 -0
  260. package/lib/strings.ts +26 -0
  261. package/lib/tests/incrementalImportSql.test.d.ts +1 -0
  262. package/lib/tests/incrementalImportSql.test.js +155 -0
  263. package/lib/tests/prefixedTables.test.d.ts +1 -0
  264. package/lib/tests/prefixedTables.test.js +29 -0
  265. package/lib/tests/schemaVersion.test.d.ts +1 -0
  266. package/lib/tests/schemaVersion.test.js +23 -0
  267. package/lib/tests/validatePrefixedTables.test.d.ts +1 -0
  268. package/lib/tests/validatePrefixedTables.test.js +14 -0
  269. package/lib/types/agenda.d.ts +44 -0
  270. package/lib/types/agenda.js +1 -0
  271. package/lib/types/ameli.d.ts +5 -0
  272. package/lib/types/ameli.js +1 -0
  273. package/lib/types/ameli.mjs +13 -0
  274. package/lib/types/ameli.ts +21 -0
  275. package/lib/types/compte_rendu.d.ts +83 -0
  276. package/lib/types/compte_rendu.js +1 -0
  277. package/lib/types/debats.d.ts +2 -0
  278. package/lib/types/debats.js +1 -0
  279. package/lib/types/debats.mjs +2 -0
  280. package/lib/types/debats.ts +6 -0
  281. package/lib/types/dosleg.d.ts +70 -0
  282. package/lib/types/dosleg.js +1 -0
  283. package/lib/types/dosleg.mjs +151 -0
  284. package/lib/types/dosleg.ts +284 -0
  285. package/lib/types/questions.d.ts +2 -0
  286. package/lib/types/questions.js +1 -0
  287. package/lib/types/questions.mjs +1 -0
  288. package/lib/types/questions.ts +3 -0
  289. package/lib/types/sens.d.ts +10 -0
  290. package/lib/types/sens.js +1 -0
  291. package/lib/types/sens.mjs +1 -0
  292. package/lib/types/sens.ts +12 -0
  293. package/lib/types/sessions.d.ts +5 -0
  294. package/lib/types/sessions.js +84 -0
  295. package/lib/types/sessions.mjs +43 -0
  296. package/lib/types/sessions.ts +42 -0
  297. package/lib/types/texte.d.ts +74 -0
  298. package/lib/types/texte.js +16 -0
  299. package/lib/types/texte.mjs +16 -0
  300. package/lib/types/texte.ts +76 -0
  301. package/lib/typings/windows-1252.d.js +2 -0
  302. package/lib/typings/windows-1252.d.mjs +2 -0
  303. package/lib/typings/windows-1252.d.ts +11 -0
  304. package/lib/utils/cr_spliting.d.ts +28 -0
  305. package/lib/utils/cr_spliting.js +265 -0
  306. package/lib/utils/date.d.ts +10 -0
  307. package/lib/utils/date.js +100 -0
  308. package/lib/utils/nvs-timecode.d.ts +7 -0
  309. package/lib/utils/nvs-timecode.js +79 -0
  310. package/lib/utils/reunion_grouping.d.ts +9 -0
  311. package/lib/utils/reunion_grouping.js +361 -0
  312. package/lib/utils/reunion_odj_building.d.ts +5 -0
  313. package/lib/utils/reunion_odj_building.js +154 -0
  314. package/lib/utils/reunion_parsing.d.ts +23 -0
  315. package/lib/utils/reunion_parsing.js +209 -0
  316. package/lib/utils/scoring.d.ts +14 -0
  317. package/lib/utils/scoring.js +147 -0
  318. package/lib/utils/string_cleaning.d.ts +7 -0
  319. package/lib/utils/string_cleaning.js +57 -0
  320. package/lib/validators/config.d.ts +9 -0
  321. package/lib/validators/config.js +10 -0
  322. package/lib/validators/config.mjs +54 -0
  323. package/lib/validators/config.ts +79 -0
  324. package/lib/validators/senat.d.ts +0 -0
  325. package/lib/validators/senat.js +28 -0
  326. package/lib/validators/senat.mjs +24 -0
  327. package/lib/validators/senat.ts +26 -0
  328. package/package.json +6 -10
@@ -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
  }
@@ -69,7 +69,8 @@ function* iterLoadSenatItems(dataDir, dataName, legislatureOrSession, subDir, {
69
69
  const itemJson = fs.readFileSync(filePath, { encoding: "utf8" });
70
70
  item = JSON.parse(itemJson);
71
71
  }
72
- catch (err) {
72
+ catch (error) {
73
+ const err = error;
73
74
  console.warn(`[iterLoadSenatItems] skipped invalid JSON: ${filePath} (${err.message})`);
74
75
  continue;
75
76
  }
@@ -180,6 +181,9 @@ export function* iterLoadSenatTextes(dataDir, session, options = {}) {
180
181
  const texteItem = iterItem;
181
182
  const texte = texteItem.item;
182
183
  const texteId = texte["id"];
184
+ if (!texteId) {
185
+ continue;
186
+ }
183
187
  const { item: texteContent } = loadSenatTexteContent(dataDir, texte["session"], texteId);
184
188
  if (texteContent) {
185
189
  texteItem.item = { ...texteContent, ...texteItem.item };
@@ -222,9 +226,11 @@ export function* iterLoadSenatAgendas(dataDir, session) {
222
226
  const gr = raw;
223
227
  if (!gr.uid || !gr.date || !gr.titre)
224
228
  continue;
225
- if (!Array.isArray(gr.events))
226
- gr.events = [];
227
- yield { item: gr };
229
+ const reunion = {
230
+ ...gr,
231
+ events: Array.isArray(gr.events) ? gr.events : [],
232
+ };
233
+ yield { item: reunion };
228
234
  }
229
235
  }
230
236
  export function* iterLoadSenatCirconscriptions(dataDir, options = {}) {
@@ -113,7 +113,7 @@ function transformAgenda(document, fileName) {
113
113
  const { startTime, endTime } = getStartAndEndTimes(timeOriginal, date);
114
114
  const titre = eventElement.querySelector(".titre")?.textContent?.trim() || "";
115
115
  const organe = eventElement.querySelector(".organe")?.textContent?.trim() || null;
116
- const objet = eventElement.querySelector(".objet")?.textContent?.trim()?.replace(/^- /, "") || null;
116
+ const objet = eventElement.querySelector(".objet")?.textContent?.trim()?.replace(/^- /, "") || null;
117
117
  const lieu = eventElement.querySelector(".lieu")?.textContent || null;
118
118
  const videoElement = eventElement.querySelector(".video");
119
119
  const urlDossierSenat = getUrlDossierSenat(eventElement.querySelectorAll(".lien a"));
@@ -142,7 +142,7 @@ export async function parseAgendaFromFile(htmlFilePath) {
142
142
  return transformAgenda(document, fileName);
143
143
  }
144
144
  catch (error) {
145
- console.error(`Could not parse texte with error ${error}`);
145
+ console.error(`Could not parse texte with error ${error.message}`);
146
146
  }
147
147
  return null;
148
148
  }