From edecf87b67b1e9f049a6ec981a8e4fd6d2483bb0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 25 Dec 2019 16:14:28 +0100 Subject: [PATCH] [#194] *command-line-args* should be nil instead of empty list when no args are provided --- src/babashka/main.clj | 139 ++++++++++++++++++------------------ test/babashka/main_test.clj | 18 +++-- 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 9a823a95..51e9b983 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -34,77 +34,78 @@ (defn parse-opts [options] (let [opts (loop [options options opts-map {}] - (if-let [opt (first options)] - (case opt - ("--version") {:version true} - ("--help" "-h" "-?") {:help? true} - ("--verbose")(recur (rest options) + (if options + (let [opt (first options)] + (case opt + ("--version") {:version true} + ("--help" "-h" "-?") {:help? true} + ("--verbose")(recur (next options) + (assoc opts-map + :verbose? true)) + ("--stream") (recur (next options) + (assoc opts-map + :stream? true)) + ("--time") (recur (next options) (assoc opts-map - :verbose? true)) - ("--stream") (recur (rest options) - (assoc opts-map - :stream? true)) - ("--time") (recur (rest options) - (assoc opts-map - :time? true)) - ("-i") (recur (rest options) - (assoc opts-map - :shell-in true)) - ("-I") (recur (rest options) - (assoc opts-map - :edn-in true)) - ("-o") (recur (rest options) - (assoc opts-map - :shell-out true)) - ("-O") (recur (rest options) - (assoc opts-map - :edn-out true)) - ("-io") (recur (rest options) - (assoc opts-map - :shell-in true - :shell-out true)) - ("-IO") (recur (rest options) - (assoc opts-map - :edn-in true - :edn-out true)) - ("-f" "--file") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map - :file (first options)))) - ("--repl") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map - :repl true))) - ("--socket-repl") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map - :socket-repl (first options)))) - ("--eval", "-e") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map :expression (first options)))) - ("--classpath", "-cp") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map :classpath (first options)))) - ("--main", "-m") - (let [options (rest options)] - (recur (rest options) - (assoc opts-map :main (first options)))) - (if (some opts-map [:file :socket-repl :expression :main]) - (assoc opts-map - :command-line-args options) - (if (and (not= \( (first (str/trim opt))) - (.exists (io/file opt))) + :time? true)) + ("-i") (recur (next options) + (assoc opts-map + :shell-in true)) + ("-I") (recur (next options) + (assoc opts-map + :edn-in true)) + ("-o") (recur (next options) + (assoc opts-map + :shell-out true)) + ("-O") (recur (next options) + (assoc opts-map + :edn-out true)) + ("-io") (recur (next options) + (assoc opts-map + :shell-in true + :shell-out true)) + ("-IO") (recur (next options) + (assoc opts-map + :edn-in true + :edn-out true)) + ("-f" "--file") + (let [options (next options)] + (recur (next options) + (assoc opts-map + :file (first options)))) + ("--repl") + (let [options (next options)] + (recur (next options) + (assoc opts-map + :repl true))) + ("--socket-repl") + (let [options (next options)] + (recur (next options) + (assoc opts-map + :socket-repl (first options)))) + ("--eval", "-e") + (let [options (next options)] + (recur (next options) + (assoc opts-map :expression (first options)))) + ("--classpath", "-cp") + (let [options (next options)] + (recur (next options) + (assoc opts-map :classpath (first options)))) + ("--main", "-m") + (let [options (next options)] + (recur (next options) + (assoc opts-map :main (first options)))) + (if (some opts-map [:file :socket-repl :expression :main]) (assoc opts-map - :file opt - :command-line-args (rest options)) - (assoc opts-map - :expression opt - :command-line-args (rest options))))) + :command-line-args options) + (if (and (not= \( (first (str/trim opt))) + (.exists (io/file opt))) + (assoc opts-map + :file opt + :command-line-args (next options)) + (assoc opts-map + :expression opt + :command-line-args (next options)))))) opts-map))] opts)) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 374a1af7..53f5d303 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -21,15 +21,15 @@ (testing "distinguish automatically between expression or file name" (is (= {:expression "(println 123)" - :command-line-args []} + :command-line-args nil} (main/parse-opts ["(println 123)"]))) (is (= {:file "src/babashka/main.clj" - :command-line-args []} + :command-line-args nil} (main/parse-opts ["src/babashka/main.clj"]))) (is (= {:expression "does-not-exist" - :command-line-args []} + :command-line-args nil} (main/parse-opts ["does-not-exist"]))))) (deftest main-test @@ -318,10 +318,14 @@ (defn foo [] (println \"foo!\")) (with-out-str (with-in-str \"(foo)\" - (clojure.main/repl :init (fn []) :prompt (fn [] (print \"> \")))))"))) + (clojure.main/repl :init (fn []) :prompt (fn [] (print \"> \")))))")))) + +(deftest command-line-args-test + (is (true? (bb nil "(nil? *command-line-args*)"))) + (is (= ["1" "2" "3"] (bb nil "*command-line-args*" "1" "2" "3")))) ;;;; Scratch - (comment - (dotimes [_ 10] (wait-for-port-test)) - )) +(comment + (dotimes [_ 10] (wait-for-port-test)) + )