From 063baba0aa8dc753817c1b7320915a616b2d10d9 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Thu, 28 Oct 2010 20:02:39 -0700 Subject: [PATCH] Add run task plus rudimentary tests. --- src/leiningen/run.clj | 33 +++++++++++++++++++ test/test_run.clj | 29 ++++++++++++++++ test_projects/tricky-name/project.clj | 4 ++- .../src/org/domain/tricky_name/core.clj | 5 +++ .../src/org/domain/tricky_name/munch.clj | 4 +++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/leiningen/run.clj create mode 100644 test/test_run.clj create mode 100644 test_projects/tricky-name/src/org/domain/tricky_name/munch.clj diff --git a/src/leiningen/run.clj b/src/leiningen/run.clj new file mode 100644 index 00000000..b282a189 --- /dev/null +++ b/src/leiningen/run.clj @@ -0,0 +1,33 @@ +(ns leiningen.run + (:use [leiningen.compile :only [eval-in-project]] + [leiningen.core :only [abort]])) + +(defn- run-main + "Loads the project namespaces as well as all its dependencies and then calls + ns/f, passing it the args." + ([project ns & args] + (eval-in-project project `((ns-resolve '~(symbol ns) '~'-main) ~@args) + nil nil `(require '~(symbol ns))))) + +;; TODO: use subtask help? +(defn run + "Call a function in a new process or run a .clj file. + +USAGE: lein run [ARGS...] +Calls the -main function in the namespace specified as :main in project.clj. + +USAGE: lein run -m NAMESPACE [ARGS...] +Calls the namespace/function in a new process; function defaults to -main. + +USAGE: lein run :alias [ARGS...] +Aliases can be defined in project.clj as + :run-aliases {:alias a.namespace + :alias2 another.namespace}" + [project & [first-arg & args]] + (let [first-arg (read-string first-arg) + alias (and (keyword? first-arg) (first-arg (:run-aliases project)))] + (cond alias (apply run project "-m" (cons alias args)) + (= first-arg '-m) (apply run-main project args) + (:main project) (apply run-main project (:main project) + first-arg args) + :else (abort "No :main namespace specified in project.clj.")))) diff --git a/test/test_run.clj b/test/test_run.clj new file mode 100644 index 00000000..e4c4c146 --- /dev/null +++ b/test/test_run.clj @@ -0,0 +1,29 @@ +(ns test-run + (:use [clojure.test] + [clojure.java.io :only [delete-file]] + [leiningen.core :only [read-project]] + [leiningen.run])) + +(def out-file "/tmp/lein-test") + +(def project (binding [*ns* (find-ns 'leiningen.core)] + (read-project "test_projects/tricky-name/project.clj"))) + +(use-fixtures :each (fn [f] + (delete-file out-file :silently) + (f))) + +(deftest test-basic + (is (zero? (run project "1"))) + (is (= "nom:1" (slurp out-file)))) + +(deftest test-alt-main + (is (zero? (run project "-m" "org.domain.tricky-name.munch" "1"))) + (is (= ":munched (\"1\")" (slurp out-file)))) + +(deftest test-aliases + (is (zero? (run project ":bbb" "1"))) + (is (= "BRUNCH" (slurp out-file))) + (delete-file out-file :silently) + (is (zero? (run project ":mmm" "1"))) + (is (= ":munched (\"1\")" (slurp out-file)))) diff --git a/test_projects/tricky-name/project.clj b/test_projects/tricky-name/project.clj index 19f495b5..43212d3b 100644 --- a/test_projects/tricky-name/project.clj +++ b/test_projects/tricky-name/project.clj @@ -2,4 +2,6 @@ :description "One with a tricky group and project name" :dev-dependencies [[clojure "1.2.0"]] :shell-wrapper true - :main org.domain.tricky-name.core) + :main org.domain.tricky-name.core + :run-aliases {:bbb org.domain.tricky-name.brunch + :mmm org.domain.tricky-name.munch}) diff --git a/test_projects/tricky-name/src/org/domain/tricky_name/core.clj b/test_projects/tricky-name/src/org/domain/tricky_name/core.clj index 48a53279..66a8e579 100644 --- a/test_projects/tricky-name/src/org/domain/tricky_name/core.clj +++ b/test_projects/tricky-name/src/org/domain/tricky_name/core.clj @@ -1 +1,6 @@ (ns org.domain.tricky-name.core) + +(defn -main [& args] + (when-not (empty? args) + (spit "/tmp/lein-test" (str "nom:" (first args))) + (recur (rest args)))) diff --git a/test_projects/tricky-name/src/org/domain/tricky_name/munch.clj b/test_projects/tricky-name/src/org/domain/tricky_name/munch.clj new file mode 100644 index 00000000..d4e65b62 --- /dev/null +++ b/test_projects/tricky-name/src/org/domain/tricky_name/munch.clj @@ -0,0 +1,4 @@ +(ns org.domain.tricky-name.munch) + +(defn -main [& args] + (spit "/tmp/lein-test" (pr-str :munched args)))