Quantcast
Channel: Clojure – Compound Theory
Viewing all articles
Browse latest Browse all 9

Brute 0.4.0 – From CLJX to Reader Conditionals

$
0
0

This release of Brute, provides no new features, but is instead a migration from using CLJX as the support for both Clojure and ClojureScript at once, to upgrading to Clojure 1.7, and utilising the (relatively?) new feature of Reader Conditionals.

In terms of changing the implementing code, this was a fairly straightforward task. It was essentially a case of changing file extensions from cljx to cljc, moving the code out of the cljx folders and back into the src directory, and then converting the markers for where clj implementations would be switched out with cljs implementations, depending on which platform it was running on.

For example, the function I had to generate UUIDs, used to looks like this:

(defn create-uuid []
  "create a UUID"
  #+clj (java.util.UUID/randomUUID)
  #+cljs
  (let [template "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
        f #(let [r (Math/floor (* (rand) 16))
                 v (if (= % \x) r (bit-or (bit-and r 0x3) 0x8))]
             (.toString v 16))]
    (.replace template (js/RegExp. "[xy]" "g") f)))

But now it looks like this:

(defn create-uuid
  "create a UUID"
  []
  #?(:clj  (java.util.UUID/randomUUID)
     :cljs (let [template "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
                 f #(let [r (Math/floor (* (rand) 16))
                          v (if (= % \x) r (bit-or (bit-and r 0x3) 0x8))]
                     (.toString v 16))]
             (.replace template (js/RegExp. "[xy]" "g") f))))

As you can see, there are some minor syntactic changes, but essentially it’s the same structure and format. Not a hard thing to do with some time and some patience.

The more interesting part was more finding a test framework that worked well with reader conditionals. Previously, I had all my tests implemented in Midje, but found that the autotest functionality doesn’t work with reader conditionals, which for me was it’s biggest feature.  It also didn’t have core support for ClojureScript, but instead was implemented by a different developer as part of the purnam library. While the implementation for ClojureScript is quite good, it hadn’t been touched in ten months, which has me concerned.

After hunting around a bit, I ended up settling on using good ol’ clojure.test and cljs.test. It’s well supported across both platforms, and as I recently discovered has amazing integration with Cursive Clojure!  It took me a little while to get all the tests ported across, but otherwise the experience was also very smooth.  Now I have a testing platform I can continue to develop on, and I know will continue to support both Clojure and ClojureScript for the foreseeable future.

I have some minor enhancements for Brute that I will probably jump on at some point in the near future, but as always, feature requests and bug reports are always appreciated.


Viewing all articles
Browse latest Browse all 9

Trending Articles