Merge pull request #2164 from cprice404/feature/master/support-reading-proj-from-reader

Add support for reading project from Reader instead of file
This commit is contained in:
Chris Price 2016-07-18 10:35:01 -07:00 committed by GitHub
commit 41febc332c
2 changed files with 24 additions and 12 deletions

View file

@ -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 [f (io/file *file*)]
`(let [args# ~(unquote-project (argument-list->argument-map args))
root# ~(.getParent (io/file *file*))]
root# ~(if f (.getParent f))]
(def ~'project
(make args# '~project-name ~version root#))))
(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)
(try
(if (instance? Reader source)
(load-reader source)
(load-file source))
(catch Exception e
(throw (Exception. (format "Error loading %s" file) 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)))

View file

@ -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