TODO: petite présentation du projet.
Nous utilisons l'API des tricoteuses pour récupérer les données. Voici le lien vers la documentation.
L'Assemblée nationale travaille à partir de dossiers législatifs. Un dossier législatif permet de suivre l'évolution d'un texte législatif : en commission, au Sénat, amendements... Deux types de textes législatifs nous intéressent : proposition de loi proposée par un député, projet de loi proposé par le gouvernement.
Voici les différents endpoint:
- dossiers =>
https://parlement.tricoteuses.fr/dossiers - texte de loi =>
https://parlement.tricoteuses.fr/documents - amendements =>
https://parlement.tricoteuses.fr/amendements - députés =>
https://parlement.tricoteuses.fr/acteurs - votes =>
https://parlement.tricoteuses.fr/scrutins
L'API propose de nombreux endpoints.
Information sur le chemin d'une loi Les documents parlementaires
Documentation technique de l'API des tricoteuses
uv syncIl y a deux façons d'exécuter des commandes:
- uv run main.py [-h] [-d] [-r] [-e] [-a]
- just
Just permet de facilement exécuter des commandes. Si vous ne voulez pas l'installer, vous pouvez toujours utiliser uv run main.py
La commande suivante va télécharger sur l'API des tricoteuses et créer des fichiers JSON dans le répertoire ./data/. Pour rajouter un endpoint, il suffit de modifier la variable APIS dans ./etl/download.py
uv run main.py -d
# ou
just downloaduv run main.py -r
# ou
just db-rebuilduv run main.py -e
# ou
just etluv run main.py -a
# ou
just allAprès avoir exécuté just download, les données de l'API des tricoteuses sont sauvegardées dans le dossier ./data/ sous la forme de fichiers JSON.
L'ETL permet d'extraire des données de ces fichiers pour les sauvegarder dans la base de données. La base de données est représentée à l'aide de
modèles créés via SqlAlchemy.
Pour charger un fichier en db, il faut rajouter un modèle qui porte le même nom que le fichier sans l'extension. Pour rajouter un champ du json dans la table, il faut rajouter une colonne dans le modèle du même type que le json et du même nom.
L'ETL est capable d'inférer à partir des modèles les fichiers à ouvrir et les champs à charger.
Voici une partie du fichier ./data/dossiers.json
{
"uid": "DLR5L17N54464",
"dataset": 17,
"chambre": "AN",
"numero": "4464",
...
}Je veux rajouter le champ chambre dans la DB et faire en sorte que l'ETL l'ajoute de lui-même.
- Rajouter le champ dans le modèle
class User(Base):
__tablename__ = "dossiers"
uid: Mapped[str] = mapped_column(primary_key=True)
titre: Mapped[str] = mapped_column(String(500))
dataset: Mapped[int]
chambre: Mapped[str] = mapped_column(String(5)) # <-------- nouvelle colonne qui porte le même nom que le champ du fichier json
Le champ doit porter le même nom sinon l'ETL ne sera pas capable de le trouver.
- Exécuter
just all