From 0817a299e25bbd8083178cf440d9ffaea003098c Mon Sep 17 00:00:00 2001 From: Connor Kilgore Date: Wed, 12 Jun 2024 16:15:37 -0700 Subject: [PATCH] can now detect files within a directory with a space --- .gitignore | 1 + Fresh.iml | 70 +++------------- project.clj | 10 +-- spec/fresh/core_spec.clj | 175 +++++++++++++++++++++++++-------------- src/fresh/core.clj | 9 +- 5 files changed, 139 insertions(+), 126 deletions(-) diff --git a/.gitignore b/.gitignore index a6343d4..7c90740 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ pom.xml lib classes sample_src +space directory .idea target pom.xml.asc \ No newline at end of file diff --git a/Fresh.iml b/Fresh.iml index 9d63d15..ed80807 100644 --- a/Fresh.iml +++ b/Fresh.iml @@ -1,11 +1,10 @@ - - - - + + - + @@ -13,63 +12,20 @@ - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/project.clj b/project.clj index 2688f41..dc69af5 100644 --- a/project.clj +++ b/project.clj @@ -1,8 +1,8 @@ -(defproject fresh "1.1.2" +(defproject fresh "1.1.3" :description "A library to keep your clojure runtime 'Fresh'." - :dependencies [[org.clojure/clojure "1.7.0-RC2"]] - :profiles {:dev {:dependencies [[speclj "3.2.0"]] - :resource-paths ["sample_src"]}} - :plugins [[speclj "3.2.0"]] + :dependencies [[org.clojure/clojure "1.11.3"]] + :profiles {:dev {:dependencies [[speclj "3.4.8"]] + :resource-paths ["sample_src" "space directory"]}} + :plugins [[speclj "3.4.8"]] :source-paths ["src"] :test-paths ["spec"]) diff --git a/spec/fresh/core_spec.clj b/spec/fresh/core_spec.clj index a9302ca..c08ada7 100644 --- a/spec/fresh/core_spec.clj +++ b/spec/fresh/core_spec.clj @@ -5,29 +5,32 @@ [clojure.java.io :only (file copy make-input-stream delete-file make-parents)])) (def sample-dir (.getCanonicalFile (file "sample_src"))) +(def space-sample-dir (.getCanonicalFile (file "space directory"))) -(defn clean-sample-files [] - (let [all (remove #(= sample-dir %) (file-seq sample-dir)) +(defn clean-sample-files [directory] + (let [all (remove #(= directory %) (file-seq directory)) files (filter #(.isFile %) all) dirs (filter #(.isDirectory %) all) dirs (reverse (sort #(compare (.length (.getPath %1)) (.length (.getPath %2))) dirs))] (doseq [file files] (delete-file file)) (doseq [dir dirs] (delete-file dir)))) -(defn sample-file [name] - (file sample-dir name)) +(defn sample-file [dir name] + (file dir name)) -(defn write-file [name content] - (let [file (sample-file name)] +(defn write-file [dir name content] + (let [file (sample-file dir name)] (make-parents file) (copy (make-input-stream (.getBytes content) {}) file) file)) (defn establish-sample-files [] - (clean-sample-files) - (write-file "sample/core.clj" "(ns sample.core) (def sample-core :sample-core)") - (write-file "sample/a/one.clj" "(ns sample.a.one (:use [sample.core])) (def sample-a-one :sample-a-one)") - (write-file "sample/b/one.clj" "; comment\n(ns sample.b.one (:use [sample.core])) (def sample-b-one :sample-b-one)")) + (clean-sample-files sample-dir) + (clean-sample-files space-sample-dir) + (write-file sample-dir "sample/core.clj" "(ns sample.core) (def sample-core :sample-core)") + (write-file sample-dir "sample/a/one.clj" "(ns sample.a.one (:use [sample.core])) (def sample-a-one :sample-a-one)") + (write-file sample-dir "sample/b/one.clj" "; comment\n(ns sample.b.one (:use [sample.core])) (def sample-b-one :sample-b-one)") + (write-file space-sample-dir "space/core.clj" "(ns space.core) (def space-core :space-core)")) (defn tweak-mod-time [file tweak] (let [mod-time (+ (.lastModified file) (* 1000 tweak))] @@ -92,55 +95,55 @@ (context "using files" - (before (clean-sample-files)) + (before (clean-sample-files sample-dir) + (clean-sample-files space-sample-dir)) (it "reads no ns form from src files that don't contain them" - (should= nil (read-ns-form (write-file "test/one.clj" "()"))) - (should= nil (read-ns-form (write-file "test/one.clj" "; hello"))) - (should= nil (read-ns-form (write-file "test/one.clj" "; (ns blah)")))) + (should= nil (read-ns-form (write-file sample-dir "test/one.clj" "()"))) + (should= nil (read-ns-form (write-file sample-dir "test/one.clj" "; hello"))) + (should= nil (read-ns-form (write-file sample-dir "test/one.clj" "; (ns blah)")))) (it "pulls read ns form from files" - (should= '(ns blah) (read-ns-form (write-file "test/one.clj" "(ns blah)"))) - (should= '(ns foo) (read-ns-form (write-file "test/one.clj" "; blah\n(ns foo)"))) + (should= '(ns blah) (read-ns-form (write-file sample-dir "test/one.clj" "(ns blah)"))) + (should= '(ns foo) (read-ns-form (write-file sample-dir "test/one.clj" "; blah\n(ns foo)"))) (should= '(ns blah (:use [foo]) - (:require [bar])) (read-ns-form (write-file "test/one.clj" "(ns blah (:use [foo])(:require [bar]))")))) - ) + (:require [bar])) (read-ns-form (write-file sample-dir "test/one.clj" "(ns blah (:use [foo])(:require [bar]))"))))) (context "using sample files" (before (establish-sample-files)) (it "should not include hidden files as clj files" - (write-file "sample/.hidden.clj" "I'm a hidden file!") + (write-file sample-dir "sample/.hidden.clj" "I'm a hidden file!") (let [files (clj-files-in sample-dir)] - (should= false (contains? (set (map #(.getName %) files)) ".hidden.clj")))) + (should-not (contains? (set (map #(.getName %) files)) ".hidden.clj")))) (it "finds cljc files by default" - (write-file "sample/portable.cljc" "I'm portable") + (write-file sample-dir "sample/portable.cljc" "I'm portable") (let [files (clj-files-in sample-dir)] (should-contain "portable.cljc" (set (map #(.getName %) files))))) (it "finds specified files by default" - (write-file "sample/portable.cljx" "I'm antiquated") + (write-file sample-dir "sample/portable.cljx" "I'm antiquated") (let [files (find-files-in #".*\.cljx" sample-dir)] (should-contain "portable.cljx" (set (map #(.getName %) files))))) (it "finds src files from ns name" - (let [cljc-file (write-file "sample/portable.cljc" "I'm portable")] + (let [cljc-file (write-file sample-dir "sample/portable.cljc" "I'm portable")] (should= cljc-file (ns-to-file "sample.portable")))) (it "finds cljc src files from ns name" - (should= (sample-file "sample/core.clj") (ns-to-file "sample.core")) - (should= (sample-file "sample/a/one.clj") (ns-to-file "sample.a.one"))) + (should= (sample-file sample-dir "sample/core.clj") (ns-to-file "sample.core")) + (should= (sample-file sample-dir "sample/a/one.clj") (ns-to-file "sample.a.one"))) (it "finds depending files form ns form" (should= [] (depending-files-from '(ns foo))) (should= [] (depending-files-from '(ns foo (:use [clojure.set])))) - (should= [(sample-file "sample/core.clj")] (depending-files-from '(ns foo + (should= [(sample-file sample-dir "sample/core.clj")] (depending-files-from '(ns foo (:use [sample.core])))) - (should= #{(sample-file "sample/core.clj") (sample-file "sample/a/one.clj")} + (should= #{(sample-file sample-dir "sample/core.clj") (sample-file sample-dir "sample/a/one.clj")} (set (depending-files-from '(ns foo (:use [sample.core]) (:require [sample.a.one])))))) @@ -149,99 +152,149 @@ (let [listing (atom {})] (make-fresh listing (clj-files-in sample-dir) (fn [_] true)) (should= 3 (count @listing)) - (should= true (contains? @listing (sample-file "sample/core.clj"))) - (should= true (contains? @listing (sample-file "sample/a/one.clj"))) - (should= true (contains? @listing (sample-file "sample/b/one.clj"))))) + (should= true (contains? @listing (sample-file sample-dir "sample/core.clj"))) + (should= true (contains? @listing (sample-file sample-dir "sample/a/one.clj"))) + (should= true (contains? @listing (sample-file sample-dir "sample/b/one.clj")))) + + (let [listing (atom {})] + (make-fresh listing (clj-files-in space-sample-dir) (fn [_] true)) + (should= 1 (count @listing)) + (should (contains? @listing (sample-file space-sample-dir "space/core.clj"))))) (it "new files are detected and added to listing" (let [listing (atom {})] (make-fresh listing (clj-files-in sample-dir) (fn [_] true)) - (write-file "sample/a/two.clj" "(ns sample.a.two)") + (write-file sample-dir "sample/a/two.clj" "(ns sample.a.two)") (make-fresh listing (clj-files-in sample-dir) (fn [_] true)) (should= 4 (count @listing)) - (should= true (contains? @listing (sample-file "sample/a/two.clj"))))) + (should= true (contains? @listing (sample-file sample-dir "sample/a/two.clj"))))) (it "deleted files are removed from listing" (let [listing (atom {})] (make-fresh listing (clj-files-in sample-dir) (fn [_] true)) - (delete-file (sample-file "sample/a/one.clj")) + (delete-file (sample-file sample-dir "sample/a/one.clj")) (make-fresh listing (clj-files-in sample-dir) (fn [_] true)) (should= 2 (count @listing)) - (should= false (contains? @listing (sample-file "sample/a/one.clj"))))) + (should-not (contains? @listing (sample-file sample-dir "sample/a/one.clj")))) + + (write-file space-sample-dir "space/new.clj" "") + (let [listing (atom {})] + (make-fresh listing (clj-files-in space-sample-dir) (fn [_] true)) + (should= 2 (count @listing)) + (delete-file (sample-file space-sample-dir "space/new.clj")) + (make-fresh listing (clj-files-in space-sample-dir) (fn [_] true)) + (should= 1 (count @listing)) + (should-not (contains? @listing (sample-file space-sample-dir "space/new.clj"))))) (context "with freshener" (with audit-value (atom true)) (with refresh-sample (freshener #(clj-files-in (file sample-dir "sample")) (fn [_] @@audit-value))) + (with refresh-space-sample (freshener #(clj-files-in (file space-sample-dir "space")) (fn [_] @@audit-value))) (it "reports new files in result map" (let [result (@refresh-sample) - new-files #{(sample-file "sample/core.clj") (sample-file "sample/a/one.clj") (sample-file "sample/b/one.clj")}] + new-files #{(sample-file sample-dir "sample/core.clj") + (sample-file sample-dir "sample/a/one.clj") + (sample-file sample-dir "sample/b/one.clj")}] + (should= new-files (:new result))) + + (let [result (@refresh-space-sample) + new-files #{(sample-file space-sample-dir "space/core.clj")}] (should= new-files (:new result)))) (it "includes empty files" - (write-file "sample/a/new.clj" "") + (write-file sample-dir "sample/a/new.clj" "") (let [result (@refresh-sample)] - (should= true (contains? (:new result) (sample-file "sample/a/new.clj"))))) + (should (contains? (:new result) (sample-file sample-dir "sample/a/new.clj")))) + + (write-file space-sample-dir "space/new.clj" "") + (let [result (@refresh-space-sample)] + (should (contains? (:new result) (sample-file space-sample-dir "space/new.clj"))))) (it "reports deleted files in result map" (@refresh-sample) - (delete-file (sample-file "sample/a/one.clj")) + (delete-file (sample-file sample-dir "sample/a/one.clj")) (let [result (@refresh-sample)] - (should= #{(sample-file "sample/a/one.clj")} (:deleted result)))) + (should= #{(sample-file sample-dir "sample/a/one.clj")} (:deleted result))) + + (write-file space-sample-dir "space/new.clj" "") + (@refresh-space-sample) + (delete-file (sample-file space-sample-dir "space/new.clj")) + (let [result (@refresh-space-sample)] + (should= #{(sample-file space-sample-dir "space/new.clj")} (:deleted result)))) (it "reports modified files in result map" (@refresh-sample) - (tweak-mod-time (sample-file "sample/a/one.clj") 1) + (tweak-mod-time (sample-file sample-dir "sample/a/one.clj") 1) (let [result (@refresh-sample)] - (should= #{(sample-file "sample/a/one.clj")} (:modified result)))) + (should= #{(sample-file sample-dir "sample/a/one.clj")} (:modified result))) + + (write-file space-sample-dir "space/new.clj" "") + (@refresh-space-sample) + (tweak-mod-time (sample-file space-sample-dir "space/new.clj") 1) + (let [result (@refresh-space-sample)] + (should= #{(sample-file space-sample-dir "space/new.clj")} (:modified result)))) (it "reports reloaded files in result map" (let [result (@refresh-sample) - reloaded [(sample-file "sample/a/one.clj") (sample-file "sample/b/one.clj") (sample-file "sample/core.clj")]] + reloaded [(sample-file sample-dir "sample/a/one.clj") + (sample-file sample-dir "sample/b/one.clj") + (sample-file sample-dir "sample/core.clj")]] (should= reloaded (:reloaded result)))) (it "tracks dependencies not provided by provider" - (write-file "sample/a/one.clj" "(ns sample.a.one (:use [other.one]))") - (write-file "other/one.clj" "(ns other.one)") + (write-file sample-dir "sample/a/one.clj" "(ns sample.a.one (:use [other.one]))") + (write-file sample-dir "other/one.clj" "(ns other.one)") (let [result (@refresh-sample)] - (should= true (contains? (:new result) (sample-file "other/one.clj"))))) + (should= true (contains? (:new result) (sample-file sample-dir "other/one.clj"))))) (it "deletes unused dependencies not provided by provider" - (write-file "sample/a/one.clj" "(ns sample.a.one (:use [other.one]))") - (write-file "other/one.clj" "(ns other.one)") + (write-file sample-dir "sample/a/one.clj" "(ns sample.a.one (:use [other.one]))") + (write-file sample-dir "other/one.clj" "(ns other.one)") (@refresh-sample) - (delete-file (sample-file "sample/a/one.clj")) + (delete-file (sample-file sample-dir "sample/a/one.clj")) (let [result (@refresh-sample)] - (should= #{(sample-file "sample/a/one.clj") (sample-file "other/one.clj")} (:deleted result)))) + (should= #{(sample-file sample-dir "sample/a/one.clj") + (sample-file sample-dir "other/one.clj")} + (:deleted result)))) (it "reloads new src files" (@refresh-sample) (should= :sample-core (eval '(do (require 'sample.core) sample.core/sample-core))) (should= :sample-a-one (eval '(do (require 'sample.a.one) sample.a.one/sample-a-one))) - (should= :sample-b-one (eval '(do (require 'sample.b.one) sample.b.one/sample-b-one)))) + (should= :sample-b-one (eval '(do (require 'sample.b.one) sample.b.one/sample-b-one))) + (should= :space-core (eval '(do (require 'space.core) space.core/space-core)))) - (it "reloads modifies src files" - (tweak-mod-time (sample-file "sample/a/one.clj") -1) + (it "reloads modified src files" + (tweak-mod-time (sample-file sample-dir "sample/a/one.clj") -1) (@refresh-sample) - (write-file "sample/a/one.clj" "(ns sample.a.one (:use [sample.core])) (def sample-a-one :another-value)") + (write-file sample-dir "sample/a/one.clj" "(ns sample.a.one (:use [sample.core])) (def sample-a-one :another-value)") (@refresh-sample) - (should= :another-value (eval '(do (require 'sample.a.one) sample.a.one/sample-a-one)))) + (should= :another-value (eval '(do (require 'sample.a.one) sample.a.one/sample-a-one))) + + (tweak-mod-time (sample-file space-sample-dir "space/core.clj") -1) + (@refresh-space-sample) + (write-file space-sample-dir "space/core.clj" "(ns space.core) (def space-core :another-value)") + (@refresh-space-sample) + (should= :another-value (eval '(do (require 'space.core) space.core/space-core))) + ) (it "reloads dependencies of modified files" - (write-file "sample/core.clj" "(ns sample.core (:use [other.one]))") - (write-file "other/one.clj" "(ns other.one) (def other-one :other)") + (write-file sample-dir "sample/core.clj" "(ns sample.core (:use [other.one]))") + (write-file sample-dir "other/one.clj" "(ns other.one) (def other-one :other)") (@refresh-sample) - (write-file "sample/a/one.clj" "(ns sample.a.one) (def sample-a-one :new-value)") - (tweak-mod-time (sample-file "other/one.clj") 1) + (write-file sample-dir "sample/a/one.clj" "(ns sample.a.one) (def sample-a-one :new-value)") + (tweak-mod-time (sample-file sample-dir "other/one.clj") 1) (let [result (@refresh-sample) - reloaded [(sample-file "other/one.clj") (sample-file "sample/a/one.clj") (sample-file "sample/b/one.clj") (sample-file "sample/core.clj")]] + reloaded [(sample-file sample-dir "other/one.clj") (sample-file sample-dir "sample/a/one.clj") + (sample-file sample-dir "sample/b/one.clj") (sample-file sample-dir "sample/core.clj")]] (should= reloaded (:reloaded result)) (should= :new-value (eval '(do (require 'sample.a.one) sample.a.one/sample-a-one))))) (it "unloads deleted files" (@refresh-sample) - (delete-file (sample-file "sample/a/one.clj")) + (delete-file (sample-file sample-dir "sample/a/one.clj")) (@refresh-sample) (should= false (contains? @@#'clojure.core/*loaded-libs* 'sample.a.one))) @@ -249,7 +302,7 @@ (reset! @audit-value false) (let [new-tag (.substring (str (rand)) 2) new-ns (format "sample.new%s" new-tag)] - (write-file (format "sample/new%s.clj" new-tag) (format "(ns %s)" new-ns)) + (write-file sample-dir (format "sample/new%s.clj" new-tag) (format "(ns %s)" new-ns)) (@refresh-sample) (should= false (contains? @@#'clojure.core/*loaded-libs* (symbol new-ns))))) ) diff --git a/src/fresh/core.clj b/src/fresh/core.clj index 6cd78ba..cbb9e35 100644 --- a/src/fresh/core.clj +++ b/src/fresh/core.clj @@ -2,9 +2,11 @@ (:use [clojure.java.io :only (file)]) (:require - [clojure.set :as set]) + [clojure.set :as set] + [clojure.string :as str]) (:import - [java.io PushbackReader FileReader File])) + [java.io PushbackReader FileReader File] + [java.net URL])) (defn find-files-in "Returns a seq of all files (matching the regex) contained in the given directories." @@ -37,7 +39,8 @@ ([ns extensions] (let [relative-filenames (ns-to-filenames ns extensions) loader (clojure.lang.RT/baseLoader) - url (first (filter identity (map #(.getResource loader %) relative-filenames)))] + url (first (filter identity (map #(.getResource loader %) relative-filenames))) + url (URL. (str/replace (.toString url) "%20" " "))] (if (and url (= "file" (.getProtocol url))) (file (.getFile url)) nil))))