Oh I meant `clojure.spec/gen` instead of `clojure.spec/with-gen`. `clojure.spec/gen` has an overrides option. I (think I) need something like this to cleanly change the unforming action in a nested spec.
Jeroen On Tue, Sep 6, 2016 at 8:00 PM, Jeroen van Dijk <jeroentjevand...@gmail.com> wrote: > Hi, > > I'm playing with the idea of using clojure.spec to make an API backwards > compatible by using conform and unform to transform data from the old > version format to a new format version. Below is an example of this in code: > > Say we have API change that involves changing the name of a nested key: > > (do > ;; Old api > (s/def :api.v0.input.nested/label keyword?) > (s/def :api.v0.input/nested (s/keys :req-un > [:api.v0.input.nested/label])) > (s/def :api.v0/input (s/keys :req-un [:api.v0.input/nested])) > > ;; New api > (s/def :api.v1.input.nested/key keyword?) > (s/def :api.v1.input/nested (s/keys :req-un [:api.v1.input.nested/key])) > (s/def :api.v1/input (s/keys :req-un [:api.v1.input/nested])) > > ;; Migration specs > (s/def :api.v0-v1.migration.input/nested (s/conformer (fn [_] (throw > (ex-info "Don't use as conformer" {}))) > (fn [x] > (clojure.set/rename-keys x {:label :key})))) > > (s/def :api.v0-v1.migration/input (s/conformer (fn [x] > (s/conform > :api.v1/input x)) > (fn [x] > (s/unform (s/keys > :req-un [:api.v0-v1.migration.input/nested]) x)))) > > ;; Changes {:nested {:label :hi}} to {:nested {:key :hi}} > (s/unform :api.v0-v1.migration/input {:nested {:label :hi}})) > > So this kind of works, but I wonder whether there is an easier way or if > I'm thinking about this the wrong way. I was hoping there would be > something like with-unformer (like with-gen) that allows me to change the > unforming action for a specific key without having to copy most of the old > spec. > > Any suggestions or advise is appreciated. > > Thanks, > Jeroen > > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.