This post describes how to generate specs for any Leiningen project. After 8 months of internships, teaching, and quals, I needed a refresher. You might also find it helpful.
First, add a dependency to lein-typed
in your ~/.lein/profiles. Here’s what mine looks like.
~/.lein/profiles.clj
{:user {:plugins [[lein-typed "0.4.2"]]}}
Let’s generate specs for clj-time.
Shell
$ git clone git@github.com:clj-time/clj-time.git
$ cd clj-time
Next, make clj-time depend on core.typed.
clj-time/project.clj
:dependencies [...
               [org.clojure/core.typed "0.5.0"]
               ...]
Now, we generate specs for the clj-time.core namespace.
Shell
$ lein typed infer-spec clj-time.core
Our annotations have been inserted automatically in src/clj_time/core.clj.
To end, here’s one of the generated annotations.
Result
(s/fdef
  days
  :args
  (s/alt :0-args (s/cat) :1-arg (s/cat :n int?))
  :ret
  (s/or
    :org.joda.time.Days
    (partial instance? org.joda.time.Days)
    :org.joda.time.PeriodType
    (partial instance? org.joda.time.PeriodType)))