diff --git a/leiningen-core/src/leiningen/core/project.clj b/leiningen-core/src/leiningen/core/project.clj index f539b66b..f6834a7a 100644 --- a/leiningen-core/src/leiningen/core/project.clj +++ b/leiningen-core/src/leiningen/core/project.clj @@ -11,7 +11,7 @@ [leiningen.core.user :as user] [leiningen.core.classpath :as classpath]) (:import (clojure.lang DynamicClassLoader) - (java.io PushbackReader))) + (java.io PushbackReader Reader))) (defn make-project-properties [project] (with-open [baos (java.io.ByteArrayOutputStream.)] @@ -400,10 +400,11 @@ "The project.clj file must either def a project map or call this macro. See `lein help sample` to see what arguments it accepts." [project-name version & args] - `(let [args# ~(unquote-project (argument-list->argument-map args)) - root# ~(.getParent (io/file *file*))] - (def ~'project - (make args# '~project-name ~version root#)))) + (let [f (io/file *file*)] + `(let [args# ~(unquote-project (argument-list->argument-map args)) + root# ~(if f (.getParent f))] + (def ~'project + (make args# '~project-name ~version root#))))) (defn- add-exclusions [exclusions dep] (dependency-vec @@ -949,15 +950,18 @@ Also merges default profiles." (defn read-raw "Read project file without loading certificates, plugins, middleware, etc." - [file] + [source] (locking read-raw (binding [*ns* (find-ns 'leiningen.core.project)] - (try (load-file file) - (catch Exception e - (throw (Exception. (format "Error loading %s" file) e))))) + (try + (if (instance? Reader source) + (load-reader source) + (load-file source)) + (catch Exception e + (throw (Exception. (format "Error loading %s" source) e))))) (let [project (resolve 'leiningen.core.project/project)] (when-not project - (throw (Exception. (format "%s must define project map" file)))) + (throw (Exception. (format "%s must define project map" source)))) ;; return it to original state (ns-unmap 'leiningen.core.project 'project) @project))) diff --git a/leiningen-core/test/leiningen/core/test/project.clj b/leiningen-core/test/leiningen/core/test/project.clj index bd1b3cbb..11d1af6f 100755 --- a/leiningen-core/test/leiningen/core/test/project.clj +++ b/leiningen-core/test/leiningen/core/test/project.clj @@ -3,11 +3,11 @@ (:use [clojure.test] [leiningen.core.project :as project]) (:require [leiningen.core.user :as user] - [leiningen.core.classpath :as classpath] [leiningen.core.test.helper :refer [abort-msg]] [leiningen.test.helper :as lthelper] [leiningen.core.utils :as utils] - [clojure.java.io :as io])) + [clojure.java.io :as io]) + (:import (java.io StringReader))) (use-fixtures :once (fn [f] @@ -64,6 +64,14 @@ (is (= (for [p path] (lthelper/pathify (str (:root actual) "/" p))) (k actual)))))) +(deftest test-read-project-from-reader + (let [project-string "(defproject foo \"0.0.1-SNAPSHOT\" :description \"foo\")" + project-reader (StringReader. project-string) + project (read project-reader)] + (is (= "foo" (:group project))) + (is (= "foo" (:name project))) + (is (= "foo" (:description project))))) + ;; TODO: test omit-default ;; TODO: test reading project that doesn't def project