jakemcc / test-refresh

Refreshes and reruns clojure.tests in your project.
393 stars 28 forks source link

Issue with test refresh and clojure 1.9 with spec #73

Closed tetriscode closed 6 years ago

tetriscode commented 6 years ago

This appears to be a problem with spec running with test-refresh. If no specs are loaded, it seems to work fine.

What version of lein-test-refresh? 0.21.1

What version of Leiningen? 2.8.1

Can you recreate the issue with a minimal project? https://github.com/tetriscode/xy

{:user {:plugin-repositories [["private-plugins" {:url "private url"}]]
        :dependencies [[pjstadig/humane-test-output "0.8.2"]]
        ;:injections [(require 'pjstadig.humane-test-output)
        ;             (pjstadig.humane-test-output/activate!)
        :plugins [[io.sattvik/lein-ancient "0.6.11"]
                  [lein-pprint "1.1.2"]
                  [lein-autoreload "0.1.1"]
                  [com.jakemccrary/lein-test-refresh "0.21.1"]
                  [lein-autoexpect "1.9.0"]]
        :test-refresh {:notify-command ["terminal-notifier" "-title" "Tests" "-message"]
                       :quiet true
                       :changes-only true}}}

Running lein test-refresh I get the error

Exception in thread "main" clojure.lang.ExceptionInfo: Call to clojure.core/ns did not conform to spec:
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-refer-clojure at: [:args :clauses :refer-clojure :clause] predicate: #{:refer-clojure}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-require at: [:args :clauses :require :clause] predicate: #{:require}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-import at: [:args :clauses :import :clause] predicate: #{:import}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-use at: [:args :clauses :use :clause] predicate: #{:use}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-refer at: [:args :clauses :refer :clause] predicate: #{:refer}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-load at: [:args :clauses :load :clause] predicate: #{:load}
In: [2 0] val: import fails spec: :clojure.core.specs.alpha/ns-gen-class at: [:args :clauses :gen-class :clause] predicate: #{:gen-class}
 #:clojure.spec.alpha{:problems ({:path [:args :clauses :refer-clojure :clause], :pred #{:refer-clojure}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-refer-clojure :clojure.core.specs.alpha/ns-refer-clojure], :in [2 0]} {:path [:args :clauses :require :clause], :pred #{:require}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-require :clojure.core.specs.alpha/ns-require], :in [2 0]} {:path [:args :clauses :import :clause], :pred #{:import}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-import :clojure.core.specs.alpha/ns-import], :in [2 0]} {:path [:args :clauses :use :clause], :pred #{:use}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-use :clojure.core.specs.alpha/ns-use], :in [2 0]} {:path [:args :clauses :refer :clause], :pred #{:refer}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-refer :clojure.core.specs.alpha/ns-refer], :in [2 0]} {:path [:args :clauses :load :clause], :pred #{:load}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-load :clojure.core.specs.alpha/ns-load], :in [2 0]} {:path [:args :clauses :gen-class :clause], :pred #{:gen-class}, :val import, :via [:clojure.core.specs.alpha/ns-form :clojure.core.specs.alpha/ns-gen-class :clojure.core.specs.alpha/ns-gen-class], :in [2 0]}), :spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x6e521c1e "clojure.spec.alpha$regex_spec_impl$reify__2436@6e521c1e"], :value (clojure.tools.namespace.find (:require [clojure.java.io :as io] [clojure.set :as set] [clojure.tools.namespace.file :as file] [clojure.tools.namespace.parse :as parse]) (import (java.io File FileReader BufferedReader PushbackReader InputStreamReader) (java.util.jar JarFile JarEntry))), :args (clojure.tools.namespace.find (:require [clojure.java.io :as io] [clojure.set :as set] [clojure.tools.namespace.file :as file] [clojure.tools.namespace.parse :as parse]) (import (java.io File FileReader BufferedReader PushbackReader InputStreamReader) (java.util.jar JarFile JarEntry)))}, compiling:(clojure/tools/namespace/find.clj:9:1)
jakemcc commented 6 years ago

Thanks for the report.

I clone xy and made my profiles.clj look like yours and recreated the problem. Next I started commenting out other plugins to try to isolate the problem to test-refresh.

After commenting out lein-autoreload the problem goes away. Digging into it more, lein-autoreload injects a dependency on [org.clojure/tools.namespace "0.2.3"]. This version of tools.namespace has a malformed ns form. This is causing the problem.

I'll open an issue on lein-autoreload to upgrade its dependencies. In the mean time, if you add an explicit [org.clojure/tools.namespace "0.2.11"] to xy's dependencies, then your configuration will work.