This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2020-11-10
Channels
- # announcements (4)
- # asami (3)
- # babashka (49)
- # beginners (56)
- # chlorine-clover (42)
- # cider (13)
- # clara (3)
- # cljfx (14)
- # clojure (65)
- # clojure-australia (2)
- # clojure-dev (12)
- # clojure-europe (57)
- # clojure-italy (10)
- # clojure-nl (3)
- # clojure-spec (25)
- # clojure-uk (25)
- # clojuredesign-podcast (11)
- # clojurescript (78)
- # code-reviews (16)
- # community-development (3)
- # cursive (14)
- # datomic (16)
- # depstar (20)
- # emacs (3)
- # figwheel-main (2)
- # fulcro (33)
- # helix (16)
- # jackdaw (15)
- # kaocha (13)
- # leiningen (3)
- # malli (33)
- # reveal (10)
- # shadow-cljs (29)
- # spacemacs (10)
- # sql (13)
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
I see, thanks @U04V15CAJ
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.
I made an issue for the first obstacle at least here: https://github.com/borkdude/babashka/issues/635
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
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
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.
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
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:@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]
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
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?
I'm partial to using cljdoc for primary docs since they don't have a good way to change docs after release
ironically I already split the REPL docs up into its own page. Maybe that was the reason he couldn;'t find it ;)