├── .gitignore ├── example.png ├── test-resources ├── base │ ├── brick │ │ └── deps.edn │ └── deps.edn ├── target │ ├── brick │ │ └── deps.edn │ └── deps.edn ├── __base.edn └── __target.edn ├── dev └── user.clj ├── .github └── workflows │ └── test.yaml ├── src └── namenu │ ├── deps_diff │ ├── spec.clj │ ├── core.clj │ └── output.clj │ └── tools │ └── deps_diff.clj ├── deps.edn ├── LICENSE ├── test └── namenu │ └── deps_diff │ └── core_test.clj ├── action.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .nrepl-port 2 | .cpcache/ 3 | .clj-kondo/ 4 | .lsp/ -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/namenu/deps-diff/HEAD/example.png -------------------------------------------------------------------------------- /test-resources/base/brick/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {com.github.seancorfield/next.jdbc {:mvn/version "1.2.796"}}} -------------------------------------------------------------------------------- /test-resources/target/brick/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.847"}}} -------------------------------------------------------------------------------- /test-resources/base/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.10.3"}} 2 | :aliases {:dev {:extra-deps {hato/hato {:mvn/version "0.9.0"} 3 | metosin/reitit {:mvn/version "0.4.0"}}} 4 | :poly {:extra-deps {poly/core-api {:local/root "./brick"}}}}} -------------------------------------------------------------------------------- /dev/user.clj: -------------------------------------------------------------------------------- 1 | (ns user 2 | (:require [clojure.tools.deps.cli.api :as cli])) 3 | 4 | (comment 5 | (= (with-out-str 6 | (cli/tree {:project "./test-resources/base/deps.edn" 7 | :aliases [:dev]})) 8 | (with-out-str 9 | (cli/tree {:dir "./test-resources/base" 10 | :aliases [:dev]}))) 11 | ) -------------------------------------------------------------------------------- /test-resources/target/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.11.1"}} 2 | :aliases {:dev {:extra-deps {metosin/reitit {:mvn/version "0.5.1"} 3 | org.clojure/clojure {:mvn/version "1.11.1"}}} 4 | :poly {:extra-deps {poly/core-api {:local/root "./brick"}}} 5 | :test {:extra-deps {prismatic/schema {:mvn/version "1.2.0"}}}}} -------------------------------------------------------------------------------- /.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v4 11 | 12 | - uses: actions/setup-java@v4 13 | with: 14 | distribution: 'temurin' 15 | java-version: '17' 16 | 17 | - name: Install clojure tools 18 | uses: DeLaGuardo/setup-clojure@12.5 19 | with: 20 | cli: 1.11.1.1182 21 | 22 | - name: Test 23 | run: clojure -X:test 24 | -------------------------------------------------------------------------------- /src/namenu/deps_diff/spec.clj: -------------------------------------------------------------------------------- 1 | (ns namenu.deps-diff.spec 2 | (:require [clojure.spec.alpha :as s] 3 | [clojure.tools.deps.specs :as deps.specs])) 4 | 5 | (s/def ::ref (s/or :gitrevision string? 6 | :filename string?)) 7 | (s/def ::aliases (s/* keyword?)) 8 | 9 | (s/def ::format (s/nilable #{:edn :markdown :cli})) 10 | 11 | (s/def ::diff (s/keys :req-un [:diff/removed :diff/added :diff/modified])) 12 | 13 | (s/def ::coord ::deps.specs/coord) 14 | 15 | (s/def :diff/removed (s/map-of symbol? ::coord)) 16 | (s/def :diff/added (s/map-of symbol? ::coord)) 17 | (s/def :diff/modified (s/map-of symbol? ::coord)) 18 | -------------------------------------------------------------------------------- /deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :deps {org.clojure/clojure {:mvn/version "1.11.2"} 3 | org.clj-commons/pretty {:mvn/version "2.2.1"} 4 | org.clojure/tools.deps {:mvn/version "0.19.1417"} 5 | org.slf4j/slf4j-nop {:mvn/version "2.0.10"}} 6 | :tools/usage {:ns-default namenu.tools.deps-diff} 7 | :aliases {:dev {:extra-paths ["dev"] 8 | :extra-deps {org.clojure/tools.deps.cli {:mvn/version "0.10.55"}} 9 | :ns-default clojure.tools.deps.cli.api} 10 | :test {:extra-paths ["test" "test-resources"] 11 | :extra-deps {io.github.cognitect-labs/test-runner 12 | {:git/tag "v0.5.1" :git/sha "dfb30dd"}} 13 | :main-opts ["-m" "cognitect.test-runner"] 14 | :exec-fn cognitect.test-runner.api/test}}} 15 | -------------------------------------------------------------------------------- /src/namenu/tools/deps_diff.clj: -------------------------------------------------------------------------------- 1 | (ns namenu.tools.deps-diff 2 | (:require [clojure.spec.alpha :as s] 3 | [namenu.deps-diff.core :as dd] 4 | [namenu.deps-diff.output :as output] 5 | [namenu.deps-diff.spec :as spec])) 6 | 7 | (defn diff 8 | " 9 | opts 10 | :base - tools.deps resolved edn of base deps.edn 11 | :target - tools.deps resolved edn of target deps.edn 12 | :format - #{:edn, :markdown, :cli} 13 | " 14 | [{:keys [base target format] :as opts}] 15 | (assert (s/valid? ::spec/ref base)) 16 | (assert (s/valid? ::spec/ref target)) 17 | (assert (s/valid? ::spec/format format)) 18 | 19 | (let [deps-from (dd/parse-resolved-tree base) 20 | deps-to (dd/parse-resolved-tree target) 21 | 22 | d (dd/diff* deps-from deps-to) 23 | exit-code (if (output/equal? d) 0 1)] 24 | (dd/print-result! d opts) 25 | (System/exit exit-code))) 26 | 27 | (comment 28 | 29 | (deps/resolve-deps (assoc (edn/read-string (slurp "deps.edn")) 30 | :mvn/repos mvn/standard-repos) {}) 31 | 32 | ) 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Hyunwoo Nam 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/namenu/deps_diff/core_test.clj: -------------------------------------------------------------------------------- 1 | (ns namenu.deps-diff.core-test 2 | (:require [clojure.spec.alpha :as s] 3 | [clojure.test :refer [deftest testing is]] 4 | [namenu.deps-diff.core :refer [diff* parse-resolved-tree]] 5 | [namenu.deps-diff.output :refer [make-ver]] 6 | [namenu.deps-diff.spec :as spec])) 7 | 8 | (deftest diff-test 9 | (let [base (parse-resolved-tree "test-resources/__base.edn") 10 | target (parse-resolved-tree "test-resources/__target.edn")] 11 | (testing "without aliases" 12 | (let [d (diff* base target)] 13 | (is (empty? (:removed d))) 14 | (is (empty? (:added d))) 15 | (is (not-empty (:modified d))))) 16 | 17 | (testing "aliases" 18 | (let [d (diff* base target)] 19 | (is (= (update-vals d count) 20 | {:removed 0, :added 0, :modified 6})))) 21 | 22 | (testing "local/root test" 23 | (let [d (diff* base target)] 24 | (is (contains? (:modified d) 25 | 'com.github.seancorfield/next.jdbc)))))) 26 | 27 | (deftest make-ver-test 28 | (testing "git deps" 29 | (is (= "e0df5b36b496c485c75f38052a71b18f02772cc0" 30 | (make-ver 31 | (s/conform ::spec/coord 32 | {:git/url "https://github.com/green-labs/superlifter.git", 33 | :git/sha "e0df5b36b496c485c75f38052a71b18f02772cc0", 34 | :deps/manifest :deps, 35 | :deps/root "/Users/namenu/.gitlibs/libs/superlifter/superlifter/e0df5b36b496c485c75f38052a71b18f02772cc0", 36 | :dependents ['green-labs/gosura], 37 | :parents #{['green-labs/gosura]}, 38 | :paths ["/Users/namenu/.gitlibs/libs/superlifter/superlifter/e0df5b36b496c485c75f38052a71b18f02772cc0/src"]} 39 | )))))) 40 | 41 | (comment 42 | (diff-test) 43 | (make-ver-test) 44 | ) 45 | 46 | -------------------------------------------------------------------------------- /src/namenu/deps_diff/core.clj: -------------------------------------------------------------------------------- 1 | (ns namenu.deps-diff.core 2 | (:require [clojure.data :as data] 3 | [clojure.edn :as edn] 4 | [clojure.set :as set] 5 | [clojure.spec.alpha :as s] 6 | [namenu.deps-diff.output :as output] 7 | [namenu.deps-diff.spec :as spec])) 8 | 9 | (defn parse-resolved-tree 10 | "Takes tools.deps resolved output filename as an input. 11 | Returns a map of [name -> ::spec/coord]" 12 | [file] 13 | (let [deps-tree (edn/read-string (slurp (str file)))] 14 | (letfn [(walk [m] 15 | (mapcat (fn [[k v]] 16 | (into [[k (dissoc v :children)]] 17 | (walk (:children v)))) 18 | m))] 19 | (->> (walk (:children deps-tree)) 20 | (keep (fn [[k v]] 21 | (if (:include v) 22 | [k (s/conform ::spec/coord (:coord v))]))) 23 | (into {}))))) 24 | 25 | (defmulti print-result! (fn [_ opts] (keyword (:format opts)))) 26 | 27 | (defmethod print-result! :default 28 | [v _] 29 | (prn v)) 30 | 31 | (defmethod print-result! :markdown 32 | [data _] 33 | (output/markdown data)) 34 | 35 | (defmethod print-result! :cli 36 | [data _] 37 | (output/cli data)) 38 | 39 | (defn diff* 40 | "Returns a map of :removed, :added and :modified dependencies. 41 | Each key is a dependency name and the value is a map of :from and :to versions" 42 | [deps-from deps-to] 43 | (let [key-set (comp set keys) 44 | [removed-deps added-deps common-deps] (data/diff (key-set deps-from) (key-set deps-to)) 45 | removed (map (fn [k] [k {:from (get deps-from k)}]) removed-deps) 46 | added (map (fn [k] [k {:to (get deps-to k)}]) added-deps) 47 | modified-keys (keys (set/difference (set (select-keys deps-to common-deps)) 48 | (select-keys deps-from common-deps))) 49 | modified (map (fn [k] [k {:from (get deps-from k) 50 | :to (get deps-to k)}]) 51 | modified-keys)] 52 | {:removed (into (sorted-map) removed) 53 | :added (into (sorted-map) added) 54 | :modified (into (sorted-map) modified)})) 55 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: "deps-diff" 2 | description: "Clojure dependencies differ" 3 | author: "Hyunwoo Nam" 4 | branding: 5 | icon: "package" 6 | color: "green" 7 | 8 | inputs: 9 | base: 10 | required: true 11 | description: git/sha of base commit 12 | default: ${{ github.event.pull_request.base.sha }} 13 | dir: 14 | required: false 15 | description: root directory of deps.edn 16 | default: "." 17 | aliases: 18 | required: false 19 | description: aliases to create basis 20 | default: "nil" 21 | format: 22 | required: false 23 | description: output format. edn (default) OR markdown 24 | 25 | outputs: 26 | deps_diff: 27 | description: output in edn format 28 | value: ${{ steps.diff.outputs.DEPS_DIFF }} 29 | exit_code: 30 | description: Result of command (exit code). 0, if no difference. 31 | value: ${{ steps.diff.outputs.EXIT_CODE }} 32 | 33 | runs: 34 | using: "composite" 35 | steps: 36 | - name: Prepare java 37 | uses: actions/setup-java@v4 38 | with: 39 | distribution: "temurin" 40 | java-version: "21" 41 | 42 | - name: Install clojure tools 43 | uses: DeLaGuardo/setup-clojure@12.5 44 | with: 45 | cli: 1.11.2.1446 46 | 47 | - name: Cache maven 48 | uses: actions/cache@v4 49 | env: 50 | cache-name: cache-clojure 51 | with: 52 | path: | 53 | ~/.m2 54 | ~/.gitlibs 55 | key: ${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} 56 | restore-keys: | 57 | ${{ env.cache-name }}- 58 | 59 | - name: Checkout base 60 | uses: actions/checkout@v4 61 | with: 62 | ref: ${{ github.event.pull_request.base.sha }} 63 | 64 | - name: Resolve base 65 | shell: bash 66 | run: | 67 | DIR=${{ inputs.dir }} 68 | clojure -X:deps tree :dir '"'$DIR'"' :aliases '${{ inputs.aliases }}' :format :edn > __base.edn 69 | 70 | - name: Checkout target 71 | uses: actions/checkout@v4 72 | with: 73 | clean: false 74 | 75 | - name: Resolve target 76 | shell: bash 77 | run: | 78 | DIR=${{ inputs.dir }} 79 | clojure -X:deps tree :dir '"'$DIR'"' :aliases '${{ inputs.aliases }}' :format :edn > __target.edn 80 | 81 | - name: Install deps-diff 82 | shell: bash 83 | run: | 84 | TOOL_PATH=${{ github.action_path }} 85 | clojure -Ttools install io.github.namenu/deps-diff '{:local/root "'$TOOL_PATH'"}' :as deps-diff 86 | 87 | - id: diff 88 | shell: bash 89 | run: | 90 | set +e 91 | 92 | DEPS_DIFF=$(clojure -Tdeps-diff namenu.tools.deps-diff/diff \ 93 | :base '"__base.edn"' \ 94 | :target '"__target.edn"' \ 95 | :format :${{ inputs.format }}) 96 | EXIT_CODE=$? 97 | 98 | echo "DEPS_DIFF<> $GITHUB_OUTPUT 99 | echo "$DEPS_DIFF" >> $GITHUB_OUTPUT 100 | echo "EOF" >> $GITHUB_OUTPUT 101 | 102 | echo "EXIT_CODE=$EXIT_CODE" >> $GITHUB_OUTPUT 103 | # always exit with 0 104 | # exit $EXIT_CODE 105 | -------------------------------------------------------------------------------- /src/namenu/deps_diff/output.clj: -------------------------------------------------------------------------------- 1 | (ns namenu.deps-diff.output 2 | (:require [clj-commons.ansi :as ansi] 3 | [clojure.string :as str])) 4 | 5 | (defn make-ver [[type coord]] 6 | (case type 7 | :mvn (:mvn/version coord) 8 | :local (:local/root coord) 9 | :git (cond-> coord 10 | :git/tag 11 | :git/sha))) 12 | 13 | (def assets-url 14 | {:removed "https://img.shields.io/badge/Removed-red" 15 | :added "https://img.shields.io/badge/Added-green" 16 | :modified "https://img.shields.io/badge/Modified-blue"}) 17 | 18 | (defn ver-string 19 | "Creates a version string from a map of :from and :to version data. 20 | 21 | Handles the case where only :to or :from is precent (because of adding/removing a dependency)." 22 | [{:keys [from to] :as ver}] 23 | (cond 24 | (and (some? from) (some? to)) (str (make-ver from) " -> " (make-ver to)) 25 | (some? to) (make-ver to) 26 | (some? from) (make-ver from))) 27 | 28 | (defn make-row [operation [dep ver]] 29 | (str "| ![](" (get assets-url operation) ") | `" dep "` | " (ver-string ver) " |")) 30 | 31 | (defn markdown 32 | [{:keys [removed added modified]}] 33 | (let [table-header ["| Operation | Artifact | Version |" 34 | "| --------- | --------- | ------- |"] 35 | lines (concat 36 | table-header 37 | (map #(make-row :removed %) removed) 38 | (map #(make-row :added %) added) 39 | (map #(make-row :modified %) modified))] 40 | (println (str/join "\n" lines)))) 41 | 42 | (defn equal? [{:keys [removed added modified]}] 43 | (and (empty? removed) 44 | (empty? added) 45 | (empty? modified))) 46 | 47 | (defn cli [{:keys [removed added modified] :as data}] 48 | (if (equal? data) 49 | (println "No changes detected.") 50 | (do 51 | (run! (fn [[name ver]] 52 | (ansi/pcompose 53 | [{:font :red 54 | :width 10} "Removed"] 55 | " " 56 | [{:font :white 57 | :width 60 58 | :pad :right} 59 | name 60 | " "] 61 | [:yellow 62 | (ver-string ver)])) 63 | removed) 64 | 65 | (run! (fn [[name ver]] 66 | (ansi/pcompose 67 | [{:font :green 68 | :width 10} "Added"] 69 | " " 70 | [{:font :white 71 | :width 60 72 | :pad :right} 73 | name 74 | " "] 75 | [:yellow 76 | (ver-string ver)])) 77 | added) 78 | 79 | (run! (fn [[name ver]] 80 | (ansi/pcompose 81 | [{:font :blue 82 | :width 10} "Modified"] 83 | " " 84 | [{:font :white 85 | :width 60 86 | :pad :right} 87 | name 88 | " "] 89 | [:yellow 90 | (ver-string ver)])) 91 | modified)))) 92 | 93 | (comment 94 | (do (ansi/pcompose 95 | [{:font :white 96 | :width 80} "org.codehaus.plexus/plexus-sec-dispatcher" 97 | " "] 98 | [{:font :red 99 | :width 8 100 | :pad :right} "Removed"] 101 | " " 102 | [{:font :yellow} 103 | "1.0.0"]) 104 | (ansi/pcompose 105 | [{:font :white 106 | :width 80} "org.ow2.asm/asm" 107 | " "] 108 | [{:font :green 109 | :width 8 110 | :pad :right} "Added"] 111 | " " 112 | [{:font :yellow} 113 | "1.2.3.4"]) 114 | (ansi/pcompose 115 | [{:font :white 116 | :width 80} "org.eclipse.jetty/jetty-client" 117 | " "] 118 | [{:font :blue 119 | :width 8 120 | :pad :right} "Modified"] 121 | " " 122 | [{:font :yellow} 123 | "1.0 -> 2.0"]))) 124 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deps-diff 2 | 3 | A tool for comparing transitive dependencies in two deps.edn files. 4 | 5 | Certainly, the Clojure ecosystem does not strictly follow SemVer ([Spec-ulation](https://www.youtube.com/watch?v=oyLBGkS5ICk&t=2789s)), 6 | and if there are no concrete benefits, it is recommended not to update dependencies. 7 | However, when it becomes necessary to replace an artifact, you need to be extremely careful, 8 | especially when implicit transitive dependencies change, as compatibility issues may arise. 9 | 10 | For example, consider the following dependency tree: 11 | 12 | ``` 13 | +-----+ +--------+ +--------+ 14 | | A | --> | B(1.0) | --> | C(1.0) | 15 | +-----+ +--------+ +--------+ 16 | \ +--------+ +--------+ 17 | +--> | D(1.0) | --> | C(1.0) | 18 | +--------+ +--------+ 19 | ``` 20 | 21 | Let's assume a situation where we need to update dependency B: 22 | 23 | ``` 24 | +-----+ +--------+ +--------+ 25 | | A | --> | B(2.0) | --> | C(2.0) | 26 | +-----+ +--------+ +--------+ 27 | \ +--------+ +--------+ 28 | +--> | D(1.0) | --> | C(1.0) | 29 | +--------+ +--------+ 30 | ``` 31 | 32 | In this scenario, B internally updated C to 2.0. If we haven't explicitly specified the version of C, 33 | there is no way to guarantee that D will work correctly (See [Dep selection](https://clojure.org/reference/dep_expansion#_dep_selection)). 34 | 35 | But it's good to know that such potential risks can be detected in advance. 36 | `deps-diff` is a GitHub Action created for this purpose. 37 | 38 | 39 | ## Example 40 | 41 | Just create a `.github/workflows/deps-diff.yml` file as follows. 42 | 43 | ```yml 44 | name: Notify dependency diff 45 | 46 | on: 47 | pull_request: 48 | paths: 49 | - 'deps.edn' # only watch this 50 | 51 | jobs: 52 | notify: 53 | runs-on: ubuntu-latest 54 | steps: 55 | - name: Diff dependencies 56 | id: diff 57 | uses: namenu/deps-diff@main 58 | with: 59 | format: markdown 60 | aliases: "[:test]" 61 | 62 | - uses: marocchino/sticky-pull-request-comment@v2 63 | if: ${{ steps.diff.outputs.exit_code != 0 }} 64 | with: 65 | header: deps-diff # Creates a collapsed comment with the report 66 | message: | 67 | ### `deps.edn` dependency changes 68 | 69 | ${{ steps.diff.outputs.deps_diff }} 70 | ``` 71 | 72 | This workflow will comment on your PR as shown below. 73 | 74 | 75 | 76 | 77 | ## Inputs 78 | 79 | | Name | Description | Default Value | 80 | |-------------|------------------------------------------------------------------------------------------------------------------------------|-----------------------------| 81 | | `base` | The git sha before the change being referenced. The default value is the git ref of the base branch of the PR. | Git ref of PR's base branch | 82 | | `format` | Determines the format of the output. You can specify `edn`, `markdown`, or `cli`. The default value is edn | `edn` | 83 | | `aliases` | Specifies the aliases to be used when forming the basis. It must be expressed as a quoted sequence (e.g., `'[:dev :test]'`). | `nil` | 84 | | `project` | Specifies the path of the `deps.edn` file. | `deps.edn` | 85 | 86 | 87 | ## Outputs 88 | 89 | - `deps_diff` - The name of the outlet where the execution result is output. Use it along with the action's id in your workflow. 90 | - `exit_code` - 0 if equal or else 1. 91 | 92 | 93 | ## Run as a tool 94 | 95 | ```bash 96 | # install 97 | clojure -Ttools install-latest :lib io.github.namenu/deps-diff :as deps-diff` 98 | 99 | # resolve deps before changes 100 | clojure -X:deps tree :dir '"./before"' > __before.edn 101 | # resolve deps after changes 102 | clojure -X:deps tree :dir '"./after"' > __after.edn 103 | 104 | # then compare 105 | clojure -Tdeps-diff diff :base '"__before.edn"' :target '"__after.edn"' :format :cli 106 | 107 | # output will be like this 108 | 109 | Modified org.clojure/spec.alpha 0.2.194 -> 0.3.218 110 | Modified com.github.seancorfield/next.jdbc 1.2.796 -> 1.3.847 111 | Modified org.clojure/core.specs.alpha 0.2.56 -> 0.2.62 112 | Modified camel-snake-kebab/camel-snake-kebab 0.4.2 -> 0.4.3 113 | Modified org.clojure/clojure 1.10.3 -> 1.11.1 114 | ``` 115 | 116 | -------------------------------------------------------------------------------- /test-resources/__base.edn: -------------------------------------------------------------------------------- 1 | {:children 2 | {org.clojure/clojure 3 | {:path [], 4 | :coord {:mvn/version "1.10.3", :deps/manifest :mvn}, 5 | :children 6 | #:org.clojure{spec.alpha 7 | {:path [org.clojure/clojure], 8 | :lib org.clojure/spec.alpha, 9 | :coord {:mvn/version "0.2.194", :deps/manifest :mvn}, 10 | :orig-coord #:mvn{:version "0.2.194"}, 11 | :coord-id #:mvn{:version "0.2.194"}, 12 | :include true, 13 | :reason :new-dep, 14 | :step 2}, 15 | core.specs.alpha 16 | {:path [org.clojure/clojure], 17 | :lib org.clojure/core.specs.alpha, 18 | :coord {:mvn/version "0.2.56", :deps/manifest :mvn}, 19 | :orig-coord #:mvn{:version "0.2.56"}, 20 | :coord-id #:mvn{:version "0.2.56"}, 21 | :include true, 22 | :reason :new-dep, 23 | :step 3}}, 24 | :orig-coord #:mvn{:version "1.10.3"}, 25 | :include true, 26 | :reason :new-top-dep, 27 | :lib org.clojure/clojure, 28 | :coord-id #:mvn{:version "1.10.3"}, 29 | :step 0}, 30 | poly/core-api 31 | {:path [], 32 | :coord 33 | {:local/root 34 | "/Users/namenu/Development/deps-diff/test-resources/base/brick", 35 | :deps/manifest :deps, 36 | :deps/root 37 | "/Users/namenu/Development/deps-diff/test-resources/base/brick"}, 38 | :children 39 | {org.clojure/clojure 40 | {:path [poly/core-api], 41 | :lib org.clojure/clojure, 42 | :coord {:mvn/version "1.11.1", :deps/manifest :mvn}, 43 | :orig-coord #:mvn{:version "1.11.1"}, 44 | :coord-id #:mvn{:version "1.11.1"}, 45 | :include false, 46 | :reason :use-top, 47 | :step 4}, 48 | com.github.seancorfield/next.jdbc 49 | {:path [poly/core-api], 50 | :coord {:mvn/version "1.2.796", :deps/manifest :mvn}, 51 | :children 52 | {org.clojure/clojure 53 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 54 | :lib org.clojure/clojure, 55 | :coord {:mvn/version "1.10.3", :deps/manifest :mvn}, 56 | :orig-coord #:mvn{:version "1.10.3"}, 57 | :coord-id #:mvn{:version "1.10.3"}, 58 | :include false, 59 | :reason :use-top, 60 | :step 6}, 61 | org.clojure/java.data 62 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 63 | :coord {:mvn/version "1.0.95", :deps/manifest :mvn}, 64 | :children 65 | #:org.clojure{tools.logging 66 | {:path 67 | [poly/core-api 68 | com.github.seancorfield/next.jdbc 69 | org.clojure/java.data], 70 | :coord 71 | {:mvn/version "1.2.1", :deps/manifest :mvn}, 72 | :children 73 | #:org.clojure{clojure 74 | {:path 75 | [poly/core-api 76 | com.github.seancorfield/next.jdbc 77 | org.clojure/java.data 78 | org.clojure/tools.logging], 79 | :lib org.clojure/clojure, 80 | :coord 81 | {:mvn/version "1.8.0", 82 | :deps/manifest :mvn}, 83 | :orig-coord 84 | #:mvn{:version "1.8.0"}, 85 | :coord-id #:mvn{:version "1.8.0"}, 86 | :include false, 87 | :reason :use-top, 88 | :step 11}}, 89 | :orig-coord #:mvn{:version "1.2.1"}, 90 | :include true, 91 | :reason :new-dep, 92 | :lib org.clojure/tools.logging, 93 | :coord-id #:mvn{:version "1.2.1"}, 94 | :step 9}, 95 | clojure 96 | {:path 97 | [poly/core-api 98 | com.github.seancorfield/next.jdbc 99 | org.clojure/java.data], 100 | :lib org.clojure/clojure, 101 | :coord 102 | {:mvn/version "1.8.0", :deps/manifest :mvn}, 103 | :orig-coord #:mvn{:version "1.8.0"}, 104 | :coord-id #:mvn{:version "1.8.0"}, 105 | :include false, 106 | :reason :use-top, 107 | :step 10}}, 108 | :orig-coord #:mvn{:version "1.0.95"}, 109 | :include true, 110 | :reason :new-dep, 111 | :lib org.clojure/java.data, 112 | :coord-id #:mvn{:version "1.0.95"}, 113 | :step 7}, 114 | camel-snake-kebab/camel-snake-kebab 115 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 116 | :lib camel-snake-kebab/camel-snake-kebab, 117 | :coord {:mvn/version "0.4.2", :deps/manifest :mvn}, 118 | :orig-coord #:mvn{:version "0.4.2"}, 119 | :coord-id #:mvn{:version "0.4.2"}, 120 | :include true, 121 | :reason :new-dep, 122 | :step 8}}, 123 | :orig-coord #:mvn{:version "1.2.796"}, 124 | :include true, 125 | :reason :new-dep, 126 | :lib com.github.seancorfield/next.jdbc, 127 | :coord-id #:mvn{:version "1.2.796"}, 128 | :step 5}}, 129 | :orig-coord 130 | #:local{:root 131 | "/Users/namenu/Development/deps-diff/test-resources/base/brick"}, 132 | :include true, 133 | :reason :new-top-dep, 134 | :lib poly/core-api, 135 | :coord-id 136 | {:lib poly/core-api, 137 | :root 138 | "/Users/namenu/Development/deps-diff/test-resources/base/brick"}, 139 | :step 1}}} 140 | -------------------------------------------------------------------------------- /test-resources/__target.edn: -------------------------------------------------------------------------------- 1 | {:children 2 | {org.clojure/clojure 3 | {:path [], 4 | :coord {:mvn/version "1.11.1", :deps/manifest :mvn}, 5 | :children 6 | #:org.clojure{spec.alpha 7 | {:path [org.clojure/clojure], 8 | :lib org.clojure/spec.alpha, 9 | :coord {:mvn/version "0.3.218", :deps/manifest :mvn}, 10 | :orig-coord #:mvn{:version "0.3.218"}, 11 | :coord-id #:mvn{:version "0.3.218"}, 12 | :include true, 13 | :reason :new-dep, 14 | :step 2}, 15 | core.specs.alpha 16 | {:path [org.clojure/clojure], 17 | :lib org.clojure/core.specs.alpha, 18 | :coord {:mvn/version "0.2.62", :deps/manifest :mvn}, 19 | :orig-coord #:mvn{:version "0.2.62"}, 20 | :coord-id #:mvn{:version "0.2.62"}, 21 | :include true, 22 | :reason :new-dep, 23 | :step 3}}, 24 | :orig-coord #:mvn{:version "1.11.1"}, 25 | :include true, 26 | :reason :new-top-dep, 27 | :lib org.clojure/clojure, 28 | :coord-id #:mvn{:version "1.11.1"}, 29 | :step 0}, 30 | poly/core-api 31 | {:path [], 32 | :coord 33 | {:local/root 34 | "/Users/namenu/Development/deps-diff/test-resources/target/brick", 35 | :deps/manifest :deps, 36 | :deps/root 37 | "/Users/namenu/Development/deps-diff/test-resources/target/brick"}, 38 | :children 39 | {org.clojure/clojure 40 | {:path [poly/core-api], 41 | :lib org.clojure/clojure, 42 | :coord {:mvn/version "1.11.1", :deps/manifest :mvn}, 43 | :orig-coord #:mvn{:version "1.11.1"}, 44 | :coord-id #:mvn{:version "1.11.1"}, 45 | :include false, 46 | :reason :use-top, 47 | :step 4}, 48 | com.github.seancorfield/next.jdbc 49 | {:path [poly/core-api], 50 | :coord {:mvn/version "1.3.847", :deps/manifest :mvn}, 51 | :children 52 | {org.clojure/clojure 53 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 54 | :lib org.clojure/clojure, 55 | :coord {:mvn/version "1.11.1", :deps/manifest :mvn}, 56 | :orig-coord #:mvn{:version "1.11.1"}, 57 | :coord-id #:mvn{:version "1.11.1"}, 58 | :include false, 59 | :reason :use-top, 60 | :step 6}, 61 | org.clojure/java.data 62 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 63 | :coord {:mvn/version "1.0.95", :deps/manifest :mvn}, 64 | :children 65 | #:org.clojure{tools.logging 66 | {:path 67 | [poly/core-api 68 | com.github.seancorfield/next.jdbc 69 | org.clojure/java.data], 70 | :coord 71 | {:mvn/version "1.2.1", :deps/manifest :mvn}, 72 | :children 73 | #:org.clojure{clojure 74 | {:path 75 | [poly/core-api 76 | com.github.seancorfield/next.jdbc 77 | org.clojure/java.data 78 | org.clojure/tools.logging], 79 | :lib org.clojure/clojure, 80 | :coord 81 | {:mvn/version "1.8.0", 82 | :deps/manifest :mvn}, 83 | :orig-coord 84 | #:mvn{:version "1.8.0"}, 85 | :coord-id #:mvn{:version "1.8.0"}, 86 | :include false, 87 | :reason :use-top, 88 | :step 11}}, 89 | :orig-coord #:mvn{:version "1.2.1"}, 90 | :include true, 91 | :reason :new-dep, 92 | :lib org.clojure/tools.logging, 93 | :coord-id #:mvn{:version "1.2.1"}, 94 | :step 9}, 95 | clojure 96 | {:path 97 | [poly/core-api 98 | com.github.seancorfield/next.jdbc 99 | org.clojure/java.data], 100 | :lib org.clojure/clojure, 101 | :coord 102 | {:mvn/version "1.8.0", :deps/manifest :mvn}, 103 | :orig-coord #:mvn{:version "1.8.0"}, 104 | :coord-id #:mvn{:version "1.8.0"}, 105 | :include false, 106 | :reason :use-top, 107 | :step 10}}, 108 | :orig-coord #:mvn{:version "1.0.95"}, 109 | :include true, 110 | :reason :new-dep, 111 | :lib org.clojure/java.data, 112 | :coord-id #:mvn{:version "1.0.95"}, 113 | :step 7}, 114 | camel-snake-kebab/camel-snake-kebab 115 | {:path [poly/core-api com.github.seancorfield/next.jdbc], 116 | :lib camel-snake-kebab/camel-snake-kebab, 117 | :coord {:mvn/version "0.4.3", :deps/manifest :mvn}, 118 | :orig-coord #:mvn{:version "0.4.3"}, 119 | :coord-id #:mvn{:version "0.4.3"}, 120 | :include true, 121 | :reason :new-dep, 122 | :step 8}}, 123 | :orig-coord #:mvn{:version "1.3.847"}, 124 | :include true, 125 | :reason :new-dep, 126 | :lib com.github.seancorfield/next.jdbc, 127 | :coord-id #:mvn{:version "1.3.847"}, 128 | :step 5}}, 129 | :orig-coord 130 | #:local{:root 131 | "/Users/namenu/Development/deps-diff/test-resources/target/brick"}, 132 | :include true, 133 | :reason :new-top-dep, 134 | :lib poly/core-api, 135 | :coord-id 136 | {:lib poly/core-api, 137 | :root 138 | "/Users/namenu/Development/deps-diff/test-resources/target/brick"}, 139 | :step 1}}} 140 | --------------------------------------------------------------------------------