Spect è una libreria di validazione dei dati potente e flessibile, progettata principalmente per Clojure, ma con port in altri linguaggi. Permette di definire specifiche che descrivono la forma e il contenuto desiderati dei dati, e poi di utilizzare queste specifiche per validare, conformare (trasformare) e persino generare dati. Offre un approccio dichiarativo alla validazione, rendendo il codice più leggibile e manutenibile.
In sostanza, Spect permette di:
Definire Schemi: Si creano specifiche che definiscono cosa si considera valido. Queste specifiche possono essere semplici (ad esempio, "deve essere un intero") o complesse (ad esempio, "deve essere una mappa con chiavi specifiche che contengono valori di certi tipi").
Validare Dati: Si utilizza Spect per verificare se i dati soddisfano la specifica definita. Spect restituisce un report dettagliato in caso di errori di validazione, indicando esattamente dove e perché i dati non sono validi.
Conformare Dati: Questo è un aspetto particolarmente potente. Spect può trasformare i dati per renderli conformi alla specifica. Ad esempio, può convertire stringhe in numeri, filtrare chiavi indesiderate, o normalizzare la struttura dei dati.
Generare Dati: A partire da una specifica, Spect può generare dati validi in modo casuale. Questo è utile per il testing e la generazione di dati di esempio.
Concetti Chiave:
Specifiche: Le https://it.wikiwhat.page/kavramlar/Specifiche definiscono la forma e il contenuto atteso dei dati. Sono costruite utilizzando un set di combinatori e primitive fornite da Spect. Possono essere combinate in modo potente per creare specifiche complesse e riutilizzabili.
Predicati: I https://it.wikiwhat.page/kavramlar/Predicati sono funzioni booleane che restituiscono true
se un valore soddisfa una certa condizione, e false
altrimenti. Spect utilizza i predicati per definire criteri di validazione.
Combinatori: I https://it.wikiwhat.page/kavramlar/Combinatori sono funzioni che combinano specifiche più piccole per crearne di più grandi. Esempi includono s/keys
, s/coll-of
, s/or
, s/and
, etc.
Trasformazioni: Le https://it.wikiwhat.page/kavramlar/Trasformazioni sono funzioni che vengono applicate ai dati durante il processo di "conformazione" per modificarli.
Path Expressions: Le https://it.wikiwhat.page/kavramlar/Path%20Expressions permettono di navigare e manipolare dati nidificati all'interno di strutture dati complesse.
Esempio Semplice (Clojure):
(require '[clojure.spec.alpha :as s])
;; Definisci una specifica per una persona
(s/def ::nome string?)
(s/def ::eta (s/and int? #(>= % 0)))
(s/def ::persona (s/keys :req-un [::nome ::eta]))
;; Valida dei dati
(s/valid? ::persona {:nome "Alice" :eta 30}) ;=> true
(s/valid? ::persona {:nome "Bob" :eta -5}) ;=> false
;; Spiega perché i dati non sono validi
(s/explain-data ::persona {:nome "Bob" :eta -5})
;=> {:problems [{:path [:eta],
; :pred (fn [p1__10487#] (>= p1__10487# 0)),
; :val -5,
; :via [::persona ::eta],
; :in []}]}
Questo esempio mostra come definire una specifica per una persona con un nome (stringa) e un'età (intero non negativo), validare dei dati e ottenere un report dettagliato quando la validazione fallisce.