find-deps icon indicating copy to clipboard operation
find-deps copied to clipboard

tools.deps friendly utility for searching clojars and maven

#+TITLE: find-deps

*** What?

find-deps helps you quickly find dependencies via the Clojars and Maven search APIs. Use it via the command line, or from the REPL.

find-deps utilizes [[http://yomguithereal.github.io/clj-fuzzy][clj-fuzzy]] to refine the search results returned from repository APIs. It also factors in the freshness of the dependencies, and the popularity of the dependency's group ID. We hope this results in a near-perfect suggestion every time!

See the Future section below for some ideas around where this can be taken. In particular, it would be great to enable searching for ~deps.edn~ files on github ...

*** TL;DR

Add a dependency to your current deps.edn as easily as this:

#+BEGIN_SRC sh clj -A:find-deps -F:save priority-map #+END_SRC

*** Changelog

  • Note taken on [2018-06-25 Mon 10:39]
  • 2018-06-25
    • hide snapshot versions by default in clojars (fixes #2)
  • 2018-06-24
    • merged @pesterhazy's README fix
  • 2018-06-23
    • fixed bug wherein it wasn't possible to save deps without a preexisting deps.edn
    • added -F:cli format flag to print deps as command line option to clojure binary
  • 2018-06-17
    • change -S flag to -s to avoid conflict with tools.deps cli
    • enable piping of invocations together to produced merged deps.edn map
    • enable saving of deps.edn map with format :save
    • renamed :merged to :merge
  • 2018-06-16
    • Initial commit

*** CLI Usage

To use find-deps from the command line, create an alias in your ~/.clojure/deps.edn map:

#+BEGIN_SRC clojure {:aliases {:find-deps {:extra-deps {find-deps {:git/url "https://github.com/hagmonk/find-deps", :sha "6fc73813aafdd2288260abb2160ce0d4cdbac8be"}}, :main-opts ["-m" "find-deps.core"]}}} #+END_SRC

You can invoke find-deps with ~-h~ to see the supported options:

#+BEGIN_SRC sh % clj -A:find-deps -h find-deps

Usage: [options*] [search-strings*]

Options: -s, --sources SOURCES :clojars:mvn Concatenated source types -R, --rank METHOD :fuzzy Ranking method - :fuzzy, :regex -F, --format FORMAT :deps Format for printing results - :deps, :merge, :table, :save, :cli -l, --limit NUM 1 Limit per-search results to NUM -h, --help #+END_SRC

**** Examples

Search for a dependency like http-kit:

#+BEGIN_SRC sh clj -A:find-deps http-kit #+END_SRC

#+BEGIN_SRC clojure {:deps {http-kit/http-kit {:mvn/version "2.3.0"}}} #+END_SRC

Search for multiple dependencies:

#+BEGIN_SRC sh clj -A:find-deps http-kit tools.logging priority-map #+END_SRC

#+BEGIN_SRC clojure {:deps {http-kit/http-kit {:mvn/version "2.3.0"}, org.clojure/tools.logging {:mvn/version "0.5.0-alpha"}, org.clojure/data.priority-map {:mvn/version "0.0.9"}}} #+END_SRC

Chain together multiple invocations using different query arguments:

#+BEGIN_SRC sh clj -A:find-deps -s:mvn roaringbitmap | clj -A:find-deps -s:clojars -R:regex -l 5 io.pedestal #+END_SRC

#+BEGIN_SRC clojure {:deps {org.roaringbitmap/RoaringBitmap {:mvn/version "0.7.13"}, io.pedestal/pedestal.jetty {:mvn/version "0.5.3"}, io.pedestal/pedestal.tomcat {:mvn/version "0.5.3"}, io.pedestal/pedestal.log {:mvn/version "0.5.3"}, io.pedestal/pedestal.service {:mvn/version "0.5.3"}, io.pedestal/pedestal.interceptor {:mvn/version "0.5.3"}}} #+END_SRC

Merge the search results into the current project's ~deps.edn~. You can also save these results to deps.edn by specifying ~:save~ instead.

#+BEGIN_SRC sh clj -A:find-deps -F:merge http-kit tools.logging priority-map #+END_SRC

#+BEGIN_SRC clojure {:paths ["src"], :deps {org.clojure/clojure {:mvn/version "1.9.0"}, org.clojure/tools.logging {:mvn/version "0.5.0-alpha"}, org.clojure/spec.alpha {:mvn/version "0.1.143"}, clj-fuzzy {:mvn/version "0.4.1"}, http-kit {:mvn/version "2.3.0"}, tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha", :sha "884d7ae5b9c228ff795e4385291708102f1cd46d"}, metosin/jsonista {:mvn/version "0.1.1"}, org.clojure/data.priority-map {:mvn/version "0.0.9"}, inflections {:mvn/version "0.13.0"}, http-kit/http-kit {:mvn/version "2.3.0"}} ;; ... snip } #+END_SRC

String search returning multiple matches in a table:

#+BEGIN_SRC sh clj -A:find-deps -F:table -l 10 "apache kafka"

| :lib | :version | |-----------------------------------+----------| | org.apache.kafka/kafka-tools | 1.1.0 | | org.apache.kafka/kafka_2.9.2 | 0.8.2.2 | | org.apache.kafka/kafka_2.9.1 | 0.8.2.2 | | org.apache.kafka/kafka_2.8.0 | 0.8.1.1 | | org.apache.kafka/kafka_2.8.2 | 0.8.1 | | org.apache.hadoop/hadoop-kafka | 3.1.0 | | org.apache.kafka/kafka-streams | 1.1.0 | | org.apache.kafka/kafka-clients | 1.1.0 | | org.apache.kafka/kafka-examples | 1.1.0 | | org.apache.kafka/kafka-perf_2.8.0 | 0.8.1.1 | #+END_SRC

Print out a command line invocation of the deps:

#+BEGIN_SRC sh clj -A:find-deps -F:cli http-kit jsonista clojure -Sdeps '{:deps {http-kit/http-kit {:mvn/version "2.3.0"}, metosin/jsonista {:mvn/version "0.2.1"}}}' #+END_SRC *** API

The ~find-deps.core~ namespace contains a number of helpers you can use from the REPL. Assuming you have an alias for rebel-readline:

#+BEGIN_SRC sh clj -A:rebel [Rebel readline] Type :repl/help for online help info user=> (use 'find-deps.core) nil user=> (print-deps "http-kit")

| :lib | :version | |-------------------+----------| | http-kit/http-kit | 2.3.0 | nil user=> (deps "http-kit") {:deps #:http-kit{http-kit #:mvn{:version "2.3.0"}}} #+END_SRC

See the ~find-deps.core~ namespace for more helpers.

*** Future

  • [ ] search github for deps.edn files
  • [ ] search github for project.clj files
    • [ ] page rank deps based on dependency graph
    • [ ] recommended other dependencies based on clustering
  • [ ] incorporate download counts into weighting factor
  • [x] support writing directly into deps.edn
  • [ ] support ~add-lib~
  • [ ] add validation support to cli parser