Fork me on GitHub

Why would babashka barf on this: 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


Because sci doesn't supported nested libspecs. I'm currently working on that.


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:


:thumbsup: thank you for pursuing this


Btw, if you want to do code analysis right now: this is one option: 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]]
         '[ :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
  (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:


Cool, I'll check it out


Certainly useful. Maybe you could PR this as an example to the pod-babashka-parcera repo


Replacing the previous example is ok with me


I tweeted it ;)

Jakub Holý (HolyJak)15:11:02

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: 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

Jakub Holý (HolyJak)15:11:45

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 ( 2) Yes

Jakub Holý (HolyJak)15:11:50

thanks a lot! Will have a look.

Jakub Holý (HolyJak)16:11:47

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.

👍 3

Making a pod is an extra level of complexity, so for proof of concept feature flag is better


And you are right @U04V15CAJ 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


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 [ 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:@")

(let [ds (jdbc/get-datasource {:jdbcUrl url :user "password" :password "password"})]
  (with-open [^java.sql.Connection c (jdbc/get-connection ds)]



─➤ ./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 '' 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


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 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

👍 9

it would be nice to have auto toc - fwiw, i thought i heard that asciidoc has some kind of toc support