[#13] add clojure.java.io and java.io.File
This commit is contained in:
parent
8e60d0cc4b
commit
8a0c9a95c8
5 changed files with 146 additions and 25 deletions
|
|
@ -1 +1,3 @@
|
||||||
{:lint-as {me.raynes.conch/let-programs clojure.core/let}}
|
{:lint-as {me.raynes.conch/let-programs clojure.core/let
|
||||||
|
babashka.impl.File/gen-wrapper-fn clojure.core/def
|
||||||
|
babashka.impl.File/gen-wrapper-fn-2 clojure.core/def}}
|
||||||
|
|
|
||||||
34
README.md
34
README.md
|
|
@ -95,24 +95,46 @@ You may also download a binary from [Github](https://github.com/borkdude/babashk
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
``` shellsession
|
``` shellsession
|
||||||
bb [ --help ] | [ --version ] | ( [ -i ] [ -o ] | [ -io ] ) [ --stream ] ( expression | -f <file> )
|
$ bb --help
|
||||||
```
|
Usage: bb [ --help ] | [ --version ] | ( [ -i ] [ -o ] | [ -io ] ) [ --stream ] ( expression | -f <file> )
|
||||||
|
|
||||||
Type `bb --help` to see a full explanation of the options.
|
Options:
|
||||||
|
|
||||||
|
--help: print this help text.
|
||||||
|
--version: print the current version of babashka.
|
||||||
|
|
||||||
|
-i: read shell input into a list of strings instead of reading EDN.
|
||||||
|
-o: write shell output instead of EDN.
|
||||||
|
-io: combination of -i and -o.
|
||||||
|
--stream: stream over lines or EDN values from stdin. Combined with -i *in* becomes a single line per iteration.
|
||||||
|
--file or -f: read expressions from file instead of argument wrapped in an implicit do.
|
||||||
|
--time: print execution time before exiting.
|
||||||
|
```
|
||||||
|
|
||||||
The `clojure.core` functions are accessible without a namespace alias.
|
The `clojure.core` functions are accessible without a namespace alias.
|
||||||
|
|
||||||
The following Clojure namespaces are required by default and only available
|
The following Clojure namespaces are required by default and only available
|
||||||
through the aliases:
|
through the aliases. If not all vars are available, they are enumerated
|
||||||
|
explicitly.
|
||||||
|
|
||||||
- `clojure.string` aliased as `str`
|
- `clojure.string` aliased as `str`
|
||||||
- `clojure.set` aliased as `set`
|
- `clojure.set` aliased as `set`
|
||||||
- `clojure.edn` aliased as `edn` (only `read-string` is available)
|
- `clojure.edn` aliased as `edn`:
|
||||||
- `clojure.java.shell` aliases as `shell` (only `sh` is available)
|
- `read-string`
|
||||||
|
- `clojure.java.shell` aliases as `shell`:
|
||||||
|
- `sh`
|
||||||
|
- `clojure.java.io` aliased as `io`:
|
||||||
|
- `as-relative-path`, `copy`, `delete-file`, `file`
|
||||||
|
|
||||||
From Java the following is available:
|
From Java the following is available:
|
||||||
|
|
||||||
- `System`: `exit`, `getProperty`, `setProperty`, `getProperties`, `getenv`
|
- `System`: `exit`, `getProperty`, `setProperty`, `getProperties`, `getenv`
|
||||||
|
- `File`: `.canRead`, `.canWrite`, `.delete`, `.deleteOnExit`, `.exists`,
|
||||||
|
`.getAbsoluteFile`, `.getCanonicalFile`, `.getCanonicalPath`, `.getName`,
|
||||||
|
`.getParent`, `.getParentFile`, `.getPath`, `.isAbsolute`, `.isDirectory`,
|
||||||
|
`.isFile`, `.isHidden`, `.lastModified`, `.length`, `.list`, `.listFiles`,
|
||||||
|
`.mkdir`, `.mkdirs`, `.renameTo`, `.setLastModified`, `.setReadOnly`,
|
||||||
|
`.setReadable`, `.toPath`, `.toURI`.
|
||||||
|
|
||||||
Special vars:
|
Special vars:
|
||||||
|
|
||||||
|
|
|
||||||
80
src/babashka/impl/File.clj
Normal file
80
src/babashka/impl/File.clj
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
(ns babashka.impl.File
|
||||||
|
(:refer-clojure :exclude [list])
|
||||||
|
(:require [clojure.java.io :as io]
|
||||||
|
[clojure.string :as str]))
|
||||||
|
|
||||||
|
(set! *warn-on-reflection* true)
|
||||||
|
;; also see https://gist.github.com/plexus/68594ba9b5e3f0d63fe84dcae31c4a53
|
||||||
|
|
||||||
|
(defmacro gen-wrapper-fn [method-name]
|
||||||
|
`(defn ~method-name {:bb/export true}
|
||||||
|
[~(with-meta 'x {:tag 'java.io.File})]
|
||||||
|
(~(symbol (str "." method-name)) ~'x)))
|
||||||
|
|
||||||
|
(defmacro gen-wrapper-fn-2 [method-name]
|
||||||
|
`(defn ~method-name {:bb/export true}
|
||||||
|
[~(with-meta 'x {:tag 'java.io.File}) ~'y]
|
||||||
|
(~(symbol (str "." method-name)) ~'x ~'y)))
|
||||||
|
|
||||||
|
(gen-wrapper-fn canRead)
|
||||||
|
(gen-wrapper-fn canWrite)
|
||||||
|
(gen-wrapper-fn delete)
|
||||||
|
(gen-wrapper-fn deleteOnExit)
|
||||||
|
(gen-wrapper-fn exists)
|
||||||
|
(gen-wrapper-fn getAbsoluteFile)
|
||||||
|
(gen-wrapper-fn getCanonicalFile)
|
||||||
|
(gen-wrapper-fn getCanonicalPath)
|
||||||
|
(gen-wrapper-fn getName)
|
||||||
|
(gen-wrapper-fn getParent)
|
||||||
|
(gen-wrapper-fn getParentFile)
|
||||||
|
(gen-wrapper-fn getPath)
|
||||||
|
(gen-wrapper-fn isAbsolute)
|
||||||
|
(gen-wrapper-fn isDirectory)
|
||||||
|
(gen-wrapper-fn isFile)
|
||||||
|
(gen-wrapper-fn isHidden)
|
||||||
|
(gen-wrapper-fn lastModified)
|
||||||
|
(gen-wrapper-fn length)
|
||||||
|
(gen-wrapper-fn list)
|
||||||
|
(gen-wrapper-fn listFiles)
|
||||||
|
(gen-wrapper-fn mkdir)
|
||||||
|
(gen-wrapper-fn mkdirs)
|
||||||
|
(gen-wrapper-fn-2 renameTo)
|
||||||
|
(defn setExecutable
|
||||||
|
([^java.io.File f b]
|
||||||
|
(.setExecutable f b))
|
||||||
|
([^java.io.File f b ownerOnly]
|
||||||
|
(.setExecutable f b ownerOnly)))
|
||||||
|
(gen-wrapper-fn-2 setLastModified)
|
||||||
|
(gen-wrapper-fn-2 setReadable)
|
||||||
|
(gen-wrapper-fn setReadOnly)
|
||||||
|
(defn setWritable
|
||||||
|
([^java.io.File f b]
|
||||||
|
(.setWritable f b))
|
||||||
|
([^java.io.File f b ownerOnly]
|
||||||
|
(.setWritable f b ownerOnly)))
|
||||||
|
(gen-wrapper-fn toPath)
|
||||||
|
(gen-wrapper-fn toURI)
|
||||||
|
|
||||||
|
(def bindings
|
||||||
|
(reduce (fn [acc [k v]]
|
||||||
|
(if (-> v meta :bb/export)
|
||||||
|
(assoc acc (symbol (str "." k))
|
||||||
|
@v)
|
||||||
|
acc))
|
||||||
|
{}
|
||||||
|
(ns-publics *ns*)))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(canRead (clojure.java.io/file "README.md"))
|
||||||
|
(canWrite (clojure.java.io/file "README.md"))
|
||||||
|
(exists (clojure.java.io/file "README.md"))
|
||||||
|
(renameTo (io/file "/tmp/script2.clj") (io/file "/tmp/script.clj"))
|
||||||
|
(.setWritable (io/file "/tmp/script.clj") true true)
|
||||||
|
(meta #'toURI)
|
||||||
|
(first bindings)
|
||||||
|
(get bindings '.length)
|
||||||
|
(get bindings '.canWrite)
|
||||||
|
(meta #'canWrite)
|
||||||
|
;; for README.md:
|
||||||
|
(str/join ", " (map #(format "`%s`" %) (sort (keys bindings))))
|
||||||
|
)
|
||||||
|
|
@ -5,7 +5,8 @@
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[clojure.java.shell :as shell]
|
[clojure.java.shell :as shell]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[sci.core :as sci])
|
[sci.core :as sci]
|
||||||
|
[babashka.impl.File :as File])
|
||||||
(:gen-class))
|
(:gen-class))
|
||||||
|
|
||||||
(set! *warn-on-reflection* true)
|
(set! *warn-on-reflection* true)
|
||||||
|
|
@ -111,23 +112,35 @@
|
||||||
(throw (ex-info "" {:bb/exit-code n})))
|
(throw (ex-info "" {:bb/exit-code n})))
|
||||||
|
|
||||||
(def bindings
|
(def bindings
|
||||||
{'run! run!
|
(merge {'run! run!
|
||||||
'shell/sh shell/sh
|
'shell/sh shell/sh
|
||||||
'csh shell/sh ;; backwards compatibility, deprecated
|
'csh shell/sh ;; backwards compatibility, deprecated
|
||||||
'namespace namespace
|
'namespace namespace
|
||||||
'slurp slurp
|
'slurp slurp
|
||||||
'spit spit
|
'spit spit
|
||||||
'pmap pmap
|
'pmap pmap
|
||||||
'print print
|
'print print
|
||||||
'pr-str pr-str
|
'pr-str pr-str
|
||||||
'prn prn
|
'prn prn
|
||||||
'println println
|
'println println
|
||||||
'edn/read-string edn/read-string
|
|
||||||
'System/getenv get-env
|
;; clojure.java.io
|
||||||
'System/getProperty get-property
|
'io/as-relative-path io/as-relative-path
|
||||||
'System/setProperty set-property
|
'io/copy io/copy
|
||||||
'System/getProperties get-properties
|
'io/delete-file io/delete-file
|
||||||
'System/exit exit})
|
'io/file io/file
|
||||||
|
;; '.canRead File/canRead
|
||||||
|
;; '.canWrite File/canWrite
|
||||||
|
;; '.exists File/exists
|
||||||
|
;; '.delete File/delete
|
||||||
|
|
||||||
|
'edn/read-string edn/read-string
|
||||||
|
'System/getenv get-env
|
||||||
|
'System/getProperty get-property
|
||||||
|
'System/setProperty set-property
|
||||||
|
'System/getProperties get-properties
|
||||||
|
'System/exit exit}
|
||||||
|
File/bindings))
|
||||||
|
|
||||||
(defn read-edn []
|
(defn read-edn []
|
||||||
(edn/read {;;:readers *data-readers*
|
(edn/read {;;:readers *data-readers*
|
||||||
|
|
|
||||||
|
|
@ -110,3 +110,7 @@
|
||||||
;; THIS TEST REQUIRES:
|
;; THIS TEST REQUIRES:
|
||||||
;; export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'
|
;; export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'
|
||||||
(is (= "foobar" (bb nil "(str (__bb__foo) (__bb__bar))"))))
|
(is (= "foobar" (bb nil "(str (__bb__foo) (__bb__bar))"))))
|
||||||
|
|
||||||
|
(deftest io-test
|
||||||
|
(is (true? (bb nil "(.exists (io/file \"README.md\"))")))
|
||||||
|
(is (true? (bb nil "(.canWrite (io/file \"README.md\"))"))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue