[#194] *command-line-args* should be nil instead of empty list when no args are provided

This commit is contained in:
Michiel Borkent 2019-12-25 16:14:28 +01:00
parent 5ad851d2ed
commit edecf87b67
2 changed files with 81 additions and 76 deletions

View file

@ -34,65 +34,66 @@
(defn parse-opts [options] (defn parse-opts [options]
(let [opts (loop [options options (let [opts (loop [options options
opts-map {}] opts-map {}]
(if-let [opt (first options)] (if options
(let [opt (first options)]
(case opt (case opt
("--version") {:version true} ("--version") {:version true}
("--help" "-h" "-?") {:help? true} ("--help" "-h" "-?") {:help? true}
("--verbose")(recur (rest options) ("--verbose")(recur (next options)
(assoc opts-map (assoc opts-map
:verbose? true)) :verbose? true))
("--stream") (recur (rest options) ("--stream") (recur (next options)
(assoc opts-map (assoc opts-map
:stream? true)) :stream? true))
("--time") (recur (rest options) ("--time") (recur (next options)
(assoc opts-map (assoc opts-map
:time? true)) :time? true))
("-i") (recur (rest options) ("-i") (recur (next options)
(assoc opts-map (assoc opts-map
:shell-in true)) :shell-in true))
("-I") (recur (rest options) ("-I") (recur (next options)
(assoc opts-map (assoc opts-map
:edn-in true)) :edn-in true))
("-o") (recur (rest options) ("-o") (recur (next options)
(assoc opts-map (assoc opts-map
:shell-out true)) :shell-out true))
("-O") (recur (rest options) ("-O") (recur (next options)
(assoc opts-map (assoc opts-map
:edn-out true)) :edn-out true))
("-io") (recur (rest options) ("-io") (recur (next options)
(assoc opts-map (assoc opts-map
:shell-in true :shell-in true
:shell-out true)) :shell-out true))
("-IO") (recur (rest options) ("-IO") (recur (next options)
(assoc opts-map (assoc opts-map
:edn-in true :edn-in true
:edn-out true)) :edn-out true))
("-f" "--file") ("-f" "--file")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map (assoc opts-map
:file (first options)))) :file (first options))))
("--repl") ("--repl")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map (assoc opts-map
:repl true))) :repl true)))
("--socket-repl") ("--socket-repl")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map (assoc opts-map
:socket-repl (first options)))) :socket-repl (first options))))
("--eval", "-e") ("--eval", "-e")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map :expression (first options)))) (assoc opts-map :expression (first options))))
("--classpath", "-cp") ("--classpath", "-cp")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map :classpath (first options)))) (assoc opts-map :classpath (first options))))
("--main", "-m") ("--main", "-m")
(let [options (rest options)] (let [options (next options)]
(recur (rest options) (recur (next options)
(assoc opts-map :main (first options)))) (assoc opts-map :main (first options))))
(if (some opts-map [:file :socket-repl :expression :main]) (if (some opts-map [:file :socket-repl :expression :main])
(assoc opts-map (assoc opts-map
@ -101,10 +102,10 @@
(.exists (io/file opt))) (.exists (io/file opt)))
(assoc opts-map (assoc opts-map
:file opt :file opt
:command-line-args (rest options)) :command-line-args (next options))
(assoc opts-map (assoc opts-map
:expression opt :expression opt
:command-line-args (rest options))))) :command-line-args (next options))))))
opts-map))] opts-map))]
opts)) opts))

View file

@ -21,15 +21,15 @@
(testing "distinguish automatically between expression or file name" (testing "distinguish automatically between expression or file name"
(is (= {:expression "(println 123)" (is (= {:expression "(println 123)"
:command-line-args []} :command-line-args nil}
(main/parse-opts ["(println 123)"]))) (main/parse-opts ["(println 123)"])))
(is (= {:file "src/babashka/main.clj" (is (= {:file "src/babashka/main.clj"
:command-line-args []} :command-line-args nil}
(main/parse-opts ["src/babashka/main.clj"]))) (main/parse-opts ["src/babashka/main.clj"])))
(is (= {:expression "does-not-exist" (is (= {:expression "does-not-exist"
:command-line-args []} :command-line-args nil}
(main/parse-opts ["does-not-exist"]))))) (main/parse-opts ["does-not-exist"])))))
(deftest main-test (deftest main-test
@ -318,10 +318,14 @@
(defn foo [] (println \"foo!\")) (defn foo [] (println \"foo!\"))
(with-out-str (with-out-str
(with-in-str \"(foo)\" (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 ;;;; Scratch
(comment (comment
(dotimes [_ 10] (wait-for-port-test)) (dotimes [_ 10] (wait-for-port-test))
)) )