From 842ff347391adabece623e4fb3f30297c848acdc Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Wed, 23 Mar 2022 09:57:56 -0600 Subject: [PATCH] Fix tests, remove accidental babashka code dependency, & add CI config (#45) * Update clojure CLI flags in script/test * Throw error when not one of version or path ...with qualified symbol pod-spec * Fix some minor formatting issues * Check for new error message in pod-registry test * Add a test for resolve fn in edn data readers * Add CI config * Try using clojure tools-deps image in CI * Check for new error message in sci pod-registry test * Use latest version of buddy in pod-registry test ...for more platform support * Stop depending on babashka Instead accept an arg for the thing we were getting from it (location of the bb.edn file) * Save maven deps in cache in CI --- .circleci/config.yml | 28 ++++++++++++++++++++ script/test | 17 ++++++------ src/babashka/pods/impl.clj | 5 ++++ src/babashka/pods/jvm.clj | 2 +- src/babashka/pods/sci.clj | 44 +++++++++++++++++--------------- test-pod/pod/test_pod.clj | 2 +- test-resources/pod_registry.clj | 4 +-- test/babashka/pods/impl_test.clj | 11 ++++++++ test/babashka/pods/jvm_test.clj | 2 +- test/babashka/pods/sci_test.clj | 2 +- 10 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 test/babashka/pods/impl_test.clj diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..56e2563 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,28 @@ +version: 2.1 +jobs: + test: + docker: + - image: clojure:openjdk-11-tools-deps-1.10.3.1087-slim-bullseye + working_directory: ~/repo + environment: + LEIN_ROOT: "true" + BABASHKA_PLATFORM: linux + resource_class: large + steps: + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "deps.edn" }} + # fallback to using latest cache if no exact match is found + - v1-dependencies- + - run: | + script/test + - save_cache: + paths: + - ~/.m2 + key: v1-dependencies-{{ checksum "deps.edn" }} +workflows: + version: 2 + ci: + jobs: + - test \ No newline at end of file diff --git a/script/test b/script/test index d8c5944..72dc5c7 100755 --- a/script/test +++ b/script/test @@ -8,24 +8,25 @@ export BABASHKA_POD_TEST_SOCKET # format = edn BABASHKA_POD_TEST_FORMAT=edn echo "Testing edn" -clojure -A:test -n babashka.pods.jvm-test -clojure -A:sci:test -n babashka.pods.sci-test +clojure -M:test -n babashka.pods.jvm-test +clojure -M:sci:test -n babashka.pods.sci-test +clojure -M:test -n babashka.pods.impl-test # format = json BABASHKA_POD_TEST_FORMAT=json echo "Testing json" -clojure -A:test -n babashka.pods.jvm-test -clojure -A:sci:test -n babashka.pods.sci-test +clojure -M:test -n babashka.pods.jvm-test +clojure -M:sci:test -n babashka.pods.sci-test # format = json BABASHKA_POD_TEST_FORMAT="transit+json" echo "Testing transit" -clojure -A:test -n babashka.pods.jvm-test -clojure -A:sci:test -n babashka.pods.sci-test +clojure -M:test -n babashka.pods.jvm-test +clojure -M:sci:test -n babashka.pods.sci-test # socket = true unset BABASHKA_POD_TEST_FORMAT BABASHKA_POD_TEST_SOCKET=true echo "Testing socket" -clojure -A:test -n babashka.pods.jvm-test -clojure -A:sci:test -n babashka.pods.sci-test +clojure -M:test -n babashka.pods.jvm-test +clojure -M:sci:test -n babashka.pods.sci-test diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index 4c4312b..f4f9820 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -315,6 +315,11 @@ (println (str/join " " (map pr-str strs))))) (defn resolve-pod [pod-spec {:keys [:version :path :force] :as opts}] + (when (qualified-symbol? pod-spec) + (when (and (not version) (not path)) + (throw (IllegalArgumentException. "Version or path must be provided"))) + (when (and version path) + (throw (IllegalArgumentException. "You must provide either version or path, not both")))) (let [resolved (when (and (qualified-symbol? pod-spec) version) (resolver/resolve pod-spec version force)) opts (if resolved diff --git a/src/babashka/pods/jvm.clj b/src/babashka/pods/jvm.clj index b60c36e..87be27b 100644 --- a/src/babashka/pods/jvm.clj +++ b/src/babashka/pods/jvm.clj @@ -6,7 +6,7 @@ (defn- unroot-resource [^String path] (symbol (.. path (substring 1) - (replace \/ \. ) + (replace \/ \.) (replace \_ \-)))) (defn- process-namespace [{:keys [:name :vars]}] diff --git a/src/babashka/pods/sci.clj b/src/babashka/pods/sci.clj index ad0fea8..3965392 100644 --- a/src/babashka/pods/sci.clj +++ b/src/babashka/pods/sci.clj @@ -2,8 +2,7 @@ (:require [babashka.pods.impl :as impl] [sci.core :as sci] [clojure.java.io :as io] - [babashka.pods.impl.resolver :as resolver] - [babashka.impl.common :as common]) + [babashka.pods.impl.resolver :as resolver]) (:import (java.io PushbackInputStream File))) (set! *warn-on-reflection* true) @@ -25,44 +24,47 @@ (string? var-value) (sci/eval-string* ctx var-value)))))) -(defn metadata-cache-file ^File [pod-spec {:keys [:version :path]}] +(defn metadata-cache-file ^File [^File bb-edn-file pod-spec {:keys [:version :path]}] (if version (io/file (resolver/cache-dir {:pod/name pod-spec :pod/version version}) "metadata.cache") - (let [bb-edn-file (-> @common/bb-edn :file io/file) - config-dir (.getParentFile bb-edn-file) + (let [config-dir (.getParentFile bb-edn-file) cache-dir (io/file config-dir ".babashka") pod-file (-> path io/file .getName) cache-file (io/file cache-dir (str pod-file ".metadata.cache"))] cache-file))) -(defn load-metadata-from-cache [pod-spec opts] - (let [cache-file (metadata-cache-file pod-spec opts)] +(defn load-metadata-from-cache [bb-edn-file pod-spec opts] + (let [cache-file (metadata-cache-file bb-edn-file pod-spec opts)] (when (.exists cache-file) (with-open [r (PushbackInputStream. (io/input-stream cache-file))] (impl/read r))))) -(defn load-pod-metadata* [pod-spec {:keys [:version :cache] :as opts}] +(defn load-pod-metadata* [bb-edn-file pod-spec {:keys [:version :cache] :as opts}] (let [metadata (impl/load-pod-metadata pod-spec opts) - cache-file (when cache (metadata-cache-file pod-spec opts))] + cache-file (when cache (metadata-cache-file bb-edn-file pod-spec opts))] (when cache-file (io/make-parents cache-file) (with-open [w (io/output-stream cache-file)] (impl/write w metadata))) metadata)) -(defn load-pod-metadata [pod-spec {:keys [:cache] :as opts}] - (let [metadata - (if-let [cached-metadata (when cache - (load-metadata-from-cache pod-spec opts))] - cached-metadata - (load-pod-metadata* pod-spec opts))] - (reduce - (fn [pod-namespaces ns] - (let [ns-sym (-> ns (get "name") impl/bytes->string symbol)] - (assoc pod-namespaces ns-sym {:pod-spec pod-spec - :opts (assoc opts :metadata metadata)}))) - {} (get metadata "namespaces")))) +(defn load-pod-metadata + ([pod-spec opts] (load-pod-metadata nil pod-spec opts)) + ([bb-edn-file pod-spec {:keys [:cache] :as opts}] + (let [metadata + (if-let [cached-metadata (when cache + (load-metadata-from-cache bb-edn-file + pod-spec + opts))] + cached-metadata + (load-pod-metadata* bb-edn-file pod-spec opts))] + (reduce + (fn [pod-namespaces ns] + (let [ns-sym (-> ns (get "name") impl/bytes->string symbol)] + (assoc pod-namespaces ns-sym {:pod-spec pod-spec + :opts (assoc opts :metadata metadata)}))) + {} (get metadata "namespaces"))))) (defn load-pod ([ctx pod-spec] (load-pod ctx pod-spec nil)) diff --git a/test-pod/pod/test_pod.clj b/test-pod/pod/test_pod.clj index cc81ccd..8e483b5 100644 --- a/test-pod/pod/test_pod.clj +++ b/test-pod/pod/test_pod.clj @@ -270,6 +270,6 @@ (defn -main [& args] #_(binding [*out* *err*] - (prn :args args)) + (prn :args args)) (when (= "true" (System/getenv "BABASHKA_POD")) (run-pod (set args)))) diff --git a/test-resources/pod_registry.clj b/test-resources/pod_registry.clj index 9199173..f8ad437 100644 --- a/test-resources/pod_registry.clj +++ b/test-resources/pod_registry.clj @@ -1,6 +1,6 @@ (require '[babashka.pods :as pods]) -(pods/load-pod 'org.babashka/buddy "0.0.1") +(pods/load-pod 'org.babashka/buddy "0.1.0") (require '[pod.babashka.buddy.codecs :as codecs] '[pod.babashka.buddy.hash :as hash]) @@ -8,4 +8,4 @@ (println (-> (hash/sha256 "foobar") (codecs/bytes->hex))) -(pods/load-pod 'org.babashka/etaoin) ;; should cause error when version is missing +(pods/load-pod 'org.babashka/etaoin) ;; should cause error when version & path are missing diff --git a/test/babashka/pods/impl_test.clj b/test/babashka/pods/impl_test.clj new file mode 100644 index 0000000..6491ebf --- /dev/null +++ b/test/babashka/pods/impl_test.clj @@ -0,0 +1,11 @@ +(ns babashka.pods.impl-test + (:require [clojure.test :refer :all] + [babashka.pods.impl :refer :all])) + +(deftest load-pod-test + (testing "resolve fn gets called when pod has EDN data readers" + (let [resolved? (atom false) + test-resolve (fn [_sym] + (reset! resolved? true))] + (load-pod ["clojure" "-M:test-pod"] {:resolve test-resolve}) + (is @resolved?)))) diff --git a/test/babashka/pods/jvm_test.clj b/test/babashka/pods/jvm_test.clj index 48f3dfd..fae2e43 100644 --- a/test/babashka/pods/jvm_test.clj +++ b/test/babashka/pods/jvm_test.clj @@ -25,4 +25,4 @@ (catch Exception e e)))] (is (str/includes? (str out) "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2")) - (is (str/includes? (pr-str ex) "Version must be provided" )))) + (is (str/includes? (pr-str ex) "Version or path must be provided")))) diff --git a/test/babashka/pods/sci_test.clj b/test/babashka/pods/sci_test.clj index 4f14c10..793882b 100644 --- a/test/babashka/pods/sci_test.clj +++ b/test/babashka/pods/sci_test.clj @@ -36,4 +36,4 @@ (catch Exception e e)))] (is (str/includes? (str out) "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2")) - (is (str/includes? (pr-str ex) "Version must be provided" )))) + (is (str/includes? (pr-str ex) "Version or path must be provided"))))