diff --git a/README.md b/README.md index 34910465..141358e6 100644 --- a/README.md +++ b/README.md @@ -179,12 +179,14 @@ The following Java classes are available: - `clojure.lang.ExceptionInfo` - `Integer` - `java.io.File` +- `java.nio.Files` - `java.util.regex.Pattern` - `String` - `System` - `Thread` -More classes can be added by request. +More classes can be added by request. See `reflection.json` and the `:classes` +option in `main.clj`. Babashka supports `import` : `(import clojure.lang.ExceptionInfo)`. diff --git a/reflection.json b/reflection.json index 986af033..f7253b1e 100644 --- a/reflection.json +++ b/reflection.json @@ -121,5 +121,45 @@ { "name":"java.lang.UNIXProcess", "allPublicMethods":true + }, + { + "name":"java.nio.file.Path", + "allPublicMethods":true + }, + { + "name":"java.nio.file.CopyOption", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true + }, + { + "name":"java.nio.file.FileAlreadyExistsException", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true + }, + { + "name":"java.nio.file.Files", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true + }, + { + "name":"java.nio.file.NoSuchFileException", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true + }, + { + "name":"java.nio.file.StandardCopyOption", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true + }, + { + "name":"sun.nio.fs.UnixPath", + "allPublicMethods":true, + "allPublicFields": true, + "allPublicConstructors": true } ] diff --git a/sci b/sci index d91bf4bf..736880b5 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit d91bf4bf1b831de58a4980379558aed6ce28a641 +Subproject commit 736880b590e6df75e928a826f1aa24e17a613c67 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index accac39e..5199e100 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -227,7 +227,14 @@ Everything after that is bound to *command-line-args*.")) 'java.io.StringReader java.io.StringReader 'java.io.StringWriter java.io.StringWriter 'java.lang.System System - 'java.lang.Thread Thread} + 'java.lang.Thread Thread + 'sun.nio.fs.UnixPath sun.nio.fs.UnixPath + 'java.nio.file.CopyOption java.nio.file.CopyOption + 'java.nio.file.FileAlreadyExistsException java.nio.file.FileAlreadyExistsException + 'java.nio.file.Files java.nio.file.Files + 'java.nio.file.NoSuchFileException java.nio.file.NoSuchFileException + 'java.nio.file.StandardCopyOption java.nio.file.StandardCopyOption + } :imports '{ArithmeticException java.lang.ArithmeticException AssertionError java.lang.AssertionError Boolean java.lang.Boolean diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index ed5f8367..af5c342d 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -134,7 +134,7 @@ (deftest eval-test (is (= "120\n" (test-utils/bb nil "(eval '(do (defn foo [x y] (+ x y)) - (defn bar [x y] (* x y)) + (defn bar [x y] (* x y)) (bar (foo 10 30) 3)))")))) (deftest preloads-test @@ -177,16 +177,16 @@ (deftest create-temp-file-test (let [temp-dir-path (System/getProperty "java.io.tmpdir")] (is (= true - (bb nil (format "(let [tdir (io/file \"%s\") + (bb nil (format "(let [tdir (io/file \"%s\") tfile (File/createTempFile \"ctf\" \"tmp\" tdir)] (.deleteOnExit tfile) ; for cleanup (.exists tfile))" - temp-dir-path)))))) + temp-dir-path)))))) (deftest wait-for-port-test (is (= :timed-out - (bb nil "(def web-server (conch/proc \"python\" \"-m\" \"SimpleHTTPServer\" \"7171\")) + (bb nil "(def web-server (conch/proc \"python\" \"-m\" \"SimpleHTTPServer\" \"7171\")) (wait/wait-for-port \"127.0.0.1\" 7171) (conch/destroy web-server) (wait/wait-for-port \"localhost\" 7172 {:default :timed-out :timeout 50})")))) @@ -194,7 +194,7 @@ (deftest wait-for-path-test (let [temp-dir-path (System/getProperty "java.io.tmpdir")] (is (not= :timed-out - (bb nil (format "(let [tdir (io/file \"%s\") + (bb nil (format "(let [tdir (io/file \"%s\") tfile (File/createTempFile \"wfp\" \"tmp\" tdir) tpath (.getPath tfile)] @@ -203,16 +203,16 @@ (wait/wait-for-path tpath {:default :timed-out :timeout 100}) (.delete tfile))" - temp-dir-path)))) + temp-dir-path)))) (is (= :timed-out - (bb nil (format "(let [tdir (io/file \"%s\") + (bb nil (format "(let [tdir (io/file \"%s\") tfile (File/createTempFile \"wfp-to\" \"tmp\" tdir) tpath (.getPath tfile)] (.delete tfile) ; for timing out test and cleanup (wait/wait-for-path tpath {:default :timed-out :timeout 100}))" - temp-dir-path)))))) + temp-dir-path)))))) (deftest async-test (is (= "process 2\n" (test-utils/bb nil " @@ -269,3 +269,22 @@ (deftest with-in-str-test (is (= 5 (bb nil "(count (with-in-str \"hello\" (read-line)))")))) + +(deftest java-nio-test + (let [f (java.io.File/createTempFile "foo" "bar") + temp-path (.getPath f) + p (.toPath (io/file f)) + p' (.resolveSibling p "f2") + f2 (.toFile p')] + (bb nil (format + "(let [f (io/file \"%s\") + p (.toPath (io/file f)) + p' (.resolveSibling p \"f2\")] + (.delete (.toFile p')) + (dotimes [_ 2] + (try + (java.nio.file.Files/copy p p' (into-array java.nio.file.CopyOption [])) + (catch java.nio.file.FileAlreadyExistsException _ + (java.nio.file.Files/copy p p' (into-array [java.nio.file.StandardCopyOption/REPLACE_EXISTING]))))))" + temp-path)) + (is (.exists f2))))