obb
obb copied to clipboard
Ad-hoc ClojureScript scripting of Mac applications via Apple's Open Scripting Architecture.
obb
Ad-hoc ClojureScript scripting of Mac applications via Apple's Open Scripting Architecture.
Status
Experimental.
Installation
Homebrew
$ brew install babashka/brew/obb
Manual
Download from Github releases.
Usage
Evaluate an expression:
$ obb -e '(-> (js/Application "Safari") (.-documents) (aget 0) (.url))'
"https://clojure.org/"
$ obb -e '(-> (js/Application "Google Chrome") (.-windows) (aget 0) (.activeTab) (.title))'
#js ["GitHub - babashka/obb: Ad-hoc ClojureScript scripting of Mac applications"]
Or evaluate a file:
$ obb examples/choice.cljs
Or make an executable script by using obb in a shebang:
#!/usr/bin/env obb
(-> (js/Application "Safari")
(.quit))
How does this tool work?
ClojureScript code is evaluated through SCI, the same interpreter that powers babashka. SCI is compiled to JavaScript which is then by executed by osascript.
Macros
SCI supports macros as first class citizens so you can write a few macros to deal with interop boilerplate:
(defmacro ->clj [obj & interops]
(let [names (map #(clojure.string/replace (str %) #"[.-]" "") interops)
ks (mapv keyword names)
exprs (mapv #(list % obj) interops)]
`(zipmap ~ks [~@exprs])))
(-> (js/Application "Spotify") (.-currentTrack) (->clj .artist .album .name))
;;=>
{:artist "The Gathering", :album "How to Measure a Planet? (Deluxe Edition)", :name "Travel"}
References
Tips and tricks
Explore app specific APIs
Open Script Editor.app, go to File > Open Dictionary and select the
application you would like to explore, e.g. Spotify.app. After selection,
select JavaScript instead of AppleScript.
Application bundle
Read here how to create an application bundle from an obb script.
Sister projects
- babashka: Native, fast starting Clojure interpreter for scripting.
- nbb: Ad-hoc CLJS scripting on Node.js using SCI.
- scittle: The Small Clojure Interpreter exposed for usage in browser script tags.
Build
Install Babashka. Then build with:
$ bb build
Then place out/obb anywhere on your path.
Dev
To develop obb you can use the bb dev task which starts a shadow-cljs server
and a file watcher.