Une façon de penser à cela est ce que vous entendez par heure / date ? Les ordinateurs ne savent pas ce que sont ces concepts: ils doivent être programmés d'une manière ou d'une autre. Il est assez courant de représenter des durées au format UNIX "secondes depuis l'époque" et d'introduire une valeur particulière dans un programme via des appels de système d'exploitation. Cependant, quelle que soit la fréquence de cet usage, il est important de garder à l'esprit que ce n'est pas le moment "réel": c'est simplement une représentation logique.
Comme d'autres l'ont fait remarquer, si vous définissiez une "échéance" à l'aide de ce mécanisme, il est trivial d'alimenter une heure différente et de dépasser cette "échéance". Il en va de même pour les mécanismes plus élaborés tels que la demande à un serveur NTP (même sur une connexion "sécurisée", puisque nous pouvons substituer nos propres certificats, autorités de certification ou même appliquer des correctifs aux bibliothèques de chiffrement). Au début, il peut sembler que ces personnes sont responsables du travail effectué autour de votre mécanisme, mais il se peut que cela se fasse automatiquement et pour de bonnes raisons . Par exemple, il est judicieux de disposer de versions reproductibles et des outils d'aide à cette fin pourraient réinitialiser / intercepter automatiquement ces appels système non déterministes. libfaketime fait exactement cela,définit l'horodatage de tous les fichiers sur 1970-01-01 00:00:01
, la fonction d' enregistrement / lecture de Qemu simule toute interaction matérielle, etc.
Ceci est similaire à la loi de Goodhart : si le comportement d'un programme dépend du temps logique, le temps logique cesse alors d'être une bonne mesure du temps "réel". En d'autres termes, les gens ne vont généralement pas jouer avec l'horloge système, mais ils le feront si vous leur en donnez la raison.
Il existe d'autres représentations logiques du temps: l'une d'entre elles est la version du logiciel (soit votre application, soit une dépendance). C’est une représentation plus souhaitable pour une "échéance" que, par exemple, l’heure UNIX, car elle est plus spécifique à ce qui vous intéresse (modification des ensembles de fonctionnalités / API) et est donc moins susceptible de piétiner des préoccupations orthogonales contourner votre échéance pourrait casser des fichiers journaux, des tâches cron, des caches, etc.).
Comme d’autres l’ont dit, si vous contrôlez la bibliothèque et souhaitez "pousser" cette modification, vous pouvez proposer une nouvelle version qui déprécie les fonctionnalités caractéristiques entièrement. Vous pouvez les publier immédiatement les uns après les autres si vous le souhaitez, car (encore) les versions ne sont que des représentations logiques du temps, elles n'ont pas besoin d'être liées au temps "réel". La gestion sémantique peut aider ici.
Le modèle alternatif consiste à "tirer" le changement. Cela ressemble à votre "plan B": ajoutez un test à l'application consommatrice, qui vérifie que la version de cette dépendance est au moins la nouvelle valeur. Comme d'habitude, red / green / refactor pour propager ce changement dans la base de code. Cela peut être plus approprié si la fonctionnalité n'est pas "mauvaise" ou "mauvaise", mais simplement "un mauvais ajustement pour ce cas d'utilisation".
Une question importante avec l'approche "pull" est de savoir si la version de dépendance compte ou non comme une "unité" ( de fonctionnalité ) et mérite donc d'être testée; ou s'il s'agit simplement d'un détail d'implémentation "privé", qui ne doit être exercé que dans le cadre de tests unitaires ( de fonctionnalité ) réels . Je dirais: si la distinction entre les versions de la dépendance compte vraiment comme une fonctionnalité de votre application, faites le test (par exemple, en vérifiant que la version Python est> = 3.x). Si non, alors ne le faites pasajouter le test (car il sera fragile, peu informatif et trop restrictif); si vous contrôlez la bibliothèque, descendez ensuite la route "push". Si vous ne contrôlez pas la bibliothèque, utilisez simplement la version fournie: si vos tests réussissent, inutile de vous limiter; S'ils ne passent pas, c'est votre "date limite"!
Il existe une autre approche, si vous souhaitez décourager certaines utilisations des fonctionnalités d'une dépendance (par exemple, appeler certaines fonctions qui ne fonctionnent pas bien avec le reste de votre code), en particulier si vous ne contrôlez pas la dépendance: interdisez vos normes de codage. / décourage l'utilisation de ces fonctionnalités et ajoute des contrôles à votre linter.
Chacun de ceux-ci sera applicable dans des circonstances différentes.