Skip to content
Snippets Groups Projects
Commit 49eb1937 authored by Emmanuel Raviart's avatar Emmanuel Raviart
Browse files

Add script to extract references from all amendments made in "Commission des affaires sociales".

parent 79776df4
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@
Diverses études des amendements et projets de lois de l'Assemblée, pour le projet [LexImpact](https://leximpact.an.fr/)
Les données extraites par ces scripts sont généralements mises dans le [dépôt Git des données extraites de l'Assemblée](https://github.com/leximpact/donnees-extraites-assemblee).
Les données extraites par ces scripts sont généralement mises dans le [dépôt Git des données extraites de l'Assemblée](https://github.com/leximpact/donnees-extraites-assemblee).
## Utilisation
......@@ -14,8 +14,16 @@ npx babel-node --extensions ".ts" --max-old-space-size=4096 src/scripts/extraire
### Extraction des références aux articles de lois faites par les amendements sous forme de fichier CSV
Note : Ce script utilise la bibliothèque [metslesliens](https://www.npmjs.com/package/metslesliens) pour extraire des amendements les références qu'ils font aux articles de lois (et à leurs alinéas).
Note : Ces script utilisent la bibliothèque [metslesliens](https://www.npmjs.com/package/metslesliens) pour extraire des amendements les références qu'ils font aux articles de lois (et à leurs alinéas).
#### Pour les amendements des PLFSS 2020 et 2021 :
```bash
npx babel-node --extensions ".ts" --max-old-space-size=4096 src/scripts/extraire_references_amendements_plfss_2020-2021.ts ../../tricoteuses/assemblee-data/ > ../donnees-extraites-assemblee/references_amendements_plfss_2020-2021.csv
```
#### Pour les amendements de tous les textes passés en Commission des affaires sociales :
```bash
npx babel-node --extensions ".ts" --max-old-space-size=4096 src/scripts/extraire_references_amendements_affaires_sociales.ts ../../tricoteuses/assemblee-data/ > ../donnees-extraites-assemblee/references_amendements_affaires_sociales.csv
```
\ No newline at end of file
import { Legislature } from "@tricoteuses/assemblee"
import {
EnabledDatasets,
loadAssembleeData,
} from "@tricoteuses/assemblee/lib/loaders"
import assert from "assert"
import commandLineArgs from "command-line-args"
import metslesliens, {
Reference,
ReferenceAtomic,
ReferenceType,
} from "metslesliens"
import { parse } from "node-html-parser"
import Papa from "papaparse"
const optionsDefinitions = [
{
defaultOption: true,
help: "directory containing Assemblée open data files",
name: "dataDir",
type: String,
},
]
const options = commandLineArgs(optionsDefinitions)
function indexedName(name: string, index: number) {
return index === 0 ? name : name + index.toString()
}
function* iterFlattenedReferences(
reference: Reference,
flattenedReferences: Array<ReferenceAtomic> = [],
): Generator<Array<ReferenceAtomic>, void, void> {
switch (reference.type) {
case ReferenceType.BoundedIntervalReference:
yield* iterFlattenedReferences(reference.first, flattenedReferences)
yield* iterFlattenedReferences(reference.last, flattenedReferences)
break
case ReferenceType.CountedIntervalReference:
yield* iterFlattenedReferences(reference.first, flattenedReferences)
break
case ReferenceType.EnumerationReference:
yield* iterFlattenedReferences(reference.left, flattenedReferences)
yield* iterFlattenedReferences(reference.right, flattenedReferences)
break
default:
if (reference.child == null) {
yield [...flattenedReferences, reference]
} else {
yield* iterFlattenedReferences(reference.child, [
...flattenedReferences,
reference,
])
}
}
}
async function main() {
const { documentByUid } = loadAssembleeData(
options.dataDir,
EnabledDatasets.DossiersLegislatifs,
Legislature.Quinze,
)
const { amendementByUid } = loadAssembleeData(
options.dataDir,
EnabledDatasets.Amendements,
Legislature.Quinze,
)
const rows = []
const columns = new Set<string>(["text"])
for (const amendement of Object.values(amendementByUid)) {
const { corps, cycleDeVie, texteLegislatifRef, uid } = amendement
const document = documentByUid[texteLegislatifRef]
if (document === undefined) {
continue
}
let textePresenteEnCommissionAffaireSociales = false
for (const { organeRef } of document.depotAmendements
?.amendementsCommission ?? []) {
if (organeRef === "PO420120") {
// Commission des affaires sociales
textePresenteEnCommissionAffaireSociales = true
break
}
}
if (!textePresenteEnCommissionAffaireSociales) {
continue
}
if (cycleDeVie.etatDesTraitements.etat.libelle !== "Discuté") {
continue
}
const { contenuAuteur } = corps
if (contenuAuteur === undefined) {
continue
}
if (contenuAuteur.dispositif === undefined) {
continue
}
const dispositif = parse(contenuAuteur.dispositif).text
const links = metslesliens.getLinks(dispositif)
for (const link of links) {
for (const flattenedReferences of iterFlattenedReferences(link.tree)) {
const countByType = new Map<ReferenceType, number>()
const row: { [name: string]: Reference | string } = {
texteLegislatifUid: texteLegislatifRef,
uid,
text: link.text,
}
for (const reference of flattenedReferences) {
assert(reference.type.endsWith("-reference"))
const index = countByType.get(reference.type) ?? 0
const name = indexedName(
reference.type.substring(
0,
reference.type.length - "-reference".length,
),
index,
)
const valueFragments: Array<string> = []
if (reference.id != null) {
valueFragments.push(reference.id.toString())
}
const indirect = reference.indirect
if (indirect != null) {
valueFragments.push(
`indirect: ${
typeof indirect === "number"
? indirect
: `(relative: ${indirect.relative})`
}`,
)
}
switch (reference.type) {
case ReferenceType.LawReference:
if (reference.lawDate != null) {
valueFragments.push(`du ${reference.lawDate}`)
}
break
}
const order = reference.order
if (order != null) {
valueFragments.push(`order: ${order}`)
}
columns.add(name)
row[name] = valueFragments.join(" ")
switch (reference.type) {
case ReferenceType.LawReference: {
const lawTypeName = indexedName("lawType", index)
columns.add(lawTypeName)
row[lawTypeName] = reference.lawType
break
}
}
const count = index + 1
countByType.set(reference.type, count)
}
rows.push(row)
}
}
}
const csv = Papa.unparse(rows, { columns: [...columns].sort() })
console.log(csv)
}
main()
.then(() => {
process.exit(0)
})
.catch((error) => {
console.error(error)
process.exit(1)
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment