automatheque.renommage
Renommage et rangement de fichiers par gabarits.
Détail
Un gabarit est un squelette de chemin — {date:%Y}/{album}/{nom} —
assorti d'une condition qui dit quand il s'applique et d'un ordre qui le
priorise. Le renommeur choisit le premier gabarit applicable, en déduit un
nouveau chemin, et y déplace le fichier.
C'est l'opération symétrique de automatheque.decomposition : là où celle-ci
tire des métadonnées d'un chemin, celle-ci construit un chemin à partir de
métadonnées. Les deux sont des distributions séparées parce que seule
celle-ci écrit sur le disque : un consommateur qui indexe sans jamais déplacer
n'a pas à en dépendre.
Les briques
Gabarit— un squelette, une condition, un ordre.Gabarits— la liste des gabarits, et l'algorithme de choix : d'abord ceux dont la condition est vérifiée, classés par ordre, puis ceux qui n'ont pas de condition. Un gabarit sans condition est donc un filet de sécurité, pas un concurrent.Renommable— mixin à faire hériter par l'objet à ranger. Il exposefilenameet surcharge_gabarits_par_defaut()et_liste_champs_dispo().Renommeur— le déplacement lui-même.
Exemple
import attr
from automatheque.renommage import Gabarit, Gabarits, Renommable
@attr.s
class Photo(Renommable):
album = attr.ib(default="", kw_only=True)
annee = attr.ib(default="", kw_only=True)
@classmethod
def _gabarits_par_defaut(cls):
return Gabarits(
[
Gabarit(
squelette="{annee}/{album}/{nom}", condition='"{album}"', ordre=1
),
Gabarit(squelette="a-trier/{nom}", ordre=9),
]
)
def _liste_champs_dispo(self):
return {"album": self.album, "annee": self.annee, "nom": ...}
photo = Photo(filename="/entree/DSC_0001.jpg", album="Japon", annee="2013")
photo.renomme("/photos")
# /photos/2013/Japon/DSC_0001.jpg
La configuration est reçue, pas cherchée
Les gabarits vivent souvent dans un fichier de configuration :
[renommage]
r1 = ['{annee}/{album}/{nom}', '"{album}"', 1]
r2 = ['a-trier/{nom}', '', 9]
Gabarits.depuis_configuration(config, section) les en tire, et le résultat
est passé au renommeur :
gabarits = Gabarits.depuis_configuration(charge_configuration(), "renommage")
Renommeur(photo, gabarits=gabarits).renomme("/photos")
Le renommeur ne consulte aucun état global : c'est l'appelant qui décide d'où
viennent ses gabarits. Le code d'origine appelait charge_configuration()
lui-même — une localisation de service, qui rendait le renommage dépendant
d'un fichier de configuration présent au bon endroit, et intestable sans lui.
Ce que le renommage ne fait pas
- Il n'écrit pas d'attributs étendus. Le code d'origine posait
discrètement
user.automatheque.fichier_origetuser.automatheque.modele.classedans les xattr du fichier, à chaque renommage. Les xattr ne survivent ni à la plupart des copies, ni aux archives, ni aux transferts réseau : c'est le plus fragile des supports pour de la provenance. Conserver le nom d'origine relève de l'application, qui sait où elle range ses métadonnées. - Il ne modifie pas le contenu du fichier. Écrire des étiquettes dans une image est l'affaire d'un adaptateur.
Transfert
Le déplacement est une copie, suivie d'une vérification de taille, suivie de
la suppression de l'original. shutil.move seul ne dirait pas si la copie
s'est mal passée d'un système de fichiers à l'autre ; ici, une cible qui ne
correspond pas lève TransfertIncomplet, efface la cible douteuse et
laisse l'original en place.
Les champs ne peuvent pas sortir du répertoire cible
Les champs d'un squelette viennent des métadonnées des fichiers traités — un
album, une ville, un titre. Substitués tels quels, ils sortiraient du
répertoire demandé : os.path.join jette son premier argument dès que le
second est absolu, et .. remonte d'un niveau.
Chaque champ chaîne est donc assaini avant substitution — séparateurs
neutralisés, segments . et .. remplacés. Les valeurs non-chaînes passent
intactes, sans quoi {date:%Y} cesserait de fonctionner. Les séparateurs du
squelette, eux, sont conservés : c'est par eux que tu décris ton
arborescence.
En dernier recours, le chemin final est vérifié comme contenu dans le
répertoire cible ; sinon CibleHorsRepertoire est levée sans rien déplacer.
Un squelette absolu tombe donc sous cette garde.
Requirement
Python >=3.9
Installation
pip install automatheque.renommage
License
LGPLv3.0 ou ultérieure
Release files for automatheque.renommage 0.23.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| automatheque_renommage-0.23.0.tar.gz | 33.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| automatheque_renommage-0.23.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 63.3 kB
Release files / automatheque_renommage-0.23.0.tar.gz
| Download URL | automatheque_renommage-0.23.0.tar.gz |
|---|---|
| Size | 33.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5b816ff4dd0cabe1c5d1d6199ac70298566d54833c75000c6ff9750e98021781
|
|
BLAKE2b-256 checksum How to use checksums |
5ec093f99976c3e3aa70ef1aea40166166c33d30fc0e149efed2bd6c5021e804
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / automatheque_renommage-0.23.0-py3-none-any.whl
| Download URL | automatheque_renommage-0.23.0-py3-none-any.whl |
|---|---|
| Size | 29.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
660b448944aa8b7960ea727ea733f5723760e7759d7a9fbb499344be23c7d733
|
|
BLAKE2b-256 checksum How to use checksums |
a3f84fe34021233fd6c225b94df89b5abd6b6650d9cfa703ac21f1110fcffbfb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency log