# Changelog

## 1.9.0 - 2026-08-19

### Added

- Un plugin utilisateur peut désormais **fournir son propre traitement d'un format d'encodage pour ses
  seuls caches**, sans rien changer pour les autres plugins. Il lui suffit de déclarer la fonction
  préfixée correspondante dans son fichier `ezcodec/<prefixe>.php`, selon le mécanisme d'Encoder
  Factory 1.0.0.

  Cache Factory n'a rien de particulier à faire pour cela : il relaie à Encoder Factory le préfixe du
  plugin **propriétaire du cache**, et non le sien. Le mécanisme se propage donc le long de la chaine
  api-services, en plus des services de codage que Cache Factory offrait déjà par
  `<prefixe>_cache_encoder_<codage>()`.

### Changed

- La compatibilité déclarée avec Encoder Factory passe à `[1.0.0;[`. Les fonctions d'API de ce plugin
  prennent depuis leur version 1.0.0 le préfixe du plugin appelant en premier argument, et les deux
  appels de Cache Factory ont été adaptés. **Cette version exige donc Encoder Factory 1.0.0 ou
  supérieur** ; la version 1.8.1 reste utilisable avec la ligne 0.x.

## 1.8.1 - 2026-08-19

### Fixed

- Les messages de journal ne précisaient pas leur niveau de gravité. Le filtre par défaut de SPIP
  retenant la gravité 5, ils n'étaient **jamais écrits en production**. Ils sont désormais émis en
  `_LOG_ERREUR`.

### Changed

- La compatibilité déclarée avec Encoder Factory est bornée à `[0.1.0;1.0.0[`. La version 1.0.0 de
  ce plugin modifie la signature de ses fonctions d'API, que Cache Factory ne saura appeler qu'à
  partir de sa propre version 1.9.0 : sans cette borne, la mise à jour d'Encoder Factory seul
  provoquerait une erreur fatale au premier cache lu ou écrit.

## 1.8.0 - 2026-08-17

Version issue d'une revue de conception complète du plugin, confrontant le code à son document de
conception.

### Added

- `cache_est_valide()` accepte un quatrième argument facultatif `$forcer` : positionné à `true`, il
  déclare le cache invalide sans le tester, ce qui conduit l'appelant à recalculer son contenu.
  Cache Factory ne préjuge pas de la façon dont cette décision est prise, chaque plugin utilisateur
  restant libre de sa politique.
- Les caches des plugins utilisateur devenus inactifs sont supprimés du disque à l'affichage de la
  page d'administration des plugins. Leur configuration disparaissant de la meta, plus aucune API ni
  aucun écran ne pouvait les atteindre.
- Le formulaire de vidage affiche la volumétrie de chaque type de cache : nombre de caches, taille
  cumulée et nombre de caches périmés.
- Les caches périmés sont signalés visuellement dans ce formulaire, et un lien « cocher les périmés »
  complète les liens « tout cocher » et « tout décocher ».
- Nouveaux items de langue : `cache_vider_cocher_perimes`, `cache_vider_perime`,
  `cache_vider_volumetrie`, `cache_vider_volumetrie_perimes`.
- Ajout d'un `README.md` et de ce changelog.

### Changed

- Les fonctions `traiter_balise_cache_liste()` et `traiter_balise_ezcache_plugins()` sont renommées
  `calculer_balise_cache_liste()` et `calculer_balise_ezcache_plugins()`. Leur nom figurant dans le
  code généré à la compilation des squelettes, **un vidage du cache des squelettes est nécessaire
  après la mise à jour** : un squelette déjà compilé utilisant `#CACHE_LISTE` ou `#EZCACHE_PLUGINS`
  appellerait sinon l'ancien nom.
- La fonction interne `ezcache_sous_chemin()` est renommée `ezcache_creer_sous_dossiers()`,
  symétrique de la nouvelle `ezcache_lister_sous_dossiers()`.
- La page de vidage des caches ne présente plus que les plugins utilisateur actifs.
- Les sept fonctions d'API sortent proprement, avec leur valeur d'échec habituelle, lorsque le type
  de cache demandé n'existe pas ; l'erreur est tracée dans le journal `ezcache`. Elles produisaient
  jusqu'ici une cascade d'avertissements PHP suivie d'une erreur fatale peu explicite.
- Le pipeline `post_cache` n'est plus appelé lorsque la suppression d'un cache a échoué, ce qui
  aligne `cache_supprimer()` et `cache_vider()` sur le comportement de `cache_ecrire()`.
- Le document de conception est fourni au format Markdown dans `docs/`, à la place du PDF.

### Removed

- L'attribut de configuration `decodage`, déprécié depuis la version 1.4.0 au profit de `codage`, est
  supprimé. Un type de cache qui le déclare encore le voit ignoré et retiré de sa configuration : le
  codage restant déduit de l'extension du fichier, aucun comportement n'est modifié.

### Fixed

- `#CACHE_LISTE` provoquait une erreur fatale hors d'un contexte où l'API était déjà chargée : le
  fichier inclus était `inc/ezcheck_cache` au lieu de `inc/ezcache_cache`. Même correction pour
  `#EZCACHE_PLUGINS`, qui incluait `inc/config` au lieu de l'API.
- `#EZCACHE_PLUGINS{non}` renvoyait une chaine au lieu de la liste des plugins : la variable statique
  servait à la fois de cache de résultat et de variable de travail. La saisie
  `selection_ezcache_plugins` était inutilisable dans ce mode.
- La configuration d'un type de cache sans préfixe ni composant obligatoire provoquait une erreur
  fatale : la valeur par défaut de `nom_obligatoire` était une chaine au lieu d'un tableau.
- `ezcache_cache_verifier()` cherchait le service `cache_composer` au lieu de `cache_verifier`, et ne
  signalait pas l'erreur lorsque l'identifiant relatif était incomplet : un cache au nom tronqué
  pouvait être écrit et `cache_ecrire()` renvoyait `true`.
- `cache_repertorier()` ignorait les caches situés dans un sous-chemin de plus d'un niveau, qui
  étaient donc invisibles dans le formulaire de vidage et non supprimables depuis l'espace privé.
- `cache_repertorier()` ne renvoyait aucun résultat lorsqu'un filtre portait sur l'extension, et
  échouait si le tableau de filtres valait explicitement `null`.
- `configuration_cache_recharger()` appelée sans plugin créait une entrée parasite dans la meta au
  lieu de recharger toutes les configurations enregistrées.
- `cache_vider()` renvoyait toujours `true`, même lorsqu'un cache n'avait pas pu être supprimé.
- L'encodage et le décodage pouvaient produire une erreur de typage sur un cache corrompu ou un
  contenu non encodable.
- La décomposition du nom d'un cache non conforme, dont un composant contient le caractère
  séparateur, produisait un avertissement PHP et une clé vide dans la description du cache.
- Un cache situé à la racine du dossier du plugin, ou désigné par un chemin extérieur à ce dossier,
  recevait un sous-dossier aberrant (`.` ou un chemin absolu).
- Le nom du plugin affiché par le formulaire de vidage provoquait des avertissements PHP pour un
  plugin non actif ; le préfixe sert désormais de valeur de repli.

### Security

- L'action de téléchargement d'un cache vérifie que le fichier demandé appartient bien à un dossier
  de cache déclaré par un plugin utilisateur. Elle acceptait auparavant n'importe quel chemin, dès
  lors que le lien était signé et l'utilisateur autorisé.

## 1.7.0 - 2025-02-16

### Changed

- Fichiers de langue au nouveau format, compatible SPIP 4.1 et versions ultérieures.

## 1.6.0 - 2024-07-05

### Added

- Balise `#EZCACHE_PLUGINS`, qui fournit la liste des plugins utilisant Cache Factory, et saisie
  `selection_ezcache_plugins` correspondante.

### Changed

- Compatibilité SPIP 4.*.

## 1.5.0 - 2024-01-18

### Changed

- L'encodage et le décodage sont délégués au plugin Encoder Factory (préfixe `ezcodec`), qui fournit
  une API générique pour tout format. Le plugin est déclaré en `utilise` et non en `necessite`, le
  codage n'étant pas toujours nécessaire.

### Added

- API `configuration_codage_csv_lire()`, qui donne la correspondance entre un codage CSV et son
  délimiteur.

## 1.4.0 - 2024-01-02

### Added

- Mise en place de l'encodage : le plugin ne savait jusqu'alors que décoder le contenu d'un cache.
- API `configuration_cache_recharger()`, qui encapsule le rechargement de la configuration.

## 1.3.0 - 2023-12-31

### Added

- Paramètre de configuration `administration`, qui permet de soustraire un type de cache à la page de
  vidage de l'espace privé.

## 1.2.0 - 2022-03-20

### Added

- Service `cache_verifier()`, qui vérifie et complète l'identifiant relatif fourni.

### Changed

- Le sous-dossier, si utilisé, reçoit par défaut le type de cache, ce qui évite de le fournir dans
  l'identifiant relatif du cache. Ce comportement se configure avec `sous_dossier_auto`.

## 1.0.0 - 2020-08-15

### Changed

- Ajout du type de cache et abandon de la branche v0. Le couple (plugin utilisateur, type de cache)
  identifie désormais la configuration à appliquer : toutes les fonctions d'API reçoivent le type de
  cache en second argument. **Cette version est incompatible avec la branche v0.**

## 0.8.5 - 2020-06-15

### Added

- Service `cache_valider()`, qui permet à un plugin utilisateur d'ajouter ses propres critères de
  validité d'un cache.

## 0.8.2 - 2020-04-24

### Added

- `_DIR_ETC` parmi les racines possibles pour le stockage des caches.

## 0.6.0 - 2020-02-08

### Changed

- Renommage du préfixe du plugin, et par conséquent de certains fichiers et dossiers. **Cette
  modification demande une adaptation des plugins utilisateur.**

## 0.5.0 - 2019-11-10

### Added

- Pipeline `post_cache`, appelé après l'écriture ou la suppression d'un cache.

## 0.4.2 - 2019-11-09

### Added

- Option de décodage du contenu d'un cache, nécessaire à l'adoption du plugin par REST Factory.
