diff --git a/requirement/erplibre_require-ments.txt b/requirement/erplibre_require-ments.txt index 742caf8..dd21a07 100644 --- a/requirement/erplibre_require-ments.txt +++ b/requirement/erplibre_require-ments.txt @@ -37,6 +37,11 @@ rich # Il n'arrivait que par pykeepass / openupgradelib / odoo-module-migrator, donc # un jour où l'un d'eux s'en passe, il disparaît sans que rien ne le réclame. lxml +# Classeurs Excel de « Transform data », et les tests qui les éprouvent. Le +# moteur garde son venv dédié (script/todo/transform_setup.py) : un +# .venv.erplibre installé avant cette ligne n'a pas openpyxl, et le code ne +# l'importe donc jamais au niveau d'un module. +openpyxl python-dotenv python-dateutil unidecode diff --git a/script/data/external_file.py b/script/data/external_file.py index c1412cc..2ca5636 100644 --- a/script/data/external_file.py +++ b/script/data/external_file.py @@ -19,9 +19,7 @@ Les formats en pur stdlib — CSV, JSON, XML, et la détection de macros qui n'est qu'un `zipfile.namelist()` — tournent sous l'interpréteur du CLI. Excel et Access exigent un venv dédié. Le module doit donc s'importer sous les deux : AUCUN import de bibliothèque tierce au niveau du module, chacun -vit dans la fonction qui en a besoin. Les tests unitaires du dépôt tournent -sous `.venv.erplibre`, qui n'a pas openpyxl : un import au niveau du module -les ferait tomber tous, y compris ceux des règles pures. +vit dans la fonction qui en a besoin. Le canal de sortie ------------------ diff --git a/script/todo/transform_menu.py b/script/todo/transform_menu.py index 3c4c86a..a616390 100644 --- a/script/todo/transform_menu.py +++ b/script/todo/transform_menu.py @@ -971,7 +971,7 @@ class TransformMenuMixin: Le processus doit lire la source ET écrire la cible : il lui faut l'union des bibliothèques. La source seule laissait csv→xlsx - importer openpyxl sous l'interpréteur du CLI, qui ne l'a pas ; la + importer openpyxl sous l'interpréteur du CLI, qui peut ne pas l'avoir ; la cible seule enverrait un classeur au même interpréteur, qui ne sait pas le lire. """ diff --git a/script/todo/transform_setup.py b/script/todo/transform_setup.py index 1cb47e3..0ca8fda 100644 --- a/script/todo/transform_setup.py +++ b/script/todo/transform_setup.py @@ -4,10 +4,11 @@ """L'environnement de lecture des fichiers externes, posé à la demande. -Excel et Access exigent des bibliothèques qui ne sont dans aucun venv du -dépôt : `.venv.erplibre` porte l'outillage du CLI, le venv Odoo porte celui -d'Odoo, et charger l'un ou l'autre de ces lecteurs les mélangerait à un -sujet qui n'est pas le leur. D'où un venv dédié, bâti au premier besoin. +Excel et Access exigent des bibliothèques qu'aucun venv du dépôt ne porte à +coup sûr : `.venv.erplibre` porte l'outillage du CLI — openpyxl compris, +mais seulement depuis qu'il est dans ses dépendances —, le venv Odoo porte +celui d'Odoo, et le lecteur Access n'est dans aucun. D'où un venv dédié, +bâti au premier besoin. Les formats en pur stdlib n'en ont PAS besoin, et c'est ce que `available()` et `engine_python()` tiennent à la place des appelants : un diff --git a/test/test_transform_external.py b/test/test_transform_external.py index 83b4e56..3aa186c 100644 --- a/test/test_transform_external.py +++ b/test/test_transform_external.py @@ -6849,6 +6849,24 @@ class TestFuiteXlsx(unittest.TestCase): ) +def _openpyxl_ici(): + """Vrai si openpyxl s'importe dans CET interpréteur. + + Pas `transform_setup.available("xlsx")` : il répond vrai dès que le venv + dédié l'a, alors que ces tests écrivent leur classeur ici même. + """ + try: + import openpyxl # noqa: F401 + except ImportError: + return False + return True + + +@unittest.skipUnless( + _openpyxl_ici(), + "openpyxl absent de cet interpréteur : pip install -r" + " requirement/erplibre_require-ments.txt", +) class TestHorodatageDeLaCopie(unittest.TestCase): """La copie ne porte pas l'instant où elle a été tirée.