jolt/docs/libraries.md
Yogthos 7b1ec9a1d3 java.time DST + data readers: make tick pass fully
Shaking out tick's api and alpha.interval suites (api 353->359, interval
0->103 passing) cleared a set of general gaps:

- Named-zone DST. Zones resolved to a fixed representative offset, so
  America/New_York in August read -05:00 not -04:00. Add US/EU DST rules
  (compact transition-date math) and make instant<->zoned, the zone rules'
  getOffset, and the zoned equality arm DST-aware.

- Nanosecond zoned/offset times. Instant is nanos but atZone/atOffset/
  toInstant/withZoneSameInstant and Instant/parse went through epoch-ms,
  truncating sub-ms. Route them through nanos.

- Locale month/day names. A formatter dropped its Locale; carry it and add
  French names so MMM under Locale/FRENCH renders "mai".

- Callable records. A defrecord implementing clojure.lang.IFn (tick's
  GeneralRelation) is now invokable: jolt-invoke dispatches to its inline
  invoke method. Also give collections the Iterable host tag so a protocol
  extended to Iterable matches vectors/seqs.

- Imported class short names. (:import [java.time ZonedDateTime]) then
  (. ZonedDateTime parse s) resolved to nil; an otherwise-unresolved bare
  Capitalized name that's a registered host class now resolves as a class.

- Data readers. A project's data_readers.{clj,cljc} is loaded into
  *data-readers* (reader namespaces required eagerly); registered #tag
  literals in source rewrite to (reader-fn 'form). clojure.core/read-string
  now applies #inst/#uuid/#"regex" and *data-readers* like Clojure.

- Duration/between accepts zoned/offset date-times.

All runtime shims, no re-mint. docs/libraries.md: tick full pass + aero.
2026-06-24 21:30:05 -04:00

4.6 KiB

Clojure libraries known to work with Jolt

Libraries confirmed to load and pass their conformance checks on Jolt (see the examples, e.g. the ring-app example).

  • aero — EDN configuration with tag literals; read-config resolves #ref/#env/#or/#profile/#long/… and map/vector/set configs round-trip
  • config
  • Selmer
  • medley
  • cuerdas
  • ring-core — via :deps/root "ring-core", on the ring-app example's spork/http adapter
  • ring-codec
  • reitit-core — data-driven routing; the reitit.Trie Java class is mirrored in Clojure by jolt-lang/router. Load with JOLT_FEATURES including clj.
  • integrant — data-driven system configuration; ig/init/ig/halt! build and tear down a component graph wired with #ig/ref, on the ring-app example. Loads unmodified with its dependency and meta-merge deps.
  • honeysql — full formatter + helpers (select/insert/update/delete/joins/:inline), loaded unmodified from git
  • clojure.jdbc — as jolt-lang/db's jdbc.core, over the built-in SQLite access (libsqlite3 via Chez's FFI)
  • next.jdbc — a compatibility layer in jolt-lang/db (next.jdbc, next.jdbc.sql, next.jdbc.prepare, next.jdbc.transaction) over jdbc.core, for libraries that target the next.jdbc API
  • tools.logging — the real clojure.tools.logging source runs verbatim. jolt provides a native clojure.tools.logging.impl backend (a stderr LoggerFactory — the library's designed extension point, where slf4j/log4j/jul adapters normally plug in) plus the host shims it needs (agent/send-off, clojure.lang.LockingTransaction, a clojure.pprint subset, clojure.string/trim-newline). The level macros, logf/logp, spy, and enabled? all work; output goes to stderr.
  • migratus — database migrations; loads unmodified and runs filesystem SQL/EDN migrations against SQLite through the next.jdbc layer above. migrate/rollback round-trip end to end.
  • malli — data schema validation, on the malli-app example. m/validate and m/explain work across the vocabulary (predicates, :int/ :string/:keyword, :map incl. nested + optional, :vector, :tuple, :enum, :maybe, :and/:or, :re, bounded int/string). Load with JOLT_FEATURES including clj (malli's .cljc keys class-schemas off the :clj reader-conditional branches).
  • markdown-clj — Markdown → HTML, on the markdown-app example. Renders headings, emphasis, inline code, links, lists, tables, strikethrough.
  • hiccup — HTML from Clojure data, on the hiccup-app example. Element tags, attribute maps, nested elements, and for comprehensions; its html macro pre-compiles the markup (a good compiler stress test).
  • clojure.data.json — JSON reading and writing; read-str/write-str with key/value fns and options. Its own test suite passes 138/139.
  • clojure.spec.alpha — data specs; s/def, s/valid?, s/conform, s/cat/s/keys, s/explain-str, and s/check-asserts work over the registry.
  • tick — date/time over Jolt's java.time. Its api and alpha.interval test suites pass in full, including named-zone DST, nanosecond instants, and French locale formatting. Loads with JOLT_FEATURES including clj; #time/… literals work via time-literals' data readers.