Skip to content

Commit

Permalink
Merge pull request #2164 from cprice404/feature/master/support-readin…
Browse files Browse the repository at this point in the history
…g-proj-from-reader

Add support for reading project from Reader instead of file
  • Loading branch information
cprice404 authored Jul 18, 2016
2 parents 0f6fbaa + 2a30d86 commit 41febc3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 12 deletions.
24 changes: 14 additions & 10 deletions leiningen-core/src/leiningen/core/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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.)]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)))
Expand Down
12 changes: 10 additions & 2 deletions leiningen-core/test/leiningen/core/test/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 41febc3

Please sign in to comment.