diff --git a/.clj-kondo/babashka/fs/config.edn b/.clj-kondo/babashka/fs/config.edn deleted file mode 100644 index 23f3609..0000000 --- a/.clj-kondo/babashka/fs/config.edn +++ /dev/null @@ -1 +0,0 @@ -{:lint-as {babashka.fs/with-temp-dir clojure.core/let}} diff --git a/.clj-kondo/imports/babashka/fs/babashka/fs.clj_kondo b/.clj-kondo/imports/babashka/fs/babashka/fs.clj_kondo new file mode 100644 index 0000000..73d4409 --- /dev/null +++ b/.clj-kondo/imports/babashka/fs/babashka/fs.clj_kondo @@ -0,0 +1,36 @@ +(ns babashka.fs + (:require [clj-kondo.hooks-api :as api])) + +(defn- symbol-node? [node] + (and (api/token-node? node) + (symbol? (api/sexpr node)))) + +(defn with-temp-dir + [{:keys [node]}] + (let [args (rest (:children node)) + binding-like-vector (first args) + body (rest args)] + (when-not (zero? (count args)) ;; let clj-kondo report on arity + (if-not (api/vector-node? binding-like-vector) + (api/reg-finding! (assoc (meta binding-like-vector) + :message "babashka.fs/with-temp-dir requires a vector for first arg" + :type :babashka-fs/with-temp-dir-first-arg-not-vector)) + (let [[binding-sym options & rest-in-vec] (:children binding-like-vector)] + (when (not (symbol-node? binding-sym)) + (api/reg-finding! (assoc (meta (or binding-sym binding-like-vector)) + :message "babashka.fs/with-temp-dir vector arg requires binding-name symbol as first value" + :type :babashka-fs/with-temp-dir-vector-arg-needs-binding-symbol))) + (doseq [extra-vector-arg rest-in-vec] + (api/reg-finding! (assoc (meta extra-vector-arg) + :message "babashka.fs/with-temp-dir vector arg accepts at most 2 values" + :type :babashka-fs/with-temp-dir-vector-arg-extra-value))) + + (when binding-sym + {:node (api/list-node + ;; satisfy linter by creating binding for for binding-sym + (list* + (api/token-node 'let) + ;; it doesn't really matter what we bind to, so long as it is bound + (api/vector-node [binding-sym (api/token-node nil)]) + options ;; avoid unused binding when options is a binding + body))})))))) diff --git a/.clj-kondo/imports/babashka/fs/config.edn b/.clj-kondo/imports/babashka/fs/config.edn new file mode 100644 index 0000000..026ca7e --- /dev/null +++ b/.clj-kondo/imports/babashka/fs/config.edn @@ -0,0 +1,4 @@ +{:linters {:babashka-fs/with-temp-dir-first-arg-not-vector {:level :error} + :babashka-fs/with-temp-dir-vector-arg-needs-binding-symbol {:level :error} + :babashka-fs/with-temp-dir-vector-arg-extra-value {:level :error}} + :hooks {:analyze-call {babashka.fs/with-temp-dir babashka.fs/with-temp-dir}}} diff --git a/.clj-kondo/imports/babashka/sci/config.edn b/.clj-kondo/imports/babashka/sci/config.edn new file mode 100644 index 0000000..60ea30d --- /dev/null +++ b/.clj-kondo/imports/babashka/sci/config.edn @@ -0,0 +1 @@ +{:hooks {:macroexpand {sci.core/copy-ns sci.core/copy-ns}}} diff --git a/.clj-kondo/imports/babashka/sci/sci/core.clj b/.clj-kondo/imports/babashka/sci/sci/core.clj new file mode 100644 index 0000000..ac324ee --- /dev/null +++ b/.clj-kondo/imports/babashka/sci/sci/core.clj @@ -0,0 +1,9 @@ +(ns sci.core) + +(defmacro copy-ns + ([ns-sym sci-ns] + `(copy-ns ~ns-sym ~sci-ns nil)) + ([ns-sym sci-ns opts] + `[(quote ~ns-sym) + ~sci-ns + (quote ~opts)])) diff --git a/.clj-kondo/borkdude/deflet/borkdude/deflet.clj_kondo b/.clj-kondo/imports/borkdude/deflet/borkdude/deflet.clj_kondo similarity index 100% rename from .clj-kondo/borkdude/deflet/borkdude/deflet.clj_kondo rename to .clj-kondo/imports/borkdude/deflet/borkdude/deflet.clj_kondo diff --git a/.clj-kondo/borkdude/deflet/config.edn b/.clj-kondo/imports/borkdude/deflet/config.edn similarity index 100% rename from .clj-kondo/borkdude/deflet/config.edn rename to .clj-kondo/imports/borkdude/deflet/config.edn diff --git a/.clj-kondo/imports/http-kit/http-kit/config.edn b/.clj-kondo/imports/http-kit/http-kit/config.edn new file mode 100644 index 0000000..e9dbcd8 --- /dev/null +++ b/.clj-kondo/imports/http-kit/http-kit/config.edn @@ -0,0 +1,3 @@ + +{:hooks + {:analyze-call {org.httpkit.server/with-channel httpkit.with-channel/with-channel}}} diff --git a/.clj-kondo/imports/http-kit/http-kit/httpkit/with_channel.clj b/.clj-kondo/imports/http-kit/http-kit/httpkit/with_channel.clj new file mode 100644 index 0000000..b429de8 --- /dev/null +++ b/.clj-kondo/imports/http-kit/http-kit/httpkit/with_channel.clj @@ -0,0 +1,16 @@ +(ns httpkit.with-channel + (:require [clj-kondo.hooks-api :as api])) + +(defn with-channel [{node :node}] + (let [[request channel & body] (rest (:children node))] + (when-not (and request channel) (throw (ex-info "No request or channel provided" {}))) + (when-not (api/token-node? channel) (throw (ex-info "Missing channel argument" {}))) + (let [new-node + (api/list-node + (list* + (api/token-node 'let) + (api/vector-node [channel (api/vector-node [])]) + request + body))] + + {:node new-node}))) diff --git a/.clj-kondo/imports/rewrite-clj/rewrite-clj/config.edn b/.clj-kondo/imports/rewrite-clj/rewrite-clj/config.edn new file mode 100644 index 0000000..19ecae9 --- /dev/null +++ b/.clj-kondo/imports/rewrite-clj/rewrite-clj/config.edn @@ -0,0 +1,5 @@ +{:lint-as + {rewrite-clj.zip/subedit-> clojure.core/-> + rewrite-clj.zip/subedit->> clojure.core/->> + rewrite-clj.zip/edit-> clojure.core/-> + rewrite-clj.zip/edit->> clojure.core/->>}} diff --git a/.clj-kondo/imports/taoensso/encore/config.edn b/.clj-kondo/imports/taoensso/encore/config.edn new file mode 100644 index 0000000..975c943 --- /dev/null +++ b/.clj-kondo/imports/taoensso/encore/config.edn @@ -0,0 +1,7 @@ +{:hooks + {:analyze-call + {taoensso.encore/defalias taoensso.encore-hooks/defalias + taoensso.encore/defaliases taoensso.encore-hooks/defaliases + taoensso.encore/defn-cached taoensso.encore-hooks/defn-cached + taoensso.encore/defonce taoensso.encore-hooks/defonce + taoensso.encore/def* taoensso.encore-hooks/def*}}} diff --git a/.clj-kondo/imports/taoensso/encore/taoensso/encore_hooks.clj b/.clj-kondo/imports/taoensso/encore/taoensso/encore_hooks.clj new file mode 100644 index 0000000..d133f73 --- /dev/null +++ b/.clj-kondo/imports/taoensso/encore/taoensso/encore_hooks.clj @@ -0,0 +1,88 @@ +(ns taoensso.encore-hooks + "I don't personally use clj-kondo, so these hooks are + kindly authored and maintained by contributors. + PRs very welcome! - Peter Taoussanis" + (:refer-clojure :exclude [defonce]) + (:require + [clj-kondo.hooks-api :as hooks])) + +(defn defalias + [{:keys [node]}] + (let [[alias src-raw _attrs body] (rest (:children node)) + src (or src-raw alias) + sym (if src-raw (hooks/sexpr alias) (symbol (name (hooks/sexpr src))))] + {:node + (with-meta + (hooks/list-node + [(hooks/token-node 'def) + (hooks/token-node sym) + (if body + (hooks/list-node + ;; use :body in the def to avoid unused import/private var warnings + [(hooks/token-node 'or) body src]) + src)]) + (meta src))})) + +(defn defaliases + [{:keys [node]}] + (let [alias-nodes (rest (:children node))] + {:node + (hooks/list-node + (into + [(hooks/token-node 'do)] + (map + (fn alias->defalias [alias-node] + (cond + (hooks/token-node? alias-node) + (hooks/list-node + [(hooks/token-node 'taoensso.encore/defalias) + alias-node]) + + (hooks/map-node? alias-node) + (let [{:keys [src alias attrs body]} (hooks/sexpr alias-node) + ;; workaround as can't seem to (get) using a token-node + ;; and there's no update-keys (yet) in sci apparently + [& {:as node-as-map}] (:children alias-node) + {:keys [attrs body]} (zipmap (map hooks/sexpr (keys node-as-map)) + (vals node-as-map))] + (hooks/list-node + [(hooks/token-node 'taoensso.encore/defalias) + (or alias src) (hooks/token-node src) attrs body]))))) + alias-nodes))})) + +(defn defn-cached + [{:keys [node]}] + (let [[sym _opts binding-vec & body] (rest (:children node))] + {:node + (hooks/list-node + (list + (hooks/token-node 'def) + sym + (hooks/list-node + (list* + (hooks/token-node 'fn) + binding-vec + body))))})) + +(defn -def-impl + [{:keys [node]} core-macro-sym] + ;; args = [sym doc-string? attr-map? init-expr] + (let [[sym & args] (rest (:children node)) + [doc-string args] (if (and (hooks/string-node? (first args)) (next args)) [(hooks/sexpr (first args)) (next args)] [nil args]) + [attr-map init-expr] (if (and (hooks/map-node? (first args)) (next args)) [(hooks/sexpr (first args)) (fnext args)] [nil (first args)]) + + attr-map (if doc-string (assoc attr-map :doc doc-string) attr-map) + sym+meta (if attr-map (with-meta sym attr-map) sym) + + rewritten + (hooks/list-node + [(hooks/token-node core-macro-sym) + sym+meta + init-expr])] + + #_(println "old node:" node) + #_(println "new node:" rewritten) + {:node rewritten})) + +(defn def* [arg] (-def-impl arg 'def)) +(defn defonce [arg] (-def-impl arg 'clojure.core/defonce)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0cd4023..9cdc82d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,51 +13,52 @@ jobs: steps: - name: "Checkout code" - uses: "actions/checkout@v4" + uses: "actions/checkout@v6" - name: Prepare java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: - distribution: "adopt" + distribution: "zulu" java-version: ${{ matrix.java-version }} - name: "Restore Cache" - uses: "actions/cache@v4" + uses: "actions/cache@v5" with: path: "~/.m2/repository" key: "${{ runner.os }}-deps-${{ hashFiles('deps.edn') }}" restore-keys: "${{ runner.os }}-deps-" - name: Setup Clojure - uses: DeLaGuardo/setup-clojure@13.2 + uses: DeLaGuardo/setup-clojure@13.5 with: bb: latest - name: Run tests run: | - bb clojure -M:clj-1.10:test -i windows - bb clojure -M:clj-1.11:test -i windows + bb clojure -M:clj-1.10:test + bb clojure -M:clj-1.11:test + bb clojure -M:clj-1.12:test test-cljs: runs-on: ubuntu-latest steps: - name: "Checkout code" - uses: "actions/checkout@v4" + uses: "actions/checkout@v6" - name: Prepare java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: - distribution: "adopt" + distribution: "zulu" java-version: 21 - name: "Restore Cache" - uses: "actions/cache@v4" + uses: "actions/cache@v5" with: path: "~/.m2/repository" key: "${{ runner.os }}-deps-${{ hashFiles('deps.edn') }}" restore-keys: "${{ runner.os }}-deps-" - name: Setup Clojure - uses: DeLaGuardo/setup-clojure@13.2 + uses: DeLaGuardo/setup-clojure@13.5 with: bb: latest diff --git a/deps.edn b/deps.edn index 5194af9..234557f 100644 --- a/deps.edn +++ b/deps.edn @@ -2,30 +2,30 @@ :aliases {:repl {:extra-paths ["test"] - :extra-deps {babashka/fs {:mvn/version "0.1.11"}}} + :extra-deps {babashka/fs {:mvn/version "0.5.32"}}} :test ;; added by neil {:extra-paths ["test"] :extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"} - babashka/fs {:mvn/version "0.1.11"} + babashka/fs {:mvn/version "0.5.32"} io.github.borkdude/deflet {:mvn/version "0.1.0"}} :exec-args {:cmd "bb test"} :main-opts ["-m" "babashka.cli.exec"] :exec-fn babashka.test-runner/test #_cognitect.test-runner.api/test} :build ;; added by neil - {:deps {io.github.clojure/tools.build {:mvn/version "0.10.8"} + {:deps {io.github.clojure/tools.build {:mvn/version "0.10.13"} slipset/deps-deploy {:mvn/version "0.2.0"}} :extra-paths ["." ".build"] :ns-default build :main-opts ["-m" "babashka.cli.exec"]} - :clj-1.9 {:extra-deps {org.clojure/clojure {:mvn/version "1.9.0"}}} :clj-1.10 {:extra-deps {org.clojure/clojure {:mvn/version "1.10.3"}}} - :clj-1.11 {:extra-deps {org.clojure/clojure {:mvn/version "1.11.1"}}} + :clj-1.11 {:extra-deps {org.clojure/clojure {:mvn/version "1.11.4"}}} + :clj-1.12 {:extra-deps {org.clojure/clojure {:mvn/version "1.12.4"}}} :cljs-test - {:extra-deps {olical/cljs-test-runner {:mvn/version "3.7.0"} + {:extra-deps {olical/cljs-test-runner {:mvn/version "3.8.0"} org.clojure/clojurescript {:mvn/version "1.12.134"}} :extra-paths ["test" "cljs-test-runner-out/gen"] :main-opts ["-m" "cljs-test-runner.main" "-d" "test"]}}} diff --git a/test/babashka/cli/exec_test.clj b/test/babashka/cli/exec_test.clj index 4411637..c7eaced 100644 --- a/test/babashka/cli/exec_test.clj +++ b/test/babashka/cli/exec_test.clj @@ -2,6 +2,7 @@ {:org.babashka/cli {:exec-args {:foo :bar}}} (:require [babashka.cli-test :refer [submap?]] + [babashka.cli.test-report] [babashka.cli.exec :refer [main]] [babashka.fs :as fs] [clojure.edn :as edn] diff --git a/test/babashka/cli/test_report.cljc b/test/babashka/cli/test_report.cljc new file mode 100644 index 0000000..8609522 --- /dev/null +++ b/test/babashka/cli/test_report.cljc @@ -0,0 +1,15 @@ +(ns babashka.cli.test-report + (:require [clojure.test :as test])) + +(def platform + #?(:bb (str "bb " (System/getProperty "babashka.version")) + :cljs (str "cljs " *clojurescript-version*) + :clj (str "jdk " (System/getProperty "java.version") " clj " (clojure-version)))) + +(defmethod test/report + #?@(:cljs [[:cljs.test/default :begin-test-var]] + :default [:begin-test-var]) [m] + (let [test-name (-> m :var meta :name) + line (str "=== " test-name " [" platform "]")] + #?(:cljs (js/process.stdout.write (str line "\n")) + :default (println line)))) diff --git a/test/babashka/cli_test.cljc b/test/babashka/cli_test.cljc index b3dd800..9cca8d3 100644 --- a/test/babashka/cli_test.cljc +++ b/test/babashka/cli_test.cljc @@ -1,6 +1,7 @@ (ns babashka.cli-test (:require [babashka.cli :as cli] + [babashka.cli.test-report] [clojure.string :as str] [clojure.test :refer [deftest is testing]] [borkdude.deflet :as d]