Exercices Architecture & Patterns Registre de données avec validation automatique
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Registre de données avec validation automatique

Pour terminer cette serie, on va combiner plusieurs techniques avancees dans un cas realiste. Imagine que tu construis un système de configuration ou de registre de données qui valide automatiquement les valeurs qu'on y stocke.

Écris une classe ValidatedRegistry qui :
1. Fonctionne comme un context manager (with)
2. Permet d'enregistrer des regles de validation pour des clés (méthode add_rule)
3. Permet de stocker des valeurs qui sont automatiquement validees (méthode set)
4. Permet de lire des valeurs (méthode get)
5. En sortie du context manager, vérifie que toutes les clés obligatoires ont une valeur

La méthode add_rule(cle, validateur, obligatoire=False) prend :
clé : le nom de la cle
validateur : une fonction qui prend la valeur et renvoie True/False
obligatoire : si True, la clé doit avoir une valeur a la sortie du with

La méthode set(cle, valeur) stocke la valeur si elle passe la validation. Si pas de regle pour cette clé, toute valeur est acceptee. Si la validation echoue, leve ValueError.

La méthode get(cle, défaut=None) renvoie la valeur ou le défaut.

__exit__ doit lever ValueError si des clés obligatoires n'ont pas de valeur.

Exemple :
r = ValidatedRegistry()
with r:
r.add_rule('age', lambda v: isinstance(v, int) and v > 0)
r.set('age', 25) # ok
r.set('nom', 'Alice') # ok (pas de regle)
r.get('age') donne 25

Tests (4/5)

Set et get basique
r = ValidatedRegistry()
with r:
    r.set('nom', 'Alice')
assert r.get('nom') == 'Alice'
Validation reussie
r = ValidatedRegistry()
with r:
    r.add_rule('age', lambda v: isinstance(v, int) and v > 0)
    r.set('age', 25)
assert r.get('age') == 25
Validation echouee
r = ValidatedRegistry()
with r:
    r.add_rule('age', lambda v: isinstance(v, int) and v > 0)
    try:
        r.set('age', -5)
        assert False, 'Devrait lever ValueError'
    except ValueError:
        pass
Cle obligatoire manquante
r = ValidatedRegistry()
try:
    with r:
        r.add_rule('email', lambda v: '@' in v, obligatoire=True)
    assert False, 'Devrait lever ValueError'
except ValueError:
    pass

+ 0 tests cachés

Indices (3 disponibles)

solution.py