Skip to content

Commit

Permalink
Jdk 9 cp fix (#129)
Browse files Browse the repository at this point in the history
* updated resource lookup to work with Java 9
  • Loading branch information
yogthos authored Dec 24, 2017
1 parent a5586c3 commit 19c0fa9
Show file tree
Hide file tree
Showing 11 changed files with 131 additions and 152 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ pom.xml
.lein-deps-sum
.lein-repl-history
.nrepl-port
/test/log4j.properties
*.log
.idea
migratus.iml
Expand Down
3 changes: 1 addition & 2 deletions README.org
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
#+STARTUP: hidestars showall
* Migratus

[[http://travis-ci.org/yogthos/migratus][https://travis-ci.org/yogthos/migratus.svg?branch=master]]

[![CircleCI](https://circleci.com/gh/yogthos/migratus.svg?style=svg)](https://circleci.com/gh/yogthos/migratus)
[[https://cdn.rawgit.com/yogthos/migratus/master/migrate.png]]

A general migration framework, with implementations for migrations as SQL
Expand Down
8 changes: 4 additions & 4 deletions src/migratus/database.clj
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,10 @@

(defn find-init-script [dir init-script-name]
(let [dir (utils/ensure-trailing-slash dir)]
(if-let [migration-dir (utils/find-migration-dir dir)]
(find-init-script-file migration-dir init-script-name)
(if-let [migration-jar (utils/find-migration-jar dir)]
(find-init-script-resource dir migration-jar init-script-name)))))
(when-let [migration-dir (utils/find-migration-dir dir)]
(if (instance? File migration-dir)
(find-init-script-file migration-dir init-script-name)
(find-init-script-resource dir migration-dir init-script-name)))))

(defn connect* [db]
(let [^Connection conn
Expand Down
85 changes: 44 additions & 41 deletions src/migratus/migrations.clj
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@

(defn ->kebab-case [s]
(-> (reduce
(fn [s c]
(if (and
(not-empty s)
(Character/isLowerCase (last s))
(Character/isUpperCase c))
(str s "-" c)
(str s c)))
"" s)
(fn [s c]
(if (and
(not-empty s)
(Character/isLowerCase (last s))
(Character/isUpperCase c))
(str s "-" c)
(str s c)))
"" s)
(str/replace #"[\s]+" "-")
(.replaceAll "_" "-")
(.toLowerCase)))
Expand All @@ -36,21 +36,19 @@
(catch Exception e
(log/error e (str "failed to parse migration id: " id)))))

(def default-migration-parent "resources/")

(def migration-file-pattern #"^(\d+)-([^\.]+)((?:\.[^\.]+)+)$")

(defn valid-extension?
"Returns true if file-name extension matches one of the file extensions supported
by all migration protocols/multimethods implemented"
[file-name]
(-> (->> (proto/get-all-supported-extensions)
(interpose "|" )
(apply str)
(format "^.*?\\.(%s)$"))
re-pattern
(re-matches file-name)
boolean))
(-> (->> (proto/get-all-supported-extensions)
(interpose "|")
(apply str)
(format "^.*?\\.(%s)$"))
re-pattern
(re-matches file-name)
boolean))


(defn parse-name [file-name]
Expand Down Expand Up @@ -94,22 +92,26 @@
(warn-on-invalid-migration entry-name))))
(remove nil?)))

(defn read-migrations [dir exclude-scripts]
(when-let [migration-dir (utils/find-migration-dir dir)]
(if (instance? File migration-dir)
(find-migration-files migration-dir exclude-scripts)
(find-migration-resources dir migration-dir exclude-scripts))))

(defn find-migrations [dir exclude-scripts]
(->> (let [dir (utils/ensure-trailing-slash dir)]
(if-let [migration-dir (utils/find-migration-dir dir)]
(find-migration-files migration-dir exclude-scripts)
(if-let [migration-jar (utils/find-migration-jar dir)]
(find-migration-resources dir migration-jar exclude-scripts))))
(->> (read-migrations (utils/ensure-trailing-slash dir) exclude-scripts)
(apply utils/deep-merge)))

(defn find-or-create-migration-dir [dir]
(if-let [migration-dir (utils/find-migration-dir dir)]
migration-dir
(defn find-or-create-migration-dir
([dir] (find-or-create-migration-dir utils/default-migration-parent dir))
([parent-dir dir]
(if-let [migration-dir (utils/find-migration-dir dir)]
migration-dir

;; Couldn't find the migration dir, create it
(let [new-migration-dir (io/file default-migration-parent dir)]
(io/make-parents new-migration-dir ".")
new-migration-dir)))
;; Couldn't find the migration dir, create it
(let [new-migration-dir (io/file parent-dir dir)]
(io/make-parents new-migration-dir ".")
new-migration-dir))))

(defn make-migration
"Constructs a Migration instance from the merged migration file maps collected
Expand All @@ -124,31 +126,32 @@
(let [[mig-type payload] (first mig')]
(proto/make-migration* mig-type id mig-name payload config))
(throw (Exception.
(format
"Multiple migration types specified for migration %d %s"
id (pr-str (map name (keys mig'))))))))
(format
"Multiple migration types specified for migration %d %s"
id (pr-str (map name (keys mig'))))))))
(throw (Exception. (format "Multiple migrations with id %d %s"
id (pr-str (keys mig))))))
(throw (Exception. (str "Invalid migration id: " id)))))

(defn list-migrations [config]
(doall
(for [[id mig] (find-migrations (utils/get-migration-dir config)
(utils/get-exclude-scripts config))]
(make-migration config id mig))))
(for [[id mig] (find-migrations (utils/get-migration-dir config)
(utils/get-exclude-scripts config))]
(make-migration config id mig))))

(defn create [config name migration-type]
(let [migration-dir (find-or-create-migration-dir
(utils/get-migration-dir config))
(let [migration-dir (find-or-create-migration-dir
(utils/get-parent-migration-dir config)
(utils/get-migration-dir config))
migration-name (->kebab-case (str (timestamp) name))]
(doseq [mig-file (proto/migration-files* migration-type migration-name)]
(.createNewFile (io/file migration-dir mig-file)))))

(defn destroy [config name]
(let [migration-dir (utils/find-migration-dir
(utils/get-migration-dir config))
(let [migration-dir (utils/find-migration-dir
(utils/get-migration-dir config))
migration-name (->kebab-case name)
pattern (re-pattern (str "[\\d]*-" migration-name "\\..*"))
migrations (file-seq migration-dir)]
pattern (re-pattern (str "[\\d]*-" migration-name "\\..*"))
migrations (file-seq migration-dir)]
(doseq [f (filter #(re-find pattern (.getName %)) migrations)]
(.delete f))))
37 changes: 19 additions & 18 deletions src/migratus/utils.clj
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
(ns migratus.utils
(:require [clojure.java.classpath :as cp]
[clojure.reflect :as reflect]
[clojure.java.io :as io])
(:import java.io.File
[java.util.jar JarEntry JarFile]
java.util.jar.JarFile
java.util.regex.Pattern))

(def default-migration-parent "resources/")
(def default-migration-dir "migrations")
(def default-init-script-name "init.sql")

(defn get-parent-migration-dir
"Gets the :parent-migration-dir from config, or default if missing."
[config]
(get config :parent-migration-dir default-migration-parent))

(defn get-migration-dir
"Gets the :migration-dir from config, or default if missing."
[config]
Expand All @@ -32,23 +35,21 @@
(str dir "/")
dir))

(defn jar-file [url]
(some-> url
(.getFile)
(.split "!/")
(first)
(.replaceFirst "file:" "")
(JarFile.)))

(defn find-migration-dir
"Finds the given directory on the classpath"
[dir]
(->> (cp/classpath-directories)
(map #(io/file % dir))
(filter #(.exists ^File %))
first))

(defn find-migration-jar
"Finds the first jar on the classpath containing a directory with the given
name."
[dir]
(first (for [jar (cp/classpath-jarfiles)
:when (some #(.matches (.getName ^JarEntry %)
(str "^" (Pattern/quote dir) ".+"))
(enumeration-seq (.entries ^JarFile jar)))]
jar)))
(when-let [url (ClassLoader/getSystemResource dir)]
(if (= "jar" (.getProtocol url))
(jar-file url)
(File. (.getFile url)))))

(defn deep-merge
"Merge keys at all nested levels of the maps."
Expand Down
25 changes: 0 additions & 25 deletions test/log4j.properties.example

This file was deleted.

Binary file added test/migrations-jar/migrations.jar
Binary file not shown.
61 changes: 32 additions & 29 deletions test/migratus/test/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,22 @@
(defn migrations [ups downs]
(for [n (range 4)]
(mock/make-migration
{:id (inc n) :name (str "id-" (inc n)) :ups ups :downs downs})))
{:id (inc n) :name (str "id-" (inc n)) :ups ups :downs downs})))

(deftest test-migrate
(let [ups (atom [])
downs (atom [])
config {:store :mock
(let [ups (atom [])
downs (atom [])
config {:store :mock
:completed-ids (atom #{1 3})}]
(with-redefs [mig/list-migrations (constantly (migrations ups downs))]
(migrate config))
(is (= [2 4] @ups))
(is (empty? @downs))))

(deftest test-up
(let [ups (atom [])
downs (atom [])
config {:store :mock
(let [ups (atom [])
downs (atom [])
config {:store :mock
:completed-ids (atom #{1 3})}]
(with-redefs [mig/list-migrations (constantly (migrations ups downs))]
(testing "should bring up an uncompleted migration"
Expand All @@ -55,9 +55,9 @@
(is (empty? @downs))))))

(deftest test-down
(let [ups (atom [])
downs (atom [])
config {:store :mock
(let [ups (atom [])
downs (atom [])
config {:store :mock
:completed-ids (atom #{1 3})}]
(with-redefs [mig/list-migrations (constantly (migrations ups downs))]
(testing "should bring down a completed migration"
Expand All @@ -72,13 +72,15 @@
(is (empty? @downs))))))

(defn- migration-exists? [name & [dir]]
(let [migrations (file-seq (utils/find-migration-dir (or dir "migrations")))
names (map #(.getName %) migrations)]
(seq (filter #(.contains % name) names))))
(when-let [migrations-dir (utils/find-migration-dir (or dir "migrations"))]
(->> (file-seq migrations-dir)
(map #(.getName %))
(filter #(.contains % name))
(not-empty))))

(deftest test-create-and-destroy
(let [migration "create-user"
migration-up "create-user.up.sql"
(let [migration "create-user"
migration-up "create-user.up.sql"
migration-down "create-user.down.sql"]
(testing "should create two migrations"
(create nil migration)
Expand All @@ -90,7 +92,7 @@
(is (empty? (migration-exists? migration-down))))))

(deftest test-create-and-destroy-edn
(let [migration "create-other-user"
(let [migration "create-other-user"
migration-edn "create-other-user.edn"]
(testing "should create the migration"
(create nil migration :edn)
Expand All @@ -100,14 +102,15 @@
(is (empty? (migration-exists? migration-edn))))))

(deftest test-create-missing-directory
(let [migration-dir "doesnt_exist"
config {:migration-dir migration-dir}
migration "create-user"
migration-up "create-user.up.sql"
migration-down "create-user.down.sql"]
(let [migration-dir "doesnt_exist"
config {:parent-migration-dir "test"
:migration-dir migration-dir}
migration "create-user"
migration-up "create-user.up.sql"
migration-down "create-user.down.sql"]
;; Make sure the directory doesn't exist before we start the test
(when (.exists (io/file "resources" migration-dir))
(io/delete-file (io/file "resources" migration-dir)))
(when (.exists (io/file "test" migration-dir))
(io/delete-file (io/file "test" migration-dir)))

(testing "when migration dir doesn't exist, it is created"
(is (nil? (utils/find-migration-dir migration-dir)))
Expand All @@ -117,14 +120,14 @@
(is (migration-exists? migration-down migration-dir)))

;; Clean up after ourselves
(when (.exists (io/file "resources" migration-dir))
(when (.exists (io/file "test" migration-dir))
(destroy config migration)
(io/delete-file (io/file "resources" migration-dir)))))
(io/delete-file (io/file "test" migration-dir)))))

(deftest test-pending-list
(let [ups (atom [])
downs (atom [])
config {:store :mock
(let [ups (atom [])
downs (atom [])
config {:store :mock
:completed-ids (atom #{1})}]
(with-redefs [mig/list-migrations (constantly (migrations ups downs))]
(testing "should return the list of pending migrations"
Expand All @@ -133,7 +136,7 @@


(deftest supported-extensions
(testing "All supported extensions show up.
(testing "All supported extensions show up.
NOTE: when you add a protocol, to migratus core, update this test")
(is (= '("sql" "edn")
(proto/get-all-supported-extensions))))
5 changes: 3 additions & 2 deletions test/migratus/test/database.clj
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,11 @@
(io/copy f (io/file to (.getName f)))))

(deftest test-migration-sql-edn-mixed
(let [migration-dir (io/file "resources/migrations-mixed")
(let [migration-dir (io/file "test/migrations-mixed")
test-config (merge config
test-edn/test-config
{:migration-dir "migrations-mixed"})]
{:parent-migration-dir "test"
:migration-dir "migrations-mixed"})]
(try
(utils/recursive-delete (io/file test-edn/test-dir))
(utils/recursive-delete migration-dir)
Expand Down
Loading

0 comments on commit 19c0fa9

Please sign in to comment.