generación de datos: Clojure.Spec deriva o alias otra especificación

CorePress2024-01-24  9

Me gustaría utilizar la especificación clojure para crear un conjunto de restricciones de tipo que puedan tener alias o restringirse aún más mediante otras especificaciones.

Por ejemplo, es posible que tenga muchos campos que deban ser válidos para una rebaja saneada.

El siguiente ejemplo funciona para la validación (s/valid?) pero no para la generación (gen/generate)

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list #(s/valid? ::sanitized-markdown %)) ;; works

(gen/generate (s/gen ::instruction-list)) ;; fails

Sin embargo (gen/generate (s/gen ::sanitized-markdown)) funciona.

¿Hay alguna manera de extender ::instruction-list desde ::sanitized-markdown para que conserve todo el comportamiento?

1

(s/def ::lista-de-instrucciones ::rebaja-desinfectada)?

- Lee

26/03/2021 a las 20:43

facepalm Pensé que lo había probado. Debí haberme topado con un error diferente y haber combinado los dos problemas. Con gusto lo marcaré como respuesta si quieres reclamarla

- farlee2121

27 de marzo de 2021 a las 0:08

@Lee, ¿te gustaría reclamar la respuesta?

- farlee2121

28 de marzo de 2021 a las 10:57



------------------------------------

Puedes asignar un alias a otra especificación proporcionándola directamente a s/def:

(s/def ::instruction-list ::sanitized-markdown)



------------------------------------

Puedes usar s/merge al fusionar especificaciones de mapas y s/and en otros casos.

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list (s/and ::sanitized-markdown #(> (count %) 10)))

(s/valid? ::instruction-list "abcd")
;; false
(s/valid? ::instruction-list "abcdefghijkl")
;; true

(gen/generate (s/gen ::instruction-list)) 
;; "178wzJW3W3zx2G0GJ1931eEeO"

Un ejemplo con mapas

(s/def ::a string?)
(s/def ::b string?)
(s/def ::c string?)
(s/def ::d string?)
(s/def ::first-map (s/keys :opt [::a ::b]))
(s/def ::second-map (s/keys :opt [::c ::d]))
(s/def ::third-map (s/merge ::first-map ::second-map))

(s/valid? ::third-map {:a "1" :d "2"})
;; true
(gen/generate (s/gen ::third-map))
;; {::b "gvQ7DI1kQ9DxG7C4poeWhk553", ::d "9KIp77974TEqs9HCq", ::c "qeSZA8NcYr7UVpJDsA17K"}

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare