Skip to main content

legi.py est un module python qui peut :

  • créer une base de données SQLite à partir des archives de la base LEGI
  • mettre à jour automatiquement et incrémentalement cette BDD
  • normaliser les titres des textes
  • connecter les différentes versions d'un texte entre elles
  • analyser les données pour détecter les anomalies

Avoir les lois françaises dans une base SQL permet aussi d'autres choses qui ne sont pas encore implémentées directement dans legi.py, par exemple générer des statistiques sur l'activité législative, trouver le texte le plus ancien encore en vigueur, etc.

Build Status

Installation

legi.py a besoin de libarchive et hunspell. L'installation de ces dépendances varie selon le système d'exploitation :

  • Arch Linux : pacman -S --needed libarchive hunspell hunspell-fr
  • Mac OS X : la version de libarchive inclue dans Mac OS X est obsolète, vous pouvez utiliser Homebrew pour installer une version récente en exécutant brew install libarchive, puis indiquer au module Python qu'il doit utiliser cette version en ajoutant une variable d'environnement : export LIBARCHIVE="$(find "$(brew --cellar libarchive)" -name libarchive.13.dylib | sort | tail -1)" (cette commande peut être ajoutée au fichier d'initialisation de votre shell, typiquement ~/.bashrc ou ~/.zshrc)
  • Ubuntu : sudo apt-get install libarchive13 hunspell hunspell-fr libhunspell-dev

Une fois ces dépendances système installées, vous pouvez cloner le dépôt et utiliser pip pour installer les modules python nécessaires :

git clone https://github.com/Legilibre/legi.py.git
cd legi.py
python -m venv env
env/bin/pip install -r requirements.txt

legi.py et les modules dont il dépend sont compatibles avec python ≥ 3.9.

legi.py peut être utilisé comme dépendance d'un autre projet, il est disponible sous forme de paquet dans PyPI.

Création et maintenance de la BDD

La première étape est de télécharger les archives LEGI depuis le serveur officiel :

env/bin/python -m legi.download ./tarballs

La deuxième étape est la conversion des archives en un fichier SQLite :

ionice -c 3 env/bin/python -u -m legi.tar2sqlite legi.sqlite ./tarballs [--raw]

Cette opération peut prendre de quelques minutes à de nombreuses heures. Cela dépend de la puissance de la machine sur laquelle tourne le programme, du nombre d'archives à traiter, et des options choisies. La vitesse de l'opération est principalement contrainte par les vitesses d'écriture du fichier SQLite et de traitement du processeur. La vitesse de lecture du fichier SQLite peut aussi être une contrainte si la quantité de mémoire vive disponible n'est pas suffisante pour éliminer le besoin de relire les données écrites précédemment. Le nombre de cœurs du processeur importe peu car le travail n'est pas parallèle.

La taille du fichier SQLite créé est environ 5 Go (en 2026).

L'option --raw désactive le nettoyage des données, ajoutez-la si vous avez besoin des données LEGI brutes.

tar2sqlite permet aussi de maintenir votre base de données à jour, il saute automatiquement les archives qu'il a déjà traité. En général la DILA publie une nouvelle archive à la fin de chaque jour ouvré, vous pouvez donc programmer votre machine pour mettre à jour la BDD du mardi au samedi pendant la nuit, par exemple avec cron :

~ 1~3 * * 2-6 ID=legi chronic ionice -c 3 ~/chemin/vers/legi.py/cron/cron.sh

(chronic fait partie des moreutils.)

Fonctionnalités

Normalisation des titres et numéros

Le module normalize nettoie les titres et numéros des textes, des sections et des articles afin qu'ils soient plus « standards ».

Factorisation des textes

La "factorisation" connecte entre elles les différentes version d'un même texte. La base LEGI n'a pas d'identifiant qui remplisse réellement ce rôle.

Nettoyage des contenus

Le module html permet de nettoyer les contenus des textes. Il supprime :

  • les espaces redondantes (whitespace collapse), sauf à l'intérieur des <pre>
  • les attributs inutiles, par exemple id et dir="ltr"
  • les éléments inutiles, par exemple un <span> sans attributs
  • les éléments vides, sauf <td> et <th>

En janvier 2020 il détecte 93 millions de caractères inutiles dans LEGI.

Le nettoyage HTML est activé par défaut sauf quand l'option --raw est passée à tar2sqlite.

La commande python -m legi.html clean legi.sqlite nettoie tout l'HTML dans la base de données. Les modifications ne sont enregistrées que si vous entrez y à la fin. Pour faciliter le développement et les tests, l'option --dry-run permet de ne pas modifier le fichier SQLite du tout.

Détection d'anomalies

Le module anomalies est conçu pour détecter les incohérences dans les données afin de les signaler à la DILA. Le résultat est visible sur anomalies.legilibre.fr. (cron/anomalies-cron.sh est le script qui génère ce mini-site.)

Pour détecter les anomalies actuellement présentes dans la base :

env/bin/python -m legi.anomalies legi.sqlite

Contribuer

Les Pull Requests sont bienvenues, n'hésitez pas à ouvrir une discussion avant de commencer le travail, ça permet une meilleure coopération et coordination. Vous pouvez aussi vous présenter dans le salon.

Tests

legi.py utilise Tox pour tester le code sur plusieurs versions de Python. Installez-le si nécessaire puis lancez la commande tox dans le dossier qui contient votre copie du dépôt legi.py.

Licence

CC0 Public Domain Dedication

Historique du projet

Fin juin 2014 la base de données LEGI contenant les lois françaises a été libérée en Open Data. J'ai immédiatement commencé le travail pour la convertir dans d'autres formats. Malheureusement, distrait par d'autres choses à faire et un peu découragé par la structure médiocre des données j'ai fini par laisser le projet de côté.

En 2015 j'ai réouvert, nettoyé et publié mon code. J'ai ensuite été très occupé à créer Liberapay.

Fin 2016 j'ai à nouveau travaillé sur legi.py. Le projet progressa fortement, anomalies.legilibre.fr fut créé.

En février 2017 la version 0.1 est publiée.

Release files for legi 0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for legi 0.6
File Size Uploaded
legi-0.6.tar.gz 60.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for legi 0.6
File Interpreter ABI Platform
legi-0.6-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 116.6 kB

Release files / legi-0.6.tar.gz

Download URL legi-0.6.tar.gz
Size 60.3 kB
Tags Source
SHA-256 checksum
How to use checksums
b73dc57e4ee9f553d39362cf3e3a3e137dd4dae39ef4ea2fcb655ade3f6f0980
BLAKE2b-256 checksum
How to use checksums
32ba575d31ee3e267728c67df43afafdfa954411cb4961ccd14f828d128969c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / legi-0.6-py2.py3-none-any.whl

Download URL legi-0.6-py2.py3-none-any.whl
Size 56.3 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
889b0ac5dd3df8b446f8e9425243b70fc1e0f4a35212c209b5be7885f972a580
BLAKE2b-256 checksum
How to use checksums
44f3f3868953f971c0052447d00f0b6b4527c7596eb029738c73856efcf75fd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

This release

0.6 This release

2 release files

0.5

2 release files

0.4

1 release file

0.3.1

2 release files

0.3

2 release files

0.2

2 release files

0.1

2 release files

0.0

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page