Cos'è spect?

Spect: Definizione e Utilizzo

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:

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.