Spec: like clojure.spec but for Elixir


I’ve just pushed Spec, the first beta version of an clojure.spec inspired library for conforming data against an specification.

Currenly Spec supports conforming against most Elixir data types, supports regex operators, and some other niceties you can read of in the README file (a bit long read). But there still work to do on it, like supporting data example generators, and maybe other things.

<3, vic.


/me is glad he grabbed it before github went down…

This looks quite nice, could clean up my type testing that I have scattered around. I am curious though, why does something like:

conform!(is_tuple() and &(tuple_size(&1) == 2), {1})

Take the value as the second argument instead of the first? It would be convenient to do things like:

|> conform!(is_tuple() and &(tuple_size(&1) == 2))
|> etc...

Also, on this example from your README.md:

iex> conform!(hello :: is_binary(), "world")
{:hello, "world"}

Have you thought about mandating this syntax instead:

iex> conform!(:hello :: is_binary(), "world")
{:hello, "world"}

That way we could tag it with anything, even a variable like:

iex> blah = :vwoop
iex> conform!(blah :: is_binary(), "world")
{:vwoop, "world"}

Hey @OvermindDL1, Thanks a lot for your feedback.

Well, while conform/2 expects the predicates (or any defined spec) inside of it to take the value as first argument (values are just piped into predicates), conform/2 itself expects its as second, I guess just because in Elixir functions use the first argument for the subject value, eg Regex.match(regex, string), so I guess I just went for Spec.conform(spec, value) naturally.

But if you do defspec and give it a name, then the resulting function will expect to work on the first value, applying the spec to it.

defp sum_tuple({a, b}, c) when a + b == c, do: true
defp sum_tuple({a, b}, c), do: false

defspec two_tuple(is_tuple() and &(tuple_size(&1) == 2))

value = {1, 2}

|> two_tuple()
|> sum_tuple(3)

So I guess having Spec.conform/2 take the spec as first argument (again just like many other things on Elixir) is better.

Regarding tags, you are irght, it could be useful to tag with a bound variable. Will change it and see how it feels.

Thanks for reading and giving input! :slight_smile:

1 Like

It looks quite useful indeed, I like it. :slight_smile:

1 Like

I will definitely use this when writing more elaborate behaviours/interfaces. It looks like a really clean way to structure conformity checks. :smile: Thank you for making this, @vic!


Hello !

Today I made some progress on the README guide, it’d would be wonderful if any of you could give a quick look at it and provide some feedback, thanks in advance! :slight_smile:

1 Like

Looks nice. Not sure when but I look forward to having a play with it. Thanks for sharing

1 Like

Awesome, I was waiting something like that since a presentation of clojure.spec in a clojure meetup. Nice to see your work. I pretend to use in my projects soon.

1 Like