README.org

June 25, 2018 ยท View on GitHub

#+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
  • support writing directly into deps.edn
  • support add-lib
  • add validation support to cli parser