Why would babashka barf on this: https://github.com/xsc/rewrite-clj/blob/master/src/rewrite_clj/node.clj#L1-L21? I'm seeing:
;; ----- Error --------------------------------------------------------------------
;; Type: java.lang.IllegalArgumentException
;; Message: No matching clause: coerce
;; Location: rewrite_clj/node.clj:1:1
;; ----- Context ------------------------------------------------------------------
;; 1: (ns
;; ^--- No matching clause: coerce
;; 2: ^{:added "0.4.0"}
;; 3: rewrite-clj.node
;; 4: (:require [rewrite-clj.node
;; 5: coerce
;; 6: comment
with babashka v0.2.2
In case it's useful for others: https://gist.github.com/codeasone/06f23dc9f1849c85d0b82329a64d3481
Certainly useful. Maybe you could PR this as an example to the pod-babashka-parcera repo
Replacing the previous example is ok with me
:thumbsup:
I tweeted it ;)
Because sci doesn't supported nested libspecs. I'm currently working on that.
I see, thanks @borkdude
I now have a nested-namespaces branch, binaries are coming into #babashka_circleci_builds. It would surprise me if bb could run rewrite-clj though, I don't think it can.
At least not right now.
I made an issue for the first obstacle at least here: https://github.com/borkdude/babashka/issues/635
:thumbsup: thank you for pursuing this
Btw, if you want to do code analysis right now: this is one option: https://github.com/babashka/pod-babashka-parcera Maybe you can explain your use case / requirement and there might already be options.
Of course, I'm want to setup a git hook to ensure namespace require forms remain ordered, so wanted to leverage nsorg
off a pre-commit hook
#!/usr/bin/env bb
(require '[babashka.classpath :refer [add-classpath]]
'[clojure.java.shell :refer [sh]]
'[clojure.string :as str])
(def nsorg-dep '{:deps {nsorg/nsorg {:mvn/version "0.2.0"}}})
(def cp (-> (sh "clojure" "-Spath" "-Sdeps" (str nsorg-dep)) :out str/trim))
(add-classpath cp)
(require '[nsorg.core :as nsorg])
(defn format-file
[filename]
(let [code (slurp filename)
processed (nsorg/rewrite-ns-form code)]
(spit filename processed)
))
(when-let [[& files] *command-line-args*]
(doseq [file files]
(prn "Processing: " file)
(format-file file)))
Was how I was hooking in nsorg
and it depends on rewrite-clj
The startup cost (1-2 seconds) of running clojure -M:nsorg --replace src test
is mildly annoying for small commits involving changes to only one or two files say
Right. Btw, clj-kondo has a linter for unsorted namespaces. So what you could do is use that linter output to then invoke nsorg on the JVM if there are unsorted namespaces.
I also have an example how to sort requires with pod-babashka-parcera: https://github.com/babashka/pod-babashka-parcera#sort-requires
Cool, I'll check it out
Hello! I see bb supports some JDBC drivers. How difficult is it / what does it take to add another one? In particular, I would like to talk to Oracle. (Yes, I know. Sorry, I am forced to do that 😉.)
@holyjak Driver support depends on how well it compiles with GraalVM. Since both Oracle DB and GraalVM are from Oracle, one would expect it to work maybe? ;)
@holyjak There are a bunch of feature flags here: https://github.com/borkdude/babashka/blob/master/doc/build.md#feature-flags One for postgres for example. You would need to make a PR for the Oracle driver that implements such a feature flag.
I vaguely remember that @mbjarland also had interest in doing something with Oracle, but I could be mixing stuff up
1. How do I test that the oracle driver compiles? 2. I would be happy to send a PR if I get it working. But I suspect oracle jdbc cannot be redistributed so the user would need to supply it herself?
1. Look for existing examples. Quarkus is a Java framework for GraalVM which has lots of plugins, I see they also have Oracle support (https://blogs.oracle.com/developers/configuring-the-oracle-jdbc-drivers-with-quarkus) 2) Yes
thanks a lot! Will have a look.
so back when I looked into this I was trying to make a standalone script to be run with a custom compiled babashka which included next.jdbc and which dynamically loaded the oracle jar
how far I got:
#!/usr/bin/env bb
; when in a babashka execution context, add extra jars to the classpath.
(ns scripts.babashka-classpath
(:import [<http://java.io|java.io> File]))
(when-let [bb-ns (find-ns 'babashka.classpath)]
(let [shared (str (.getParentFile (File. ^String *file*)) "/shared")
acp-fn (ns-resolve bb-ns (symbol "add-classpath"))
add-cp (fn [& r]
(let [path (clojure.string/join "/" r)]
(println "adding" path)
(acp-fn path)))]
(add-cp shared "ojdbc6_g.jar")))
(ns scripts.jdbc-test
(:require [next.jdbc :as jdbc])
(:import [java.sql.Connection]))
(println "loading class")
(println "class:" (Class/forName "oracle.jdbc.driver.OracleDriver"))
(println "class loaded")
(def url "jdbc:oracle:thin:@172.20.0.80:1521:orcl")
(let [ds (jdbc/get-datasource {:jdbcUrl url :user "password" :password "password"})]
(with-open [^java.sql.Connection c (jdbc/get-connection ds)]
and:
─➤ ./bb jdbc-test.clj
adding <elided for brevity>/babashka/matias/shared/ojdbc6_g.jar
loading class
class: oracle.jdbc.driver.OracleDriver
class loaded
clojure.lang.ExceptionInfo: IO Error: Message file 'oracle.net.mesg.Message' is missing. [at /home/mbjarland/projects/clojure/babashka/matias/jdbc-test.clj, line 27, column 38]
so not that far, let me know if you end up solving this
Ah I see, you tried to run the Oracle driver from babashka source. Unfortunately that won't work. You will have to add it via a feature flag, like the postgres driver. You cannot load classes at runtime in babashka / graal
I also found an issue about it here: https://github.com/quarkusio/quarkus/issues/1658
Awesome, thanks a lot! BTW do you recommend going the feature flag way or making a pod? I'm not up to speed..
Making a feature flag might be easier to find out if it's going to work. If it works, with this knowledge you could proceed to make a pod.
Making a pod is an extra level of complexity, so for proof of concept feature flag is better
might be in the TL;DR realm at this point
a suggestion: make the repo README mostly about how to develop and contribute to babashka, and move all the (very rich) documentation somewhere else
perhaps articles so they show up in https://cljdoc.org/d/borkdude/babashka/0.2.3/ and that can be the doc site?
do you mean split up by topic and move to their own page?
I'm partial to using cljdoc for primary docs since they don't have a good way to change docs after release
yeah, if you split them up into separate pages by topic
then the left column on cljdoc is like a table of contents for all doc
ironically I already split the REPL docs up into its own page. Maybe that was the reason he couldn;'t find it ;)
I like cljdoc too, because then the docs are versioned with the releases
I've seen long READMEs on github that simply put a table-of-contents at the top that links to the markdown headers, and it helps a lot
And you are right @borkdude i did start looking into this, I'll dig tomorrow and see where I left it. Seem to remember there being some trickery involved with classloading and next-jdbc...or something, I'll see if I can dig it up