Compare commits

..

1 commit

Author SHA1 Message Date
Michiel Borkent
ad046852c9 Re-enable mac on CircleCI 2022-05-09 17:51:14 +02:00
222 changed files with 3922 additions and 11302 deletions

View file

@ -2,5 +2,5 @@
:deps {borkdude/gh-release-artifact
#_{:local/root "../gh-release-artifact"}
{:git/url "https://github.com/borkdude/gh-release-artifact"
:git/sha "4a9a74f0e50e897c45df8cc70684360eb30fce80"}}
:sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}}
:tasks {release-artifact babashka.release-artifact/release}}

View file

@ -3,38 +3,490 @@
# Check https://circleci.com/docs/2.0/language-clojure/ for more details
#
version: 2.1
commands:
setup-docker-buildx:
steps:
- run:
name: Create multi-platform capabale buildx builder
command: |
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --name ci-builder --use
# this allows you to use CircleCI's dynamic configuration feature
setup: true
# the continuation orb is required in order to use dynamic configuration
orbs:
continuation: circleci/continuation@0.1.2
# our defined job, and its steps
jobs:
setup:
jvm:
docker:
- image: cimg/clojure:1.11.1
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
BABASHKA_PLATFORM: linux # could be used in jar name
resource_class: large
steps:
- checkout
- run:
name: Bootstrap Babashka
name: "Pull Submodules"
command: |
curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
sudo bash install --dir /tmp
git submodule init
git submodule update
- restore_cache:
keys:
- v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run:
name: Rename bb binary
command: mv /tmp/bb /tmp/bbb
- run:
name: Generate config
name: Install Clojure
command: |
/tmp/bbb .circleci/script/gen_ci.clj > generated_config.yml
- continuation/continue:
configuration_path: generated_config.yml
sudo script/install-clojure
- run:
name: Run JVM tests
command: |
export BABASHKA_FEATURE_JDBC=true
export BABASHKA_FEATURE_POSTGRESQL=true
script/test
script/run_lib_tests
- run:
name: Run as lein command
command: |
.circleci/script/lein
- run:
name: Create uberjar
command: |
mkdir -p /tmp/release
script/uberjar
VERSION=$(cat resources/BABASHKA_VERSION)
jar=target/babashka-$VERSION-standalone.jar
cp $jar /tmp/release
java -jar $jar script/reflection.clj
reflection="babashka-$VERSION-reflection.json"
java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$jar"
java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$reflection"
- store_artifacts:
path: /tmp/release
destination: release
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }}
linux:
docker:
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
BABASHKA_PLATFORM: linux # used in release script
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
resource_class: large
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
- restore_cache:
keys:
- linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- run:
name: Install Clojure
command: |
sudo script/install-clojure
- run:
name: Install native dev tools
command: |
sudo apt-get update
sudo apt-get -y install build-essential zlib1g-dev
- run:
name: Download GraalVM
command: |
script/install-graalvm
- run:
name: Build binary
command: |
script/uberjar
script/compile
no_output_timeout: 30m
- run:
name: Run tests
command: |
script/test
script/run_lib_tests
- run:
name: Release
command: |
.circleci/script/release
- persist_to_workspace:
root: /tmp
paths:
- release
- save_cache:
paths:
- ~/.m2
- ~/graalvm-ce-java11-22.1.0
key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- store_artifacts:
path: /tmp/release
destination: release
- run:
name: Publish artifact link to Slack
command: |
./bb .circleci/script/publish_artifact.clj || true
linux-static:
docker:
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
BABASHKA_PLATFORM: linux # used in release script
BABASHKA_TEST_ENV: native
BABASHKA_STATIC: "true"
BABASHKA_MUSL: "true"
BABASHKA_XMX: "-J-Xmx6500m"
resource_class: large
steps:
- checkout
- attach_workspace:
at: /tmp
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
# - run:
# name: "Short circuit on SNAPSHOT"
# command: |
# VERSION=$(cat resources/BABASHKA_VERSION)
# if [[ "$VERSION" == *-SNAPSHOT ]]
# then
# circleci task halt
# fi
- restore_cache:
keys:
- linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- run:
name: Install Clojure
command: |
sudo script/install-clojure
- run:
name: Install native dev tools
command: |
sudo apt-get update
sudo apt-get -y install build-essential zlib1g-dev
sudo -E script/setup-musl
- run:
name: Download GraalVM
command: |
script/install-graalvm
- run:
name: Build binary
command: |
script/uberjar
script/compile
no_output_timeout: 30m
- run:
name: Run tests
command: |
script/test
script/run_lib_tests
- run:
name: Release
command: |
.circleci/script/release
- persist_to_workspace:
root: /tmp
paths:
- release
- save_cache:
paths:
- ~/.m2
- ~/graalvm-ce-java11-22.1.0
key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- store_artifacts:
path: /tmp/release
destination: release
- run:
name: Publish artifact link to Slack
command: |
./bb .circleci/script/publish_artifact.clj || true
linux-aarch64:
machine:
image: ubuntu-2004:202111-01
resource_class: arm.large
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
BABASHKA_PLATFORM: linux # used in release script
BABASHKA_ARCH: aarch64
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
- run:
name: Install Clojure
command: |
sudo script/install-clojure
- restore_cache:
keys:
- linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- run:
name: Install native dev tools
command: |
sudo apt-get update
sudo apt-get -y install build-essential zlib1g-dev
- run:
name: Download GraalVM
command: |
script/install-graalvm
- run:
name: Build binary
command: |
script/uberjar
script/compile
no_output_timeout: 30m
- run:
name: Run tests
command: |
script/test
script/run_lib_tests
- run:
name: Release
command: |
.circleci/script/release
- persist_to_workspace:
root: /tmp
paths:
- release
- save_cache:
paths:
- ~/.m2
- ~/graalvm-ce-java11-22.1.0
key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- store_artifacts:
path: /tmp/release
destination: release
- run:
name: Publish artifact link to Slack
command: |
./bb .circleci/script/publish_artifact.clj || true
linux-aarch64-static:
machine:
image: ubuntu-2004:202111-01
resource_class: arm.large
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
BABASHKA_PLATFORM: linux # used in release script
BABASHKA_ARCH: aarch64
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
BABASHKA_STATIC: "true"
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
# - run:
# name: "Short circuit on SNAPSHOT"
# command: |
# VERSION=$(cat resources/BABASHKA_VERSION)
# if [[ "$VERSION" == *-SNAPSHOT ]]
# then
# circleci task halt
# fi
- run:
name: Install Clojure
command: |
sudo script/install-clojure
- restore_cache:
keys:
- linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- run:
name: Install native dev tools
command: |
sudo apt-get update
sudo apt-get -y install build-essential zlib1g-dev
# sudo -E script/setup-musl
- run:
name: Download GraalVM
command: |
script/install-graalvm
- run:
name: Build binary
command: |
script/uberjar
script/compile
no_output_timeout: 30m
- run:
name: Run tests
command: |
script/test
script/run_lib_tests
- run:
name: Release
command: |
.circleci/script/release
- persist_to_workspace:
root: /tmp
paths:
- release
- save_cache:
paths:
- ~/.m2
- ~/graalvm-ce-java11-22.1.0
key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- store_artifacts:
path: /tmp/release
destination: release
- run:
name: Publish artifact link to Slack
command: |
./bb .circleci/script/publish_artifact.clj || true
mac:
macos:
xcode: "12.0.0"
environment:
MACOSX_DEPLOYMENT_TARGET: 10.13 # 10.12 is EOL
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home
BABASHKA_PLATFORM: macos # used in release script
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
resource_class: large
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
- restore_cache:
keys:
- mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- run:
name: Install Clojure
command: |
script/install-clojure
- run:
name: Install Leiningen
command: |
script/install-leiningen
- run:
name: Download GraalVM
command: |
script/install-graalvm
- run:
name: Build binary
command: |
export PATH=$GRAALVM_HOME/bin:$PATH
script/uberjar
script/compile
no_output_timeout: 30m
- run:
name: Run tests
command: |
export PATH=$GRAALVM_HOME/bin:$PATH
script/test
script/run_lib_tests
- run:
name: Release
command: |
.circleci/script/release
- save_cache:
paths:
- ~/.m2
- ~/graalvm-ce-java11-22.1.0/Contents/Home
key: mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
- store_artifacts:
path: /tmp/release
destination: release
- run:
name: Publish artifact link to Slack
command: |
./bb .circleci/script/publish_artifact.clj || true
deploy:
resource_class: large
docker:
- image: circleci/clojure:lein-2.9.8
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
- restore_cache:
keys:
- v1-dependencies-{{ checksum "project.clj" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: .circleci/script/deploy
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "project.clj" }}
docker:
machine:
image: ubuntu-2004:202111-01
steps:
- checkout
- run:
name: "Pull Submodules"
command: |
git submodule init
git submodule update
- setup-docker-buildx
- attach_workspace:
at: /tmp
- run:
name: Build uberjar
command: script/uberjar
- run:
name: Build Docker image
environment:
PLATFORMS: linux/amd64,linux/arm64
command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj
# our single workflow, that triggers the setup job defined above
workflows:
setup:
version: 2
ci:
jobs:
- setup
- jvm
- linux
- linux-static
- mac
- linux-aarch64
- linux-aarch64-static
- deploy:
filters:
branches:
only: master
requires:
- jvm
- linux
# - mac # TODO: Enable when not needed from Actions
- docker:
filters:
branches:
only: master
requires:
- linux
- linux-static
- linux-aarch64

View file

@ -1,6 +1,6 @@
(require '[babashka.fs :as fs]
(require '[clojure.string :as str]
'[babashka.process :as proc]
'[clojure.string :as str])
'[babashka.fs :as fs])
(import '[java.time Instant])
(defn read-env
@ -12,9 +12,7 @@
(def image-name "babashka/babashka")
(def ghcr-image-name "ghcr.io/babashka/babashka")
(def image-tag (str/trim (slurp "resources/BABASHKA_VERSION")))
(def image-tag (slurp "resources/BABASHKA_VERSION"))
(def latest-tag "latest")
@ -48,11 +46,6 @@
[username password]
(exec ["docker" "login" "-u" username "-p" password]))
(defn docker-login-ghcr
[username password]
(exec ["docker" "login" "ghcr.io" "-u" username "-p" password]))
;; TODO: Remove this when Dockerhub goes off
(defn build-push
[image-tag platform docker-file]
(println (format "Building and pushing %s Docker image(s) %s:%s"
@ -62,21 +55,6 @@
(let [base-cmd ["docker" "buildx" "build"
"-t" (str image-name ":" image-tag)
"--platform" platform
"--progress" "plain"
"--push"
"-f" docker-file]]
(exec (concat base-cmd label-args ["."]))))
(defn build-push-ghcr
[image-tag platform docker-file]
(println (format "Building and pushing %s Docker image(s) %s:%s to GHCR"
platform
ghcr-image-name
image-tag))
(let [base-cmd ["docker" "buildx" "build"
"-t" (str ghcr-image-name ":" image-tag)
"--platform" platform
"--progress" "plain"
"--push"
"-f" docker-file]]
(exec (concat base-cmd label-args ["."]))))
@ -86,7 +64,7 @@
(doseq [platform (str/split platforms #",")]
(let [tarball-platform (str/replace platform #"\/" "-")
tarball-platform (if (= "linux-arm64" tarball-platform)
"linux-aarch64-static"
"linux-aarch64"
tarball-platform)
tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz"
image-tag
@ -96,20 +74,16 @@
; this overwrites, but this is to work around having built the uberjar/metabom multiple times
(fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true})))
(build-push image-tag platforms "Dockerfile.ci")
(build-push-ghcr image-tag platforms "Dockerfile.ci")
(when-not snapshot?
(build-push latest-tag platforms "Dockerfile.ci")
(build-push-ghcr latest-tag platforms "Dockerfile.ci")))
(build-push latest-tag platforms "Dockerfile.ci")))
(defn build-push-alpine-images
"Build alpine image for linux-amd64 only (no upstream arm64 support yet)"
[]
(exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")])
(build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine")
(build-push-ghcr (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine")
(when-not snapshot?
(build-push "alpine" "linux/amd64" "Dockerfile.alpine")
(build-push-ghcr "alpine" "linux/amd64" "Dockerfile.alpine")))
(build-push "alpine" "linux/amd64" "Dockerfile.alpine")))
(when (= *file* (System/getProperty "babashka.file"))
(if (and (nil? (read-env "CIRCLE_PULL_REQUEST"))
@ -119,7 +93,6 @@
(println "This is a snapshot version")
(println "This is a non-snapshot version"))
(docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS"))
(docker-login-ghcr (read-env "CONTAINER_REGISTRY_USER") (read-env "BB_GHCR_TOKEN"))
(build-push-images)
(build-push-alpine-images))
(println "Not publishing docker image(s).")))

View file

@ -1,281 +0,0 @@
(ns gen-ci
(:require
[babashka.tasks :as tasks]
[clj-yaml.core :as yaml]
[clojure.string :as str]
[flatland.ordered.map :refer [ordered-map]]))
(def graalvm-version "24")
(defn run
([cmd-name cmd]
(run cmd-name cmd nil))
([cmd-name cmd no-output-timeout]
(let [base {:run {:name cmd-name
:command cmd}}]
(if no-output-timeout
(assoc-in base [:run :no_output_timeout] no-output-timeout)
base))))
(defn gen-steps
[shorted? steps]
(if shorted?
[(run "Shorted" "echo 'Skipping Run'")]
steps))
(defn gen-job
[shorted? conf]
(if shorted?
(-> conf
(dissoc :machine :macos)
(assoc :resource_class "small" :docker [{:image "ubuntu:latest"}]))
conf))
(defn pull-submodules
[]
(run "Pull Submodules" "git submodule init\ngit submodule update"))
(defn deploy
[shorted?]
(gen-job shorted?
(ordered-map
:resource_class "large"
:docker [{:image "circleci/clojure:lein-2.9.8"}]
:working_directory "~/repo"
:environment {:LEIN_ROOT "true"}
:steps (gen-steps
shorted?
[:checkout
(pull-submodules)
{:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}"
"v1-dependencies-"]}}
{:run ".circleci/script/deploy"}
{:save_cache {:paths ["~/.m2"]
:key "v1-dependencies-{{ checksum \"project.clj\" }}"}}]))))
(defn docker
[shorted?]
(gen-job
shorted?
(ordered-map
:machine {:image "ubuntu-2004:2024.05.1"}
:steps
(gen-steps
shorted?
[:checkout
(pull-submodules)
"setup-docker-buildx"
{:attach_workspace {:at "/tmp"}}
(run "Build uberjar" "script/uberjar")
{:run
{:name "Build Docker image"
:environment {:PLATFORMS "linux/amd64,linux/arm64"}
:command
"java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}]))))
(defn jvm
[shorted? graalvm-home]
(gen-job
shorted?
(ordered-map
:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]
:working_directory "~/repo"
:environment {:LEIN_ROOT "true"
:BABASHKA_PLATFORM "linux"
:GRAALVM_VERSION graalvm-version
:GRAALVM_HOME graalvm-home
:BABASHKA_TEST_ENV "jvm"
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
:resource_class "large"
:steps
(gen-steps
shorted?
[:checkout
(pull-submodules)
{:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"
"v1-dependencies-"]}}
(run "Install Clojure" "sudo script/install-clojure")
(run "Download GraalVM" "script/install-graalvm")
(run
"Run JVM tests"
"export BABASHKA_FEATURE_JDBC=true
export BABASHKA_FEATURE_POSTGRESQL=true
script/test\nscript/run_lib_tests")
(run
"Create uberjar"
"mkdir -p /tmp/release
script/uberjar
VERSION=$(cat resources/BABASHKA_VERSION)
jar=target/babashka-$VERSION-standalone.jar
cp $jar /tmp/release
export PATH=$GRAALVM_HOME/bin:$PATH
export JAVA_HOME=$GRAALVM_HOME
java -jar $jar script/reflection.clj
reflection=\"babashka-$VERSION-reflection.json\"
java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$jar\"
java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$reflection\"")
{:store_artifacts {:path "/tmp/release"
:destination "release"}}
{:save_cache {:paths ["~/.m2"]
:key "v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"}}]))))
(defn unix
[shorted? static? musl? arch executor-conf resource-class graalvm-home platform]
(let [env {:LEIN_ROOT "true"
:GRAALVM_VERSION graalvm-version
:GRAALVM_HOME graalvm-home
:BABASHKA_PLATFORM (if (= "mac" platform)
"macos"
platform)
:BABASHKA_TEST_ENV "native"
:BABASHKA_XMX "-J-Xmx6500m"
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
env (if (= "aarch64" arch)
(assoc env :BABASHKA_ARCH arch)
env)
env (if static?
(assoc env :BABASHKA_STATIC "true")
env)
env (if musl?
(assoc env :BABASHKA_MUSL "true")
env)
env (if (= "mac" platform)
(assoc env :MACOSX_DEPLOYMENT_TARGET 10.13)
env)
base-install-cmd "sudo apt-get update\nsudo apt-get -y install build-essential zlib1g-dev"
cache-key (format "%s-%s{{ checksum \"project.clj\" }}-{{ checksum \".circleci/config.yml\" }}"
platform
(if (= "aarch64" arch)
"aarch64-"
""))]
(gen-job shorted?
(merge
executor-conf
(ordered-map
:working_directory "~/repo"
:environment env
:resource_class resource-class
:steps (gen-steps shorted?
(filter some?
[:checkout
(when (contains? #{"linux" "linux-aarch64"} platform)
(run "Check max glibc version" "script/check_glibc.sh"))
{:attach_workspace {:at "/tmp"}}
(run "Pull Submodules" "git submodule init\ngit submodule update")
{:restore_cache
{:keys [cache-key]}}
(when (= "mac" platform)
(run "Install Rosetta" "sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license"))
(run "Install Clojure" "sudo script/install-clojure")
(when (= "mac" platform)
(run "Install Leiningen" "script/install-leiningen"))
(when (not= "mac" platform)
(run "Install native dev tools"
(if (and static? musl? (not= "aarch64" arch))
(str base-install-cmd "\nsudo -E script/setup-musl")
base-install-cmd)))
(run "Download GraalVM" "script/install-graalvm")
#_(run "Download iprof" "curl -sLO 'https://github.com/babashka/pgo-profiles/releases/download/2023.10.11/default.iprof'")
(run "Build binary" (if (= "aarch64" arch)
"script/uberjar\nscript/compile -H:PageSize=64K # --pgo=default.iprof"
"script/uberjar\nscript/compile # --pgo=default.iprof") "30m")
(run "Release" ".circleci/script/release")
{:persist_to_workspace {:root "/tmp"
:paths ["release"]}}
(run "Run tests" "script/test\nscript/run_lib_tests")
(run "Release + publish"
(str/join "\n" ["export BABASHKA_RELEASE=true"
".circleci/script/release"]))
{:save_cache
{:paths ["~/.m2" "~/graalvm"]
:key cache-key}}
{:store_artifacts {:path "/tmp/release"
:destination "release"}}
(run "Publish artifact link to Slack"
"./bb .circleci/script/publish_artifact.clj || true")])))))))
(defn make-config
[shorted?]
(let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]}
machine-executor-conf {:machine {:image "ubuntu-2004:2024.05.1"}}
mac-executor-conf {:macos {:xcode "13.4.1"}}
linux-graalvm-home (str "/home/circleci/graalvm-" graalvm-version)
mac-graalvm-home (format "/Users/distiller/graalvm-%s/Contents/Home" graalvm-version)]
(ordered-map
:version 2.1
:commands
{:setup-docker-buildx
{:steps
[{:run
{:name "Create multi-platform capabale buildx builder"
:command
"docker run --privileged --rm tonistiigi/binfmt --install all\ndocker buildx create --name ci-builder --use"}}]}}
:jobs (ordered-map
:jvm (jvm shorted? linux-graalvm-home)
:linux (unix shorted? false false "amd64" docker-executor-conf "large" linux-graalvm-home "linux")
:linux-static
(unix shorted? true true "amd64" docker-executor-conf "large" linux-graalvm-home "linux")
:linux-aarch64-static
(unix shorted? true false "aarch64" machine-executor-conf "arm.large" linux-graalvm-home "linux")
:mac (unix shorted? false false "amd64" mac-executor-conf "macos.m1.medium.gen1" mac-graalvm-home "mac")
:deploy (deploy shorted?)
:docker (docker shorted?))
:workflows (ordered-map
:version 2
:ci {:jobs ["jvm"
"linux"
"linux-static"
"mac"
"linux-aarch64-static"
{:deploy {:filters {:branches {:only "master"}}
:requires ["jvm" "linux"]}}
{:docker {:filters {:branches {:only "master"}}
:requires ["linux" "linux-static" "linux-aarch64-static"]}}]}))))
(def skip-config
{:skip-if-only [#".*.md$"
#"^logo\/.*$"]})
(defn get-changes
[]
(-> (tasks/shell {:out :string} "git diff --name-only HEAD~1")
(:out)
(str/split-lines)))
(defn irrelevant-change?
[change regexes]
(some? (some #(re-matches % change) regexes)))
(defn relevant?
[change-set regexes]
(some? (some #(not (irrelevant-change? % regexes)) change-set)))
(defn main
[]
(let [{:keys [skip-if-only]} skip-config
changed-files (get-changes)
conf (make-config (not (relevant? changed-files skip-if-only)))]
(println (yaml/generate-string conf
:dumper-options
{:flow-style :block}))))
(when (= *file* (System/getProperty "babashka.file"))
(main))
(comment
(main)
(def regexes
[#".*.md$"
#".*.clj$" ; ignore clojure files
#"^logo\/.*$"])
(:out (tasks/shell {:out :string} "ls"))
(irrelevant-change? "src/file.png" regexes)
(re-matches #".*.clj$" "src/file.clj.dfff")
(re-matches #"^logo\/.*$" "logo/foo/bar.jpg")
(relevant? ["src/file.clj"] regexes))

View file

@ -29,9 +29,7 @@ tar zcvf "$archive" bb # bbk
cd -
if [ "$BABASHKA_RELEASE" = "true" ]; then
./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive"
fi
./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive"
## cleanup

View file

@ -1,42 +0,0 @@
macos_instance:
image: ghcr.io/cirruslabs/macos-monterey-base:latest
task:
skip: "changesIncludeOnly('logo/*', '**.md')"
env:
LEIN_ROOT: "true"
GRAALVM_VERSION: "24"
GRAALVM_HOME: ${HOME}/graalvm-${GRAALVM_VERSION}/Contents/Home
BABASHKA_PLATFORM: macos # used in release script
BABASHKA_ARCH: aarch64
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
GITHUB_TOKEN: ENCRYPTED[d6ff8cdc392157f211c754fa0763875434d1bfde0c00a05e48ba9470003a76c14c9213adb80623f81e13f2f0fa8fbd57]
script: |
git submodule init
git submodule update
sudo script/install-clojure
sudo script/install-leiningen
script/install-graalvm
export PATH=$GRAALVM_HOME/bin:$PATH
export JAVA_HOME=$GRAALVM_HOME
sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license
java -version
export BABASHKA_SHA=$(git rev-parse HEAD)
script/uberjar
# curl -sLO 'https://github.com/babashka/pgo-profiles/releases/download/2023.10.11/default.iprof'
script/compile # --pgo=default.iprof
# script/test
# script/run_lib_tests
VERSION=$(cat resources/BABASHKA_VERSION)
arch=${BABASHKA_ARCH:-amd64}
archive="babashka-$VERSION-$BABASHKA_PLATFORM-$arch.tar.gz"
tar zcvf "$archive" bb
./bb --config .build/bb.edn --deps-root . release-artifact "$archive" || true
binaries_artifacts:
path: "babashka-*.tar.gz"

View file

@ -5,5 +5,4 @@
babashka.impl.File/gen-wrapper-fn-2 clojure.core/def
babashka.impl.Pattern/gen-wrapper-fn-2 clojure.core/def
babashka.impl.Pattern/gen-constants clojure.core/declare}
:linters {:unsorted-required-namespaces {:level :warning}}
:hooks {:analyze-call {clojure.core/requiring-resolve hooks.mine/req-resolve}}}
:linters {:unsorted-required-namespaces {:level :warning}}}

View file

@ -1,99 +0,0 @@
name: build
on:
push:
paths-ignore:
- "**.md"
- "logo/**"
pull_request:
paths-ignore:
- "**.md"
- "logo/**"
# TODO: Add deploy if needed
jobs:
native:
if: "!contains(github.event.head_commit.message, 'skip ci')"
strategy:
matrix:
include:
- os: windows-2022
name: windows
static: false
runs-on: ${{ matrix.os }}
env:
LEIN_ROOT: "true"
GRAALVM_VERSION: "24"
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
BABASHKA_TEST_ENV: native
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BABASHKA_SHA: ${{ github.sha }}
steps:
- name: Git checkout
uses: actions/checkout@v2
with:
fetch-depth: 1
submodules: 'true'
- name: Cache deps
uses: actions/cache@v4
id: cache-deps
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
restore-keys: ${{ runner.os }}-maven-
- name: Setup GraalVM
if: "matrix.static == false"
uses: graalvm/setup-graalvm@v1.3.3
with:
java-version: '24'
distribution: 'graalvm'
components: 'native-image'
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install clojure tools
uses: DeLaGuardo/setup-clojure@13.2
with:
cli: latest
# lein: latest -- skipped because this uses some PS bullshit
- name: Babashka version
id: babashka-version
shell: bash
run: |
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
echo "##[set-output name=version;]${BABASHKA_VERSION}"
- name: Build
shell: cmd
run: |
powershell -Command "(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat', 'lein.bat')"
call lein self-install
set GRAALVM_HOME=%JAVA_HOME%
call script/uberjar.bat
call script/compile.bat
echo Creating zip archive
set zip=babashka-%BABASHKA_VERSION%-windows-amd64.zip
jar -cMf %zip% bb.exe
bb --config .build/bb.edn --deps-root . release-artifact %zip%
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
path: bb.exe
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-amd64
- name: Test binary and libs
shell: cmd
run: |
set BABASHKA_CLASSPATH=
set BABASHKA_TEST_ENV=native
call script/test.bat :windows
call script/run_lib_tests.bat

View file

@ -2,15 +2,9 @@ name: build
on:
push:
paths-ignore:
- "**.md"
- "logo/**"
branches:
- master
pull_request:
paths-ignore:
- "**.md"
- "logo/**"
branches:
- master
@ -24,7 +18,6 @@ jobs:
LEIN_ROOT: "true"
BABASHKA_PLATFORM: linux # could be used in jar name
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BABASHKA_SHA: ${{ github.sha }}
steps:
- name: Git checkout
uses: actions/checkout@v2
@ -33,7 +26,7 @@ jobs:
submodules: 'true'
- name: Cache deps
uses: actions/cache@v4
uses: actions/cache@v2
id: cache-deps
with:
path: ~/.m2/repository
@ -44,7 +37,7 @@ jobs:
uses: actions/setup-java@v2
with:
distribution: 'adopt-hotspot'
java-version: '19'
java-version: '11'
- name: Install clojure tools
uses: DeLaGuardo/setup-clojure@5.0
@ -60,6 +53,9 @@ jobs:
script/test
script/run_lib_tests
- name: Run as lein command
run: echo '{:a 1}' | lein bb '(:a *in*)'
- name: Build uberjar
run: |
mkdir -p /tmp/release
@ -78,7 +74,7 @@ jobs:
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
echo "##[set-output name=version;]${BABASHKA_VERSION}"
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v1
with:
name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
@ -88,7 +84,7 @@ jobs:
strategy:
matrix:
include:
- os: macos-13
- os: macos-12
name: macos
static: false
#- os: ubuntu-latest
@ -100,12 +96,11 @@ jobs:
runs-on: ${{ matrix.os }}
env:
LEIN_ROOT: "true"
GRAALVM_VERSION: "24"
GRAALVM_VERSION: "22.1.0"
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BABASHKA_SHA: ${{ github.sha }}
steps:
- name: Git checkout
uses: actions/checkout@v2
@ -114,7 +109,7 @@ jobs:
submodules: 'true'
- name: Cache deps
uses: actions/cache@v4
uses: actions/cache@v2
id: cache-deps
with:
path: ~/.m2/repository
@ -125,8 +120,8 @@ jobs:
if: "matrix.static == false"
uses: graalvm/setup-graalvm@v1
with:
java-version: '24'
distribution: 'graalvm'
version: '22.1.0'
java-version: '11'
components: 'native-image'
github-token: ${{ secrets.GITHUB_TOKEN }}
@ -134,8 +129,8 @@ jobs:
if: "matrix.static == true"
uses: graalvm/setup-graalvm@v1
with:
version: '24'
distribution: 'graalvm'
version: '22.1.0'
java-version: '11'
components: 'native-image'
native-image-musl: true
github-token: ${{ secrets.GITHUB_TOKEN }}
@ -172,19 +167,6 @@ jobs:
BABASHKA_MUSL: "true"
run: script/compile
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-amd64
- name: Upload static artifact
if: "matrix.static == true"
uses: actions/upload-artifact@v4
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-static-amd64
- name: Test binary and libs
run: |
script/test
@ -193,6 +175,19 @@ jobs:
- name: Release
run: .circleci/script/release
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-amd64
- name: Upload static artifact
if: "matrix.static == true"
uses: actions/upload-artifact@v2
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-static-amd64
docker:
if: ${{ false }} # Disabled
# if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
@ -216,13 +211,13 @@ jobs:
run: mkdir -p /tmp/release
- name: Download linux binary
uses: actions/download-artifact@v4.1.7
uses: actions/download-artifact@v2
with:
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip
path: /tmp/release
- name: Download static linux binary
uses: actions/download-artifact@v4.1.7
uses: actions/download-artifact@v2
with:
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
path: /tmp/release-static

3
.gitignore vendored
View file

@ -36,6 +36,3 @@ bb.build_artifacts.txt
target
.nrepl-port
.DS_Store
.portal
default.iprof
scratch.clj

View file

@ -5,594 +5,6 @@ For a list of breaking changes, check [here](#breaking-changes).
A preview of the next release can be installed from
[babashka-dev-builds](https://github.com/babashka/babashka-dev-builds).
[Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting
## Unreleased
- [#1818](https://github.com/babashka/babashka/issues/1818): wrong argument order in `clojure.java.io/resource` implementation
- Add `java.text.BreakIterator`
- Bump `fs` to `0.5.25`
- Bump `jsoup` to `1.20.1`
- Bump `edamame` to `1.4.30`
- [#1815](https://github.com/babashka/babashka/issues/1815): Make install-script wget-compatible ([@eval](https://github.com/eval))
## 1.12.200 (2025-04-26)
- Improve Java reflection based on provided type hints (read blog post [here](https://blog.michielborkent.nl/babashka-java-reflection-type-hints.html))
- Add compatibility with the [fusebox](https://github.com/potetm/fusebox) library
- Fix virtual `ThreadBuilder` interop
- Add `java.util.concurrent.ThreadLocalRandom`
- Add `java.util.concurrent.locks.ReentrantLock`
- Add classes:
- `java.time.chrono.ChronoLocalDate`
- `java.time.temporal.TemporalUnit`
- `java.time.chrono.ChronoLocalDateTime`
- `java.time.chrono.ChronoZonedDateTime`
- `java.time.chrono.Chronology`
## 1.12.199 (2025-04-18)
- [#1806](https://github.com/babashka/babashka/issues/1806): Add `cheshire.factory` namespace ([@lread](https://github.com/lread))
## 1.12.198 (2025-04-17)
- Bump GraalVM to `24`
- Bump SCI to `0.9.45`
- Bump edamame to `1.4.28`
- [#1801](https://github.com/babashka/babashka/issues/1801): Add `java.util.regex.PatternSyntaxException`
- Bump core.async to `1.8.735`
- Bump cheshire to `6.0.0`
- Bump babashka.cli to `0.8.65`
## 1.12.197 (2025-02-28)
- [#1785](https://github.com/babashka/babashka/issues/1785): Allow subclasses of `Throwable` to have instance methods invoked ([@bobisageek](https://github.com/bobisageek))
- [#1791](https://github.com/babashka/babashka/issues/1791): interop problem on Jsoup form element
- [#1793](https://github.com/babashka/babashka/issues/1793): Bump `rewrite-clj` to `1.1.49` (fixes parsing of `foo//` among other things)
- Bump `deps.clj`
- Bump `fs`
## 1.12.196 (2024-12-24)
- [#1771](https://github.com/babashka/babashka/issues/1771): `*e*` in REPL should contain exception thrown by user, not a wrapped one
- [#1777](https://github.com/babashka/babashka/issues/1777) Add `java.nio.file.attribute.UserDefinedFileAttributeView`
- [#1776](https://github.com/babashka/babashka/issues/1776) `Add java.nio.file.attribute.PosixFileAttributes`
- [#1761](https://github.com/babashka/babashka/issues/1761) Support calling `clojure.lang.RT/iter`
- [#1760](https://github.com/babashka/babashka/issues/1760) For compatibility with [Fireworks v0.10.3](https://github.com/paintparty/fireworks), added the following to `:instance-checks` entry in `babashka.impl.classes/classes`([@paintparty](https://github.com/paintparty))
- `clojure.lang.PersistentArrayMap$TransientArrayMap`
- `clojure.lang.PersistentHashMap$TransientHashMap`
- `clojure.lang.PersistentVector$TransientVector`
- `java.lang.NoSuchFieldException`
- `java.util.AbstractMap`
- `java.util.AbstractSet`
- `java.util.AbstractList`
- [#1760](https://github.com/babashka/babashka/issues/1760) For compatibility with [Fireworks v0.10.3](https://github.com/paintparty/fireworks), added `volatile?` entry to `babashka.impl.clojure.core/core-extras`([@paintparty](https://github.com/paintparty))
- Bump `babashka.cli` to `0.8.61`
- Bump `clj-yaml` to `1.0.29`
- [#1768](https://github.com/babashka/babashka/issues/1768): Add `taoensso.timbre` `color-str` function
- Add classes:
- `javax.crypto.KeyAgreement`
- `java.security.KeyPairGenerator`
- `java.security.KeyPair`
- `java.security.spec.ECGenParameterSpec`
- `java.security.spec.PKCS8EncodedKeySpec`
- `java.security.spec.X509EncodedKeySpec`
- `java.security.Signature`
- Add `java.util.concurrent.CompletionStage`
- Bump `core.async` to `1.7.701`
- Bump `org.babashka/cli` to `0.8.162`
## 1.12.195 (2024-11-12)
- Include [jsoup](https://jsoup.org/) for HTML parsing. This makes bb compatible with the [hickory](https://github.com/clj-commons/hickory) library (and possibly other libraries?).
- [#1752](https://github.com/babashka/babashka/issues/1752): include `java.lang.SecurityException` for `java.net.http.HttpClient` support ([@grzm](https://github.com/grzm))
- [#1748](https://github.com/babashka/babashka/issues/1748): add `clojure.core/ensure`
- Upgrade `taoensso/timbre`to `v6.6.0`
- Upgrade `babashka.http-client` to `v0.4.22`
- Add `:git/sha` from build to `bb describe` output ([@lispyclouds](https://github.com/lispyclouds))
- Fix NPE with determining if executing from self-contained executable
## 1.12.194 (2024-10-12)
- Upgrade to GraalVM 23
- [#1743](https://github.com/babashka/babashka/issues/1743): fix new fully qualified instance method in call position with GraalVM 23
## 1.12.193 (2024-10-11)
- Clojure 1.12 interop: method thunks, FI coercion, array notation (see below)
- Upgrade SCI reflector based on clojure 1.12 and remove specific workaround for
`Thread/sleep` interop
- Add `tools.reader.edn/read`
- Fix [#1741](https://github.com/babashka/babashka/issues/1741): `(taoensso.timbre/spy)` now relies on macros from `taoensso.encore` previously not available in bb
Examples of the new Clojure interop:
``` clojure
;; Qualified methods in call position:
(String/.length "123") ;;=> 3
(String/new "123") ;;=> "123"
;; Qualified methods in value position, as functions:
(map Integer/parseInt ["1" "22" "333"]) ;;=> (1 22 333)
(map String/.length ["1" "22" "333"]) ;;=> (1 2 3)
(map String/new ["1" "22" "333"]) ;;=> ("1" "22" "333")
;; Typed multi-dimensional array class notation:
long/1 ;;=> 1-dimensional long array class
String/2 ;;=> 2-dimensional String array class
;; Pass Clojure IFn to Java where `java.util.function.Predicate`, etc. is expected:
(into [] (doto (java.util.ArrayList. [1 2 3]) (.removeIf even?))) ;;=> [1 3]
(.computeIfAbsent (java.util.HashMap.) "abc" #(str % %)) ;;=> "abcabc"
```
## 1.4.192 (2024-09-12)
- Upgrade Clojure to `1.12.0`
- [#1722](https://github.com/babashka/babashka/issues/1722): add new clojure 1.12 vars
- [#1720](https://github.com/babashka/babashka/issues/1720): include new clojure 1.12's `clojure.java.process`
- [#1719](https://github.com/babashka/babashka/issues/1719): add new clojure 1.12 `clojure.repl.deps` namespace. Only calls with explicit versions are supported.
- [#1598](https://github.com/babashka/babashka/issues/1598): use Rosetta on CircleCI to build x64 images
- [#1716](https://github.com/babashka/babashka/issues/1716): expose `babashka.http-client.interceptors` namespace
- [#1707](https://github.com/babashka/babashka/issues/1707): support `aset` on primitive array
- [#1676](https://github.com/babashka/babashka/issues/1676): restore compatibility with newest [at-at](https://github.com/overtone/at-at/) version (1.3.58)
- Bump SCI
- Bump `fs`
- Bump `process`
- Bump `deps.clj`
- Bump `http-client`
- Bump `clj-yaml`
- Bump `edamame`
- Bump `rewrite-clj`
- Add `java.io.LineNumberReader`
## 1.3.191 (2024-06-19)
- Fix [#1688](https://github.com/babashka/babashka/issues/1688): `use-fixtures` should add metadata to `*ns*`
- Fix [#1692](https://github.com/babashka/babashka/issues/1692): Add support for `ITransientSet` and `org.flatland/ordered-set`
- Bump org.flatland/ordered to `1.15.12`.
- Partially Fix [#1695](https://github.com/babashka/babashka/issues/1695): `--repl` arg handling should consume only one arg (itself) ([@bobisageek](https://github.com/bobisageek))
- Partially Fix [#1695](https://github.com/babashka/babashka/issues/1695): make `*command-line-args*` value available in the REPL ([@bobisageek](https://github.com/bobisageek))
- Fix [#1686](https://github.com/babashka/babashka/issues/1686): do not fetch dependencies/invoke java for `version`, `help`, and `describe` options ([@bobisageek](https://github.com/bobisageek))
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.lang.DynamicClassLoader` constructors ([@bobisageek](https://github.com/bobisageek))
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.core/*source-path*` (points to the same sci var as `*file*`) ([@bobisageek](https://github.com/bobisageek))
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.main/with-read-known` ([@bobisageek](https://github.com/bobisageek))
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.core.server/repl-read` ([@bobisageek](https://github.com/bobisageek))
- [#1696](https://github.com/babashka/babashka/issues/1696): make the `cognitect-labs/transcriptor` library work ([@bobisageek](https://github.com/bobisageek))
- [#1700](https://github.com/babashka/babashka/issues/1700): catch exceptions from resolving symbolic links during `bb.edn` lookup ([@bobisageek](https://github.com/bobisageek))
- Support `java.nio.channels.ByteChannel` + several other related interop
- Bump `nrepl/bencode` to `1.2.0`
- Bump `babashka/fs`
- Bump `org.babashka/http-client` to `0.4.18`
## 1.3.190 (2024-04-17)
- Fix [#1679](https://github.com/babashka/babashka/issues/1679): bump timbre and fix wrapping `timbre/log!`
- Add `java.util.concurrent.CountDownLatch`
- Add `java.lang.ThreadLocal`
- Bump `babashka.process`
- Bump httpkit to `2.8.0-RC1`
- Bump clojure to `1.11.2`
- Bump deps.clj
- Bump `babashka.cli`
- Bump `cheshire` to `5.13.0`
- Bump `http-client` to `0.4.17`
## 1.3.189 (2024-02-22)
- [#1660](https://github.com/babashka/babashka/issues/1660): add `:deps-root` as part of hash to avoid caching issue with `deps.clj`
- [#1632](https://github.com/babashka/babashka/issues/1632): fix `(.readPassword (System/console))` by upgrading GraalVM to `21.0.2`
- [#1661](https://github.com/babashka/babashka/issues/1661): follow symlink when reading adjacent bb.edn
- [#1665](https://github.com/babashka/babashka/issues/1665): `read-string` should use non-indexing reader for compatibilty with Clojure
- Bump edamame to 1.4.24
- Bump http-client to 0.4.16
- Bump babashka.cli to 0.8.57
- Uberjar task: support reader conditional in .cljc file
- Support reader conditional in .cljc file when creating uberjar
- Add more `javax.net.ssl` classes
- [#1675](https://github.com/babashka/babashka/issues/1675): add `hash-unordered-coll`
## 1.3.188 (2024-01-12)
- [#1658](https://github.com/babashka/babashka/issues/1658): fix command line parsing for scripts that parse `--version` or `version` etc
## 1.3.187 (2024-01-09)
- Add `clojure.reflect/reflect`
- Add `java.util.ScheduledFuture`, `java.time.temporal.WeekFields`
- Support `Runnable` to be used without import
- Allow `catch` to be used as var name
- [#1646](https://github.com/babashka/babashka/issues/1646): command-line-args are dropped when file exists with same name
- [#1645](https://github.com/babashka/babashka/issues/1645): Support for `clojure.lang.LongRange`
- [#1652](https://github.com/babashka/babashka/issues/1652): allow `bb.edn` to be empty
- [#1586](https://github.com/babashka/babashka/issues/1586): warn when config file doesn't exist and `--debug` is enabled
- [#1410](https://github.com/babashka/babashka/issues/1410): better error message when exec fn doesn't exist
- Bump `babashka.cli` to `0.8.55` which contains subcommand improvements
- Bump `deps.clj` to `1.11.1.1435`
- Bump `babashka.fs` to `0.5.20`
- Compatibility with `plumbing.core`
- Compatibility with `shadow.css` by improving `tools.reader` compatibility
- [#1647](https://github.com/babashka/babashka/issues/1647): Allow capturing env vars at build time (only relevant for building bb)
## 1.3.186 (2023-11-02)
- [Support self-contained binaries as uberjars!](https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar)
- Add `java.security.KeyFactory`, `java.security.spec.PKCS8EncodedKeySpec`, `java.net.URISyntaxException`, `javax.crypto.spec.IvParameterSpec`
- Fix babashka.process/exec wrt `babashka.process/*defaults*`
- [#1632](https://github.com/babashka/babashka/issues/1632): Partial fix for `(.readPassword (System/console))`
- Enable producing self-contained binaries using [uberjars](https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar)
- Bump httpkit to `2.8.0-beta3` (fixes GraalVM issue with virtual threads)
- Bump `deps.clj` and `fs`
- Expose `taoensso.timbre.appenders.core`
- nREPL: implement `ns-list` op
- SCI: optimize `swap!`, `deref` and `reset!` for normal atoms (rather than user-created `IAtom`s)
- Add test for [#1639](https://github.com/babashka/babashka/issues/1639)
- Upgrade to GraalVM 21.0.1
## 1.3.185 (2023-09-28)
- [#1624](https://github.com/babashka/babashka/pull/1624): Use Oracle GraalVM 21 ([@lispyclouds](https://github.com/lispyclouds))
- Use PGO to speed up loops (now 2-3x faster for `(time (loop [val 0 cnt 10000000] (if (pos? cnt) (recur (inc val) (dec cnt)) val)))`!)
- Bump babashka.http-client to v0.4.15
- Bump rewrite-clj to v0.1.1.47
- [#1619](https://github.com/babashka/babashka/issues/1619): Fix reflection issue with `Thread/sleep` in `core.async/timeout`
- Support interop on `java.util.stream.IntStream`
- [#1513](https://github.com/babashka/babashka/issues/1513): Fix interop on `Thread/sleep` with numbers that aren't already longs
- Bump babashka.cli to 0.7.53
- Fix [#babashka.nrepl/66](https://github.com/babashka/babashka.nrepl/issues/66)
- Various nREPL server improvements (classpath op, file lookup information for `cider-find-var`)
- Bump cheshire to 5.12.0
## 1.3.184 (2023-08-22)
- Remove leftover debugging output from deps.clj
## 1.3.183 (2023-08-22)
- [#1592](https://github.com/babashka/babashka/issues/1592): expose `sci.core` in babashka
- [#1596](https://github.com/babashka/babashka/issues/1596): Fix `clojure.java.browse/browse-url` truncates URLs with multiple query parameters on Windows
- [#1599](https://github.com/babashka/babashka/issues/1599): propagate error from `run` when task does not exist
- Bump clj-yaml to `1.0.27`
- [#1604](https://github.com/babashka/babashka/issues/1604): throw `FileNotFoundException` when requiring namespace whose file cannot be found (as JVM Clojure does)
- Bump integrant CI tests
- [#1600](https://github.com/babashka/babashka/issues/1600): use pagesize of 64K on linux aarch64, so it works on Asahi linux
- Expose `selmer.parser/resolve-arg`
- [#1610](https://github.com/babashka/babashka/issues/1610): expose `babashka.http-client.websocket` namespace
- Bump `babashka.http-client` to `0.4.14`
- [#1568](https://github.com/babashka/babashka/issues/1568): warn when task overrides built-in command
## 1.3.182 (2023-07-20)
- [#1579](https://github.com/babashka/babashka/issues/1579): add `clojure.tools.reader/resolve-symbol`
- [#1581](https://github.com/babashka/babashka/issues/1581): `bb print-deps`: sort dependencies ([@teodorlu](https://github.com/teodorlu))
- Upgrade `babashka.http-client` to `0.4.12`, fixes `:insecure` option
- Bump [edamame](https://github.com/borkdude/edamame) to `1.3.23`: fixes infinite loop with reader conditional expression
- Bump [Selmer](https://github.com/yogthos/Selmer) to Bumping to `1.12.59`
- Bump [deps.clj](https://github.com/borkdude/deps.clj) with more fixes which should make downloading/installation of tools jar more robust
- Add `javax.net.ssl.X509ExtendedTrustManager` class
- Bump [babashka.process](https://github.com/babashka/process): accept path or file as `:dir` argument
- Bump [hiccup](https://github.com/weavejester/hiccup) to `2.0.0-RC1`
## 1.3.181 (2023-06-13)
- [#1575](https://github.com/babashka/babashka/issues/1575): fix command line parsing problem with `-e` + `*command-line-args*`
- [#1576](https://github.com/babashka/babashka/issues/1576): make downloading/unzipping of deps.clj tools .zip file more robust
## 1.3.180 (2023-05-28)
- [#1524](https://github.com/babashka/babashka/issues/1524): Remove dynamic builds for linux-aarch64 ([@lispyclouds](https://github.com/lispyclouds))
- [#1577](https://github.com/babashka/babashka/issues/1557): Add support for `babashka.process/exec` after namespace reload of `babashka.process` ([@lread](https://github.com/lread))
- [#1548](https://github.com/babashka/babashka/issues/1548): shell and sh should respect `babashka.process/*defaults*`
- [#1524](https://github.com/babashka/babashka/issues/1524): deprecate (remove) linux-aarch64 dynamic binary build
- Expose `org.graalvm.nativeimage.ProcessProperties/exec`
- Bump `babashka.http-client` to `0.3.11`
- Bump `babashka.fs` to `0.4.19`
- Bump `babashka.process` to `0.5.21`
## 1.3.179 (2023-04-26)
- [#1544](https://github.com/babashka/babashka/issues/1544): `:local/root` in script-adjacent bb.edn should resolve relative to script
- [#1545](https://github.com/babashka/babashka/issues/1545): Adjacent `bb.edn` not respected with explicit `-f` option
- [#1546](https://github.com/babashka/babashka/issues/1546): add `.contains` for vector and lazy-seq
## 1.3.178 (2023-04-21)
- Fix regression with [#1541](https://github.com/babashka/babashka/issues/1541)
## 1.3.177 (2023-04-21)
- [#1541](https://github.com/babashka/babashka/issues/1541): respect `bb.edn`
adjacent to invoked file. This eases writing system-global scripts from
projects without using bbin. See [docs](https://book.babashka.org/#_script_adjacent_bb_edn).
- [#1523](https://github.com/babashka/babashka/pull/1523): Reduce the size of the Docker images ([@raszi](https://github.com/raszi))
- Upgrade deps.clj to v1.11.1.1273
- Upgrade transit-clj to 1.0.333
- Add `java.security.cert.CertificateFactory`
- Bump clj-yaml to 1.0.26
- Bump edamame to 1.3.21
- Add `UnsupportedOperationException`
- Bump babashka CLI to 0.7.51
- Bump babashka http-client to 0.2.9
- Add `--install-exit-handlers` to native-image build to support shutdown hook + SIGTERM
## 1.3.176 (2023-03-18)
- Upgrade http-client to 0.1.8, fixes binary file uploads (which messed up the previous release)
- Downgrade org.flatland/ordered to 1.5.9 due to this [issue](https://github.com/clj-commons/ordered/issues/71)
## 1.3.175 (2023-03-18)
- [#1507](https://github.com/babashka/babashka/issues/1507): Expose methods on java.lang.VirtualThread ([@lispyclouds](https://github.com/lispyclouds))
- [#1510](https://github.com/babashka/babashka/issues/1510): add virtual thread interop on `Thread`
- [#1511](https://github.com/babashka/babashka/issues/1511): support for domain sockets
- [#1521](https://github.com/babashka/babashka/issues/1521): push images to GHCR ([@lispyclouds](https://github.com/lispyclouds))
- Bump edamame to 1.3.20
- Bump deps.clj to 1.11.1.1257
- Bump org.flatland/ordered to 1.15.10
- Support `clojure.lang.MapEntry/create`
- clojure.core.async `go` macro now uses virtual threads
- Bump babashka.cli to 0.6.50
- Bump http-client to 0.1.7
## 1.2.174 (2023-03-01)
- Use GraalVM 22.3.1 on JDK 19.0.2. This adds virtual thread support. See [demo](https://twitter.com/borkdude/status/1572222344684531717).
- Expose more `jaxax.crypto` classes
- Add more `java.time` and related classes with the goal of supporting [juxt.tick](https://github.com/juxt/tick) ([issue](https://github.com/juxt/tick/issues/86))
- Compatibility with [kaocha](https://github.com/lambdaisland/kaocha) test runner
- [#1000](https://github.com/babashka/babashka/issues/1000): add lib tests for xforms ([@bobisageek](https://github.com/bobisageek))
- [#1482](https://github.com/babashka/babashka/issues/1482): make loading of libs thread safe
- [#1487](https://github.com/babashka/babashka/issues/1487): `babashka.tasks/clojure` should be supported without arguments to start a REPL
- [#1496](https://github.com/babashka/babashka/issues/1496): Add `set-agent-send-executor!` and `set-agent-send-off-executor!`
- [#1489](https://github.com/babashka/babashka/issues/1489): Don't overwrite non-empty, non-jar files when writing uberscript/uberjar ([@bobisageek](https://github.com/bobisageek))
- [#1506](https://github.com/babashka/babashka/issues/1506): `:exec-args` in task should override `:exec-args` on fn metadata
- [#1501](https://github.com/babashka/babashka/issues/1501): equals on deftype
- Add support for `.getWatches` on atoms
- Bump `babashka.fs` to `0.3.17`
- Bump `deps.clj` to `1.11.1.1237`
- Bump `babashka.http-client` to `0.1.5`
- Bump `babashka.cli` to `0.6.46`
## 1.1.173 (2023-02-04)
- [#1473](https://github.com/babashka/babashka/issues/1473): support `--config` in other dir + `:local/root` ([@lispyclouds](https://github.com/lispyclouds))
- Compatibility with `clojure.tools.namespace.repl/refresh` and `clojure.java.classpath`
- `(clojure.lang.RT/baseLoader)` now returns classloader with babashka dependencies on classpath
- Support reading tags from `data_readers.clj` and `data_readers.cljc`
- Don't exit REPL when `babashka.deps/add-deps` fails
- Fix [#1474](https://github.com/babashka/babashka/issues/1474): when `.bb` file is in different artifact, `.clj` file is loaded first if it appears first on classpath
- Support for `*loaded-libs*` and `(loaded-libs)`
- Bump rewrite-clj to `1.1.46`
- Bump http-client to `0.0.3`
- Bump fs to `0.2.15`
- Bump process to `0.4.16`
## 1.1.172 (2023-01-23)
- [#1472](https://github.com/babashka/babashka/issues/1472): fix tokenization of `babashka.tasks/clojure`: command was tokenized twice (regression was introduced in `1.0.168`)
- **BREAKING**: Bump `babashka.process`: change default for `:out :append` to `:out :write`. This default is undocumented so the impact should be small.
## 1.1.171 (2023-01-23)
- [#1467](https://github.com/babashka/babashka/issues/1467): **BREAKING**: avoid printing results, unless `--prn` is enabled (aside from `-e`, `-o` and `-O`).
- Include [http-client](https://github.com/babashka/http-client) as built-in library
- SCI: support `add-watch` on vars
- Compatibility with [eftest](https://github.com/weavejester/eftest) test runner (see [demo](https://twitter.com/borkdude/status/1616886788898885632))
- Add classes:
- `java.util.concurrent.Callable`
- `java.util.concurrent.ExecutorService`
- Expose `clojure.main` `main` and `repl-caught`
- Switch `clojure.test/*report-counters*` to ref instead of atom for compatibility with [kaocha](https://github.com/lambdaisland/kaocha)
- Allow `java.io.OutputStream` to be proxied, for [kaocha](https://github.com/lambdaisland/kaocha)
- Support qualified method names in `proxy` and ignore namespace
## 1.0.170 (2023-01-19)
- [#1463](https://github.com/babashka/babashka/issues/1463): Add `java.util.jar.Attributes` class ([@jeroenvandijk](https://github.com/jeroenvandijk))
- [#1456](https://github.com/babashka/babashka/issues/1456): allow `*warn-on-reflection*` and `*unchecked-math*` to be set in socket REPL and nREPL ([@axks](https://github.com/axks))
- SCI: macroexpansion error location improvement
- Add compatibility with [tab](https://github.com/eerohele/tab) and [solenoid](https://github.com/adam-james-v/solenoid)
- Bump babashka.cli and babashka.fs
- New classes:
- `java.util.jar.Attributes`
- `java.util.concurrent.ThreadFactory`
- `java.lang.Thread$UncaughtExceptionHandler`
- `java.lang.Thread$UncaughtExceptionHandler`
- `java.util.concurrent.BlockingQueue`
- `java.util.concurrent.ArrayBlockingQueue`
- `java.util.concurrent.ThreadFactory`
- `java.lang.Thread$UncaughtExceptionHandler`
- `java.util.concurrent.Semaphore`
- Expose more httpkit.server functions: `with-channel`, `on-close`, `close`
## 1.0.169 (2023-01-03)
- Implement `ns`, `lazy-seq` as macro
- Support `--dev-build` flag in installation script
- [#1451](https://github.com/babashka/babashka/issues/1451): Allow passing explicit file and line number to clojure.test ([@matthewdowney](https://github.com/matthewdowney))
- [#1280](https://github.com/babashka/babashka/issues/1280): babashka REPL doesn't quit right after Ctrl-d ([@formerly-a-trickster](https://github.com/formerly-a-trickster) and Alice Margatroid)
- [#1446](https://github.com/babashka/babashka/issues/1446): add `pprint/code-dispatch`
- Update zlib to version `1.2.13` ([@thiagokokada](https://github.com/thiagokokada))
- [#1454](https://github.com/babashka/babashka/issues/1454): Add `babashka.process` to `print-deps` output
- Update `deps.clj` / clojure tools to `1.11.1.1208`
- Add `reader-conditional` function
- Fix pretty printing (with `clojure.pprint`) of vars
- Upgrade built-in `spec.alpha`
- SCI performance improvements: faster JVM interop
## 1.0.168 (2022-12-07)
- `loop*`, `fn*` are now special forms and `loop`, `fn`, `defn`, `defmacro`, `and` and `or` are implemented as macros. This restores compatibility with [rcf](https://github.com/borkdude/hyperfiddle-rcf)
- fs: don't touch dirs in `split-ext`
- Update to babashka process to v0.4.13: support `(process opts? & args)` syntax everywhere
- [#1438](https://github.com/babashka/babashka/issues/1438): expose `query-string` and `url-encode` functions from org.httpkit.client ([@bobisageek](https://github.com/bobisageek))
- Add `java.util.InputMismatchException`
## 1.0.167 (2022-11-30)
- [#1433](https://github.com/babashka/babashka/issues/1433): spec source as built-in fallback. When not including the
[clojure.spec.alpha](https://github.com/babashka/spec.alpha) fork as a
library, babashka loads a bundled version, when `clojure.spec.alpha` is required.
- [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list.
- Add note about BSOD when using WSL1, see [README.md/quickstart](https://github.com/LouDnl/babashka#quickstart)
- SCI: performance improvements
- Better error locations for interop ([@bobisageek](https://github.com/bobisageek))
- Fix [babashka/babashka.nrepl#59](https://github.com/babashka/babashka.nrepl/issues/59): do not output extra new line with cider pprint
- Use `namespace-munge` instead of `munge` for doing ns -> file lookup
## 1.0.166 (2022-11-24)
See the [Testing babashka scripts](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release.
- Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace)
- Add `run-test` and `run-test-var` to `clojure.test`
- Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix
- [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map
- [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek))
- Update nix app example in docs
- Add `java.lang.Error` and `java.net.URLClassLoader` (only for compatibility with the `clojure.java.classpath` lib)
- Deps.clj `deps.clj: 1.11.1.1200`
- Upgrade timbre to `6.0.1`
- Performance improvements in SCI
- SCI: preserve stack information on `throw` expressions
## 1.0.165 (2022-11-01)
- Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method
- Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var
- [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek))
- Add `java.net.URLConnection` class
- Add `java.time.zone.ZoneRules` class
- Copy more docstrings for core macros and vars
- Bump `core.async` to `1.6.673`
- Implement `in-ns` as function, rather than special form ([@SignSpice](https://github.com/SignSpice))
- Bump `deps.clj` to `1.11.1.1182`
- Bump GraalVM to `22.3.0`
- SCI: don't rely on metadata for record implementation
## 1.0.164 (2022-10-17)
- SCI: optimizations for `let`
- Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit))
- feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb))
- [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset
- [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb
- [#1384](https://github.com/babashka/babashka/issues/1384): allow `.indexOf` on `LazySeq`
- [#1330](https://github.com/babashka/babashka/issues/1330): allow `(set! *warn-on-reflection*)` in programmatic nREPL
- Better error message when failing to load `bb.edn` ([@lispyclouds](https://github.com/lispyclouds))
- Pods: print and flush to `*out*` and `*err*` instead of using `println` ([@justone](https://github.com/justone))
- deps.clj: support for `CLJ_JVM_OPTS` and `JAVA_OPTS` ([@ikappaki](https://github.com/ikappaki))
- Fix `*print-namespace-maps*` when using `clojure.pprint` ([@ghoseb](https://github.com/ghoseb))
- Process: only slurp `*err*` when inputstream ([@ikappaki](https://github.com/ikappaki))
- Process: add `alive?` API function ([@grzm](https://github.com/grzm))
- Bump libraries: tools.cli, babashka.cli
- [#1391](https://github.com/babashka/babashka/issues/1391): include raw in `hiccup2.core` ns
- [#1391](https://github.com/babashka/babashka/issues/1391): support loading `hiccup.page` when adding hiccup to deps
## 0.10.163 (2022-09-24)
- [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last
- [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global `-Sforce` option ([@bobisageek](https://github.com/bobisageek))
- [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` methods are missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek))
- [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns
- [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit))
- [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan))
- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of `java.lang.ref` to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit))
- [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn`
- Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele))
- Add more reflection class methods ([@eerohele](https://github.com/eerohele))
- Bump `clj-yaml`
- Add `-x` help
- Set `TCP_NODELAY` in pods for performance
- Expose `clojure.main/with-bindings`
- Add `ThreadPoolExecutor` rejection policy classes ([@eerohele](https://github.com/eerohele))
- Download but don't run pods when `os.name` / `os.arch` don't match ([@cap10morgan](https://github.com/cap10morgan))
- Add `clojure.core.server/stop-server` ([@eerohele](https://github.com/eerohele))
- Add `ns-unalias`
- Add `AtomicInteger` and `AtomicLong` to full interop
- Add `PrintWriter-on`
- Improve `reify` error messages ([@retrogradeorbit](https://github.com/retrogradeorbit))
- Expose `core.async` `ManyToManyChannel`
- fs: add `write-lines`
- fs: add `write-bytes`
- [#1350](https://github.com/babashka/babashka/issues/1350): map `clojure.lang.Var` to `sci.lang.Var`
- Use temporary fork of `clj-yaml` with new `:load-all`, `:unknown-tag-fn`
options and preserves strings with numbers that start with zeros as strings
(this solves a problem when YAML 1.1 output is read as YAML 1.2.). Once
upstream SnakeYAML 1.33 lands, this will be used again.
## 0.9.162 (2022-09-04)
Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. Thanks [@rads](https://github.com/rads)!
- Throw exception on attempt to reify multiple interfaces ([@retrogradeorbit](https://github.com/retrogradeorbit))
- Allow java.lang.Object reify with empty methods ([@retrogradeorbit](https://github.com/retrogradeorbit))
- [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature
- [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread))
- Fix `satisfies?` with marker protocol (no methods)
- Update `rewrite-clj`
- Update `deps.clj`
- Update `babashka.cli`
- Update `org.clj-commons/clj-yaml`
- `babashka.fs`: fix `expand-home` on Windows
- `babashka.fs`: expose `:win-exts`
- nREPL: preserve stacktrace on exception
- Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location
- Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault
- Fix [#1339](https://github.com/babashka/babashka/issues/1339): resolve record name ending with dot.
## 0.9.161 (2022-07-31)
- Fix `exec`
## 0.9.160 (2022-07-29)
- Breaking: change `exec`, introduced in `0.9.159` to a function instead.
You now write `(exec 'mynamespace.function)` instead.
## 0.9.159 (2022-07-29)
Read the introductory blog post about the new babashka CLI integration [here](https://blog.michielborkent.nl/babashka-tasks-meets-babashka-cli.html).
- [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI
- [#1324](https://github.com/babashka/babashka/issues/1324): `babashka.tasks/exec` to invoke a function with babashka CLI in tasks
- SCI: don't eval metatada on defn body
- SCI issue 774: make interpreter stacktrace available to user
- `babashka.process`: improve `tokenize`
- Upgrade to GraalVM 22.2.0 (#1325)
## 0.8.157 (2022-07-01)
- Add compatibility with [`metosin/malli`](https://github.com/metosin/malli#babashka) `{:mvn/version "0.8.9"}`.
- Expose `babashka.nrepl.server/start-server!`- and `stop-server!`-functions to support programmatically starting
an nrepl-server. `start-server!` is redefined to not require a sci-context as its first argument.
- Fix misspelling in script/uberjar: `BABASHKA_FEATURE_TRANSIT`
## 0.8.156 (2022-06-08)
- macOS aarch64 support. Upgrading via brew or the installer script should
install the aarch64 version on an M1 system.
- Support for running [prismatic/schema](https://github.com/plumatic/schema)
from source. There is an open PR for babashka. Until it is merged you can use
[this](https://github.com/borkdude/schema/tree/bb-test-suite) fork.
- SCI: many small improvements, especially in `defrecord` (discovered while
trying to make `schema.core` work)
- Switch version schema to major.minor.release_count.
- babashka.nrepl: fix completions for static Java interop
- `fs/read-all-lines`, support charset
- fs: `strip` and `split-ext` are less reliant on file system and are now just
string operations
- Bump cheshire
- Add `babashka.process/exec` for exec call (replacing the current process)
- Improve `babashka.process/tokenize`
- [#1264](https://github.com/babashka/babashka/issues/1264): add support for calling `ScheduledExecutorService`
- Add support for `sun.misc.SignalHandler`
- Add `java.net.BindException`, `clojure.lang.AFunction`, `AbstractMethodError`
- Upgrade httpkit to `2.6.0-RC1`
- Add `process/shell`, similar to `babashka.tasks/shell` but in process ns
- pods: fix benign socket closed exception error output
## 0.8.2 (2022-05-06)
- Convey `*print-length*` to pprint and allow `set!`
@ -1029,7 +441,7 @@ Babashka.pods:
- Add `babashka.task` `System` property [#837](https://github.com/babashka/babashka/issues/837)
- Allow thread-first with `shell` like `babashka.process` [#829](https://github.com/babashka/babashka/issues/829)
## 0.4.0 (2021-05-08)
## 0.4.0
Babashka proper:
@ -1039,7 +451,7 @@ Babashka proper:
[jasentaa](https://github.com/rm-hull/jasentaa) parser combinator library
- Update Selmer to 1.12.40
SCI:
Sci:
- Better error msg for protocol not found or class
@ -1609,14 +1021,6 @@ Details about releases prior to v0.1.0 can be found
## Breaking changes
### v1.1.172
- Bump `babashka.process`: change default for `:out :append` to `:out :write`. This default is undocumented so the impact should be small.
### v1.1.171
- [#1467](https://github.com/babashka/babashka/issues/1467): avoid printing results, unless `--prn` is enabled (aside from `-e`, `-o` and `-O`).
### v0.2.4
- Remove cheshire smile functions [#658](https://github.com/babashka/babashka/issues/658)

View file

@ -5,25 +5,24 @@ RUN apt update
RUN apt install --no-install-recommends -yy build-essential zlib1g-dev
WORKDIR "/opt"
ENV GRAALVM_VERSION="24"
ENV GRAALVM_VERSION="22.1.0"
ARG TARGETARCH
# Do not set those directly, use TARGETARCH instead
ENV BABASHKA_ARCH=
ENV GRAALVM_ARCH=
ENV BABASHKA_ARCH=${TARGETARCH}
ENV GRAALVM_ARCH=${TARGETARCH}
RUN if [ "${TARGETARCH}" = "" ] || [ "${TARGETARCH}" = "amd64" ]; then \
export GRAALVM_ARCH=x64; export BABASHKA_ARCH=x86_64; \
export GRAALVM_ARCH=amd64; export BABASHKA_ARCH=x86_64; \
elif [ "${TARGETARCH}" = "arm64" ]; then \
export GRAALVM_ARCH=aarch64; \
fi && \
echo "Installing GraalVM for ${GRAALVM_ARCH}" && \
curl -sLO https://download.oracle.com/graalvm/${GRAALVM_VERSION}/archive/graalvm-jdk-${GRAALVM_VERSION}_linux-${GRAALVM_ARCH}_bin.tar.gz && \
mkdir "graalvm-$GRAALVM_VERSION" && \
tar -xzf graalvm-jdk-${GRAALVM_VERSION}_linux-${GRAALVM_ARCH}_bin.tar.gz -C graalvm-$GRAALVM_VERSION --strip-components 1
curl -sLO https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${GRAALVM_VERSION}/graalvm-ce-java11-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz && \
tar -xzf graalvm-ce-java11-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz && \
rm graalvm-ce-java11-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz
ARG BABASHKA_XMX="-J-Xmx4500m"
ENV GRAALVM_HOME="/opt/graalvm-$GRAALVM_VERSION"
ENV JAVA_HOME="$GRAALVM_HOME/bin"
ENV GRAALVM_HOME="/opt/graalvm-ce-java11-${GRAALVM_VERSION}"
ENV JAVA_HOME="/opt/graalvm-ce-java11-${GRAALVM_VERSION}/bin"
ENV PATH="$JAVA_HOME:$PATH"
ENV BABASHKA_XMX=$BABASHKA_XMX
@ -35,7 +34,7 @@ ARG BABASHKA_FEATURE_CSV=
ARG BABASHKA_FEATURE_JAVA_NET_HTTP=
ARG BABASHKA_FEATURE_JAVA_NIO=
ARG BABASHKA_FEATURE_JAVA_TIME=
ARG BABASHKA_FEATURE_TRANSIT=
ARG BABAHSKA_FEATURE_TRANSIT=
ARG BABASHKA_FEATURE_XML=
ARG BABASHKA_FEATURE_YAML=
ARG BABASHKA_FEATURE_HTTPKIT_CLIENT=
@ -52,7 +51,7 @@ ENV BABASHKA_FEATURE_CSV=$BABASHKA_FEATURE_CSV
ENV BABASHKA_FEATURE_JAVA_NET_HTTP=$BABASHKA_FEATURE_JAVA_NET_HTTP
ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO
ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME
ENV BABASHKA_FEATURE_TRANSIT=$BABASHKA_FEATURE_TRANSIT
ENV BABAHSKA_FEATURE_TRANSIT=$BABAHSKA_FEATURE_TRANSIT
ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML
ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML
ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT
@ -73,9 +72,7 @@ RUN ./script/compile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/local/bin
&& mkdir -p /usr/local/bin
COPY --from=BASE /opt/target/metabom.jar /opt/babashka-metabom.jar
COPY --from=BASE /opt/bb /usr/local/bin/bb
CMD ["bb"]

View file

@ -4,20 +4,15 @@ COPY bb /bin/bb
RUN chmod +x /bin/bb
# TODO: See https://github.com/sgerrand/alpine-pkg-glibc/issues/185 and remove the `--force-overwrite`s when resolved.
RUN apk --no-cache add curl ca-certificates tar && \
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk
apk add --allow-untrusted /tmp/glibc-2.28-r0.apk
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
# TODO: Run actual native tests when they are ported
RUN curl --version
# RUN bb -e '(prn (java.io.File/createTempFile "babashka.curl" ".headers"))'
# RUN bb -e '(spit (java.io.File/createTempFile "babashka.curl" ".headers") "hello")'
# RUN bb -e "(curl/get \"https://clojure.org\")" # cURL http test
RUN bb -e "(require '[org.httpkit.client :as http]) (when-let [error (:error @(http/get \"https://clojure.org\"))] (throw error))" # JVM http test
RUN bb -e "(curl/get \"https://httpstat.us/200\")" # cURL http test
RUN bb -e "(require '[org.httpkit.client :as http]) (when-let [error (:error @(http/get \"https://httpstat.us/200\"))] (throw error))" # JVM http test
RUN bb -e "(.length \"Hello, Babashka\")" # Java interop test
RUN bb -e "(require '[babashka.pods :as pods]) (pods/load-pod 'org.babashka/go-sqlite3 \"0.0.1\") (require '[pod.babashka.go-sqlite3 :as sqlite]) (sqlite/execute! \"/tmp/foo.db\" [\"SELECT 1 + 1\"])" # Pod test
@ -26,7 +21,7 @@ FROM alpine:3
RUN apk --no-cache add curl ca-certificates tar && \
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk && rm /tmp/glibc-2.28-r0.apk
apk add --allow-untrusted /tmp/glibc-2.28-r0.apk
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
COPY metabom.jar /opt/babashka-metabom.jar

View file

@ -2,7 +2,6 @@ FROM ubuntu:latest
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/local/bin
ARG TARGETARCH

244
README.md
View file

@ -1,10 +1,10 @@
[<img src="logo/babashka.svg" alt="Babashka" width="425px">](https://babashka.org)
<img src="logo/babashka.svg" width="425px">
[![CircleCI](https://circleci.com/gh/babashka/babashka/tree/master.svg?style=shield)](https://circleci.com/gh/babashka/babashka/tree/master)
[![project chat](https://img.shields.io/badge/slack-join_chat-brightgreen.svg)](https://app.slack.com/client/T03RZGPFR/CLX41ASCS)
[![Financial Contributors on Open Collective](https://opencollective.com/babashka/all/badge.svg?label=financial+contributors)](https://opencollective.com/babashka) [![Clojars Project](https://img.shields.io/clojars/v/babashka/babashka.svg)](https://clojars.org/babashka/babashka)
[![twitter](https://img.shields.io/badge/twitter-%23babashka-blue)](https://twitter.com/search?q=%23babashka&src=typed_query&f=live)
[![docs](https://img.shields.io/badge/website-docs-blue)](https://book.babashka.org) [![Gurubase](https://img.shields.io/badge/Gurubase-Ask%20Babashka%20Guru-006BFF)](https://gurubase.io/g/babashka)
[![docs](https://img.shields.io/badge/website-docs-blue)](https://book.babashka.org)
<blockquote class="twitter-tweet" data-lang="en">
<p lang="en" dir="ltr">Life's too short to remember how to write Bash code. I feel liberated.</p>
@ -12,6 +12,12 @@
<a href="https://github.com/laheadle">@laheadle</a> on Clojurians Slack
</blockquote>
<hr>
Please leave some feedback about babashka in the [Q1 Survey](https://forms.gle/ko3NjDg2SwXeEoNQ9)!
<hr>
## Introduction
Babashka is a native Clojure interpreter for scripting with fast startup. Its
@ -40,10 +46,10 @@ As one user described it:
## Quickstart
For installation options check [Installation](https://github.com/babashka/babashka#installation).
For quick installation using `bash`, use:
For quick installation use:
``` shell
bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install)
$ bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install)
```
or grab a binary from [Github
@ -53,36 +59,11 @@ anywhere on the path.
Then you're ready to go:
``` shellsession
time bb -e '(->> (fs/list-dir ".") (filter fs/directory?) (map fs/normalize) (map str) (take 3))'
$ ls | bb -i '(filter #(-> % io/file .isDirectory) *input*)'
("doc" "resources" "sci" "script" "src" "target" "test")
bb took 4ms.
```
``` clojure
(".build" "feature-lanterna" ".repl")
bb -e 0,01s user 0,01s system 70% cpu 0,017 total
```
## Support :heart:
You can support this project via [Github
Sponsors](https://github.com/sponsors/borkdude),
[OpenCollective](https://opencollective.com/babashka),
[Ko-fi](https://ko-fi.com/borkdude) or indirectly via [Clojurists
Together](https://www.clojuriststogether.org/).
<details>
<summary>Top sponsors</summary>
- [Clojurists Together](https://clojuriststogether.org/)
- [Roam Research](https://roamresearch.com/)
- [Nextjournal](https://nextjournal.com/)
- [Toyokumo](https://toyokumo.co.jp/)
- [Cognitect](https://www.cognitect.com/)
- [Kepler16](https://kepler16.com/)
- [Adgoji](https://www.adgoji.com/)
</details>
## Babashka users
See [companies](doc/companies.md) for a list of companies using babashka.
@ -107,7 +88,7 @@ and is unlikely to change. Changes may happen in other parts of babashka,
although we will try our best to prevent them. Always check the release notes or
[CHANGELOG.md](CHANGELOG.md) before upgrading.
## Talk
### Talk
To get an overview of babashka, you can watch this talk ([slides](https://speakerdeck.com/borkdude/babashka-and-the-small-clojure-interpreter-at-clojured-2020)):
@ -118,10 +99,44 @@ To get an overview of babashka, you can watch this talk ([slides](https://speake
The [babashka book](https://book.babashka.org) contains detailed information
about how to get the most out of babashka scripting.
There is also the book [Babashka Babooka](https://www.braveclojure.com/quests/babooka/),
by Daniel Higginbotham, who has also helped a lot of people learn Clojure with
[Clojure for the Brave and
True](https://www.braveclojure.com/clojure-for-the-brave-and-true/).
## Examples
Read the output from a shell command as a lazy seq of strings:
``` shell
$ ls | bb -i '(take 2 *input*)'
("CHANGES.md" "Dockerfile")
```
Read EDN from stdin and write the result to stdout:
``` shell
$ bb '(vec (dedupe *input*))' <<< '[1 1 1 1 2]'
[1 2]
```
Read more about input and output flags [here](https://book.babashka.org/#_input_and_output_flags).
Execute a script. E.g. print the current time in California using the
`java.time` API:
File `pst.clj`:
``` clojure
#!/usr/bin/env bb
(def now (java.time.ZonedDateTime/now))
(def LA-timezone (java.time.ZoneId/of "America/Los_Angeles"))
(def LA-time (.withZoneSameInstant now LA-timezone))
(def pattern (java.time.format.DateTimeFormatter/ofPattern "HH:mm"))
(println (.format LA-time pattern))
```
``` shell
$ pst.clj
05:17
```
More examples can be found [here](examples/README.md).
## Try online
@ -138,34 +153,15 @@ Install:
brew install borkdude/brew/babashka
<!-- On macOS with an M1 processor: -->
<!-- softwareupdate --install-rosetta -->
<!-- arch -x86_64 brew install borkdude/brew/babashka -->
Upgrade:
brew upgrade babashka
### Nix
Linux and macOS (including ARM Macs) binaries are provided via nix (see the installation instructions for nix [here](https://nixos.org/download.html)).
Install:
# Adding `nixpkgs-unstable` channel for more up-to-date binaries, skip this if you already have `nixpkgs-unstable` in your channel list
nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs-unstable
nix-channel --update
nix-env -iA nixpkgs-unstable.babashka
Upgrade:
nix-channel --update
nix-env -iA nixpkgs-unstable.babashka
You can find more documentation on how to use babashka with nix [here](./doc/nix.md).
### Alpine
On Alpine it's recommended to download the binary manually from [Github
Releases](https://github.com/babashka/babashka/releases) and use the static
linux binary.
### Arch (Linux)
`babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as
@ -175,29 +171,15 @@ linux binary.
### asdf
[asdf](https://github.com/asdf-vm/asdf) is an extendable version manager for linux and macOS. Note that asdf will add significant startup time to any babashka script, consider using [mise](#mise) instead.
[asdf](https://github.com/asdf-vm/asdf) is an extendable version manager for linux and macOS.
Babashka can be installed using a plugin as follows:
asdf plugin add babashka https://github.com/pitch-io/asdf-babashka
asdf plugin add babashka
asdf install babashka latest
### mise
[mise](https://mise.jdx.dev/) is a development environment setup tool for linux and macOS.
Install:
mise use --global babashka@latest
Upgrade:
mise upgrade babashka
### Windows
#### Scoop
On Windows you can install using [scoop](https://scoop.sh/) and the
[scoop-clojure](https://github.com/littleli/scoop-clojure) bucket.
@ -212,28 +194,12 @@ scoop bucket add extras
scoop install babashka
```
#### Manual
If scoop does not work for you, then you can also just download the `bb.exe`
binary from [Github releases](https://github.com/babashka/babashka/releases) and
place it on your path manually.
#### WSL1
> Note: WSL1 users might experience a BSOD, please use the --static install option when installing
``` shell
$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
$ chmod +x install
$ ./install --static
```
### Installer script
Install via the installer script for linux and macOS:
Install via the installer script:
``` shell
$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
# or
$ wget -qO install https://raw.githubusercontent.com/babashka/babashka/master/install
$ chmod +x install
$ ./install
```
@ -282,12 +248,6 @@ You may also download a binary from
[Github](https://github.com/babashka/babashka/releases). For linux there is a
static binary available which can be used on Alpine.
### CI
- On Github Actions it's recommended to use [setup-clojure](https://github.com/DeLaGuardo/setup-clojure) with `bb: latest`.
- You can use the [installer script](https://github.com/babashka/babashka#installer-script) on any non-Windows CI system. CircleCI requires `sudo`.
- On Appveyor + Windows you can use a bit of [Powershell](https://github.com/clj-kondo/clj-kondo/blob/39b5cb2b0d3d004c005e8975b6fafe0e314eec68/appveyor.yml#L60-L64).
## Docker
Check out the image on [Docker hub](https://hub.docker.com/r/babashka/babashka/).
@ -300,25 +260,13 @@ Check out the [news](doc/news.md) page to keep track of babashka-related news it
Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list of built-in namespaces.
## [Compatible Projects](doc/projects.md)
## [Projects](doc/projects.md)
A list of projects (scripts, libraries, pods and tools) known to work with babashka.
## Badges
Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo!
[![bb compatible](/logo/badge.svg)](https://book.babashka.org#badges)
The babashka compatible badge indicates that a library can be used as babashka dependency.
If this is the case for your library, we encourage you to proudly display this badge.
[![bb built-in](/logo/built-in-badge.svg)](https://book.babashka.org#badges)
The babashka built-in badge means that a library has been built directly into babashka and requires no extra dependencies to use it.
If this rare honor belongs to your library, you should display this badge.
See [the babashka book for details](https://book.babashka.org#badges).
## Swag
- [t-shirt](https://www.etsy.com/listing/1241766068/babashka-clj-kondo-nbb-shirt)
[![bb compatible](https://img.shields.io/badge/babashka-compatible-green?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNDcyIDE0NzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTk1LjkxMSAxMTkzLjg5QzExMTAuOTMgMTExMi4zOCAxMTg2IDk3OC4yMDYgMTE4NiA4MjYuNUMxMTg2IDU3Ny45NzIgMTAxNCAyNTQuNSA3MzYgMTEzQzQ2MC41IDI2MiAyODYgNTc3Ljk3MiAyODYgODI2LjVDMjg2IDk3OC4yMDYgMzYxLjA3IDExMTIuMzggNDc2LjA4OSAxMTkzLjg5QzQ3MS45ODMgMTE5NC40NCA0NjcuOTQ5IDExOTUuMTQgNDY0IDExOTZDMzc2LjYxMSAxMjE1LjA3IDI3MCAxMzU5LjA1IDI3MCAxMzU5LjA1SDUzNEM1ODAuOTcyIDEzNTkuMDUgNjI1LjYzMSAxMzQxLjQxIDY2MC45NTYgMTMyMS42MkM2NzguMTE1IDEzNDQuMzIgNzA1LjM0NCAxMzU5IDczNiAxMzU5Qzc2Ni42NTYgMTM1OSA3OTMuODg1IDEzNDQuMzIgODExLjA0NCAxMzIxLjYyQzg0Ni4zNjkgMTM0MS40MSA4OTEuMDI4IDEzNTkuMDUgOTM4IDEzNTkuMDVIMTIwMkMxMjAyIDEzNTkuMDUgMTA5NS4zOSAxMjE1LjA3IDEwMDggMTE5NkMxMDA0LjA1IDExOTUuMTQgMTAwMC4wMiAxMTk0LjQ0IDk5NS45MTEgMTE5My44OVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4KPGNpcmNsZSBjeD0iNzM1LjUiIGN5PSI4NTIuNSIgcj0iMzExLjUiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00NDMgNzUwLjQxN0M2NjIgNzY1Ljg2NiA3OTEuMzgyIDcxMi4zODggODgxIDU3OS44ODFDODgxIDU3OS44ODEgNzA4LjI5MyA1MjEuNjQ5IDYwMy4yNDQgNTc5Ljg4MUM0OTguNTUgNjM3LjkxNiA0NDMgNzUwLjQxNyA0NDMgNzUwLjQxN1oiIGZpbGw9IiNCNEI0QjQiLz4KPHBhdGggZD0iTTEwMzkuOTkgNzQ4LjI4MkM5MTQuODYyIDczNC43NDUgODAzLjI2NCA2OTQuMTM1IDc1MCA1NDFDNzUwIDU0MSA4NjAuNjMzIDU2Ni4yNzIgOTcyLjM1NSA2NjguMTAxQzEwODguMzkgNzczLjg1NyAxMDM5Ljk5IDc0OC4yODIgMTAzOS45OSA3NDguMjgyWiIgZmlsbD0iI0I0QjRCNCIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgc3Ryb2tlPSIjMEEwMDAwIiBzdHJva2Utd2lkdGg9IjQwIi8+CjxwYXRoIGQ9Ik03OTcgNzE5SDY3NEw3MDQgNzQ5VjgzOUM3MDguNSA4MDkuNSA3NjQuNSA4MDguNSA3NjcuNSA4MzlMNzc1IDc0OUw3OTcgNzE5WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTM1MS4xMTcgNzU5QzM1MS4xMTcgNzM2LjkwOSAzNjkuMDI2IDcxOSAzOTEuMTE3IDcxOUg2NzYuMDE4QzcwMC4yIDcxOSA3MTguODUyIDc0MC4yOTIgNzE1LjY3IDc2NC4yNjRMNjkwLjkxIDk1MC43NjRDNjg4LjI3IDk3MC42NDYgNjcxLjMxNCA5ODUuNSA2NTEuMjU4IDk4NS41SDM5MS4xMTdDMzY5LjAyNiA5ODUuNSAzNTEuMTE3IDk2Ny41OTEgMzUxLjExNyA5NDUuNVY3NTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNNzU2LjAxMiA3NjQuMjY3Qzc1Mi44MjggNzQwLjI5NCA3NzEuNDgxIDcxOSA3OTUuNjY0IDcxOUgxMDgwQzExMDIuMDkgNzE5IDExMjAgNzM2LjkwOSAxMTIwIDc1OVY5NDUuMDk2QzExMjAgOTY3LjE4NyAxMTAyLjA5IDk4NS4wOTYgMTA4MCA5ODUuMDk2SDgyMC4zODFDODAwLjMyNSA5ODUuMDk2IDc4My4zNyA5NzAuMjQ0IDc4MC43MjkgOTUwLjM2Mkw3NTYuMDEyIDc2NC4yNjdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTAyNCA5NTJWOTIxLjQ3SDEwMTMuNzFDMTAwNy4wMyA5MjEuNDcgMTAwMi41OCA5MTYuNzUyIDEwMDAuMzUgOTA5LjgxM0w5NTguMDY0IDc4Mi42OTdDOTU1LjI4MiA3NzQuNjQ5IDk1MS45NDQgNzY4LjgyIDk0Ny40OTIgNzY0LjM3OUM5MzkuMTQ2IDc1NS43NzUgOTI4LjI5NiA3NTMgOTE2LjA1NCA3NTNIOTAyLjdWNzg0LjkxOEg5MTEuNjAzQzkxOS4xMTUgNzg0LjkxOCA5MjQuOTU3IDc4Ny42OTMgOTI3LjQ2MSA3OTYuNTc1TDkzMy4zMDMgODE3LjExM0w4ODEgOTUySDkxOS4xMTVMOTUwLjU1MyA4NjMuMTg1TDk2Ny4yNDUgOTE2Ljc1MkM5NzMuNjQ0IDkzNy41NjggOTg0LjQ5NCA5NTIgMTAwOC45OCA5NTJIMTAyNFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OTAgOTUyVjkyMS40N0g1NzkuNzA2QzU3My4wMjkgOTIxLjQ3IDU2OC41NzggOTE2Ljc1MiA1NjYuMzUyIDkwOS44MTNMNTI0LjA2NCA3ODIuNjk3QzUyMS4yODIgNzc0LjY0OSA1MTcuOTQ0IDc2OC44MiA1MTMuNDkyIDc2NC4zNzlDNTA1LjE0NiA3NTUuNzc1IDQ5NC4yOTYgNzUzIDQ4Mi4wNTQgNzUzSDQ2OC43Vjc4NC45MThINDc3LjYwM0M0ODUuMTE1IDc4NC45MTggNDkwLjk1NyA3ODcuNjkzIDQ5My40NjEgNzk2LjU3NUw0OTkuMzAzIDgxNy4xMTNMNDQ3IDk1Mkg0ODUuMTE1TDUxNi41NTMgODYzLjE4NUw1MzMuMjQ1IDkxNi43NTJDNTM5LjY0NCA5MzcuNTY4IDU1MC40OTQgOTUyIDU3NC45NzcgOTUySDU5MFoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSI3NTIiIHkxPSIxMTMiIHgyPSI3NTIiIHkyPSIxMzU5LjUyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNFNDFGMjYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQjcwMDAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==)](https://babashka.org)
## [Pods](https://github.com/babashka/babashka.pods)
@ -326,7 +274,7 @@ Pods are programs that can be used as a Clojure library by
babashka. Documentation is available in the [pod library
repo](https://github.com/babashka/pods).
A list of available pods can be found in the [pod registry](https://github.com/babashka/pod-registry).
A list of available pods can be found [here](doc/projects.md#pods).
## Differences with Clojure
@ -368,33 +316,8 @@ handling of SIGINT and SIGPIPE. This can be done by setting
## Articles, podcasts and videos
- [Blambda analyses sites](https://jmglov.net/blog/2023-01-04-blambda-analyses-sites.html) by Josh Glover
- [The wizard of HOP - How we built the web based HOP CLI Settings Editor using Babashka and Scittle](https://www.gethop.dev/post/the-wizard-of-hop-how-we-built-the-web-based-hop-cli-settings-editor-using-babashka-and-scittle) by Bingen Galartza
- [Simple TUIs with Babashka and Gum](https://rattlin.blog/bbgum.html) by Rattlin.blog
- [Babashka And Dialog Part Ii: Announcing The Bb-Dialog Library](https://www.pixelated-noise.com/blog/2023/01/20/bb-dialog-announcement/index.html) by A.C. Danvers
- [Babashka Babooka](https://www.braveclojure.com/quests/babooka/): Write Command-Line Clojure by Daniel Higginbotham
- [Re-Writing a GlobalProtect OpenConnect VPN Connect script in Babashka](https://tech.toryanderson.com/2023/01/14/re-writing-a-globalprotect-openconnect-vpn-connect-script-in-babashka/) by Tory Anderson
- [Babashka: How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746) by Michiel Borkent (Japanese version [here]((https://logico-jp.io/2023/01/07/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure/)))
- [Adding Prompts To Your Babashka Scripts With Dialog](https://www.pixelated-noise.com/blog/2022/12/09/dialog-and-babashka/index.html) by A.C. Danvers
- [Scraping an HTML dictionary with Babashka and Bootleg](https://blog.exupero.org/scraping-an-html-dictionary-with-babashka-and-bootleg/) by exupero
- [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices.html) by Kari Marttila
- [How to Do Things With Babashka](https://presumably.de/how-to-do-things-with-babashka.html) by Paulus Esterhazy (2022-12)
- [Using nREPL as a system interface](https://yogthos.net/posts/2022-11-26-nREPL-system-interaction.html) by Dmitri Sotnikov
- [Manage git hooks with babashka tasks](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy
- [Messing around with babashka](https://ian-muge.medium.com/messing-around-with-babashka-f181a9003faa) by Ian Muge
- Introducing [bbin](https://radsmith.com/bbin) by Radford Smith (2022-09)
- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund
- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover
- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs!
- [Breakneck Babashka on K8s](https://www.linkedin.com/pulse/breakneck-babashka-k8s-heow-goodman/) by Heow Goodman
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/)
- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg
- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks) by Cyprien Pannier
- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent
- [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea
- [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý
@ -469,10 +392,47 @@ commit](https://github.com/babashka/babashka/commit/02c7c51ad4b2b1ab9aa95c26a744
Thanks to all the people that contributed to babashka:
- [Adgoji](https://www.adgoji.com/) for financial support
- [CircleCI](https://circleci.com/) for CI and additional support
- [Nikita Prokopov](https://github.com/tonsky) for the logo
- [Contributors](https://github.com/babashka/babashka/graphs/contributors) and
other users posting issues with bug reports and ideas
- [Github sponsors](https://github.com/sponsors/borkdude)
- [OpenCollective sponsors](https://opencollective.com/babashka)
- [Clojurists Together](https://www.clojuriststogether.org/)
### Code Contributors
This project exists thanks to all the people who contribute. [[Contribute](doc/dev.md)].
<a href="https://github.com/babashka/babashka/graphs/contributors"><img src="https://opencollective.com/babashka/contributors.svg?width=890&button=false" /></a>
### Financial Contributors
#### Github Sponsors
- [Dig Gashinsky](https://github.com/digash)
#### OpenCollective
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/babashka/contribute)]
##### Individuals
<a href="https://opencollective.com/babashka"><img src="https://opencollective.com/babashka/individuals.svg?width=890"></a>
##### Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/babashka/contribute)]
<a href="https://opencollective.com/babashka/organization/0/website"><img src="https://opencollective.com/babashka/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/1/website"><img src="https://opencollective.com/babashka/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/2/website"><img src="https://opencollective.com/babashka/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/3/website"><img src="https://opencollective.com/babashka/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/4/website"><img src="https://opencollective.com/babashka/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/5/website"><img src="https://opencollective.com/babashka/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/6/website"><img src="https://opencollective.com/babashka/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/7/website"><img src="https://opencollective.com/babashka/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/8/website"><img src="https://opencollective.com/babashka/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/babashka/organization/9/website"><img src="https://opencollective.com/babashka/organization/9/avatar.svg"></a>
## License

View file

@ -2,20 +2,15 @@
version: "v-{build}"
image: Visual Studio 2022
image: Visual Studio 2017
clone_folder: C:\projects\babashka
environment:
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0
BABASHKA_XMX: "-J-Xmx5g"
skip_commits:
files:
- "logo/*"
- "**/*.md"
cache:
- C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml
- '%USERPROFILE%\.m2 -> project.clj'
@ -23,9 +18,6 @@ cache:
clone_script:
- cmd: git config --global core.autocrlf true
- cmd: git config --global core.symlinks true
- ps: >-
if(-not $env:APPVEYOR_PULL_REQUEST_NUMBER) {
git clone -q --branch=$env:APPVEYOR_REPO_BRANCH https://github.com/$env:APPVEYOR_REPO_NAME.git $env:APPVEYOR_BUILD_FOLDER
@ -39,12 +31,9 @@ clone_script:
}
- cmd: git submodule update --init --recursive
- cmd: git reset --hard
build_script:
# TODO: Extract the zip by removing the top level folder to remove the hardcoded path for GRAALVM_HOME
- cmd: >-
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24_windows-x64_bin.zip', 'graalvm.zip') }"
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-windows-amd64-22.1.0.zip', 'graalvm.zip') }"
powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }"
@ -61,7 +50,7 @@ build_script:
# see https://github.com/quarkusio/quarkus/pull/7663
- cmd: >-
set BABASHKA_SHA=%APPVEYOR_REPO_COMMIT%
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
call script/uberjar.bat
@ -75,15 +64,11 @@ build_script:
bb --config .build/bb.edn --deps-root . release-artifact %zip%
before_test:
- cmd: >-
set BABASHKA_CLASSPATH=
set BABASHKA_TEST_ENV=native
test_script:
- cmd: >-
call script/test.bat :windows
call script/test.bat
call script/run_lib_tests.bat

@ -1 +1 @@
Subproject commit e936acd40544eb637b6041c7e89454b21eb7ee34
Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178

@ -1 +1 @@
Subproject commit edd3d613bfb9bf3adabfd0bda5c3f5c6ee85ec20
Subproject commit 156ef6bfa59ba4a14ba6c69d1681fd7c2988a36d

@ -1 +1 @@
Subproject commit 976cf7b0e54901ada3f7e83f12a4c0aed039adc9
Subproject commit bac835661adbcd06b07ce2c408bb3e4911a48c28

View file

@ -16,43 +16,39 @@
"babashka.nrepl/src"
"depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources"
"resources" "sci/resources"
"impl-java/src"],
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
"resources" "sci/resources"],
:deps {org.clojure/clojure {:mvn/version "1.11.0"},
org.babashka/sci {:local/root "sci"}
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
org.babashka/babashka.impl.reify {:mvn/version "0.1.0"}
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
babashka/babashka.curl {:local/root "babashka.curl"}
babashka/fs {:local/root "fs"}
babashka/babashka.core {:local/root "babashka.core"}
org.clojure/core.async {:mvn/version "1.8.741"},
org.clojure/tools.cli {:mvn/version "1.0.214"},
borkdude/graal.locking {:mvn/version "0.0.2"},
org.clojure/core.async {:mvn/version "1.5.648"},
org.clojure/tools.cli {:mvn/version "1.0.206"},
org.clojure/data.csv {:mvn/version "1.0.0"},
cheshire/cheshire {:mvn/version "6.0.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
clj-commons/clj-yaml {:mvn/version "1.0.29"}
com.cognitect/transit-clj {:mvn/version "1.0.333"}
cheshire/cheshire {:mvn/version "5.10.2"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"}
clj-commons/clj-yaml {:mvn/version "0.7.108"}
com.cognitect/transit-clj {:mvn/version "1.0.329"}
org.clojure/test.check {:mvn/version "1.1.1"}
nrepl/bencode {:mvn/version "1.2.0"}
nrepl/bencode {:mvn/version "1.1.0"}
seancorfield/next.jdbc {:mvn/version "1.1.610"}
org.postgresql/postgresql {:mvn/version "42.2.18"}
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
datascript/datascript {:mvn/version "1.0.1"}
http-kit/http-kit {:mvn/version "2.8.0-RC1"}
http-kit/http-kit {:mvn/version "2.5.3"}
babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"}
org.clojure/core.match {:mvn/version "1.0.0"}
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
selmer/selmer {:mvn/version "1.12.59"}
com.taoensso/timbre {:mvn/version "6.6.0"}
hiccup/hiccup {:mvn/version "2.0.0-alpha2"}
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"}
selmer/selmer {:mvn/version "1.12.50"}
com.taoensso/timbre {:mvn/version "5.2.1"}
org.clojure/tools.logging {:mvn/version "1.1.0"}
org.clojure/data.priority-map {:mvn/version "1.1.0"}
insn/insn {:mvn/version "0.5.2"}
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}
org.babashka/cli {:mvn/version "0.8.65"}
org.babashka/http-client {:mvn/version "0.4.22"}
org.flatland/ordered {:mvn/version "1.15.12"}
org.jsoup/jsoup {:mvn/version "1.20.1"}}
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}}
:aliases {:babashka/dev
{:main-opts ["-m" "babashka.main"]}
:profile
@ -65,8 +61,8 @@
:lib-tests
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
#_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
lambdaisland/regal {:mvn/version "0.0.143"}
cprop/cprop {:mvn/version "0.1.16"}
comb/comb {:mvn/version "0.1.1"}
@ -108,22 +104,20 @@
exoscale/coax {:mvn/version "1.0.0-alpha14"}
orchestra/orchestra {:mvn/version "2021.01.01-1"}
expound/expound {:mvn/version "0.8.10"}
integrant/integrant {:git/url "https://github.com/weavejester/integrant", :git/sha "a9fd7c02bd7201f36344b47142badc3c3ef22f88"}
integrant/integrant {:mvn/version "0.8.0"}
com.stuartsierra/dependency {:mvn/version "1.0.0"}
listora/again {:mvn/version "1.0.0"}
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
environ/environ {:mvn/version "1.2.0"}
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32",
:git/url "https://github.com/clojure/tools.namespace"}
org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
medley/medley {:mvn/version "1.3.0"}
io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner",
:git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"}
io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"}
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
testdoc/testdoc {:mvn/version "1.4.1"}
org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}
org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"}
borkdude/rewrite-edn {:mvn/version "0.1.0"}
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
io.aviso/pretty {:mvn/version "1.1.1"}
@ -144,41 +138,7 @@
com.github.seancorfield/expectations {:mvn/version "2.0.157"}
com.rpl/specter {:mvn/version "1.1.4"}
com.github.askonomm/clarktown {:mvn/version "1.1.2"}
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}
prismatic/schema {:git/url "https://github.com/plumatic/schema"
:git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
:git/tag "schema-1.3.0"}
metosin/malli {:git/url "https://github.com/metosin/malli"
:git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99"
:git/tag "0.8.9"}
meander/epsilon {:git/url "https://github.com/noprompt/meander"
:git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"}
cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex"
:git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a"
:deps/manifest :deps}
exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor"
:git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e"
:deps/manifest :deps}
lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri"
:git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"
:deps/manifest :deps}
clj-commons/fs {:mvn/version "1.6.310"}
postmortem/postmortem {:git/url "https://github.com/athos/Postmortem"
:git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}
com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj"
:git/sha "4a92e772b4e07bf127423448d4140748b5782198"
:deps/manifest :deps}
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
:deps/manifest :deps}
prismatic/plumbing {:git/url "https://github.com/plumatic/plumbing",
:git/sha "424bc704f2db422de34269c139a5494314b3a43b"}
org.clj-commons/hickory {:git/url "https://github.com/clj-commons/hickory"
:git/sha "9385b6708ef35f161732d8464b3a3aa57dd79f30"}
com.potetm/fusebox {:git/url "https://github.com/potetm/fusebox"
:git/sha "ac6d6a0a69510b009b3c1bb2247cd110fd9f7246"}
net.sekao/odoyle-rules {:git/url "https://github.com/oakes/odoyle-rules"
:git/sha "0b1d825ec45a998c4d3481dfb292e08ce6a47f0b"}}
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}}
:classpath-overrides {org.clojure/clojure nil
org.clojure/spec.alpha nil}}
:clj-nvd
@ -188,11 +148,9 @@
:test
{:extra-paths ["test"]
:extra-deps {io.github.cognitect-labs/test-runner
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}
nubank/matcher-combinators {:mvn/version "3.6.0"}}
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
:main-opts ["-m" "cognitect.test-runner"]
:exec-fn cognitect.test-runner.api/test}
:test-pod
{:extra-paths ["test-resources"]
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
;; release

@ -1 +1 @@
Subproject commit 2bf9d3c9f15298d7dd9de033674a42f830e23d6f
Subproject commit c419b8c82041855d55593c5b561fc7cea8234712

View file

@ -3,24 +3,24 @@
## Prerequisites
- Install [lein](https://leiningen.org/) for producing uberjars
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *Oracle GraalVM 24*.
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.1.0*.
- For Windows, installing Visual Studio 2019 with the "Desktop development
with C++" workload is recommended.
- Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like:
``` shell
export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1/Contents/Home
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0/Contents/Home
```
On linux:
``` shell
export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0
```
On Windows, from the [Visual Studio 2019 x64 Native Tools Command Prompt](https://github.com/oracle/graal/issues/2116#issuecomment-590470806) or `cmd.exe` (not Powershell):
```
set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-jdk-21.0.0.1
set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.1.0
```
If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using:
```
@ -62,7 +62,7 @@ take long to complete.
### Alternative: Build inside Docker
To build a Linux version of babashka, you can use `docker build`, enabling the
To build a Linux version of babashka, you can use `docker build`, enabling the
desired features via `--build-arg` like this:
```shell
@ -113,8 +113,8 @@ Babashka supports the following feature flags:
| `BABASHKA_FEATURE_ORACLEDB` | Includes the [Oracle](https://www.oracle.com/database/technologies/appdev/jdbc.html) JDBC driver | `false` |
| `BABASHKA_FEATURE_DATASCRIPT` | Includes [datascript](https://github.com/tonsky/datascript) | `false` |
| `BABASHKA_FEATURE_LANTERNA` | Includes [clojure-lanterna](https://github.com/babashka/clojure-lanterna) | `false` |
| `BABASHKA_FEATURE_LOGGING` | Includes [clojure.tools.logging](https://github.com/clojure/tools.logging) with [taoensso.timbre](https://github.com/ptaoussanis/timbre) as the default implementation| `true` |
| `BABASHKA_FEATURE_PRIORITY_MAP` | Includes [clojure.data.priority-map](https://github.com/clojure/data.priority-map) | `true` |
| `BABASHKA_FEATURE_LOGGING` | Includes [clojure.tools.logging](https://github.com/clojure/tools.logging) with [taoensso.timbre](https://github.com/ptaoussanis/timbre) as the default implementation| `true` |
| `BABASHKA_FEATURE_PRIORITY_MAP` | Includes [clojure.data.priority-map](https://github.com/clojure/data.priority-map) | `true` |
Note that httpkit server is currently experimental, the feature flag could be toggled to `false` in a future release.

View file

@ -64,7 +64,6 @@ Sponsoring via [Cognitect](https://www.cognitect.com/).
- [Fluree](https://flur.ee/)
- [Hi](https://www.hi.group/)
- [Juxt](https://www.juxt.pro/)
- [Kleene](https://www.kleene.ai/)
- [Latacora](https://www.latacora.com/)
- [Metosin](https://www.metosin.fi/en/)
- [Nextdoc](https://www.nextdoc.io/)

View file

@ -22,9 +22,6 @@ agreement, the PR will be merged.
Each bug fix, change or new feature should be tested well to prevent future
regressions.
If possible, tests should use public APIs. If the bug is in private/internal
code, try to trigger it from a public API.
### Force-push
Please do not use `git push --force` on your PR branch for the following
@ -40,7 +37,7 @@ reasons:
## Requirements
You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use Oracle GraalVM 24.
You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.1.0.
## Clone repository
@ -84,14 +81,8 @@ Test the native version:
## Tests for Libraries
Babashka runs tests of libraries that are compatible with it through
`script/run_lib_tests`.
You can check out [this
commit](https://github.com/babashka/babashka/commit/8d9ac4c4d18a5588a4a258a61a9db3835b4f4e5c)
for how to add tests for a library that needs no changes to its tests.
The library is cloned as a git dependency, which also includes the tests, that are then added to the test's classpath and ran.
If a library's tests needs changes, we copy the tests using the `add-libtest.clj` script. Examples:
`script/run_lib_tests`. The script `add-libtest.clj` makes adding new libraries
fairly easy. Some examples:
```sh
# To add tests for a new library on clojars
@ -114,47 +105,6 @@ If the library you want to add doesn't work automatically, you can manually do t
Note: If you have to modify any test file or configuration to have it work with
bb, add an inline comment with prefix `BB-TEST-PATCH:` explaining what you did.
## Windows
We have corresponding `.bat` scripts for Windows, examples from a CMD Shell:
```shell
script\test.bat
script\run_lib_tests.bat
set BABASHKA_TEST_ENV=native
script\run_lib_tests.bat
```
### Enable Windows Symbolic Links
You'll need to **enable symbolic links**.
You must do this before you git clone babashka otherwise some tests will fail.
There seems to be many ways to achieve this; I found the following worked from PowerShell:
```shell
Install-Module -Name Carbon -Force
Import-Module Carbon
Grant-CPrivilege -Identity lee -Privilege SeCreateSymbolicLinkPrivilege
```
You'll need to reboot:
```shell
shutdown /r /t 0
```
After reboot, verify the new privilege via:
```shell
whoami /priv
```
Test if you can create a symbolic link via:
```
mklink foofoo barbar
```
> **TIP**: Symbolic links are not supported in some folder-sharing technologies.
For example, if you are running Windows as a VirtualBox guest, sharing babashka
source folders from your host OS will not share the symbolic links as symbolic links.
One solution is to re-clone babashka to a non-shared folder on Windows.
### Git for Windows
Install [Git for Windows](https://gitforwindows.org/).
It includes a version of `cat` that babashka tests currently rely on.
## Build
See [build.md](build.md).

View file

@ -1,5 +0,0 @@
FROM babashka/babashka:0.8.2
COPY example.clj /
ENTRYPOINT bb /example.clj

View file

@ -1,19 +0,0 @@
# Deploying a babashka app to fly.io
[Fly.io](https://fly.io/) is a service that can run full stack apps with minimal
configuration. If you like the ease of Heroku, you might like fly.io and perhaps
even better! This document shows how to get a minimal babashka application up
and running on `fly.io`.
In `example.clj` we start an http-kit web server which spits out some HTML. You
can run this locally by invoking `bb example.clj` from the command line.
To get this site running on `fly.io`, you need to
[install](https://fly.io/docs/getting-started/installing-flyctl/) and [log
in](https://fly.io/docs/getting-started/log-in-to-fly/).
Then run `flyctl launch` to create a new application. After making changes, you
can re-deploy the site with `flyctl deploy`.
That's it! See this
[tweet](https://twitter.com/borkdude/status/1526175120825401344) for a demo.

View file

@ -1,21 +0,0 @@
(ns example
(:require [hiccup2.core :refer [html]]
[org.httpkit.server :refer [run-server]]))
(def port (or (some-> (System/getenv "PORT")
parse-long)
8092))
(run-server
(fn [_]
{:body
(str (html
[:html
[:body
[:h1 "Hello world!"]
[:p (str "This site is running with babashka v"
(System/getProperty "babashka.version"))]]]))})
{:port port})
(println "Site running on port" port)
@(promise)

View file

@ -1,41 +0,0 @@
# fly.toml file generated for shy-sound-2847 on 2022-05-16T14:12:38+02:00
app = "shy-sound-2847"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []
[env]
PORT = "8092"
[experimental]
allowed_public_ports = []
auto_rollback = true
[[services]]
http_checks = []
internal_port = 8092
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"
[[services.ports]]
force_https = true
handlers = ["http"]
port = 80
[[services.ports]]
handlers = ["tls", "http"]
port = 443
[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

View file

@ -8,12 +8,9 @@ borkdude/deps,https://github.com/borkdude/deps.clj
borkdude/missing.test.assertions,https://github.com/borkdude/missing.test.assertions
borkdude/rewrite-edn,https://github.com/borkdude/rewrite-edn
camel-snake-kebab/camel-snake-kebab,https://github.com/clj-commons/camel-snake-kebab
cc.qbits/auspex,https://github.com/mpenet/auspex
cheshire/cheshire,https://github.com/dakrone/cheshire
circleci/bond,https://github.com/circleci/bond
cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git
clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml
clj-commons/fs,https://github.com/clj-commons/fs
clj-commons/multigrep,https://github.com/clj-commons/multigrep
clj-stacktrace/clj-stacktrace,https://github.com/mmcgrana/clj-stacktrace
clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv
@ -21,7 +18,6 @@ clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack
clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors
com.exoscale/lingo,https://github.com/exoscale/lingo
com.github.askonomm/clarktown,https://github.com/askonomm/clarktown
com.github.rawleyfowler/sluj,https://github.com/rawleyfowler/sluj
com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test
com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql
com.grammarly/omniconf,https://github.com/grammarly/omniconf
@ -40,7 +36,6 @@ douglass/clj-psql,https://github.com/DarinDouglass/clj-psql
edn-query-language/eql,https://github.com/edn-query-language/eql
environ/environ,https://github.com/weavejester/environ
exoscale/coax,https://github.com/exoscale/coax
exoscale/interceptor,https://github.com/exoscale/interceptor
expound/expound,https://github.com/bhb/expound
failjure/failjure,https://github.com/adambard/failjure
ffclj/ffclj,https://github.com/luissantos/ffclj
@ -62,13 +57,10 @@ java-http-clj/java-http-clj,http://www.github.com/schmee/java-http-clj
lambdaisland/regal,https://github.com/lambdaisland/regal
listora/again,https://github.com/liwp/again
markdown-clj/markdown-clj,https://github.com/yogthos/markdown-clj
meander/epsilon,https://github.com/noprompt/meander
medley/medley,https://github.com/weavejester/medley
meta-merge/meta-merge,https://github.com/weavejester/meta-merge
metosin/malli,https://github.com/metosin/malli
minimallist/minimallist,https://github.com/green-coder/minimallist
mvxcvi/arrangement,https://github.com/greglook/clj-arrangement
net.cgrand/xforms,https://github.com/cgrand/xforms
orchestra/orchestra,https://github.com/jeaye/orchestra
org.babashka/spec.alpha,https://github.com/babashka/spec.alpha
org.clj-commons/clj-http-lite,https://github.com/clj-commons/clj-http-lite
@ -85,9 +77,7 @@ org.clojure/math.combinatorics,https://github.com/clojure/math.combinatorics
org.clojure/math.numeric-tower,https://github.com/clojure/math.numeric-tower
org.clojure/test.check,https://github.com/clojure/test.check
org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs
org.clojure/tools.namespace,https://github.com/clojure/tools.namespace
postmortem/postmortem,https://github.com/athos/Postmortem
prismatic/schema,https://github.com/plumatic/schema
org.clojure/tools.namespace,https://github.com/babashka/tools.namespace
progrock/progrock,https://github.com/weavejester/progrock
reifyhealth/specmonstah,https://github.com/reifyhealth/specmonstah
rewrite-clj/rewrite-clj,https://github.com/clj-commons/rewrite-clj

1 maven-name git-url
8 borkdude/missing.test.assertions https://github.com/borkdude/missing.test.assertions
9 borkdude/rewrite-edn https://github.com/borkdude/rewrite-edn
10 camel-snake-kebab/camel-snake-kebab https://github.com/clj-commons/camel-snake-kebab
cc.qbits/auspex https://github.com/mpenet/auspex
cheshire/cheshire https://github.com/dakrone/cheshire
11 circleci/bond https://github.com/circleci/bond
12 cli-matic/cli-matic https://github.com/l3nz/cli-matic.git
13 clj-commons/clj-yaml https://github.com/clj-commons/clj-yaml
clj-commons/fs https://github.com/clj-commons/fs
14 clj-commons/multigrep https://github.com/clj-commons/multigrep
15 clj-stacktrace/clj-stacktrace https://github.com/mmcgrana/clj-stacktrace
16 clojure-csv/clojure-csv https://github.com/davidsantiago/clojure-csv
18 clojure-term-colors/clojure-term-colors https://github.com/trhura/clojure-term-colors
19 com.exoscale/lingo https://github.com/exoscale/lingo
20 com.github.askonomm/clarktown https://github.com/askonomm/clarktown
com.github.rawleyfowler/sluj https://github.com/rawleyfowler/sluj
21 com.github.seancorfield/expectations https://github.com/clojure-expectations/clojure-test
22 com.github.seancorfield/honeysql https://github.com/seancorfield/honeysql
23 com.grammarly/omniconf https://github.com/grammarly/omniconf
36 edn-query-language/eql https://github.com/edn-query-language/eql
37 environ/environ https://github.com/weavejester/environ
38 exoscale/coax https://github.com/exoscale/coax
exoscale/interceptor https://github.com/exoscale/interceptor
39 expound/expound https://github.com/bhb/expound
40 failjure/failjure https://github.com/adambard/failjure
41 ffclj/ffclj https://github.com/luissantos/ffclj
57 lambdaisland/regal https://github.com/lambdaisland/regal
58 listora/again https://github.com/liwp/again
59 markdown-clj/markdown-clj https://github.com/yogthos/markdown-clj
meander/epsilon https://github.com/noprompt/meander
60 medley/medley https://github.com/weavejester/medley
61 meta-merge/meta-merge https://github.com/weavejester/meta-merge
metosin/malli https://github.com/metosin/malli
62 minimallist/minimallist https://github.com/green-coder/minimallist
63 mvxcvi/arrangement https://github.com/greglook/clj-arrangement
net.cgrand/xforms https://github.com/cgrand/xforms
64 orchestra/orchestra https://github.com/jeaye/orchestra
65 org.babashka/spec.alpha https://github.com/babashka/spec.alpha
66 org.clj-commons/clj-http-lite https://github.com/clj-commons/clj-http-lite
77 org.clojure/math.numeric-tower https://github.com/clojure/math.numeric-tower
78 org.clojure/test.check https://github.com/clojure/test.check
79 org.clojure/tools.gitlibs https://github.com/clojure/tools.gitlibs
80 org.clojure/tools.namespace https://github.com/clojure/tools.namespace https://github.com/babashka/tools.namespace
postmortem/postmortem https://github.com/athos/Postmortem
prismatic/schema https://github.com/plumatic/schema
81 progrock/progrock https://github.com/weavejester/progrock
82 reifyhealth/specmonstah https://github.com/reifyhealth/specmonstah
83 rewrite-clj/rewrite-clj https://github.com/clj-commons/rewrite-clj

View file

@ -5,314 +5,13 @@ you have anything to add. Also see
[#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on
Twitter.
## 2023-05 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-05-01%20until%3A2023-06-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
<!--
### Releases
## 2022-03
1.3.178
Mostly a boring maintenance release with lib upgrades!
### Events
- [Babashka-conf](https://babashka.org/conf/) is happening June 10th in
Berlin. Only a few tickets left! See the [schedule](https://babashka.org/conf/schedule.html). Also you can buy a [conf t-shirt](https://www.etsy.com/listing/1475981599/babashka-conf-berlin-2023-t-shirt) now! See Nikita wearing it [here](https://twitter.com/nikitonsky/status/1658066530800742400)!
Thanks to conference sponsors:
<img src="https://pbs.twimg.com/media/Fw5h-0_XwA4DTIj?format=jpg&name=medium" width="200px">
- Babashka is going to the [Strange Loop](https://www.thestrangeloop.com/) conference!
### Projects
- [beep-boop](https://github.com/pesterhazy/beep-boop): Audible and visual feedback for test runs
- [panas.example](https://github.com/keychera/panas.example): All htmx examples ported to babashka!
- [utility-scripts](https://github.com/somecho/utility-scripts): A collection of helper scripts for Clojure, Java, Ledger and Taskwarrior. Written in Clojure
- [bb-scripts](https://github.com/techconative/bb-scripts): Babashka scripts for common utilities
- [Launching bb tasks from emacs](https://mastodon.social/@mykhaylo@fosstodon.org/110456087708592838)
### Articles
- [Clojure in security: Docker](https://www.juxt.pro/blog/clojure-in-docker/): mentions babashka and clj-kondo
- [Changing my mind: Converting a script from bash to Babashka](https://blog.agical.se/en/posts/changing-my-mind--converting-a-script-from-bash-to-babashka/)
- [How to create a really simple ClojureCLR dependency tool](https://blog.agical.se/en/posts/how-to-create-a-really-simple-clojureclr-dependency-tool/) with babashka
- [Making a resume with Node.js babashka (nbb)](https://yogthos.net/posts/2023-05-12-nbb-resume.html)
## 2023-04 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-04-01%20until%3A2023-05-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
[Babashka-conf](https://babashka.org/conf/) is happening June 10th in
Berlin. Save the date and/or submit your babashka/clojure-related talk or workshop
in the CfP!
### Releases
1.3.177
Biggest highlight: `bb.edn` is now respected relative of a script, no matter the directory you invoke it from! See [docs](https://book.babashka.org/#_script_adjacent_bb_edn).
### Projects
- [babashka-dl](https://github.com/mjhika/babashka-dl): simple install script for babashka on windows
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Use instaparse from babashka, a new release
### Videos
- [Learning clojure w/ @lispyclouds](https://youtu.be/uBTRLBU-83A): a stream with teej_dv, a neovim core dev
## 2023-03 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-03-01%20until%3A2023-04-01&src=typed_query&f=top), [Mastodon](https://mastodon.social/tags/babashka))
### Releases
1.3.176, 1.3.175, 1.2.174:
Biggest highlight: Switch to GraalVM 19 and enable virtual threads!
### Videos
- [Blambda! The sound of babashka and AWS colliding](https://pitch.com/public/03fa9c7e-2b0e-45fb-8a22-d4a4d4d79d24), by Josh Glover from Pitch!
### Projects
- [babashka.json](https://github.com/babashka/json): JSON abstraction library
- [martian](https://github.com/oliyh/martian) is now babashka compatible!
- [panas.reload](https://github.com/keychera/panas.reload): a hot reload for babashka serving html+css (or htmx)
- [cljs-exif-reader](https://git.sr.ht/~rwv/cljs-exif-reader): Extract information from TIFF and JPEG images (works in babashka, despite the name)
### Jobs
- Write babashka at [Cognician](https://twitter.com/RobStuttaford/status/1641694501793038336)!
## 2023-02 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-02-01%20until%3A2023-03-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
## Releases
1.1.173: mostly bugfixes
### Articles
- [A technique for live coding simple web pages](https://github.com/whacked/cow/blob/main/a%20technique%20for%20live%20coding%20simple%20web%20pages.md) with babashka
### Videos
- [Stockholm Clojure Meetup Feb 23: Blambda! The sound of Babashka and Lambda colliding](https://www.youtube.com/watch?v=NfgYon96dsE)
### Projects
- [debux](https://github.com/philoskim/debux) is now babaskha-compatible
- [lines-of-code-bb](https://github.com/matthewdowney/linesofcode-bb): Babashka script to count lines of Clojure code, docs, comments, and more
- [deps-try](https://github.com/eval/deps-try): a babashka-script to try out Clojure libraries in rebel-readline
- [bb-dialog](https://github.com/pixelated-noise/bb-dialog) adds support for `--treeview`
- [A duckduck go CLI with babashka and (bbl)gum](https://mastodon.me.uk/@choffee/109845697304457129)
- [babashka http-client](https://github.com/babashka/http-client) now supports multipart uploads
- [sublime-pretty-edn](https://github.com/oakmac/sublime-pretty-edn): Format, Validate, Minify EDN files in Sublime Text
- [Play console tetris in babashka!](https://twitter.com/borkdude/status/1628473136969576449)
- [kaocha test runner](https://github.com/lambdaisland/kaocha) became babashka compatible!
## 2023-01 ([Twitter](https://twitter.com/search?q=%28%23babashka%20OR%20babashka%29%20until%3A2023-02-01%20since%3A2023-01-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
### Releases
New releases in the past month: 1.0.170 - 1.1.173
Release highlights:
- Support for `data_readers.clj(c)`
- Include [http-client](https://github.com/babashka/http-client) as built-in library
- Compatibility with [clojure.tools.namespace.repl/refresh](https://github.com/clojure/tools.namespace)
- Compatibility with [clojure.java.classpath](https://github.com/clojure/java.classpath) (and other libraries which rely on `java.class.path` and `RT/baseLoader`)
- Compatibility with [eftest](https://github.com/weavejester/eftest) test runner (see demo)
- Compatibility with [cljfmt](https://github.com/weavejester/cljfmt)
- Support for `*loaded-libs*` and `(loaded-libs)`
- Support `add-watch` on vars (which adds compatibility with `potemkin.namespaces`)
- BREAKING: make printing of script results explicit with `--prn`
### Events
- [Babashka Workshop](https://clojure.stream/workshops/babashka) at ClojureStream with Rahul De
- [Blambda! The sound of Babashka and Lambda colliding](https://www.meetup.com/sthlm-clj/events/291204199/?utm_medium=referral&utm_campaign=share-btn_savedevents_share_modal&utm_source=twitter): sthlm.clj (Stockholm, Sweden)
### Articles
- [Babooka: write command line Clojure](https://www.braveclojure.com/quests/babooka/) by Daniel Higginbotham
- [Blambda analyses sites](https://jmglov.net/blog/2023-01-04-blambda-analyses-sites.html) by Josh Glover
- [Babashka: How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://logico-jp.io/2023/01/07/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure/) in Japanese
- [The wizard of HOP - How we built the web based HOP CLI Settings Editor using Babashka and Scittle](https://www.gethop.dev/post/the-wizard-of-hop-how-we-built-the-web-based-hop-cli-settings-editor-using-babashka-and-scittle) by Bingen Galartza
- [Simple TUIs with Babashka and Gum](https://rattlin.blog/bbgum.html) by Rattlin.blog
- [Babashka And Dialog Part Ii: Announcing The Bb-Dialog Library](https://www.pixelated-noise.com/blog/2023/01/20/bb-dialog-announcement/index.html) by A.C. Danvers
- [Re-Writing a GlobalProtect OpenConnect VPN Connect script in Babashka](https://tech.toryanderson.com/2023/01/14/re-writing-a-globalprotect-openconnect-vpn-connect-script-in-babashka/) by Tory Anderson
### Projects
Projects that were new, had updates or were made compatible with babashka:
- [asdf-babashka](https://github.com/pitch-io/asdf-babashka): babashka plugin for the asdf version manager
- [babashka-htmx-todoapp](https://github.com/prestancedesign/babashka-htmx-todoapp): Quick example of a todo list SPA using Babashka and HTMX
- [bblgum](https://github.com/lispyclouds/bblgum): An extremely tiny and simple wrapper around charmbracelet/gum
- [bb-dialog](https://github.com/pixelated-noise/bb-dialog): A simple wrapper library for working with dialog from Babashka
- [carve](https://github.com/borkdude/carve): Remove unused Clojure vars
- [chr](https://github.com/ThaddeusJiang/chr): native commands history report for the default terminal users
- [clj-kondo-bb](https://github.com/clj-kondo/clj-kondo-bb): Invoke clj-kondo from babashka scripts!
- [cljfmt](https://github.com/weavejester/cljfmt): A tool for formatting Clojure code
- [drepl](https://github.com/claytn/drepl): Node JS dependency-repl. The node repl you already know with easy library installations
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Wrapper library aroud pod-babashka-instaparse
- [lein2deps](https://github.com/borkdude/lein2deps): Lein project.clj to deps.edn converter
- [neil](https://github.com/babashka/neil): A CLI to add common aliases and features to deps.edn-based projects
- [obsidian-babashka](https://github.com/filipesilva/obsidian-babashka): Run Obsidian Clojure(Script) codeblocks in Babashka
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure)
- [quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka
- [solenoid](https://github.com/adam-james-v/solenoid): A small clojure tool for making little control UIs while using the REPL!
- [tools.bbuild](https://github.com/babashka/tools.bbuild): babashka version of tools.build
- [weather](https://gist.github.com/yogthos/f86e63b856e1413180b2262024ece977): command line util for grabbing current weather for a city using OpenWeather API
## [2022-12](https://twitter.com/search?q=%28%23babashka%20OR%20babashka%29%20until%3A2023-01-01%20since%3A2022-12-01&src=typed_query&f=live)
- Releases: [1.0.168](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746)
- [http-client](https://github.com/babashka/http-client): a new HTTP client library for babashka
- [How to Do Things With Babashka](https://presumably.de/how-to-do-things-with-babashka.html) by Paulus Esterhazy (2022-12)
- [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices) by Kari Marttila
- [Adding prompts to your babashka scripts with dialog](https://www.pixelated-noise.com/blog/2022/12/09/dialog-and-babashka/index.html) by A.C. Danvers
- [Scraping an HTML dictionary with Babashka and Bootleg](https://blog.exupero.org/scraping-an-html-dictionary-with-babashka-and-bootleg/) by exupero
- [quickblog](https://github.com/borkdude/quickblog) v0.1.0: Light-weight static blog engine for Clojure and babashka
- [bb-excel](https://github.com/kbosompem/bb-excel): Read Excel Files in babashka scripts
- [Get paginated list of issues from gitlab with clojure/babashka](https://gist.github.com/MrGung/29d0547fe45316c3438032fd164d42c6) by Steffen Glückselig
- Install development builds: `bash <(curl https://raw.githubusercontent.com/babashka/babashka/master/install) --dev-build --dir /tmp`
- [JVM interop improvements in bb](https://twitter.com/borkdude/status/1606280110692352001)
- [A little trick to have conditional code for babashka in a .clj file without resorting to .cljc reader conditionals](https://twitter.com/borkdude/status/1599067149187764224)
- [Get Advent of Code input in babashka](https://gist.github.com/jeeger/6e39fea94ce49e33d1fa43f40cc36630) by Jan Seeger
- [Grabbing current weather for a city using OpenWeather API](https://gist.github.com/yogthos/f86e63b856e1413180b2262024ece977) by Dmitri Sotnikov
## [2022-11](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-12-01%20since%3A2022-11-01&src=typed_query&f=live)
- Releases: [1.0.165 - 1.0.167](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- Registration for a [Babashka workshop](https://clojure.stream/workshops/babashka) with Rahul De at ClojureStream is now open!
- [Tutkain, a Sublime plugin for clojure based on socket REPL now with support for babashka](https://github.com/eerohele/Tutkain)
- [Manage git hooks in babashka](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy
- [Messing around with babashka](Messing around with Babashka) by Ian Muge
- [A babashka one liner to inspect data in portal](https://twitter.com/borkdude/status/1597505695800516609)
- [Using nREPL as a system interface](https://yogthos.net/posts/2022-11-26-nREPL-system-interaction.html) by Dmitri Sotnikov
- [deep-diff2](https://github.com/lambdaisland/deep-diff2) is now babashka-compatible!
- [A script to normalize auto-resolved keywords](https://github.com/babashka/babashka/blob/master/examples/normalize-keywords.clj)
- [Sum up page counts of books from Calibre library with babashka](https://gist.github.com/jeeger/d13159fefaee33c771be979639900ebc) by Jan Seeger
- [Tiny babashka script that returns a random clojure doc](https://gist.github.com/CarnunMP/c592cd3b6e711d56ddd4ca7832b9b251) by Carnun Marcus-Page
## [2022-10](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-11-01%20since%3A2022-10-01&src=typed_query&f=live)
- Releases: [1.0.164](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [bb-pod-racer](https://github.com/justone/bb-pod-racer): Speed up development of Babashka pods by Nate Jones
- [Babashka tasks VSCode plugin](https://marketplace.visualstudio.com/items?itemName=fbeyer.babashka-tasks) by Ferdinand Beyer
- A [PR](https://github.com/nextjournal/clerk/pull/232) to get Clerk working in babashka
- [lein2deps](https://github.com/borkdude/lein2deps): lein to deps.edn converter
- [awyeah-api](https://github.com/grzm/awyeah-api) by Michael Glaesemann v0.8.41 is now available! aws-api for Babashka. Aw yeah!
- [bbssh](https://github.com/epiccastle/bbssh/releases/tag/v0.2.0) by Crispin Wellington, v0.2.0 released
- [safely use rsync --archive --delete to backup a directory](https://gist.github.com/stelcodes/ddc8ff53de2192dca7d3fee1081ddb77) by Stel Abrego
## [2022-09](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-10-01%20since%3A2022-09-01&src=typed_query&f=live)
- Releases: [0.9.162 - 0.10.163](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- Introducing [bbin](https://radsmith.com/bbin): a tool to install babashka scripts on your system by Radford Smith
- [bbssh](https://github.com/epiccastle/bbssh): Babashka pod for SSH support by [Epic Castle](https://github.com/epiccastle)
- [Loom virtual threads are coming to babashka](https://twitter.com/borkdude/status/1572222344684531717)
- [Tiny script to cycle through pulseaudio outputs (aka sinks)](https://gist.github.com/stelcodes/7d9136a5839b645b6cd5bc829a9fe541) by Stel Abrego
- [Tetris in the console via pod-babashka-lantera](https://twitter.com/borkdude/status/1569351199404576770)
- [org-mode gets support for babashka](https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=764642f55b7a9821acbabcfa1e2d354afab99be7)
- [docs for combining babashka process with promesa](https://github.com/babashka/process#promesa)
[exoscale/interceptor](https://github.com/exoscale/interceptor) became babashka-compatible!
- [Tutkain, socket REPL Sublime plugin, gets better support for babashka](https://twitter.com/borkdude/status/1568315151404924933)
- [babashka tweepy](https://github.com/davclark/babashka-tweepy): kicking the tires on using the tweepy library from a babashka task by Dav Clark
- [aoc helper](https://github.com/jjcomer/aoc-helper) by Josh Comer
- [Dogfooding blambda part 5](https://jmglov.net/blog/2022-09-02-dogfooding-blambda-logs.html) by Josh Glover
## [2022-08](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-09-01%20since%3A2022-08-01&src=typed_query&f=live)
- It's babashka's third birthday on August 9th 2022!
- [etaoin](https://github.com/clj-commons/etaoin), Pure Clojure Webdriver protocol implementation, is now babashka-compatible!
- [xforms](https://github.com/cgrand/xforms) is now babashka-compatible!
- [squint](https://github.com/squint-cljs/squint) and [cherry](https://github.com/squint-cljs/cherry) are CLJS-compilers that work with babashka!
## [2022-07](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live)
- Releases: [0.8.157 - 0.9.161](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund
- [Babashka toolbox](https://babashka.org/toolbox/): A categorised directory of libraries and tools for Babashka
- [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka
- Win a babashka t-shirt by participating in [this](https://twitter.com/borkdude/status/1547847843381030912) contest!
- [AWS Lambda, now with first class parentheses](https://www.juxt.pro/blog/nbb-lambda) by Ray McDermott (about nbb)
- [bb-github-app](https://github.com/brandonstubbs/bb-github-app): An example Babashka Script authenticating as a Github App and interacting with the Checks API
- [Ruuter](https://github.com/askonomm/ruuter#setting-up-with-babashka) is a routing library which works very well with bb
- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover
- Files with the `.bb` extension are now correctly highlighted as Clojure code on Github! See [this](https://twitter.com/borkdude/status/1543937735429431298) tweet.
- Encode and decode files as kroki url diagrams, a [gist](https://gist.github.com/henryw374/070845dbd8cfb4672a3c0d06cf8b00e4) by Henry Widd
- Customized bb builds with clj-nix: [tweet](https://twitter.com/jlesquembre/status/1543686641461694470)
- Expose Clojure functions in the CLI with babashka and nix: [tweet](https://twitter.com/jlesquembre/status/1546777332471455745)
- [Meander](https://github.com/noprompt/meander) is now compatible with bb: [tweet](https://twitter.com/borkdude/status/1542881167338250242)
- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller
## [2022-06](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live)
- Releases: [0.8.156](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [AWS wiki page](https://github.com/babashka/babashka/wiki/AWS)
- [blambda](https://github.com/jmglov/blambda): Blambda! is a custom runtime for AWS Lambda that lets you write functions using Babashka
- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs!
- [Http-server](https://github.com/babashka/http-server#babashka): Serve static assets
- [Deps-bundler](https://github.com/MrGung/deps-bundler): Bundle dependencies on
a computer that has access to maven and clojars (PC-A) and bring these over to
a computer with limited access (PC-L).
- [Prismatic/schema](https://github.com/plumatic/schema/blob/master/CHANGELOG.md#130-2022-06-10) and babashka are now compatible
- [Logseq bb tasks](https://github.com/logseq/bb-tasks): Reusable babashka tasks used by logseq team
- [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman
## [2022-05](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-06-01%20since%3A2022-05-01&src=typed_query&f=live)
- Releases: [0.8.2](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well.
- [Nix docs for babashka](https://github.com/babashka/babashka/blob/master/doc/nix.md)
- [Fly.io docs for babashka](https://github.com/babashka/babashka/tree/master/doc/fly_io)
- [Babashka survey results](https://blog.michielborkent.nl/babashka-survey-q1-2022.html)
- [Quickdoc](https://github.com/borkdude/quickdoc): (Quick and minimal API doc generation for Clojure
- [Awyeah-api](https://github.com/grzm/awyeah-api) - Cognitect's aws-api for babashka
## [2022-04](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live)
- Releases: [0.8.0 - 0.8.1](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group
- [Setup-Clojure](https://github.com/DeLaGuardo/setup-clojure/releases/tag/5.0) Github action is now able to install babashka!
- Control Chrome via devtools using [clj-chrome-devtools](https://github.com/tatut/clj-chrome-devtools/blob/master/bb.clj) which runs with bb!
- Use pods directly in `bb.edn`: [tweet](https://twitter.com/borkdude/status/1510995356229767172)
## [2022-03](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-04-01%20since%3A2022-03-01&src=typed_query&f=live)
- Releases: [0.7.7 - 0.7.8](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg
- [Clj-konmari](https://github.com/oxalorg/clj-konmari/) by Oxalorg
- [Logseq-query](https://github.com/cldwalker/logseq-query) by Gabriel Horner [(announcement tweet with video)](https://twitter.com/cldwalker/status/1506991213030871041)
- The [loom](https://github.com/aysylu/loom) library is now compatible [(tweet)](https://twitter.com/borkdude/status/1502237220811550723)
- The [at-at](https://github.com/overtone/at-at) library is now compatible
## [2022-02](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-03-01%20since%3A2022-02-01&src=typed_query&f=live)
- Releases: [0.7.5 - 0.7.6](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Spire is available as a babashka pod](https://twitter.com/epic_castle/status/1496784352256008194)
- Babashka Clojure template on [Repl.it](https://replit.com/@eccentric-j/Babashka-Clojure-Template?v=1#replit.nix) by Eccentric J
- Create a self-contained executable with [caxa](https://github.com/babashka/babashka/wiki/Self-contained-executable)
- Cli-matic is now compatible due to this [PR](https://github.com/l3nz/cli-matic/pull/145)
- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou
- [Staplegun](https://github.com/escherize/staplegun): Single file clipboard-manager
- [Bbb](https://github.com/nikvdp/bbb): make executable CLI tools from bb scripts
- [Apptemplate](https://github.com/redstarssystems/apptemplate): Application project template for Clojure featuring bb tasks
## [2022-01](https://twitter.com/search?f=live&q=%28%23babashka%29%20until%3A2022-02-01%20since%3A2022-01-01&src=typed_query)
- Releases: [0.7.4](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
- [Babashka dev builds](https://github.com/babashka/babashka-dev-builds)
- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks/) by Cyprien Pannier
- [HTMX Todo App](https://github.com/prestancedesign/babashka-htmx-todoapp)
- [Better linting for `bb.edn`](https://twitter.com/borkdude/status/1484100071134220291)
- [Unwordle](https://github.com/mknoszlig/unwordle): solver for wordle puzzles
- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent
-->
## 2021-12
@ -375,7 +74,7 @@ Projects that were new, had updates or were made compatible with babashka:
- [Cursive](https://twitter.com/CursiveIDE/status/1439022267187433472) adds support for babashka in 1.11.0
- How to filter tail output with babashka on [StackOverflow](https://stackoverflow.com/questions/69241046/how-to-filter-output-of-tail-with-babashka/69241911?stw=2#69241911)
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holy
- [Neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects.
- [neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects.
## 2021-08

View file

@ -1,87 +0,0 @@
# Using Babashka with Nix
Babashka is [packaged](https://search.nixos.org/packages?type=packages&query=babashka) in nixpkgs and can be easily used from the Nix package manager.
The following assumes a recent installation of nix and uses the unstable [nix cli](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html) and [Flakes](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html).
To enable the unstable cli and flakes add the following to `/etc/nix/nix.conf`:
```
extra-experimental-features flakes nix-command
```
## Imperative install on Nix
To imperatively install nix for the current user, run `nix profile install babashka`.
## Declarative global install on NixOS
To install babashka for all users on a NixOS system, place it in `environment.systemPackages` in your `configuration.nix`:
```nix
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
babashka
];
}
```
Then run `nixos-rebuild switch`, to activate the new configuration.
## Declarative per-user install with home-manager
You can install babashka for a specific user using [home-manager](https://github.com/nix-community/home-manager). Add the following to your `~/.config/nixpkgs/home.nix`:
```nix
{ pkgs, ... }:
{
home.packages = with pkgs; [
babashka
];
}
```
Then run `home-manager switch`, to activate the new configuration.
## Per project install with direnv
To make babashka available on a per-project basis, you can use [direnv](https://direnv.net/).
Create a file `.envrc` in the project directory with the following contents:
```
use flake
```
Create a file `flake.nix` in the project directory with the following contents:
```nix
{
outputs = {nixpkgs, ...}: let
supportedSystems = ["x86_64-linux" "x86_64-darwin"];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
nixpkgsFor = system: import nixpkgs {inherit system;};
in {
devShell = forAllSystems (system: let
pkgs = nixpkgsFor system;
in
pkgs.mkShell {
packages = with pkgs; [
babashka
];
});
};
}
```
After running `direnv allow`, babashka should be available on the `$PATH`, when you are inside the project directory.
## Write Babashka Application
You can write babashka scripts with native dependencies using [WriteBabashkaApplication](https://github.com/sohalt/write-babashka-application).
The WriteBabashkaApplication repository has an [example](https://github.com/Sohalt/write-babashka-application/tree/main/example) `flake.nix` using `cowsay` as an external dependency.
You can download that example, and then build the application using `nix build` or run it using `nix run`.

View file

@ -7,6 +7,7 @@ The following libraries and projects are known to work with babashka.
- [tools.namespace](#toolsnamespace)
- [test-runner](#test-runner)
- [spec.alpha](#specalpha)
- [tools.bbuild](#toolsbbuild)
- [clj-http-lite](#clj-http-lite)
- [spartan.spec](#spartanspec)
- [missing.test.assertions](#missingtestassertions)
@ -61,12 +62,6 @@ The following libraries and projects are known to work with babashka.
- [datalog-parser](#datalog-parser)
- [at-at](#at-at)
- [aysylu/loom](#aysyluloom)
- [Clarktown](#clarktown)
- [Malli](#malli)
- [Meander](#meander)
- [Schema](#schema)
- [Sluj](#sluj)
- [malli-cli](#malli-cli)
- [Pods](#pods)
- [Projects](#projects-1)
- [babashka-test-action](#babashka-test-action)
@ -93,7 +88,6 @@ The following libraries and projects are known to work with babashka.
- [Babashka + scittle guestbook](#babashka--scittle-guestbook)
- [bb htmx todo app](#bb-htmx-todo-app)
- [bb aws lambda runtime](#bb-aws-lambda-runtime)
- [bb-github-app](#bb-github-app)
Also keep an eye on the [news](news.md) page for new projects, gists and other
developments around babashka.
@ -120,9 +114,9 @@ A fork of `clojure.spec.alpha` that includes support for generation and
instrumentation! Its readme also contains instructions on how to use
`clojure.core.specs.alpha`.
<!-- ### [tools.bbuild](https://github.com/babashka/tools.bbuild) -->
### [tools.bbuild](https://github.com/babashka/tools.bbuild)
<!-- A fork of `tools.build`. -->
A fork of `tools.build`.
### [clj-http-lite](https://github.com/clj-commons/clj-http-lite)
@ -769,7 +763,7 @@ Example:
(require '[babashka.deps :as deps])
(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}}})
(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.2"}}})
(require '[contajners.core :as c])
@ -818,26 +812,6 @@ Graph library for Clojure. Compatible with babashka 0.7.8+.
An extensible and modular zero-dependency, pure-Clojure Markdown parser.
### [Malli](https://github.com/metosin/malli#babashka)
Data-Driven Schemas for Clojure/Script
### [Meander](https://github.com/noprompt/meander)
Tools for transparent data transformation
### [Schema](https://github.com/plumatic/schema)
Clojure(Script) library for declarative data description and validation
### [Sluj](https://github.com/rawleyfowler/sluj)
Sluj is a very small library for converting strings of UTF-16 text to slugs. A slug is a piece of text that is URL safe.
### [malli-cli](https://github.com/piotr-yuxuan/malli-cli)
Configuration and CLI powertool with `metosin/malli`.
## Pods
[Babashka pods](https://github.com/babashka/babashka.pods) are programs that can
@ -965,8 +939,3 @@ Quick example of a todo list SPA using Babashka and htmx.
### [bb aws lambda runtime](https://github.com/tatut/bb-lambda)
AWS Lambda custom runtime for Babashka scripts.
### [bb-github-app](https://github.com/brandonstubbs/bb-github-app)
An example Babashka script that can authenticate as a Github Application,
this example focuses on the checks api.

View file

@ -38,8 +38,6 @@
- [Simple logger](#simple-logger)
- [Using GZip streams (memo utility)](#using-gzip-streams-to-make-a-note-utility)
- [Pretty-printing mySQL results](#pretty-printing-mysql-results)
- [Single page application with Babashka + htmx](#single-page-application-with-babashka--htmx)
- [Wikipedia translation](#wikipedia-translation)
Here's a gallery of useful examples. Do you have a useful example? PR welcome!
@ -392,7 +390,7 @@ Example usage:
$ examples/http-server.clj
```
See [http-server.clj](http-server.clj).
See [file-server.clj](file-server.clj).
## Torrent viewer
@ -557,14 +555,3 @@ Example of a todo list SPA using Babashka and htmx
See [htmx_todoapp.clj](htmx_todoapp.clj)
Contributed by [@prestancedesign](https://github.com/prestancedesign).
## Wikipedia translation
[wiki-translate.clj](wiki-translate.clj) uses Wikipedia to translate words from English to Dutch (other languages are available).
``` shell
$ bb wiki-translate.clj window
"Venster (muur) Dutch"
```
Shared by Janne Himanka on Clojurians Slack

View file

@ -1,18 +1,18 @@
(ns normalize-keywords
(:require [babashka.pods :as pods]
[clojure.java.io :as io]
[rewrite-clj.node :as node]
[rewrite-clj.zip :as z]))
(pods/load-pod 'clj-kondo/clj-kondo "2022.11.02")
(pods/load-pod 'borkdude/clj-kondo "2021.06.18")
(require '[pod.borkdude.clj-kondo :as clj-kondo])
(def code (first *command-line-args*))
(defn findings [file-path]
(->> (clj-kondo/run! {:lint [file-path]
:config {:output {:analysis {:keywords true}}}})
(def findings
(->> (with-in-str code
(clj-kondo/run! {:lint [code]
:config {:output {:analysis {:keywords true}}}}))
:analysis
:keywords
(filter (some-fn :alias :auto-resolved))))
@ -33,11 +33,6 @@
zloc (z/replace zloc (node/coerce k))]
(recur zloc (next findings)))
(recur (z/next zloc) findings)))
(str (z/root zloc)))))
(println (str (z/root zloc))))))
(doseq [f (file-seq (io/file code))
:when (re-find #"\.clj[cdsx]?$" (str f))
:let [file-path (str f)]]
(when-let [findings' (findings file-path)]
(prn (format "Rewriting %s" file-path))
(spit f (remove-locs (z/of-file file-path) findings'))))
(remove-locs (z/of-file code) findings)

View file

@ -1,11 +0,0 @@
#!/usr/bin/env bb
;; by Janne Himanka shared on Clojurians Slack
(require '[babashka.curl :as curl])
(let [url (str "https://en.wikipedia.org/wiki/" (first *command-line-args*))
page (:body (curl/get url))]
(cond
(re-find #"Disambiguation" page)
(doseq [item (map last (re-seq #"<li><a href...wiki/([^\"]+)" page))]
(println item))
:else (last (re-find #"nl.wikipedia.org/.+?title..([^\"]+)" page))))

View file

@ -2,10 +2,11 @@
{:no-doc true}
(:require [datascript.core :as d]
[datascript.db :as db]
[sci.core :as sci :refer [copy-var]]))
[sci.impl.namespaces :refer [copy-var]]
[sci.impl.vars :as vars]))
(def datascript-ns (sci/create-ns 'datascript.core nil))
(def datascript-db-ns (sci/create-ns 'datascript.db nil))
(def datascript-ns (vars/->SciNamespace 'datascript.core nil))
(def datascript-db-ns (vars/->SciNamespace 'datascript.db nil))
(def datascript-namespace
{'create-conn (copy-var d/create-conn datascript-ns)

View file

@ -55,8 +55,7 @@
{'html (copy-var html-1 hns {:name 'html})})
(def hiccup2-namespace
{'html (copy-var html-2 hns2 {:name 'html})
'raw (copy-var util/raw-string hns2 {:name 'raw})})
{'html (copy-var html-2 hns2 {:name 'html})})
(def html-mode (copy-var util/*html-mode* uns))
(def escape-strings? (copy-var util/*escape-strings?* uns))
@ -64,8 +63,7 @@
(def hiccup-util-namespace
{'*html-mode* html-mode
'*escape-strings?* escape-strings?
'raw-string (copy-var util/raw-string uns)
'to-uri (copy-var util/to-uri uns)})
'raw-string (copy-var util/raw-string uns)})
(defn render-html [& contents]
(binding [util/*html-mode* @html-mode

View file

@ -72,9 +72,7 @@
'acl (copy-var acl cns)
'unlock (copy-var unlock cns)
'default-client (copy-var client/default-client cns)
'*default-client* default-client
'query-string (copy-var client/query-string cns)
'url-encode (copy-var client/url-encode cns)})
'*default-client* default-client})
(def sni-client-namespace
{'ssl-configurer (copy-var sni-client/ssl-configurer sns)

View file

@ -15,8 +15,4 @@
'send-checked-websocket-handshake! (copy-var server/send-checked-websocket-handshake! sns)
'send-websocket-handshake! (copy-var server/send-websocket-handshake! sns)
'as-channel (copy-var server/as-channel sns)
'send! (copy-var server/send! sns)
'with-channel (copy-var server/with-channel sns)
'on-close (copy-var server/on-close sns)
'close (copy-var server/close sns)}
)
'send! (copy-var server/send! sns)})

View file

@ -1,12 +1,12 @@
(ns babashka.impl.jdbc
{:no-doc true}
(:require
[next.jdbc :as njdbc]
[next.jdbc.result-set :as rs]
[next.jdbc.sql :as sql]
[sci.core :as sci]))
(:require [next.jdbc :as njdbc]
[next.jdbc.result-set :as rs]
[next.jdbc.sql :as sql]
[sci.impl.namespaces :refer [copy-var macrofy]]
[sci.impl.vars :as vars]))
(def next-ns (sci/create-ns 'next.jdbc nil))
(def next-ns (vars/->SciNamespace 'next.jdbc nil))
(defn with-transaction
"Given a transactable object, gets a connection and binds it to `sym`,
@ -19,30 +19,30 @@
* `:rollback-only` -- `true` / `false`."
[_ _ [sym transactable opts] & body]
(let [con (vary-meta sym assoc :tag 'java.sql.Connection)]
`(njdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {}))))
`(next.jdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {}))))
(def njdbc-namespace
{'get-datasource (sci/copy-var njdbc/get-datasource next-ns)
'execute! (sci/copy-var njdbc/execute! next-ns)
'execute-one! (sci/copy-var njdbc/execute-one! next-ns)
'get-connection (sci/copy-var njdbc/get-connection next-ns)
'plan (sci/copy-var njdbc/plan next-ns)
'prepare (sci/copy-var njdbc/prepare next-ns)
'transact (sci/copy-var njdbc/transact next-ns)
'with-transaction (sci/copy-var with-transaction next-ns)})
{'get-datasource (copy-var njdbc/get-datasource next-ns)
'execute! (copy-var njdbc/execute! next-ns)
'execute-one! (copy-var njdbc/execute-one! next-ns)
'get-connection (copy-var njdbc/get-connection next-ns)
'plan (copy-var njdbc/plan next-ns)
'prepare (copy-var njdbc/prepare next-ns)
'transact (copy-var njdbc/transact next-ns)
'with-transaction (macrofy 'with-transaction with-transaction next-ns)})
(def sns (sci/create-ns 'next.jdbc.sql nil))
(def sns (vars/->SciNamespace 'next.jdbc.sql nil))
(def next-sql-namespace
{'insert-multi! (sci/copy-var sql/insert-multi! sns)})
{'insert-multi! (copy-var sql/insert-multi! sns)})
(def rsns (sci/create-ns 'next.jdbc.result-set nil))
(def rsns (vars/->SciNamespace 'next.jdbc.result-set nil))
(def result-set-namespace
{'as-maps (sci/copy-var rs/as-maps rsns)
'as-unqualified-maps (sci/copy-var rs/as-unqualified-maps rsns)
'as-modified-maps (sci/copy-var rs/as-modified-maps rsns)
'as-unqualified-modified-maps (sci/copy-var rs/as-unqualified-modified-maps rsns)
'as-lower-maps (sci/copy-var rs/as-lower-maps rsns)
'as-unqualified-lower-maps (sci/copy-var rs/as-unqualified-lower-maps rsns)
'as-maps-adapter (sci/copy-var rs/as-maps-adapter rsns)})
{'as-maps (copy-var rs/as-maps rsns)
'as-unqualified-maps (copy-var rs/as-unqualified-maps rsns)
'as-modified-maps (copy-var rs/as-modified-maps rsns)
'as-unqualified-modified-maps (copy-var rs/as-unqualified-modified-maps rsns)
'as-lower-maps (copy-var rs/as-lower-maps rsns)
'as-unqualified-lower-maps (copy-var rs/as-unqualified-lower-maps rsns)
'as-maps-adapter (copy-var rs/as-maps-adapter rsns)})

View file

@ -3,8 +3,9 @@
[clojure.tools.logging.impl :as impl]
[clojure.tools.logging.readable]
[sci.core :as sci]
[taoensso.encore :as encore :refer [have]]
[taoensso.timbre :as timbre]))
[taoensso.encore :as enc :refer [have]]
[taoensso.timbre :as timbre]
[taoensso.timbre.appenders.core :as appenders]))
;;;; timbre
@ -12,80 +13,56 @@
(defn- fline [and-form] (:line (meta and-form)))
(defonce callsite-counter
(encore/counter))
(defmacro log! ; Public wrapper around `-log!`
"Core low-level log macro. Useful for tooling/library authors, etc.
"Core low-level log macro. Useful for tooling, etc.
* `level` - must eval to a valid logging level
* `msg-type` - must eval to e/o #{:p :f nil}
* `opts` - ks e/o #{:config :?err :?ns-str :?file :?line :?base-data :spying?}
Supports compile-time elision when compile-time const vals
provided for `level` and/or `?ns-str`."
[level msg-type args & [opts]]
(have [:or nil? sequential?] args) ; To allow -> (delay [~@args])
(let [{:keys [?ns-str] :or {?ns-str (str @sci/ns)}} opts]
;; level, ns may/not be compile-time consts:
(when-not (timbre/-elide? level ?ns-str)
(let [{:keys [config ?err ?file ?line ?base-data spying?]
:or {config 'taoensso.timbre/*config*
?err :auto ; => Extract as err-type v0
?file @sci/file
;; NB waiting on CLJ-865:
?line (fline &form)}} opts
* `level` - must eval to a valid logging level
* `msg-type` - must eval to e/o #{:p :f nil}
* `args` - arguments seq (ideally vec) for logging call
* `opts` - ks e/o #{:config ?err ?base-data spying?
:?ns-str :?file :?line :?column}
?file (when (not= ?file "NO_SOURCE_PATH") ?file)
Supports compile-time elision when compile-time const vals
provided for `level` and/or `?ns-str`.
;; Identifies this particular macro expansion; note that this'll
;; be fixed for any fns wrapping `log!` (notably `tools.logging`,
;; `slf4j-timbre`, etc.):
callsite-id
(hash [level msg-type args ; Unevaluated args (arg forms)
?ns-str ?file ?line (rand)])]
Logging wrapper examples:
(defn log-wrapper-fn [& args] (timbre/log! :info :p args))
(defmacro log-wrapper-macro [& args] (timbre/keep-callsite `(timbre/log! :info :p ~args)))"
([{:as opts
:keys [loc level msg-type args vargs
config ?err ?base-data spying?]
:or
{config 'taoensso.timbre/*config*
?err :auto}}]
(have [:or nil? sequential? symbol?] args)
(let [callsite-id (callsite-counter)
{:keys [line column]} (merge (meta &form) loc)
{:keys [ns file line column]} {:ns @sci/ns :file @sci/file :line line :column column}
ns (or (get opts :?ns-str) ns)
file (or (get opts :?file) file)
line (or (get opts :?line) line)
column (or (get opts :?column) column)
elide? (and #_(enc/const-forms? level ns) (timbre/-elide? level ns))]
(when-not elide?
(let [vargs-form
(or vargs
(if (symbol? args)
`(taoensso.timbre/-ensure-vec ~args)
`[ ~@args]))]
;; Note pre-resolved expansion
`(taoensso.timbre/-log! ~config ~level ~ns ~file ~line ~column ~msg-type ~?err
(delay ~vargs-form) ~?base-data ~callsite-id ~spying?
~(get opts :instant)
~(get opts :may-log?))))))
([level msg-type args & [opts]]
(let [{:keys [line column]} (merge (meta &form))
{:keys [ns file line column]} {:ns @sci/ns :file @sci/file :line line :column column}
loc {:ns ns :file file :line line :column column}
opts (assoc (conj {:loc loc} opts)
:level level, :msg-type msg-type, :args args)]
`(taoensso.timbre/log! ~opts))))
`(taoensso.timbre/-log! ~config ~level ~?ns-str ~?file ~?line ~msg-type ~?err
(delay [~@args]) ~?base-data ~callsite-id ~spying?)))))
(defn make-ns [ns sci-ns ks]
(reduce (fn [ns-map [var-name var]]
(let [m (meta var)
no-doc (:no-doc m)
doc (:doc m)
arglists (:arglists m)]
(assoc ns-map var-name
(sci/new-var (symbol var-name) @var
(cond-> {:ns sci-ns
:name (:name m)}
(:macro m) (assoc :macro true)
doc (assoc :doc doc)
arglists (assoc :arglists arglists))))))
(if no-doc ns-map
(assoc ns-map var-name
(sci/new-var (symbol var-name) @var
(cond-> {:ns sci-ns
:name (:name m)}
(:macro m) (assoc :macro true)
doc (assoc :doc doc)
arglists (assoc :arglists arglists)))))))
{}
(select-keys (ns-publics ns) ks)))
(def atomic-println @#'appenders/atomic-println)
(defn println-appender
"Returns a simple `println` appender for Clojure/Script.
Use with ClojureScript requires that `cljs.core/*print-fn*` be set.
@ -115,7 +92,7 @@
:*err* @sci/err
stream)]
(binding [*out* stream]
(encore/println-atomic (force output_)))))}))
(atomic-println (force output_)))))}))
(def default-config (assoc-in timbre/*config* [:appenders :println]
(println-appender {:stream :auto})))
@ -128,7 +105,7 @@
(defn set-level! [level] (swap-config! (fn [m] (assoc m :min-level level))))
(defn merge-config! [m] (swap-config! (fn [old] (encore/nested-merge old m))))
(defn merge-config! [m] (swap-config! (fn [old] (enc/nested-merge old m))))
(defmacro -log-and-rethrow-errors [?line & body]
`(try (do ~@body)
@ -143,27 +120,14 @@
'info 'infof 'warn 'warnf
'error 'errorf
'-log! 'with-level
'spit-appender '-spy 'spy
'color-str])
'spit-appender '-spy 'spy])
'log! (sci/copy-var log! tns)
'*config* config
'swap-config! (sci/copy-var swap-config! tns)
'merge-config! (sci/copy-var merge-config! tns)
'set-level! (sci/copy-var set-level! tns)
'println-appender (sci/copy-var println-appender tns)
'-log-and-rethrow-errors (sci/copy-var -log-and-rethrow-errors tns)
'-ensure-vec (sci/copy-var encore/ensure-vec tns)))
(def enc-ns (sci/create-ns 'taoensso.encore))
(def encore-namespace
{'catching (sci/copy-var encore/catching enc-ns)
'try* (sci/copy-var encore/try* enc-ns)})
(def timbre-appenders-namespace
(let [tan (sci/create-ns 'taoensso.timbre.appenders.core nil)]
{'println-appender (sci/copy-var println-appender tan)
'spit-appender (sci/copy-var #_:clj-kondo/ignore timbre/spit-appender tan)}))
'-log-and-rethrow-errors (sci/copy-var -log-and-rethrow-errors tns)))
;;;; clojure.tools.logging
@ -196,7 +160,7 @@
#'clojure.tools.logging/*logger-factory*
(fn [_]
(LoggerFactory.
(encore/memoize (fn [logger-ns] (Logger. (str logger-ns) config))))))
(enc/memoize (fn [logger-ns] (Logger. (str logger-ns) config))))))
(def lns (sci/create-ns 'clojure.tools.logging nil))

View file

@ -4,7 +4,6 @@
[babashka.impl.common :refer [ctx]]
[sci.core :as sci]
[selmer.filters :as filters]
[selmer.filter-parser :as fp]
[selmer.parser]
[selmer.tags :as tags]
[selmer.util :as util]
@ -61,7 +60,7 @@
(selmer.parser/render-template template context-map)))
(defn sci-ns-resolve [ns fqs]
(sci/eval-form (ctx) (list 'clojure.core/ns-resolve ns (list 'quote fqs))))
(sci/eval-form @ctx (list 'clojure.core/ns-resolve ns (list 'quote fqs))))
(defn force! [x]
(if (instance? clojure.lang.IDeref x) @x x))
@ -84,31 +83,12 @@
(apply merge)
(selmer.parser/render ~s)))
(defn resolve-arg
"Resolves an arg as passed to an add-tag! handler using the provided
context-map.
A custom tag handler will receive a seq of args as its first argument.
With this function, you can selectively resolve one or more of those args
so that if they contain literals, the literal value is returned, and if they
contain templates of any sort, which can itself have variables, filters or
tags in it, they will be returned resolved, applied and rendered.
Example:
(resolve-arg {{header-name|upper}} {:header-name \"My Page\"})
=> \"MY PAGE\""
[arg context-map]
(if (fp/literal? arg)
(fp/parse-literal arg)
(render arg context-map)))
(def selmer-parser-namespace
(-> selmer-parser-ns
(assoc 'render-file (sci/copy-var render-file spns)
'render (sci/copy-var render spns)
'render-template (sci/copy-var render-template spns)
'resolve-var-from-kw (sci/copy-var resolve-var-from-kw spns)
'resolve-arg (sci/copy-var resolve-arg spns )
'<< (sci/copy-var << spns))))
(def stns (sci/create-ns 'selmer.tags nil))
@ -125,9 +105,7 @@
(def selmer-filters-namespace
{'add-filter! (sci/copy-var filters/add-filter! sfns)
'remove-filter! (sci/copy-var filters/remove-filter! sfns)
'get-filter (sci/copy-var filters/get-filter sfns)
'filters (sci/copy-var filters/filters sfns)})
'remove-filter! (sci/copy-var filters/remove-filter! sfns)})
(defn turn-off-escaping! []
(sci/alter-var-root escape-variables (constantly false)))

View file

@ -1,9 +1,10 @@
(ns babashka.impl.transit
(:require
[cognitect.transit :as transit]
[sci.core :as sci :refer [copy-var]]))
(:require [cognitect.transit :as transit]
[sci.impl.namespaces :refer [copy-var]]
[sci.impl.vars :as vars]))
(def tns (sci/create-ns 'cognitect.transit nil))
(def tns (vars/->SciNamespace 'cognitect.transit nil))
(def transit-namespace
{'write (copy-var transit/write tns)

View file

@ -12,7 +12,7 @@
(def xtns (sci/create-ns 'clojure.data.xml.tree nil))
(defn- clj-ns-name [ns]
(cond (instance? sci.lang.Namespace ns) (str ns)
(cond (instance? sci.impl.vars.SciNamespace ns) (str ns)
(keyword? ns) (name ns)
:else (str ns)))
@ -40,8 +40,8 @@
#_(assert (<= (count ans)) (pr-str ans))
(let [xn (xml/uri-symbol n)
al (symbol (clj-ns-name a))]
(sci/eval-form (ctx) `(create-ns (quote ~xn)))
(sci/eval-form (ctx) `(alias (quote ~al) (quote ~xn)))
(sci/eval-form @ctx `(create-ns (quote ~xn)))
(sci/eval-form @ctx `(alias (quote ~al) (quote ~xn)))
(recur rst)))))
(def xml-namespace

View file

@ -1,14 +1,9 @@
(ns babashka.impl.ordered
{:no-doc true}
(:require [flatland.ordered.map :as omap]
[flatland.ordered.set :as oset]
[sci.core :as sci]))
(def omap-ns (sci/create-ns 'flatland.ordered.map nil))
(def oset-ns (sci/create-ns 'flatland.ordered.set nil))
(def ordered-map-ns
{'ordered-map (sci/copy-var omap/ordered-map omap-ns)})
(def ordered-set-ns
{'ordered-set (sci/copy-var oset/ordered-set oset-ns)})

2
fs

@ -1 +1 @@
Subproject commit fdd5780bc4df4931332b56082c6c3a5c3c85066d
Subproject commit 68b42dd1b6ee22cbcca6e6a807cfb079b608f033

View file

@ -1,2 +0,0 @@
{:tasks {install (clojure "-T:build install")
deploy (clojure "-T:build deploy")}}

View file

@ -1,94 +0,0 @@
// This file is mostly a workaround for https://github.com/oracle/graal/issues/1956
package babashka.impl;
import java.util.WeakHashMap;
import java.io.*;
import java.util.Objects;
import java.net.*;
import java.util.jar.*;
public class URLClassLoader extends java.net.URLClassLoader implements Closeable {
private WeakHashMap<Closeable,Void>
closeables = new WeakHashMap<>();
public URLClassLoader(java.net.URL[] urls) {
super(urls);
}
public URLClassLoader(java.net.URL[] urls, java.net.URLClassLoader parent) {
super(urls, parent);
}
public void _addURL(java.net.URL url) {
super.addURL(url);
}
// calling super.getResource() returned nil in native-image
public java.net.URL getResource(String name) {
return findResource(name);
}
// calling super.getResourceAsStream() returned nil in native-image
public InputStream getResourceAsStream(String name) {
Objects.requireNonNull(name);
URL url = getResource(name);
try {
if (url == null) {
return null;
}
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream();
if (urlc instanceof JarURLConnection) {
JarFile jar = ((JarURLConnection)urlc).getJarFile();
synchronized (closeables) {
if (!closeables.containsKey(jar)) {
closeables.put(jar, null);
}
}
} else {
synchronized (closeables) {
closeables.put(is, null);
}
}
return is;
} catch (IOException e) {
return null;
}
}
public java.util.Enumeration<java.net.URL> getResources(String name) throws java.io.IOException {
return findResources(name);
}
public void close() throws IOException {
super.close();
java.util.List<IOException> errors = new java.util.ArrayList<IOException>();
synchronized (closeables) {
java.util.Set<Closeable> keys = closeables.keySet();
for (Closeable c : keys) {
try {
c.close();
} catch (IOException ex) {
errors.add(ex);
}
}
closeables.clear();
}
if (errors.isEmpty()) {
return;
}
IOException firstEx = errors.remove(0);
for (IOException error: errors) {
firstEx.addSuppressed(error);
}
throw firstEx;
}
}

88
install
View file

@ -8,7 +8,6 @@ static_binary="false"
default_install_dir="/usr/local/bin"
install_dir="$default_install_dir"
download_dir=""
dev_build=""
print_help() {
echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin."
@ -29,32 +28,6 @@ print_help() {
exit 1
}
has() {
command -v "$1" >/dev/null 2>&1
}
fetch() {
local url=$1
local outfile=${2:-}
if has wget; then
if [[ -n $outfile ]]; then
wget -qO "$outfile" "$url"
else
wget -qO - "$url"
fi
elif has curl; then
if [[ -n $outfile ]]; then
curl -fsSL "$url" -o "$outfile"
else
curl -fsSL "$url"
fi
else
>&2 echo "Either 'wget' or 'curl' needs to be on PATH!"
exit 1
fi
}
while [[ $# -gt 0 ]]
do
key="$1"
@ -83,10 +56,6 @@ do
static_binary="true"
shift
;;
--dev-build)
dev_build="true"
shift
;;
*) # unknown option
print_help
shift
@ -105,11 +74,7 @@ if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then
fi
if [[ "$version" == "" ]]; then
if [[ "$dev_build" == "true" ]]; then
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
else
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
fi
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
fi
case "$(uname -s)" in
@ -117,36 +82,21 @@ case "$(uname -s)" in
Darwin*) platform=macos;;
esac
case "$(uname -m)" in
aarch64) arch=aarch64;;
*) arch=amd64;;
esac
# Ugly ugly conversion of version to a comparable number
IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
case "$(uname -m)" in
aarch64) arch=aarch64
if [[ "$platform" == "linux" ]]; then
static_binary="true"
fi
;;
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
arch="amd64"
else
arch="aarch64"
fi
;;
*) arch=amd64
# always use static image on linux
if [[ "$platform" == "linux" ]]; then
static_binary="true"
fi
;;
esac
if [[ 10#$vernum -le 10#000002013 ]]; then
ext="zip"
util="$(which unzip) -qqo"
ext="zip"
util="$(which unzip) -qqo"
else
ext="tar.gz"
util="$(which tar) -zxf"
ext="tar.gz"
util="$(which tar) -zxf"
fi
case "$platform-$static_binary" in
@ -169,15 +119,15 @@ fi
download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename"
# macOS only have shasum available by default
# Some Linux distros (RHEL-like) only have sha256sum available by default (others have both)
if has sha256sum; then
sha256sum_cmd="sha256sum"
elif has shasum; then
sha256sum_cmd="shasum -a 256"
# Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both)
if command -v sha256sum >/dev/null; then
sha256sum_cmd="sha256sum"
elif command -v shasum >/dev/null; then
sha256sum_cmd="shasum -a 256"
else
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
>&2 echo "Exiting..."
exit 1
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
>&2 echo "Exiting..."
exit 1
fi
# Running this part in a subshell so when it finishes we go back to the previous directory
@ -185,7 +135,7 @@ mkdir -p "$download_dir" && (
cd "$download_dir"
echo -e "Downloading $download_url to $download_dir"
fetch "$download_url" "$filename"
curl -o "$filename" -sL "$download_url"
if [[ -n "$checksum" ]]; then
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
>&2 echo "Failed checksum on $filename"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View file

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="882" height="648" viewBox="0 0 2944 2162" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1742.91 1219.89C1857.93 1138.38 1933 1004.21 1933 852.5C1933 603.972 1761 280.5 1483 139C1207.5 288 1033 603.972 1033 852.5C1033 1004.21 1108.07 1138.38 1223.09 1219.89C1218.98 1220.44 1214.95 1221.14 1211 1222C1123.61 1241.07 1017 1385.05 1017 1385.05H1281C1327.97 1385.05 1372.63 1367.41 1407.96 1347.62C1425.12 1370.32 1452.34 1385 1483 1385C1513.66 1385 1540.89 1370.32 1558.04 1347.62C1593.37 1367.41 1638.03 1385.05 1685 1385.05H1949C1949 1385.05 1842.39 1241.07 1755 1222C1751.05 1221.14 1747.02 1220.44 1742.91 1219.89Z" style="fill-rule: evenodd; fill: rgb(0, 91, 187);"/>
<circle cx="1482.5" cy="878.5" r="311.5" style="fill: rgb(255, 213, 0);"/>
<path d="M1212 745.5C1396.5 758.5 1505.5 713.5 1581 602C1581 602 1435.5 553 1347 602C1258.8 650.834 1212 745.5 1212 745.5Z" fill="#B4B4B4"/>
<path d="M1728 718C1654 710 1588 686 1556.5 595.5C1556.5 595.5 1621.93 610.435 1688 670.614C1756.62 733.114 1728 718 1728 718Z" fill="#B4B4B4"/>
<circle cx="1482.5" cy="878.5" r="311.5" stroke="#0A0000" stroke-width="40"/>
<path d="M1544 745H1421L1451 775V865C1455.5 835.5 1511.5 834.5 1514.5 865L1522 775L1544 745Z" fill="black"/>
<path d="M1098.12 785C1098.12 762.909 1116.03 745 1138.12 745H1423.02C1447.2 745 1465.85 766.292 1462.67 790.264L1437.91 976.764C1435.27 996.646 1418.31 1011.5 1398.26 1011.5H1138.12C1116.03 1011.5 1098.12 993.591 1098.12 971.5V785Z" fill="black"/>
<path d="M1216.1 967.55V951.05H1210.55C1206.95 951.05 1204.55 948.5 1203.35 944.75L1180.55 876.05C1179.05 871.7 1177.25 868.55 1174.85 866.15C1170.35 861.5 1164.5 860 1157.9 860H1150.7V877.25H1155.5C1159.55 877.25 1162.7 878.75 1164.05 883.55L1167.2 894.65L1139 967.55H1159.55L1176.5 919.55L1185.5 948.5C1188.95 959.75 1194.8 967.55 1208 967.55H1216.1Z" fill="white"/>
<path d="M1248.8 951.05V967.55H1304.8V951.05H1248.8Z" fill="white"/>
<path d="M1503.01 790.267C1499.83 766.294 1518.48 745 1542.66 745H1827C1849.09 745 1867 762.909 1867 785V971.096C1867 993.187 1849.09 1011.1 1827 1011.1H1567.38C1547.33 1011.1 1530.37 996.244 1527.73 976.362L1503.01 790.267Z" fill="black"/>
<path d="M1649.3 968V951.5H1643.75C1640.15 951.5 1637.75 948.95 1636.55 945.2L1613.75 876.5C1612.25 872.15 1610.45 869 1608.05 866.6C1603.55 861.95 1597.7 860.45 1591.1 860.45H1583.9V877.7H1588.7C1592.75 877.7 1595.9 879.2 1597.25 884L1600.4 895.1L1572.2 968H1592.75L1609.7 920L1618.7 948.95C1622.15 960.2 1628 968 1641.2 968H1649.3Z" fill="white"/>
<path d="M1682 951.5V968H1738V951.5H1682Z" fill="white"/>
<path d="M 245.923 1712.64 C 254.47 1701.19 264.812 1692.21 276.949 1685.72 C 289.085 1679.05 301.991 1675.72 315.667 1675.72 C 349.684 1675.72 374.897 1688.37 391.308 1713.67 C 407.889 1738.79 416.18 1774.26 416.18 1820.08 C 416.18 1848.45 411.906 1873.67 403.359 1895.72 C 394.983 1917.6 382.59 1934.78 366.18 1947.26 C 349.94 1959.56 330.282 1965.72 307.205 1965.72 C 293.53 1965.72 280.795 1962.81 269 1957 C 257.376 1951.36 247.633 1943.15 239.769 1932.38 L 236.692 1957 L 164.897 1957 L 164.897 1576.49 L 245.923 1568.03 L 245.923 1712.64 Z M 285.923 1906.74 C 317.034 1906.74 332.59 1878.2 332.59 1821.1 C 332.59 1799.22 330.88 1782.04 327.462 1769.56 C 324.043 1756.91 319.171 1748.11 312.846 1743.15 C 306.692 1738.03 299.085 1735.46 290.026 1735.46 C 273.274 1735.46 258.573 1745.97 245.923 1767 L 245.923 1881.87 C 251.222 1890.25 257.034 1896.49 263.359 1900.59 C 269.855 1904.69 277.376 1906.74 285.923 1906.74 Z" style="fill: rgb(0, 91, 187);"/>
<path d="M 701.745 1878.54 C 701.745 1888.62 703.113 1896.06 705.848 1900.85 C 708.583 1905.46 713.198 1908.97 719.694 1911.36 L 703.027 1964.69 C 686.446 1963.15 672.686 1959.56 661.745 1953.92 C 650.976 1948.11 642.515 1939.74 636.361 1928.79 C 626.275 1940.93 613.198 1950.16 597.13 1956.49 C 581.233 1962.64 564.395 1965.72 546.617 1965.72 C 528.156 1965.72 511.916 1962.13 497.899 1954.95 C 484.053 1947.6 473.369 1937.51 465.848 1924.69 C 458.327 1911.7 454.566 1896.83 454.566 1880.08 C 454.566 1860.59 459.78 1843.92 470.207 1830.08 C 480.634 1816.23 495.763 1805.72 515.592 1798.54 C 535.421 1791.19 559.267 1787.51 587.13 1787.51 L 623.797 1787.51 L 623.797 1777.26 C 623.797 1749.39 605.848 1735.46 569.951 1735.46 C 560.891 1735.46 549.438 1736.74 535.592 1739.31 C 521.916 1741.87 508.498 1745.38 495.335 1749.82 L 476.617 1695.97 C 493.711 1689.48 511.745 1684.52 530.72 1681.1 C 549.694 1677.51 567.045 1675.72 582.771 1675.72 C 622.771 1675.72 652.6 1683.84 672.258 1700.08 C 691.916 1716.32 701.745 1740.25 701.745 1771.87 L 701.745 1878.54 Z M 574.566 1907.77 C 583.797 1907.77 593.113 1905.12 602.515 1899.82 C 611.916 1894.35 619.01 1887 623.797 1877.77 L 623.797 1833.67 L 603.797 1833.67 C 581.574 1833.67 565.079 1837.09 554.31 1843.92 C 543.54 1850.76 538.156 1860.93 538.156 1874.44 C 538.156 1885.03 541.318 1893.24 547.643 1899.05 C 554.139 1904.86 563.113 1907.77 574.566 1907.77 Z" style="fill: rgb(0, 91, 187);"/>
<path d="M984.204 1711.64C992.751 1700.19 1003.09 1691.21 1015.23 1684.72C1027.37 1678.05 1040.27 1674.72 1053.95 1674.72C1087.97 1674.72 1113.18 1687.37 1129.59 1712.67C1146.17 1737.79 1154.46 1773.26 1154.46 1819.08C1154.46 1847.45 1150.19 1872.67 1141.64 1894.72C1133.26 1916.6 1120.87 1933.78 1104.46 1946.26C1088.22 1958.56 1068.56 1964.72 1045.49 1964.72C1031.81 1964.72 1019.08 1961.81 1007.28 1956C995.657 1950.36 985.914 1942.15 978.05 1931.38L974.974 1956H903.179V1575.49L984.204 1567.03V1711.64ZM1024.2 1905.74C1055.32 1905.74 1070.87 1877.2 1070.87 1820.1C1070.87 1798.22 1069.16 1781.04 1065.74 1768.56C1062.32 1755.91 1057.45 1747.11 1051.13 1742.15C1044.97 1737.03 1037.37 1734.46 1028.31 1734.46C1011.55 1734.46 996.854 1744.97 984.204 1766V1880.87C989.503 1889.25 995.315 1895.49 1001.64 1899.59C1008.14 1903.69 1015.66 1905.74 1024.2 1905.74Z" style="fill: rgb(0, 91, 187);"/>
<path d="M1440.03 1877.54C1440.03 1887.62 1441.39 1895.06 1444.13 1899.85C1446.86 1904.46 1451.48 1907.97 1457.98 1910.36L1441.31 1963.69C1424.73 1962.15 1410.97 1958.56 1400.03 1952.92C1389.26 1947.11 1380.8 1938.74 1374.64 1927.79C1364.56 1939.93 1351.48 1949.16 1335.41 1955.49C1319.51 1961.64 1302.68 1964.72 1284.9 1964.72C1266.44 1964.72 1250.2 1961.13 1236.18 1953.95C1222.33 1946.6 1211.65 1936.51 1204.13 1923.69C1196.61 1910.7 1192.85 1895.83 1192.85 1879.08C1192.85 1859.59 1198.06 1842.92 1208.49 1829.08C1218.92 1815.23 1234.04 1804.72 1253.87 1797.54C1273.7 1790.19 1297.55 1786.51 1325.41 1786.51H1362.08V1776.26C1362.08 1748.39 1344.13 1734.46 1308.23 1734.46C1299.17 1734.46 1287.72 1735.74 1273.87 1738.31C1260.2 1740.87 1246.78 1744.38 1233.62 1748.82L1214.9 1694.97C1231.99 1688.48 1250.03 1683.52 1269 1680.1C1287.98 1676.51 1305.33 1674.72 1321.05 1674.72C1361.05 1674.72 1390.88 1682.84 1410.54 1699.08C1430.2 1715.32 1440.03 1739.25 1440.03 1770.87V1877.54ZM1312.85 1906.77C1322.08 1906.77 1331.39 1904.12 1340.8 1898.82C1350.2 1893.35 1357.29 1886 1362.08 1876.77V1832.67H1342.08C1319.86 1832.67 1303.36 1836.09 1292.59 1842.92C1281.82 1849.76 1276.44 1859.93 1276.44 1873.44C1276.44 1884.03 1279.6 1892.24 1285.92 1898.05C1292.42 1903.86 1301.39 1906.77 1312.85 1906.77Z" style="fill: rgb(0, 91, 187);"/>
<path d="M1627.64 1906.77C1641.49 1906.77 1652.43 1904.63 1660.46 1900.36C1668.67 1895.91 1672.77 1889.5 1672.77 1881.13C1672.77 1875.15 1671.15 1870.27 1667.9 1866.51C1664.65 1862.58 1658.58 1858.91 1649.7 1855.49C1640.81 1851.9 1626.96 1847.54 1608.16 1842.41C1580.81 1835.06 1559.87 1824.97 1545.34 1812.15C1530.98 1799.33 1523.8 1781.56 1523.8 1758.82C1523.8 1742.41 1528.33 1727.88 1537.39 1715.23C1546.62 1702.58 1560.12 1692.67 1577.9 1685.49C1595.68 1678.31 1617.05 1674.72 1642 1674.72C1685.25 1674.72 1722 1685.74 1752.26 1707.79L1719.95 1755.49C1708.16 1748.31 1695.76 1742.67 1682.77 1738.56C1669.95 1734.46 1657.13 1732.41 1644.31 1732.41C1631.15 1732.41 1621.32 1734.21 1614.82 1737.79C1608.5 1741.21 1605.34 1746.43 1605.34 1753.44C1605.34 1758.22 1606.96 1762.24 1610.21 1765.49C1613.63 1768.74 1619.7 1772.07 1628.41 1775.49C1637.3 1778.91 1651.06 1783.26 1669.7 1788.56C1689.35 1794.03 1705.34 1800.1 1717.64 1806.77C1729.95 1813.26 1739.52 1821.98 1746.36 1832.92C1753.37 1843.69 1756.87 1857.62 1756.87 1874.72C1756.87 1893.86 1751.06 1910.27 1739.44 1923.95C1727.99 1937.45 1712.52 1947.62 1693.03 1954.46C1673.54 1961.3 1651.92 1964.72 1628.16 1964.72C1602.69 1964.72 1579.78 1961.13 1559.44 1953.95C1539.1 1946.6 1521.58 1936.51 1506.87 1923.69L1547.64 1878.05C1558.93 1886.94 1571.32 1893.95 1584.82 1899.08C1598.33 1904.21 1612.6 1906.77 1627.64 1906.77Z" style="fill: rgb(0, 91, 187);"/>
<path d="M1907.06 1710.62C1929.79 1686.68 1956.46 1674.72 1987.06 1674.72C2011.16 1674.72 2029.62 1681.81 2042.44 1696C2055.43 1710.02 2061.93 1730.02 2061.93 1756V1956H1980.9V1778.56C1980.9 1767.45 1980.05 1758.74 1978.34 1752.41C1976.8 1746.09 1974.15 1741.56 1970.39 1738.82C1966.63 1735.91 1961.41 1734.46 1954.75 1734.46C1946.54 1734.46 1938.59 1737.28 1930.9 1742.92C1923.21 1748.56 1915.26 1756.77 1907.06 1767.54V1956H1826.03V1575.49L1907.06 1567.54V1710.62Z" style="fill: rgb(0, 91, 187);"/>
<path d="M2337.72 1956H2256.69V1575.49L2337.72 1567.03V1956ZM2425.67 1804.21L2522.59 1956H2430.28L2340.8 1806.77L2430.28 1683.69H2515.16L2425.67 1804.21Z" style="fill: rgb(0, 91, 187);"/>
<path d="M2793.54 1877.54C2793.54 1887.62 2794.91 1895.06 2797.64 1899.85C2800.38 1904.46 2805 1907.97 2811.49 1910.36L2794.82 1963.69C2778.24 1962.15 2764.48 1958.56 2753.54 1952.92C2742.77 1947.11 2734.31 1938.74 2728.16 1927.79C2718.07 1939.93 2705 1949.16 2688.93 1955.49C2673.03 1961.64 2656.19 1964.72 2638.41 1964.72C2619.95 1964.72 2603.71 1961.13 2589.7 1953.95C2575.85 1946.6 2565.17 1936.51 2557.64 1923.69C2550.12 1910.7 2546.36 1895.83 2546.36 1879.08C2546.36 1859.59 2551.58 1842.92 2562 1829.08C2572.43 1815.23 2587.56 1804.72 2607.39 1797.54C2627.22 1790.19 2651.06 1786.51 2678.93 1786.51H2715.59V1776.26C2715.59 1748.39 2697.64 1734.46 2661.75 1734.46C2652.69 1734.46 2641.23 1735.74 2627.39 1738.31C2613.71 1740.87 2600.29 1744.38 2587.13 1748.82L2568.41 1694.97C2585.51 1688.48 2603.54 1683.52 2622.52 1680.1C2641.49 1676.51 2658.84 1674.72 2674.57 1674.72C2714.57 1674.72 2744.4 1682.84 2764.06 1699.08C2783.71 1715.32 2793.54 1739.25 2793.54 1770.87V1877.54ZM2666.36 1906.77C2675.59 1906.77 2684.91 1904.12 2694.31 1898.82C2703.71 1893.35 2710.81 1886 2715.59 1876.77V1832.67H2695.59C2673.37 1832.67 2656.88 1836.09 2646.11 1842.92C2635.34 1849.76 2629.95 1859.93 2629.95 1873.44C2629.95 1884.03 2633.11 1892.24 2639.44 1898.05C2645.94 1903.86 2654.91 1906.77 2666.36 1906.77Z" style="fill: rgb(0, 91, 187);"/>
<path d="M862 1819C862 1848.27 838.271 1872 809 1872C779.729 1872 756 1848.27 756 1819C756 1789.73 779.729 1766 809 1766C838.271 1766 862 1789.73 862 1819Z" style="fill: rgb(255, 213, 0);"/>
<path d="M2215.5 1819C2215.5 1848.27 2191.77 1872 2162.5 1872C2133.23 1872 2109.5 1848.27 2109.5 1819C2109.5 1789.73 2133.23 1766 2162.5 1766C2191.77 1766 2215.5 1789.73 2215.5 1819Z" style="fill: rgb(255, 213, 0);"/>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

View file

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="882" height="648" viewBox="0 0 2944 2162" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1742.91 1219.89C1857.93 1138.38 1933 1004.21 1933 852.5C1933 603.972 1761 280.5 1483 139C1207.5 288 1033 603.972 1033 852.5C1033 1004.21 1108.07 1138.38 1223.09 1219.89C1218.98 1220.44 1214.95 1221.14 1211 1222C1123.61 1241.07 1017 1385.05 1017 1385.05H1281C1327.97 1385.05 1372.63 1367.41 1407.96 1347.62C1425.12 1370.32 1452.34 1385 1483 1385C1513.66 1385 1540.89 1370.32 1558.04 1347.62C1593.37 1367.41 1638.03 1385.05 1685 1385.05H1949C1949 1385.05 1842.39 1241.07 1755 1222C1751.05 1221.14 1747.02 1220.44 1742.91 1219.89Z" fill="url(#paint0_linear)"/>
<circle cx="1482.5" cy="878.5" r="311.5" fill="white"/>
<path d="M1212 745.5C1396.5 758.5 1505.5 713.5 1581 602C1581 602 1435.5 553 1347 602C1258.8 650.834 1212 745.5 1212 745.5Z" fill="#B4B4B4"/>
<path d="M1728 718C1654 710 1588 686 1556.5 595.5C1556.5 595.5 1621.93 610.435 1688 670.614C1756.62 733.114 1728 718 1728 718Z" fill="#B4B4B4"/>
<circle cx="1482.5" cy="878.5" r="311.5" stroke="#0A0000" stroke-width="40"/>
<path d="M1544 745H1421L1451 775V865C1455.5 835.5 1511.5 834.5 1514.5 865L1522 775L1544 745Z" fill="black"/>
<path d="M1098.12 785C1098.12 762.909 1116.03 745 1138.12 745H1423.02C1447.2 745 1465.85 766.292 1462.67 790.264L1437.91 976.764C1435.27 996.646 1418.31 1011.5 1398.26 1011.5H1138.12C1116.03 1011.5 1098.12 993.591 1098.12 971.5V785Z" fill="black"/>
<path d="M1216.1 967.55V951.05H1210.55C1206.95 951.05 1204.55 948.5 1203.35 944.75L1180.55 876.05C1179.05 871.7 1177.25 868.55 1174.85 866.15C1170.35 861.5 1164.5 860 1157.9 860H1150.7V877.25H1155.5C1159.55 877.25 1162.7 878.75 1164.05 883.55L1167.2 894.65L1139 967.55H1159.55L1176.5 919.55L1185.5 948.5C1188.95 959.75 1194.8 967.55 1208 967.55H1216.1Z" fill="white"/>
<path d="M1248.8 951.05V967.55H1304.8V951.05H1248.8Z" fill="white"/>
<path d="M1503.01 790.267C1499.83 766.294 1518.48 745 1542.66 745H1827C1849.09 745 1867 762.909 1867 785V971.096C1867 993.187 1849.09 1011.1 1827 1011.1H1567.38C1547.33 1011.1 1530.37 996.244 1527.73 976.362L1503.01 790.267Z" fill="black"/>
<path d="M1649.3 968V951.5H1643.75C1640.15 951.5 1637.75 948.95 1636.55 945.2L1613.75 876.5C1612.25 872.15 1610.45 869 1608.05 866.6C1603.55 861.95 1597.7 860.45 1591.1 860.45H1583.9V877.7H1588.7C1592.75 877.7 1595.9 879.2 1597.25 884L1600.4 895.1L1572.2 968H1592.75L1609.7 920L1618.7 948.95C1622.15 960.2 1628 968 1641.2 968H1649.3Z" fill="white"/>
<path d="M1682 951.5V968H1738V951.5H1682Z" fill="white"/>
<path d="M245.923 1711.64C254.47 1700.19 264.812 1691.21 276.949 1684.72C289.085 1678.05 301.991 1674.72 315.667 1674.72C349.684 1674.72 374.897 1687.37 391.308 1712.67C407.889 1737.79 416.18 1773.26 416.18 1819.08C416.18 1847.45 411.906 1872.67 403.359 1894.72C394.983 1916.6 382.59 1933.78 366.18 1946.26C349.94 1958.56 330.282 1964.72 307.205 1964.72C293.53 1964.72 280.795 1961.81 269 1956C257.376 1950.36 247.633 1942.15 239.769 1931.38L236.692 1956H164.897V1575.49L245.923 1567.03V1711.64ZM285.923 1905.74C317.034 1905.74 332.59 1877.2 332.59 1820.1C332.59 1798.22 330.88 1781.04 327.462 1768.56C324.043 1755.91 319.171 1747.11 312.846 1742.15C306.692 1737.03 299.085 1734.46 290.026 1734.46C273.274 1734.46 258.573 1744.97 245.923 1766V1880.87C251.222 1889.25 257.034 1895.49 263.359 1899.59C269.855 1903.69 277.376 1905.74 285.923 1905.74Z" style="fill: rgb(220, 27, 32);"/>
<path d="M701.745 1877.54C701.745 1887.62 703.113 1895.06 705.848 1899.85C708.583 1904.46 713.198 1907.97 719.694 1910.36L703.027 1963.69C686.446 1962.15 672.686 1958.56 661.745 1952.92C650.976 1947.11 642.515 1938.74 636.361 1927.79C626.275 1939.93 613.198 1949.16 597.13 1955.49C581.233 1961.64 564.395 1964.72 546.617 1964.72C528.156 1964.72 511.916 1961.13 497.899 1953.95C484.053 1946.6 473.369 1936.51 465.848 1923.69C458.327 1910.7 454.566 1895.83 454.566 1879.08C454.566 1859.59 459.78 1842.92 470.207 1829.08C480.634 1815.23 495.763 1804.72 515.592 1797.54C535.421 1790.19 559.267 1786.51 587.13 1786.51H623.797V1776.26C623.797 1748.39 605.848 1734.46 569.951 1734.46C560.891 1734.46 549.438 1735.74 535.592 1738.31C521.916 1740.87 508.498 1744.38 495.335 1748.82L476.617 1694.97C493.711 1688.48 511.745 1683.52 530.72 1680.1C549.694 1676.51 567.045 1674.72 582.771 1674.72C622.771 1674.72 652.6 1682.84 672.258 1699.08C691.916 1715.32 701.745 1739.25 701.745 1770.87V1877.54ZM574.566 1906.77C583.797 1906.77 593.113 1904.12 602.515 1898.82C611.916 1893.35 619.01 1886 623.797 1876.77V1832.67H603.797C581.574 1832.67 565.079 1836.09 554.31 1842.92C543.54 1849.76 538.156 1859.93 538.156 1873.44C538.156 1884.03 541.318 1892.24 547.643 1898.05C554.139 1903.86 563.113 1906.77 574.566 1906.77Z" style="fill: rgb(219, 25, 31);"/>
<path d="M984.204 1711.64C992.751 1700.19 1003.09 1691.21 1015.23 1684.72C1027.37 1678.05 1040.27 1674.72 1053.95 1674.72C1087.97 1674.72 1113.18 1687.37 1129.59 1712.67C1146.17 1737.79 1154.46 1773.26 1154.46 1819.08C1154.46 1847.45 1150.19 1872.67 1141.64 1894.72C1133.26 1916.6 1120.87 1933.78 1104.46 1946.26C1088.22 1958.56 1068.56 1964.72 1045.49 1964.72C1031.81 1964.72 1019.08 1961.81 1007.28 1956C995.657 1950.36 985.914 1942.15 978.05 1931.38L974.974 1956H903.179V1575.49L984.204 1567.03V1711.64ZM1024.2 1905.74C1055.32 1905.74 1070.87 1877.2 1070.87 1820.1C1070.87 1798.22 1069.16 1781.04 1065.74 1768.56C1062.32 1755.91 1057.45 1747.11 1051.13 1742.15C1044.97 1737.03 1037.37 1734.46 1028.31 1734.46C1011.55 1734.46 996.854 1744.97 984.204 1766V1880.87C989.503 1889.25 995.315 1895.49 1001.64 1899.59C1008.14 1903.69 1015.66 1905.74 1024.2 1905.74Z" style="fill: rgb(219, 25, 31);"/>
<path d="M1440.03 1877.54C1440.03 1887.62 1441.39 1895.06 1444.13 1899.85C1446.86 1904.46 1451.48 1907.97 1457.98 1910.36L1441.31 1963.69C1424.73 1962.15 1410.97 1958.56 1400.03 1952.92C1389.26 1947.11 1380.8 1938.74 1374.64 1927.79C1364.56 1939.93 1351.48 1949.16 1335.41 1955.49C1319.51 1961.64 1302.68 1964.72 1284.9 1964.72C1266.44 1964.72 1250.2 1961.13 1236.18 1953.95C1222.33 1946.6 1211.65 1936.51 1204.13 1923.69C1196.61 1910.7 1192.85 1895.83 1192.85 1879.08C1192.85 1859.59 1198.06 1842.92 1208.49 1829.08C1218.92 1815.23 1234.04 1804.72 1253.87 1797.54C1273.7 1790.19 1297.55 1786.51 1325.41 1786.51H1362.08V1776.26C1362.08 1748.39 1344.13 1734.46 1308.23 1734.46C1299.17 1734.46 1287.72 1735.74 1273.87 1738.31C1260.2 1740.87 1246.78 1744.38 1233.62 1748.82L1214.9 1694.97C1231.99 1688.48 1250.03 1683.52 1269 1680.1C1287.98 1676.51 1305.33 1674.72 1321.05 1674.72C1361.05 1674.72 1390.88 1682.84 1410.54 1699.08C1430.2 1715.32 1440.03 1739.25 1440.03 1770.87V1877.54ZM1312.85 1906.77C1322.08 1906.77 1331.39 1904.12 1340.8 1898.82C1350.2 1893.35 1357.29 1886 1362.08 1876.77V1832.67H1342.08C1319.86 1832.67 1303.36 1836.09 1292.59 1842.92C1281.82 1849.76 1276.44 1859.93 1276.44 1873.44C1276.44 1884.03 1279.6 1892.24 1285.92 1898.05C1292.42 1903.86 1301.39 1906.77 1312.85 1906.77Z" style="fill: rgb(219, 25, 31);"/>
<path d="M1627.64 1906.77C1641.49 1906.77 1652.43 1904.63 1660.46 1900.36C1668.67 1895.91 1672.77 1889.5 1672.77 1881.13C1672.77 1875.15 1671.15 1870.27 1667.9 1866.51C1664.65 1862.58 1658.58 1858.91 1649.7 1855.49C1640.81 1851.9 1626.96 1847.54 1608.16 1842.41C1580.81 1835.06 1559.87 1824.97 1545.34 1812.15C1530.98 1799.33 1523.8 1781.56 1523.8 1758.82C1523.8 1742.41 1528.33 1727.88 1537.39 1715.23C1546.62 1702.58 1560.12 1692.67 1577.9 1685.49C1595.68 1678.31 1617.05 1674.72 1642 1674.72C1685.25 1674.72 1722 1685.74 1752.26 1707.79L1719.95 1755.49C1708.16 1748.31 1695.76 1742.67 1682.77 1738.56C1669.95 1734.46 1657.13 1732.41 1644.31 1732.41C1631.15 1732.41 1621.32 1734.21 1614.82 1737.79C1608.5 1741.21 1605.34 1746.43 1605.34 1753.44C1605.34 1758.22 1606.96 1762.24 1610.21 1765.49C1613.63 1768.74 1619.7 1772.07 1628.41 1775.49C1637.3 1778.91 1651.06 1783.26 1669.7 1788.56C1689.35 1794.03 1705.34 1800.1 1717.64 1806.77C1729.95 1813.26 1739.52 1821.98 1746.36 1832.92C1753.37 1843.69 1756.87 1857.62 1756.87 1874.72C1756.87 1893.86 1751.06 1910.27 1739.44 1923.95C1727.99 1937.45 1712.52 1947.62 1693.03 1954.46C1673.54 1961.3 1651.92 1964.72 1628.16 1964.72C1602.69 1964.72 1579.78 1961.13 1559.44 1953.95C1539.1 1946.6 1521.58 1936.51 1506.87 1923.69L1547.64 1878.05C1558.93 1886.94 1571.32 1893.95 1584.82 1899.08C1598.33 1904.21 1612.6 1906.77 1627.64 1906.77Z" style="fill: rgb(219, 25, 31);"/>
<path d="M1907.06 1710.62C1929.79 1686.68 1956.46 1674.72 1987.06 1674.72C2011.16 1674.72 2029.62 1681.81 2042.44 1696C2055.43 1710.02 2061.93 1730.02 2061.93 1756V1956H1980.9V1778.56C1980.9 1767.45 1980.05 1758.74 1978.34 1752.41C1976.8 1746.09 1974.15 1741.56 1970.39 1738.82C1966.63 1735.91 1961.41 1734.46 1954.75 1734.46C1946.54 1734.46 1938.59 1737.28 1930.9 1742.92C1923.21 1748.56 1915.26 1756.77 1907.06 1767.54V1956H1826.03V1575.49L1907.06 1567.54V1710.62Z" style="fill: rgb(219, 25, 31);"/>
<path d="M2337.72 1956H2256.69V1575.49L2337.72 1567.03V1956ZM2425.67 1804.21L2522.59 1956H2430.28L2340.8 1806.77L2430.28 1683.69H2515.16L2425.67 1804.21Z" style="fill: rgb(219, 25, 31);"/>
<path d="M2793.54 1877.54C2793.54 1887.62 2794.91 1895.06 2797.64 1899.85C2800.38 1904.46 2805 1907.97 2811.49 1910.36L2794.82 1963.69C2778.24 1962.15 2764.48 1958.56 2753.54 1952.92C2742.77 1947.11 2734.31 1938.74 2728.16 1927.79C2718.07 1939.93 2705 1949.16 2688.93 1955.49C2673.03 1961.64 2656.19 1964.72 2638.41 1964.72C2619.95 1964.72 2603.71 1961.13 2589.7 1953.95C2575.85 1946.6 2565.17 1936.51 2557.64 1923.69C2550.12 1910.7 2546.36 1895.83 2546.36 1879.08C2546.36 1859.59 2551.58 1842.92 2562 1829.08C2572.43 1815.23 2587.56 1804.72 2607.39 1797.54C2627.22 1790.19 2651.06 1786.51 2678.93 1786.51H2715.59V1776.26C2715.59 1748.39 2697.64 1734.46 2661.75 1734.46C2652.69 1734.46 2641.23 1735.74 2627.39 1738.31C2613.71 1740.87 2600.29 1744.38 2587.13 1748.82L2568.41 1694.97C2585.51 1688.48 2603.54 1683.52 2622.52 1680.1C2641.49 1676.51 2658.84 1674.72 2674.57 1674.72C2714.57 1674.72 2744.4 1682.84 2764.06 1699.08C2783.71 1715.32 2793.54 1739.25 2793.54 1770.87V1877.54ZM2666.36 1906.77C2675.59 1906.77 2684.91 1904.12 2694.31 1898.82C2703.71 1893.35 2710.81 1886 2715.59 1876.77V1832.67H2695.59C2673.37 1832.67 2656.88 1836.09 2646.11 1842.92C2635.34 1849.76 2629.95 1859.93 2629.95 1873.44C2629.95 1884.03 2633.11 1892.24 2639.44 1898.05C2645.94 1903.86 2654.91 1906.77 2666.36 1906.77Z" style="fill: rgb(220, 27, 32);"/>
<path d="M862 1819C862 1848.27 838.271 1872 809 1872C779.729 1872 756 1848.27 756 1819C756 1789.73 779.729 1766 809 1766C838.271 1766 862 1789.73 862 1819Z" style="fill: rgb(219, 25, 31);"/>
<path d="M2215.5 1819C2215.5 1848.27 2191.77 1872 2162.5 1872C2133.23 1872 2109.5 1848.27 2109.5 1819C2109.5 1789.73 2133.23 1766 2162.5 1766C2191.77 1766 2215.5 1789.73 2215.5 1819Z" style="fill: rgb(219, 25, 31);"/>
<defs>
<linearGradient id="paint0_linear" x1="1499" y1="139" x2="1499" y2="1385.52" gradientUnits="userSpaceOnUse">
<stop stop-color="#E41F26"/>
<stop offset="1" stop-color="#B70000"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="151" height="20" role="img" aria-label="babashka: compatible"><title>babashka: compatible</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="151" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="80" height="20" fill="#555"/><rect x="80" width="71" height="20" fill="#97ca00"/><rect width="151" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><image x="5" y="3" width="14" height="14" xlink:href="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNDcyIDE0NzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTk1LjkxMSAxMTkzLjg5QzExMTAuOTMgMTExMi4zOCAxMTg2IDk3OC4yMDYgMTE4NiA4MjYuNUMxMTg2IDU3Ny45NzIgMTAxNCAyNTQuNSA3MzYgMTEzQzQ2MC41IDI2MiAyODYgNTc3Ljk3MiAyODYgODI2LjVDMjg2IDk3OC4yMDYgMzYxLjA3IDExMTIuMzggNDc2LjA4OSAxMTkzLjg5QzQ3MS45ODMgMTE5NC40NCA0NjcuOTQ5IDExOTUuMTQgNDY0IDExOTZDMzc2LjYxMSAxMjE1LjA3IDI3MCAxMzU5LjA1IDI3MCAxMzU5LjA1SDUzNEM1ODAuOTcyIDEzNTkuMDUgNjI1LjYzMSAxMzQxLjQxIDY2MC45NTYgMTMyMS42MkM2NzguMTE1IDEzNDQuMzIgNzA1LjM0NCAxMzU5IDczNiAxMzU5Qzc2Ni42NTYgMTM1OSA3OTMuODg1IDEzNDQuMzIgODExLjA0NCAxMzIxLjYyQzg0Ni4zNjkgMTM0MS40MSA4OTEuMDI4IDEzNTkuMDUgOTM4IDEzNTkuMDVIMTIwMkMxMjAyIDEzNTkuMDUgMTA5NS4zOSAxMjE1LjA3IDEwMDggMTE5NkMxMDA0LjA1IDExOTUuMTQgMTAwMC4wMiAxMTk0LjQ0IDk5NS45MTEgMTE5My44OVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4KPGNpcmNsZSBjeD0iNzM1LjUiIGN5PSI4NTIuNSIgcj0iMzExLjUiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00NDMgNzUwLjQxN0M2NjIgNzY1Ljg2NiA3OTEuMzgyIDcxMi4zODggODgxIDU3OS44ODFDODgxIDU3OS44ODEgNzA4LjI5MyA1MjEuNjQ5IDYwMy4yNDQgNTc5Ljg4MUM0OTguNTUgNjM3LjkxNiA0NDMgNzUwLjQxNyA0NDMgNzUwLjQxN1oiIGZpbGw9IiNCNEI0QjQiLz4KPHBhdGggZD0iTTEwMzkuOTkgNzQ4LjI4MkM5MTQuODYyIDczNC43NDUgODAzLjI2NCA2OTQuMTM1IDc1MCA1NDFDNzUwIDU0MSA4NjAuNjMzIDU2Ni4yNzIgOTcyLjM1NSA2NjguMTAxQzEwODguMzkgNzczLjg1NyAxMDM5Ljk5IDc0OC4yODIgMTAzOS45OSA3NDguMjgyWiIgZmlsbD0iI0I0QjRCNCIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgc3Ryb2tlPSIjMEEwMDAwIiBzdHJva2Utd2lkdGg9IjQwIi8+CjxwYXRoIGQ9Ik03OTcgNzE5SDY3NEw3MDQgNzQ5VjgzOUM3MDguNSA4MDkuNSA3NjQuNSA4MDguNSA3NjcuNSA4MzlMNzc1IDc0OUw3OTcgNzE5WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTM1MS4xMTcgNzU5QzM1MS4xMTcgNzM2LjkwOSAzNjkuMDI2IDcxOSAzOTEuMTE3IDcxOUg2NzYuMDE4QzcwMC4yIDcxOSA3MTguODUyIDc0MC4yOTIgNzE1LjY3IDc2NC4yNjRMNjkwLjkxIDk1MC43NjRDNjg4LjI3IDk3MC42NDYgNjcxLjMxNCA5ODUuNSA2NTEuMjU4IDk4NS41SDM5MS4xMTdDMzY5LjAyNiA5ODUuNSAzNTEuMTE3IDk2Ny41OTEgMzUxLjExNyA5NDUuNVY3NTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNNzU2LjAxMiA3NjQuMjY3Qzc1Mi44MjggNzQwLjI5NCA3NzEuNDgxIDcxOSA3OTUuNjY0IDcxOUgxMDgwQzExMDIuMDkgNzE5IDExMjAgNzM2LjkwOSAxMTIwIDc1OVY5NDUuMDk2QzExMjAgOTY3LjE4NyAxMTAyLjA5IDk4NS4wOTYgMTA4MCA5ODUuMDk2SDgyMC4zODFDODAwLjMyNSA5ODUuMDk2IDc4My4zNyA5NzAuMjQ0IDc4MC43MjkgOTUwLjM2Mkw3NTYuMDEyIDc2NC4yNjdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTAyNCA5NTJWOTIxLjQ3SDEwMTMuNzFDMTAwNy4wMyA5MjEuNDcgMTAwMi41OCA5MTYuNzUyIDEwMDAuMzUgOTA5LjgxM0w5NTguMDY0IDc4Mi42OTdDOTU1LjI4MiA3NzQuNjQ5IDk1MS45NDQgNzY4LjgyIDk0Ny40OTIgNzY0LjM3OUM5MzkuMTQ2IDc1NS43NzUgOTI4LjI5NiA3NTMgOTE2LjA1NCA3NTNIOTAyLjdWNzg0LjkxOEg5MTEuNjAzQzkxOS4xMTUgNzg0LjkxOCA5MjQuOTU3IDc4Ny42OTMgOTI3LjQ2MSA3OTYuNTc1TDkzMy4zMDMgODE3LjExM0w4ODEgOTUySDkxOS4xMTVMOTUwLjU1MyA4NjMuMTg1TDk2Ny4yNDUgOTE2Ljc1MkM5NzMuNjQ0IDkzNy41NjggOTg0LjQ5NCA5NTIgMTAwOC45OCA5NTJIMTAyNFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OTAgOTUyVjkyMS40N0g1NzkuNzA2QzU3My4wMjkgOTIxLjQ3IDU2OC41NzggOTE2Ljc1MiA1NjYuMzUyIDkwOS44MTNMNTI0LjA2NCA3ODIuNjk3QzUyMS4yODIgNzc0LjY0OSA1MTcuOTQ0IDc2OC44MiA1MTMuNDkyIDc2NC4zNzlDNTA1LjE0NiA3NTUuNzc1IDQ5NC4yOTYgNzUzIDQ4Mi4wNTQgNzUzSDQ2OC43Vjc4NC45MThINDc3LjYwM0M0ODUuMTE1IDc4NC45MTggNDkwLjk1NyA3ODcuNjkzIDQ5My40NjEgNzk2LjU3NUw0OTkuMzAzIDgxNy4xMTNMNDQ3IDk1Mkg0ODUuMTE1TDUxNi41NTMgODYzLjE4NUw1MzMuMjQ1IDkxNi43NTJDNTM5LjY0NCA5MzcuNTY4IDU1MC40OTQgOTUyIDU3NC45NzcgOTUySDU5MFoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSI3NTIiIHkxPSIxMTMiIHgyPSI3NTIiIHkyPSIxMzU5LjUyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNFNDFGMjYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQjcwMDAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="/><text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">babashka</text><text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="530">babashka</text><text aria-hidden="true" x="1145" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="610">compatible</text><text x="1145" y="140" transform="scale(.1)" fill="#fff" textLength="610">compatible</text></g></svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="129" height="20" role="img" aria-label="babashka: built-in"><title>babashka: built-in</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="129" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="80" height="20" fill="#555"/><rect x="80" width="49" height="20" fill="#97ca00"/><rect width="129" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><image x="5" y="3" width="14" height="14" xlink:href="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDE0NzIgMTQ3MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05OTUuOTExIDExOTMuODlDMTExMC45MyAxMTEyLjM4IDExODYgOTc4LjIwNiAxMTg2IDgyNi41QzExODYgNTc3Ljk3MiAxMDE0IDI1NC41IDczNiAxMTNDNDYwLjUgMjYyIDI4NiA1NzcuOTcyIDI4NiA4MjYuNUMyODYgOTc4LjIwNiAzNjEuMDcgMTExMi4zOCA0NzYuMDg5IDExOTMuODlDNDcxLjk4MyAxMTk0LjQ0IDQ2Ny45NDkgMTE5NS4xNCA0NjQgMTE5NkMzNzYuNjExIDEyMTUuMDcgMjcwIDEzNTkuMDUgMjcwIDEzNTkuMDVINTM0QzU4MC45NzIgMTM1OS4wNSA2MjUuNjMxIDEzNDEuNDEgNjYwLjk1NiAxMzIxLjYyQzY3OC4xMTUgMTM0NC4zMiA3MDUuMzQ0IDEzNTkgNzM2IDEzNTlDNzY2LjY1NiAxMzU5IDc5My44ODUgMTM0NC4zMiA4MTEuMDQ0IDEzMjEuNjJDODQ2LjM2OSAxMzQxLjQxIDg5MS4wMjggMTM1OS4wNSA5MzggMTM1OS4wNUgxMjAyQzEyMDIgMTM1OS4wNSAxMDk1LjM5IDEyMTUuMDcgMTAwOCAxMTk2QzEwMDQuMDUgMTE5NS4xNCAxMDAwLjAyIDExOTQuNDQgOTk1LjkxMSAxMTkzLjg5WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyKSIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTQ0MyA3NTAuNDE3QzY2MiA3NjUuODY2IDc5MS4zODIgNzEyLjM4OCA4ODEgNTc5Ljg4MUM4ODEgNTc5Ljg4MSA3MDguMjkzIDUyMS42NDkgNjAzLjI0NCA1NzkuODgxQzQ5OC41NSA2MzcuOTE2IDQ0MyA3NTAuNDE3IDQ0MyA3NTAuNDE3WiIgZmlsbD0iI0I0QjRCNCIvPgo8cGF0aCBkPSJNMTAzOS45OSA3NDguMjgyQzkxNC44NjIgNzM0Ljc0NSA4MDMuMjY0IDY5NC4xMzUgNzUwIDU0MUM3NTAgNTQxIDg2MC42MzMgNTY2LjI3MiA5NzIuMzU1IDY2OC4xMDFDMTA4OC4zOSA3NzMuODU3IDEwMzkuOTkgNzQ4LjI4MiAxMDM5Ljk5IDc0OC4yODJaIiBmaWxsPSIjQjRCNEI0Ii8+CjxjaXJjbGUgY3g9IjczNS41IiBjeT0iODUyLjUiIHI9IjMxMS41IiBzdHJva2U9IiMwQTAwMDAiIHN0cm9rZS13aWR0aD0iNDAiLz4KPHBhdGggZD0iTTc5NyA3MTlINjc0TDcwNCA3NDlWODM5QzcwOC41IDgwOS41IDc2NC41IDgwOC41IDc2Ny41IDgzOUw3NzUgNzQ5TDc5NyA3MTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMzUxLjExNyA3NTlDMzUxLjExNyA3MzYuOTA5IDM2OS4wMjYgNzE5IDM5MS4xMTcgNzE5SDY3Ni4wMThDNzAwLjIgNzE5IDcxOC44NTIgNzQwLjI5MiA3MTUuNjcgNzY0LjI2NEw2OTAuOTEgOTUwLjc2NEM2ODguMjcgOTcwLjY0NiA2NzEuMzE0IDk4NS41IDY1MS4yNTggOTg1LjVIMzkxLjExN0MzNjkuMDI2IDk4NS41IDM1MS4xMTcgOTY3LjU5MSAzNTEuMTE3IDk0NS41Vjc1OVoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik03NTYuMDEyIDc2NC4yNjdDNzUyLjgyOCA3NDAuMjk0IDc3MS40ODEgNzE5IDc5NS42NjQgNzE5SDEwODBDMTEwMi4wOSA3MTkgMTEyMCA3MzYuOTA5IDExMjAgNzU5Vjk0NS4wOTZDMTEyMCA5NjcuMTg3IDExMDIuMDkgOTg1LjA5NiAxMDgwIDk4NS4wOTZIODIwLjM4MUM4MDAuMzI1IDk4NS4wOTYgNzgzLjM3IDk3MC4yNDQgNzgwLjcyOSA5NTAuMzYyTDc1Ni4wMTIgNzY0LjI2N1oiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0xMDI0IDk1MlY5MjEuNDdIMTAxMy43MUMxMDA3LjAzIDkyMS40NyAxMDAyLjU4IDkxNi43NTIgMTAwMC4zNSA5MDkuODEzTDk1OC4wNjQgNzgyLjY5N0M5NTUuMjgyIDc3NC42NDkgOTUxLjk0NCA3NjguODIgOTQ3LjQ5MiA3NjQuMzc5QzkzOS4xNDYgNzU1Ljc3NSA5MjguMjk2IDc1MyA5MTYuMDU0IDc1M0g5MDIuN1Y3ODQuOTE4SDkxMS42MDNDOTE5LjExNSA3ODQuOTE4IDkyNC45NTcgNzg3LjY5MyA5MjcuNDYxIDc5Ni41NzVMOTMzLjMwMyA4MTcuMTEzTDg4MSA5NTJIOTE5LjExNUw5NTAuNTUzIDg2My4xODVMOTY3LjI0NSA5MTYuNzUyQzk3My42NDQgOTM3LjU2OCA5ODQuNDk0IDk1MiAxMDA4Ljk4IDk1MkgxMDI0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU5MCA5NTJWOTIxLjQ3SDU3OS43MDZDNTczLjAyOSA5MjEuNDcgNTY4LjU3OCA5MTYuNzUyIDU2Ni4zNTIgOTA5LjgxM0w1MjQuMDY0IDc4Mi42OTdDNTIxLjI4MiA3NzQuNjQ5IDUxNy45NDQgNzY4LjgyIDUxMy40OTIgNzY0LjM3OUM1MDUuMTQ2IDc1NS43NzUgNDk0LjI5NiA3NTMgNDgyLjA1NCA3NTNINDY4LjdWNzg0LjkxOEg0NzcuNjAzQzQ4NS4xMTUgNzg0LjkxOCA0OTAuOTU3IDc4Ny42OTMgNDkzLjQ2MSA3OTYuNTc1TDQ5OS4zMDMgODE3LjExM0w0NDcgOTUySDQ4NS4xMTVMNTE2LjU1MyA4NjMuMTg1TDUzMy4yNDUgOTE2Ljc1MkM1MzkuNjQ0IDkzNy41NjggNTUwLjQ5NCA5NTIgNTc0Ljk3NyA5NTJINTkwWiIgZmlsbD0id2hpdGUiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9Ijc1MiIgeTE9IjExMyIgeDI9Ijc1MiIgeTI9IjEzNTkuNTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0U0MUYyNiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNCNzAwMDAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K"/><text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">babashka</text><text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="530">babashka</text><text aria-hidden="true" x="1035" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="390">built-in</text><text x="1035" y="140" transform="scale(.1)" fill="#fff" textLength="390">built-in</text></g></svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

2
pods

@ -1 +1 @@
Subproject commit 717cef7af5cb1c1b091bd10e012b2e71b7b8b9bc
Subproject commit c2d6ba847c53b1f6b7986b166a8a4d7dda97db83

@ -1 +1 @@
Subproject commit 2058c79fb63f80ca71917432eddea73e0c58717c
Subproject commit 6bcef6ea7ce4c60b9b66f4028d97f5df93b02b3d

View file

@ -11,41 +11,33 @@
"babashka.core/src"
"babashka.nrepl/src" "depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources"
"impl-java/src"]
"reify/src"]
;; for debugging Reflector.java code:
;; :java-source-paths ["sci/reflector/src-java"]
:java-source-paths ["src-java"]
:resource-paths ["resources" "sci/resources"]
:test-selectors {:default (complement (some-fn :windows-only :flaky))
:windows (complement (some-fn :skip-windows :flaky))
:non-flaky (complement :flaky)
:flaky :flaky}
:jvm-opts ["--enable-preview"]
:dependencies [[org.clojure/clojure "1.12.0"]
[borkdude/edamame "1.4.30"]
[org.clojure/tools.cli "1.0.214"]
[cheshire "6.0.0"]
[nrepl/bencode "1.2.0"]
[borkdude/sci.impl.reflector "0.0.4"]
:test-selectors {:default (complement :windows-only)
:windows (complement :skip-windows)}
:dependencies [[org.clojure/clojure "1.11.0"]
[borkdude/edamame "1.0.0"]
[borkdude/graal.locking "0.0.2"]
[org.clojure/tools.cli "1.0.206"]
[cheshire "5.10.2"]
[nrepl/bencode "1.1.0"]
[borkdude/sci.impl.reflector "0.0.1"]
[org.babashka/sci.impl.types "0.0.2"]
[org.babashka/babashka.impl.java "0.1.10"]
[org.clojure/core.async "1.8.741"]
[org.babashka/babashka.impl.reify "0.1.0"]
[org.clojure/core.async "1.5.648"]
[org.clojure/test.check "1.1.1"]
[com.github.clj-easy/graal-build-time "0.1.0"]
[rewrite-clj/rewrite-clj "1.1.49"]
[insn/insn "0.5.2"]
[org.babashka/cli "0.8.65"]
[org.babashka/http-client "0.4.22"]
[org.jsoup/jsoup "1.20.1"]
[borkdude/graal.locking "0.0.2"]]
[rewrite-clj/rewrite-clj "1.0.699-alpha"]
[insn/insn "0.5.2"]]
:plugins [[org.kipz/lein-meta-bom "0.1.1"]]
:metabom {:jar-name "metabom.jar"}
:profiles {:feature/xml {:source-paths ["feature-xml"]
:dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]}
:dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]}
:feature/yaml {:source-paths ["feature-yaml"]
:dependencies [[clj-commons/clj-yaml "1.0.29"
:exclusions [org.flatland/ordered]#_#_clj-commons/clj-yaml "0.7.110"]
[org.flatland/ordered "1.15.12"]]}
:dependencies [[clj-commons/clj-yaml "0.7.108"]]}
:feature/jdbc {:source-paths ["feature-jdbc"]
:dependencies [[seancorfield/next.jdbc "1.1.610"]]}
:feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}]
@ -56,25 +48,25 @@
:feature/csv {:source-paths ["feature-csv"]
:dependencies [[org.clojure/data.csv "1.0.0"]]}
:feature/transit {:source-paths ["feature-transit"]
:dependencies [[com.cognitect/transit-clj "1.0.333"]]}
:dependencies [[com.cognitect/transit-clj "1.0.329"]]}
:feature/datascript {:source-paths ["feature-datascript"]
:dependencies [[datascript "1.3.10"]]}
:feature/httpkit-client {:source-paths ["feature-httpkit-client"]
:dependencies [[http-kit "2.8.0-RC1"]]}
:dependencies [[http-kit "2.5.3"]]}
:feature/httpkit-server {:source-paths ["feature-httpkit-server"]
:dependencies [[http-kit "2.8.0-RC1"]]}
:dependencies [[http-kit "2.5.3"]]}
:feature/lanterna {:source-paths ["feature-lanterna"]
:dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]}
:feature/core-match {:source-paths ["feature-core-match"]
:dependencies [[org.clojure/core.match "1.0.0"]]}
:feature/hiccup {:source-paths ["feature-hiccup"]
:dependencies [[hiccup/hiccup "2.0.0-RC1"]]}
:dependencies [[hiccup/hiccup "2.0.0-alpha2"]]}
:feature/test-check {:source-paths ["feature-test-check"]}
:feature/spec-alpha {:source-paths ["feature-spec-alpha"]}
:feature/selmer {:source-paths ["feature-selmer"]
:dependencies [[selmer/selmer "1.12.59"]]}
:dependencies [[selmer/selmer "1.12.50"]]}
:feature/logging {:source-paths ["feature-logging"]
:dependencies [[com.taoensso/timbre "6.6.0"]
:dependencies [[com.taoensso/timbre "5.2.1"]
[org.clojure/tools.logging "1.1.0"]]}
:feature/priority-map {:source-paths ["feature-priority-map"]
:dependencies [[org.clojure/data.priority-map "1.1.0"]]}
@ -98,10 +90,8 @@
:feature/logging
:feature/priority-map
:feature/rrb-vector
{:dependencies [[borkdude/rewrite-edn "0.4.6"]
[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
[com.opentable.components/otj-pg-embedded "0.13.3"]
[nubank/matcher-combinators "3.6.0"]]}]
{:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
[com.opentable.components/otj-pg-embedded "0.13.3"]]}]
:uberjar {:global-vars {*assert* false}
:jvm-opts ["-Dclojure.compiler.direct-linking=true"
"-Dclojure.spec.skip-macros=true"

View file

@ -2,8 +2,8 @@
(:require [build.reify2 :as reify2]
[clojure.tools.build.api :as b]))
(def lib 'org.babashka/babashka.impl.java)
(def version "0.1.10")
(def lib 'org.babashka/babashka.impl.reify)
(def version "0.1.0")
(def class-dir "target/classes")
(def basis (b/create-basis {:project "deps.edn"}))
(def jar-file (format "target/%s-%s.jar" (name lib) version))
@ -14,25 +14,13 @@
(defn gen-classes [_]
(reify2/gen-classes nil))
(defn compile-java [_]
(b/javac {:src-dirs ["src-java"]
:class-dir class-dir
:basis basis
:javac-opts ["--release" "8"]}))
(defn jar [_]
(compile-java nil)
(gen-classes nil)
(b/write-pom {:class-dir class-dir
:lib lib
:version version
:basis basis
:src-dirs ["src"]
:pom-data
[[:licenses
[:license
[:name "MIT License"]
[:url "https://opensource.org/license/mit/"]]]]})
:src-dirs ["src"]})
(b/copy-dir {:src-dirs ["src"]
:target-dir class-dir})
(b/jar {:class-dir class-dir

View file

@ -2,7 +2,7 @@
:aliases
{:build ;; added by neil
{:paths ["." "build" "src"]
:deps {io.github.clojure/tools.build {:git/tag "v0.9.6" :git/sha "8e78bcc"}
:deps {io.github.clojure/tools.build {:git/tag "v0.8.1" :git/sha "7d40500"}
slipset/deps-deploy {:mvn/version "0.2.0"}
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
;; insn/insn {:mvn/version "0.5.3"}

View file

@ -45,26 +45,8 @@
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20))
(applyTo [this arglist] (apply-fn this arglist)))))
(defn reify-object [m]
(let [methods (:methods m)
toString-fn (or (get methods 'toString)
(fn [this]
(str
(.getName (.getClass this))
"@"
(Integer/toHexString (.hashCode this)))))]
(reify
sci.impl.types.IReified
(getMethods [_] (:methods m))
(getInterfaces [_] (:interfaces m))
(getProtocols [_] (:protocols m))
java.lang.Object
(toString [this] (toString-fn this)))))
(defmacro gen-reify-fn []
`(fn [~'m]
(when (> (count (:interfaces ~'m)) 1)
(throw (UnsupportedOperationException. "babashka reify only supports implementing a single interface")))
(if (empty? (:interfaces ~'m))
(reify
sci.impl.types.IReified
@ -73,12 +55,19 @@
(getProtocols [_] (:protocols ~'m)))
(case (.getName ~(with-meta `(first (:interfaces ~'m))
{:tag 'Class}))
"java.lang.Object"
(reify
java.lang.Object
(toString [~'this]
((method-or-bust (:methods ~'m) (quote ~'toString)) ~'this))
sci.impl.types.IReified
(getMethods [_] (:methods ~'m))
(getInterfaces [_] (:interfaces ~'m))
(getProtocols [_] (:protocols ~'m)))
~@(mapcat identity
(cons
["clojure.lang.IFn"
`(reify-ifn ~'m)
"java.lang.Object"
`(reify-object ~'m)]
`(reify-ifn ~'m)]
(for [i interfaces]
(let [in (.getName ^Class i)]
[in

View file

@ -1,7 +1,6 @@
(ns babashka.impl.reify2.interfaces)
(def interfaces [java.nio.file.FileVisitor
java.nio.file.DirectoryStream$Filter
java.io.FileFilter
java.io.FilenameFilter
clojure.lang.Associative
@ -20,19 +19,12 @@
clojure.lang.Reversible
clojure.lang.Seqable
java.lang.Iterable
java.lang.Runnable
java.net.http.WebSocket$Listener
java.util.Iterator
java.util.function.Consumer
java.util.function.BiConsumer
java.util.function.Function
java.util.function.BiFunction
java.util.function.Predicate
java.util.function.Supplier
java.lang.Comparable
javax.net.ssl.X509TrustManager
clojure.lang.LispReader$Resolver
sun.misc.SignalHandler
java.util.concurrent.ThreadFactory
java.lang.Thread$UncaughtExceptionHandler
java.util.concurrent.Callable])
clojure.lang.LispReader$Resolver])

View file

@ -1 +1 @@
1.12.200
0.8.2

View file

@ -1 +1 @@
1.12.201-SNAPSHOT
0.8.3-SNAPSHOT

View file

@ -10,49 +10,43 @@
"feature-selmer"
"feature-logging"
"feature-priority-map"
"feature-rrb-vector"
"feature-jdbc"
"pods/src"
"babashka.nrepl/src"
"depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources"
"resources" "sci/resources"
"impl-java/src"],
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
"resources" "sci/resources"],
:deps {org.clojure/clojure {:mvn/version "1.11.0"},
org.babashka/sci {:local/root "sci"}
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
org.babashka/babashka.impl.reify {:mvn/version "0.0.7"}
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
babashka/babashka.curl {:local/root "babashka.curl"}
babashka/fs {:local/root "fs"}
babashka/babashka.core {:local/root "babashka.core"}
org.clojure/core.async {:mvn/version "1.8.741"},
org.clojure/tools.cli {:mvn/version "1.0.214"},
borkdude/graal.locking {:mvn/version "0.0.2"},
org.clojure/core.async {:mvn/version "1.5.648"},
org.clojure/tools.cli {:mvn/version "1.0.206"},
org.clojure/data.csv {:mvn/version "1.0.0"},
cheshire/cheshire {:mvn/version "6.0.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
clj-commons/clj-yaml {:mvn/version "1.0.29"}
com.cognitect/transit-clj {:mvn/version "1.0.333"}
cheshire/cheshire {:mvn/version "5.10.2"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"}
clj-commons/clj-yaml {:mvn/version "0.7.108"}
com.cognitect/transit-clj {:mvn/version "1.0.329"}
org.clojure/test.check {:mvn/version "1.1.1"}
nrepl/bencode {:mvn/version "1.2.0"}
nrepl/bencode {:mvn/version "1.1.0"}
seancorfield/next.jdbc {:mvn/version "1.1.610"}
org.postgresql/postgresql {:mvn/version "42.2.18"}
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
datascript/datascript {:mvn/version "1.0.1"}
http-kit/http-kit {:mvn/version "2.8.0-RC1"}
http-kit/http-kit {:mvn/version "2.5.3"}
babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"}
org.clojure/core.match {:mvn/version "1.0.0"}
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
selmer/selmer {:mvn/version "1.12.59"}
com.taoensso/timbre {:mvn/version "6.6.0"}
hiccup/hiccup {:mvn/version "2.0.0-alpha2"}
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"}
selmer/selmer {:mvn/version "1.12.50"}
com.taoensso/timbre {:mvn/version "5.2.1"}
org.clojure/tools.logging {:mvn/version "1.1.0"}
org.clojure/data.priority-map {:mvn/version "1.1.0"}
insn/insn {:mvn/version "0.5.2"}
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}
org.babashka/cli {:mvn/version "0.8.65"}
org.babashka/http-client {:mvn/version "0.4.22"}
org.flatland/ordered {:mvn/version "1.15.12"}
org.jsoup/jsoup {:mvn/version "1.20.1"}}
insn/insn {:mvn/version "0.5.2"}}
:aliases {:babashka/dev
{:main-opts ["-m" "babashka.main"]}
:profile
@ -65,8 +59,8 @@
:lib-tests
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
#_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
lambdaisland/regal {:mvn/version "0.0.143"}
cprop/cprop {:mvn/version "0.1.16"}
comb/comb {:mvn/version "0.1.1"}
@ -108,22 +102,20 @@
exoscale/coax {:mvn/version "1.0.0-alpha14"}
orchestra/orchestra {:mvn/version "2021.01.01-1"}
expound/expound {:mvn/version "0.8.10"}
integrant/integrant {:git/url "https://github.com/weavejester/integrant", :git/sha "a9fd7c02bd7201f36344b47142badc3c3ef22f88"}
integrant/integrant {:mvn/version "0.8.0"}
com.stuartsierra/dependency {:mvn/version "1.0.0"}
listora/again {:mvn/version "1.0.0"}
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
environ/environ {:mvn/version "1.2.0"}
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32",
:git/url "https://github.com/clojure/tools.namespace"}
org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
medley/medley {:mvn/version "1.3.0"}
io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner",
:git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"}
io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"}
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
testdoc/testdoc {:mvn/version "1.4.1"}
org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}
org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"}
borkdude/rewrite-edn {:mvn/version "0.1.0"}
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
io.aviso/pretty {:mvn/version "1.1.1"}
@ -142,43 +134,7 @@
aysylu/loom {:mvn/version "1.0.2"}
com.layerware/hugsql-core {:mvn/version "0.5.3"}
com.github.seancorfield/expectations {:mvn/version "2.0.157"}
com.rpl/specter {:mvn/version "1.1.4"}
com.github.askonomm/clarktown {:mvn/version "1.1.2"}
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}
prismatic/schema {:git/url "https://github.com/plumatic/schema"
:git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
:git/tag "schema-1.3.0"}
metosin/malli {:git/url "https://github.com/metosin/malli"
:git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99"
:git/tag "0.8.9"}
meander/epsilon {:git/url "https://github.com/noprompt/meander"
:git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"}
cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex"
:git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a"
:deps/manifest :deps}
exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor"
:git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e"
:deps/manifest :deps}
lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri"
:git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"
:deps/manifest :deps}
clj-commons/fs {:mvn/version "1.6.310"}
postmortem/postmortem {:git/url "https://github.com/athos/Postmortem"
:git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}
com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj"
:git/sha "4a92e772b4e07bf127423448d4140748b5782198"
:deps/manifest :deps}
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
:deps/manifest :deps}
prismatic/plumbing {:git/url "https://github.com/plumatic/plumbing",
:git/sha "424bc704f2db422de34269c139a5494314b3a43b"}
org.clj-commons/hickory {:git/url "https://github.com/clj-commons/hickory"
:git/sha "9385b6708ef35f161732d8464b3a3aa57dd79f30"}
com.potetm/fusebox {:git/url "https://github.com/potetm/fusebox"
:git/sha "ac6d6a0a69510b009b3c1bb2247cd110fd9f7246"}
net.sekao/odoyle-rules {:git/url "https://github.com/oakes/odoyle-rules"
:git/sha "0b1d825ec45a998c4d3481dfb292e08ce6a47f0b"}}
com.rpl/specter {:mvn/version "1.1.4"}}
:classpath-overrides {org.clojure/clojure nil
org.clojure/spec.alpha nil}}
:clj-nvd
@ -188,11 +144,9 @@
:test
{:extra-paths ["test"]
:extra-deps {io.github.cognitect-labs/test-runner
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}
nubank/matcher-combinators {:mvn/version "3.6.0"}}
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
:main-opts ["-m" "cognitect.test-runner"]
:exec-fn cognitect.test-runner.api/test}
:test-pod
{:extra-paths ["test-resources"]
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
;; release

View file

@ -4,17 +4,15 @@ Args=-H:+ReportExceptionStackTraces \
-J-Dborkdude.dynaload.aot=true \
-H:IncludeResources=BABASHKA_VERSION \
-H:IncludeResources=META-INF/babashka/.* \
-H:IncludeResources=src/babashka/.* \
-H:IncludeResources=SCI_VERSION \
-H:Log=registerResource:3 \
--enable-url-protocols=http,https,jar,unix \
-H:Log=registerResource: \
-H:EnableURLProtocols=http,https,jar \
--enable-all-security-services \
-H:+JNI \
--no-server \
--report-unsupported-elements-at-runtime \
--initialize-at-build-time=com.fasterxml.jackson \
--initialize-at-build-time=java.sql.SQLException \
--initialize-at-build-time=org.yaml.snakeyaml \
--initialize-at-run-time=org.postgresql.sspi.SSPIClient \
--initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \
-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \
@ -26,32 +24,4 @@ Args=-H:+ReportExceptionStackTraces \
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader \
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter \
-H:ServiceLoaderFeatureExcludeServices=java.net.ContentHandlerFactory \
-H:ServiceLoaderFeatureExcludeServices=java.nio.charset.spi.CharsetProvider \
-EBABASHKA_STATIC \
-EBABASHKA_MUSL \
-EBABASHKA_FEATURE_YAML \
-EBABASHKA_FEATURE_XML \
-EBABASHKA_FEATURE_CSV \
-EBABASHKA_FEATURE_TRANSIT \
-EBABASHKA_FEATURE_JAVA_TIME \
-EBABASHKA_FEATURE_JAVA_NET_HTTP \
-EBABASHKA_FEATURE_JAVA_NIO \
-EBABASHKA_FEATURE_HTTPKIT_CLIENT \
-EBABASHKA_FEATURE_HTTPKIT_SERVER \
-EBABASHKA_FEATURE_CORE_MATCH \
-EBABASHKA_FEATURE_HICCUP \
-EBABASHKA_FEATURE_TEST_CHECK \
-EBABASHKA_FEATURE_SELMER \
-EBABASHKA_FEATURE_LOGGING \
-EBABASHKA_FEATURE_PRIORITY_MAP \
-EBABASHKA_FEATURE_JDBC \
-EBABASHKA_FEATURE_SQLITE \
-EBABASHKA_FEATURE_POSTGRESQL \
-EBABASHKA_FEATURE_ORACLEDB \
-EBABASHKA_FEATURE_HSQLDB \
-EBABASHKA_FEATURE_DATASCRIPT \
-EBABASHKA_FEATURE_LANTERNA \
-EBABASHKA_FEATURE_SPEC_ALPHA \
-EBABASHKA_FEATURE_RRB_VECTOR \
-EBABASHKA_REQUIRE_SCAN \
-EBABASHKA_SHA
-H:ServiceLoaderFeatureExcludeServices=java.nio.charset.spi.CharsetProvider

View file

@ -1,31 +0,0 @@
[{
"interfaces": [
"java.util.function.Predicate"
]
},
{
"interfaces": [
"java.util.function.Function"
]
},
{
"interfaces": [
"java.io.FileFilter"
]
},
{
"interfaces": [
"java.nio.file.DirectoryStream$Filter"
]
},
{
"interfaces": [
"java.util.function.Supplier"
]
},
{
"interfaces": [
"java.util.function.UnaryOperator"
]
}
]

View file

@ -1,55 +0,0 @@
/*
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessControlContext;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.WeakHashMap;
import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;
@TargetClass(URLClassLoader.class)
@SuppressWarnings({"unused", "static-method"})
final class Target_java_net_URLClassLoader {
@Alias//
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.NewInstance, declClass = WeakHashMap.class)//
private WeakHashMap<Closeable, Void> closeables;
@Substitute
public InputStream getResourceAsStream(String name) throws IOException {
System.out.println("getResource");
return null;
// return Resources.createInputStream(name);
}
}

View file

@ -1,31 +0,0 @@
(ns clojure.repl.deps
(:require [babashka.deps :as deps]))
(defn add-libs
"Given lib-coords, a map of lib to coord, will resolve all transitive deps for the libs
together and add them to the repl classpath, unlike separate calls to add-lib."
{:added "1.12"}
[lib-coords]
(deps/add-deps {:deps lib-coords})
nil)
(defn add-lib
"Given a lib that is not yet on the repl classpath, make it available by
downloading the library if necessary and adding it to the classloader.
Libs already on the classpath are not updated. Requires a valid parent
DynamicClassLoader.
lib - symbol identifying a library, for Maven: groupId/artifactId
coord - optional map of location information specific to the procurer,
or latest if not supplied
Returns coll of libs loaded, including transitive (or nil if none).
For info on libs, coords, and versions, see:
https://clojure.org/reference/deps_and_cli"
{:added "1.12"}
([lib coord]
(add-libs {lib coord}))
([lib]
(throw (ex-info "add-lib without explicit version isn't supported in babashka (yet)" {:lib lib}))))

File diff suppressed because it is too large Load diff

View file

@ -1,227 +0,0 @@
; Copyright (c) Rich Hickey. All rights reserved.
; The use and distribution terms for this software are covered by the
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
; which can be found in the file epl-v10.html at the root of this distribution.
; By using this software in any fashion, you are agreeing to be bound by
; the terms of this license.
; You must not remove this notice, or any other, from this software.
(ns clojure.spec.gen.alpha
(:refer-clojure :exclude [boolean bytes cat hash-map list map not-empty set vector
char double int keyword symbol string uuid delay shuffle]))
(alias 'c 'clojure.core)
(defonce ^:private dynalock (Object.))
(defn- dynaload
[s]
(let [ns (namespace s)]
(assert ns)
(locking dynalock
(require (c/symbol ns)))
(let [v (resolve s)]
(if v
@v
(throw (RuntimeException. (str "Var " s " is not on the classpath")))))))
(def ^:private quick-check-ref
(c/delay (dynaload 'clojure.test.check/quick-check)))
(defn quick-check
[& args]
(apply @quick-check-ref args))
(def ^:private for-all*-ref
(c/delay (dynaload 'clojure.test.check.properties/for-all*)))
(defn for-all*
"Dynamically loaded clojure.test.check.properties/for-all*."
[& args]
(apply @for-all*-ref args))
(let [g? (c/delay (dynaload 'clojure.test.check.generators/generator?))
g (c/delay (dynaload 'clojure.test.check.generators/generate))
mkg (c/delay (dynaload 'clojure.test.check.generators/->Generator))]
(defn- generator?
[x]
(@g? x))
(defn- generator
[gfn]
(@mkg gfn))
(defn generate
"Generate a single value using generator."
[generator]
(@g generator)))
(defn ^:skip-wiki delay-impl
[gfnd]
;;N.B. depends on test.check impl details
(generator (fn [rnd size]
((:gen @gfnd) rnd size))))
(defmacro delay
"given body that returns a generator, returns a
generator that delegates to that, but delays
creation until used."
[& body]
`(delay-impl (c/delay ~@body)))
(defn gen-for-name
"Dynamically loads test.check generator named s."
[s]
(let [g (dynaload s)]
(if (generator? g)
g
(throw (RuntimeException. (str "Var " s " is not a generator"))))))
(defmacro ^:skip-wiki lazy-combinator
"Implementation macro, do not call directly."
[s]
(let [fqn (c/symbol "clojure.test.check.generators" (name s))
doc (str "Lazy loaded version of " fqn)]
`(let [g# (c/delay (dynaload '~fqn))]
(defn ~s
~doc
[& ~'args]
(apply @g# ~'args)))))
(defmacro ^:skip-wiki lazy-combinators
"Implementation macro, do not call directly."
[& syms]
`(do
~@(c/map
(fn [s] (c/list 'lazy-combinator s))
syms)))
(lazy-combinators hash-map list map not-empty set vector vector-distinct fmap elements
bind choose fmap one-of such-that tuple sample return
large-integer* double* frequency shuffle)
(defmacro ^:skip-wiki lazy-prim
"Implementation macro, do not call directly."
[s]
(let [fqn (c/symbol "clojure.test.check.generators" (name s))
doc (str "Fn returning " fqn)]
`(let [g# (c/delay (dynaload '~fqn))]
(defn ~s
~doc
[& ~'args]
@g#))))
(defmacro ^:skip-wiki lazy-prims
"Implementation macro, do not call directly."
[& syms]
`(do
~@(c/map
(fn [s] (c/list 'lazy-prim s))
syms)))
(lazy-prims any any-printable boolean bytes char char-alpha char-alphanumeric char-ascii double
int keyword keyword-ns large-integer ratio simple-type simple-type-printable
string string-ascii string-alphanumeric symbol symbol-ns uuid)
(defn cat
"Returns a generator of a sequence catenated from results of
gens, each of which should generate something sequential."
[& gens]
(fmap #(apply concat %)
(apply tuple gens)))
(defn- qualified? [ident] (not (nil? (namespace ident))))
(def ^:private
gen-builtins
(c/delay
(let [simple (simple-type-printable)]
{any? (one-of [(return nil) (any-printable)])
some? (such-that some? (any-printable))
number? (one-of [(large-integer) (double)])
integer? (large-integer)
int? (large-integer)
pos-int? (large-integer* {:min 1})
neg-int? (large-integer* {:max -1})
nat-int? (large-integer* {:min 0})
float? (double)
double? (double)
boolean? (boolean)
string? (string-alphanumeric)
ident? (one-of [(keyword-ns) (symbol-ns)])
simple-ident? (one-of [(keyword) (symbol)])
qualified-ident? (such-that qualified? (one-of [(keyword-ns) (symbol-ns)]))
keyword? (keyword-ns)
simple-keyword? (keyword)
qualified-keyword? (such-that qualified? (keyword-ns))
symbol? (symbol-ns)
simple-symbol? (symbol)
qualified-symbol? (such-that qualified? (symbol-ns))
uuid? (uuid)
uri? (fmap #(java.net.URI/create (str "http://" % ".com")) (uuid))
decimal? (fmap #(BigDecimal/valueOf %)
(double* {:infinite? false :NaN? false}))
inst? (fmap #(java.util.Date. %)
(large-integer))
seqable? (one-of [(return nil)
(list simple)
(vector simple)
(map simple simple)
(set simple)
(string-alphanumeric)])
indexed? (vector simple)
map? (map simple simple)
vector? (vector simple)
list? (list simple)
seq? (list simple)
char? (char)
set? (set simple)
nil? (return nil)
false? (return false)
true? (return true)
zero? (return 0)
rational? (one-of [(large-integer) (ratio)])
coll? (one-of [(map simple simple)
(list simple)
(vector simple)
(set simple)])
empty? (elements [nil '() [] {} #{}])
associative? (one-of [(map simple simple) (vector simple)])
sequential? (one-of [(list simple) (vector simple)])
ratio? (such-that ratio? (ratio))
bytes? (bytes)})))
(defn gen-for-pred
"Given a predicate, returns a built-in generator if one exists."
[pred]
(if (set? pred)
(elements pred)
(get @gen-builtins pred)))
(comment
(require :reload 'clojure.spec.gen.alpha)
(in-ns 'clojure.spec.gen.alpha)
;; combinators, see call to lazy-combinators above for complete list
(generate (one-of [(gen-for-pred integer?) (gen-for-pred string?)]))
(generate (such-that #(< 10000 %) (gen-for-pred integer?)))
(let [reqs {:a (gen-for-pred number?)
:b (gen-for-pred ratio?)}
opts {:c (gen-for-pred string?)}]
(generate (bind (choose 0 (count opts))
#(let [args (concat (seq reqs) (c/shuffle (seq opts)))]
(->> args
(take (+ % (count reqs)))
(mapcat identity)
(apply hash-map))))))
(generate (cat (list (gen-for-pred string?))
(list (gen-for-pred ratio?))))
;; load your own generator
(gen-for-name 'clojure.test.check.generators/int)
;; failure modes
(gen-for-name 'unqualified)
(gen-for-name 'clojure.core/+)
(gen-for-name 'clojure.core/name-does-not-exist)
(gen-for-name 'ns.does.not.exist/f)
)

View file

@ -1,579 +0,0 @@
; Copyright (c) Rich Hickey. All rights reserved.
; The use and distribution terms for this software are covered by the
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
; which can be found in the file epl-v10.html at the root of this distribution.
; By using this software in any fashion, you are agreeing to be bound by
; the terms of this license.
; You must not remove this notice, or any other, from this software.
(ns clojure.spec.test.alpha
(:refer-clojure :exclude [test])
(:require
[clojure.pprint :as pp]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as gen]
[clojure.string :as str]))
(in-ns 'clojure.spec.test.check)
(in-ns 'clojure.spec.test.alpha)
(alias 'stc 'clojure.spec.test.check)
(defn- throwable?
[x]
(instance? Throwable x))
(defn ->sym
[x]
(@#'s/->sym x))
(defn- ->var
[s-or-v]
(if (var? s-or-v)
s-or-v
(let [v (and (symbol? s-or-v) (resolve s-or-v))]
(if (var? v)
v
(throw (IllegalArgumentException. (str (pr-str s-or-v) " does not name a var")))))))
(defn- collectionize
[x]
(if (symbol? x)
(list x)
x))
(defn enumerate-namespace
"Given a symbol naming an ns, or a collection of such symbols,
returns the set of all symbols naming vars in those nses."
[ns-sym-or-syms]
(into
#{}
(mapcat (fn [ns-sym]
(map
(fn [name-sym]
(symbol (name ns-sym) (name name-sym)))
(keys (ns-interns ns-sym)))))
(collectionize ns-sym-or-syms)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instrument ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private ^:dynamic *instrument-enabled*
"if false, instrumented fns call straight through"
true)
(defn- fn-spec?
"Fn-spec must include at least :args or :ret specs."
[m]
(or (:args m) (:ret m)))
(defmacro with-instrument-disabled
"Disables instrument's checking of calls, within a scope."
[& body]
`(binding [*instrument-enabled* nil]
~@body))
(defn- thunk-frame? [s]
(str/includes? s "--KVS--EMULATION--THUNK--"))
(defn- interpret-stack-trace-element
"Given the vector-of-syms form of a stacktrace element produced
by e.g. Throwable->map, returns a map form that adds some keys
guessing the original Clojure names. Returns a map with
:class class name symbol from stack trace
:method method symbol from stack trace
:file filename from stack trace
:line line number from stack trace
:var-scope optional Clojure var symbol scoping fn def
:local-fn optional local Clojure symbol scoping fn def
For non-Clojure fns, :scope and :local-fn will be absent."
[[cls method file line]]
(let [clojure? (contains? '#{invoke invokeStatic} method)
demunge #(s/demunge %)
degensym #(str/replace % #"--.*" "")
[ns-sym name-sym local] (when clojure?
(->> (str/split (str cls) #"\$" 3)
(map demunge)))]
(merge {:file file
:line line
:method method
:class cls}
(when (and ns-sym name-sym)
{:var-scope (symbol ns-sym name-sym)})
(when local
{:local-fn (symbol (degensym local))
:thunk? (thunk-frame? local)}))))
(defn- stacktrace-relevant-to-instrument
"Takes a coll of stack trace elements (as returned by
StackTraceElement->vec) and returns a coll of maps as per
interpret-stack-trace-element that are relevant to a
failure in instrument."
[elems]
(let [plumbing? (fn [{:keys [var-scope thunk?]}]
(or thunk?
(contains? '#{clojure.spec.test.alpha/spec-checking-fn
clojure.core/apply}
var-scope)))]
(sequence (comp (map StackTraceElement->vec)
(map interpret-stack-trace-element)
(filter :var-scope)
(drop-while plumbing?))
elems)))
(defn- spec-checking-fn
"Takes a function name, a function f, and an fspec and returns a thunk that
first conforms the arguments given then calls f with those arguments if
the conform succeeds. Otherwise, an exception is thrown containing information
about the conform failure."
[fn-name f fn-spec]
(let [fn-spec (@#'s/maybe-spec fn-spec)
conform! (fn [fn-name role spec data args]
(let [conformed (s/conform spec data)]
(if (= ::s/invalid conformed)
(let [caller (->> (.getStackTrace (Thread/currentThread))
stacktrace-relevant-to-instrument
first)
ed (merge (assoc (s/explain-data* spec [] [] [] data)
::s/fn fn-name
::s/args args
::s/failure :instrument)
(when caller
{::caller (dissoc caller :class :method)}))]
(throw (ex-info
(str "Call to " fn-name " did not conform to spec.")
ed)))
conformed)))]
(fn
[& args]
(if *instrument-enabled*
(with-instrument-disabled
(when (:args fn-spec) (conform! fn-name :args (:args fn-spec) args args))
(binding [*instrument-enabled* true]
(.applyTo ^clojure.lang.IFn f args)))
(.applyTo ^clojure.lang.IFn f args)))))
(defn- no-fspec
[v spec]
(ex-info (str "Fn at " v " is not spec'ed.")
{:var v :spec spec ::s/failure :no-fspec}))
(defonce ^:private instrumented-vars (atom {}))
(defn- find-varargs-decl
"Takes an arglist and returns the restargs binding form if found, else nil."
[arglist]
(let [[_ decl :as restargs] (->> arglist
(split-with (complement #{'&}))
second)]
(and (= 2 (count restargs))
decl)))
(defn- has-kwargs? [arglists]
(->> arglists (some find-varargs-decl) map?))
(defn- kwargs->kvs
"Takes the restargs of a kwargs function call and checks for a trailing element.
If found, that element is flattened into a sequence of key->value pairs and
concatenated onto the preceding arguments."
[args]
(if (even? (count args))
args
(concat (butlast args)
(reduce-kv (fn [acc k v] (->> acc (cons v) (cons k)))
()
(last args)))))
(defn- gen-fixed-args-syms
"Takes an arglist and generates a vector of names corresponding to the fixed
args found."
[arglist]
(->> arglist (take-while (complement #{'&})) (map (fn [_] (gensym))) vec))
(defn- build-kwargs-body
"Takes a function name fn-name and arglist and returns code for a function body that
handles kwargs by calling fn-name with any fixed followed by its restargs transformed
from kwargs to kvs."
[fn-name arglist]
(let [alias (gensym "kwargs")
head-args (gen-fixed-args-syms arglist)]
(list (conj head-args '& alias)
`(apply ~fn-name ~@head-args (@#'kwargs->kvs ~alias)))))
(defn- build-varargs-body
"Takes a function name fn-name and arglist and returns code for a function body that
handles varargs by calling fn-name with any fixed args followed by its rest args."
[fn-name arglist]
(let [head-args (gen-fixed-args-syms arglist)
alias (gensym "restargs")]
(list (conj head-args '& alias)
`(apply ~fn-name ~@head-args ~alias))))
(defn- build-fixed-args-body
"Takes a function name fn-name and arglist and returns code for a function body that
handles fixed args by calling fn-name with its fixed args."
[fn-name arglist]
(let [arglist (gen-fixed-args-syms arglist)]
(list arglist
`(~fn-name ~@arglist))))
(defn- build-flattener-code
"Takes argslists and generates code for a HOF that given a function, returns a forwarding thunk
of analogous arglists that ensures that kwargs are passed as kvs to the original function."
[arglists]
(let [closed-over-name (gensym "inner")]
`(fn [~closed-over-name]
(fn ~'--KVS--EMULATION--THUNK--
~@(map (fn [arglist]
(let [varargs-decl (find-varargs-decl arglist)]
(cond (map? varargs-decl) (build-kwargs-body closed-over-name arglist)
varargs-decl (build-varargs-body closed-over-name arglist)
:default (build-fixed-args-body closed-over-name arglist))))
(or arglists
'([& args])))))))
(comment
;; Given a function with the arglists (([a]) ([a b]) ([a b & kvs]))
;; the flattener generated is below (with some gensym name cleanup for readability)
(fn [inner]
(fn
([G__a] (inner G__a))
([G__a G__b] (inner G__a G__b))
([G__a G__b & G__kvs]
(apply inner G__a G__b (if (even? (count G__kvs))
G__kvs
(reduce-kv (fn [acc k v]
(->> acc (cons v) (cons k)))
(butlast G__kvs)
(last G__kvs)))))))
)
(defn- maybe-wrap-kvs-emulation
"Takes an argslist and function f and returns f except when arglists
contains a kwargs binding, else wraps f with a forwarding thunk that
flattens a trailing map into kvs if present in the kwargs call."
[f arglists]
(if (has-kwargs? arglists)
(let [flattener-code (build-flattener-code arglists)
kvs-emu (eval flattener-code)]
(kvs-emu f))
f))
(defn- instrument-choose-fn
"Helper for instrument."
[f spec sym {over :gen :keys [stub replace]}]
(if (some #{sym} stub)
(-> spec (s/gen over) gen/generate)
(get replace sym f)))
(defn- instrument-choose-spec
"Helper for instrument"
[spec sym {overrides :spec}]
(get overrides sym spec))
(defn- instrument-1
[s opts]
(when-let [v (resolve s)]
(when-not (-> v meta :macro)
(let [spec (s/get-spec v)
{:keys [raw wrapped]} (get @instrumented-vars v)
current @v
to-wrap (if (= wrapped current) raw current)
ospec (or (instrument-choose-spec spec s opts)
(throw (no-fspec v spec)))
ofn (instrument-choose-fn to-wrap ospec s opts)
checked (spec-checking-fn (->sym v) ofn ospec)
arglists (->> v meta :arglists (sort-by count) seq)
wrapped (maybe-wrap-kvs-emulation checked arglists)]
(alter-var-root v (constantly wrapped))
(swap! instrumented-vars assoc v {:raw to-wrap :wrapped wrapped})
(->sym v)))))
(defn- unstrument-1
[s]
(when-let [v (resolve s)]
(when-let [{:keys [raw wrapped]} (get @instrumented-vars v)]
(swap! instrumented-vars dissoc v)
(let [current @v]
(when (= wrapped current)
(alter-var-root v (constantly raw))
(->sym v))))))
(defn- opt-syms
"Returns set of symbols referenced by 'instrument' opts map"
[opts]
(reduce into #{} [(:stub opts) (keys (:replace opts)) (keys (:spec opts))]))
(defn- fn-spec-name?
[s]
(and (symbol? s)
(not (some-> (resolve s) meta :macro))))
(defn instrumentable-syms
"Given an opts map as per instrument, returns the set of syms
that can be instrumented."
([] (instrumentable-syms nil))
([opts]
(assert (every? ident? (keys (:gen opts))) "instrument :gen expects ident keys")
(reduce into #{} [(filter fn-spec-name? (keys (s/registry)))
(keys (:spec opts))
(:stub opts)
(keys (:replace opts))])))
(defn instrument
"Instruments the vars named by sym-or-syms, a symbol or collection
of symbols, or all instrumentable vars if sym-or-syms is not
specified.
If a var has an :args fn-spec, sets the var's root binding to a
fn that checks arg conformance (throwing an exception on failure)
before delegating to the original fn.
The opts map can be used to override registered specs, and/or to
replace fn implementations entirely. Opts for symbols not included
in sym-or-syms are ignored. This facilitates sharing a common
options map across many different calls to instrument.
The opts map may have the following keys:
:spec a map from var-name symbols to override specs
:stub a set of var-name symbols to be replaced by stubs
:gen a map from spec names to generator overrides
:replace a map from var-name symbols to replacement fns
:spec overrides registered fn-specs with specs your provide. Use
:spec overrides to provide specs for libraries that do not have
them, or to constrain your own use of a fn to a subset of its
spec'ed contract.
:stub replaces a fn with a stub that checks :args, then uses the
:ret spec to generate a return value.
:gen overrides are used only for :stub generation.
:replace replaces a fn with a fn that checks args conformance, then
invokes the fn you provide, enabling arbitrary stubbing and mocking.
:spec can be used in combination with :stub or :replace.
Returns a collection of syms naming the vars instrumented."
([] (instrument (instrumentable-syms)))
([sym-or-syms] (instrument sym-or-syms nil))
([sym-or-syms opts]
(locking instrumented-vars
(into
[]
(comp (filter (instrumentable-syms opts))
(distinct)
(map #(instrument-1 % opts))
(remove nil?))
(collectionize sym-or-syms)))))
(defn unstrument
"Undoes instrument on the vars named by sym-or-syms, specified
as in instrument. With no args, unstruments all instrumented vars.
Returns a collection of syms naming the vars unstrumented."
([] (unstrument (map ->sym (keys @instrumented-vars))))
([sym-or-syms]
(locking instrumented-vars
(into
[]
(comp (filter symbol?)
(map unstrument-1)
(remove nil?))
(collectionize sym-or-syms)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; testing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- explain-check
[args spec v role]
(ex-info
"Specification-based check failed"
(when-not (s/valid? spec v nil)
(assoc (s/explain-data* spec [role] [] [] v)
::args args
::val v
::s/failure :check-failed))))
(defn- check-call
"Returns true if call passes specs, otherwise *returns* an exception
with explain-data + ::s/failure."
[f specs args]
(let [cargs (when (:args specs) (s/conform (:args specs) args))]
(if (= cargs ::s/invalid)
(explain-check args (:args specs) args :args)
(let [ret (apply f args)
cret (when (:ret specs) (s/conform (:ret specs) ret))]
(if (= cret ::s/invalid)
(explain-check args (:ret specs) ret :ret)
(if (and (:args specs) (:ret specs) (:fn specs))
(if (s/valid? (:fn specs) {:args cargs :ret cret})
true
(explain-check args (:fn specs) {:args cargs :ret cret} :fn))
true))))))
(defn- quick-check
[f specs {gen :gen opts ::stc/opts}]
(let [{:keys [num-tests] :or {num-tests 1000}} opts
g (try (s/gen (:args specs) gen) (catch Throwable t t))]
(if (throwable? g)
{:result g}
(let [prop (gen/for-all* [g] #(check-call f specs %))]
(apply gen/quick-check num-tests prop (mapcat identity opts))))))
(defn- make-check-result
"Builds spec result map."
[check-sym spec test-check-ret]
(merge {:spec spec
::stc/ret test-check-ret}
(when check-sym
{:sym check-sym})
(when-let [result (-> test-check-ret :result)]
(when-not (true? result) {:failure result}))
(when-let [shrunk (-> test-check-ret :shrunk)]
{:failure (:result shrunk)})))
(defn- check-1
[{:keys [s f v spec]} opts]
(let [re-inst? (and v (seq (unstrument s)) true)
f (or f (when v @v))
specd (s/spec spec)]
(try
(cond
(or (nil? f) (some-> v meta :macro))
{:failure (ex-info "No fn to spec" {::s/failure :no-fn})
:sym s :spec spec}
(:args specd)
(let [tcret (quick-check f specd opts)]
(make-check-result s spec tcret))
:default
{:failure (ex-info "No :args spec" {::s/failure :no-args-spec})
:sym s :spec spec})
(finally
(when re-inst? (instrument s))))))
(defn- sym->check-map
[s]
(let [v (resolve s)]
{:s s
:v v
:spec (when v (s/get-spec v))}))
(defn- validate-check-opts
[opts]
(assert (every? ident? (keys (:gen opts))) "check :gen expects ident keys"))
(defn check-fn
"Runs generative tests for fn f using spec and opts. See
'check' for options and return."
([f spec] (check-fn f spec nil))
([f spec opts]
(validate-check-opts opts)
(check-1 {:f f :spec spec} opts)))
(defn checkable-syms
"Given an opts map as per check, returns the set of syms that
can be checked."
([] (checkable-syms nil))
([opts]
(validate-check-opts opts)
(reduce into #{} [(filter fn-spec-name? (keys (s/registry)))
(keys (:spec opts))])))
(defn check
"Run generative tests for spec conformance on vars named by
sym-or-syms, a symbol or collection of symbols. If sym-or-syms
is not specified, check all checkable vars.
The opts map includes the following optional keys, where stc
aliases clojure.spec.test.check:
::stc/opts opts to flow through test.check/quick-check
:gen map from spec names to generator overrides
The ::stc/opts include :num-tests in addition to the keys
documented by test.check. Generator overrides are passed to
spec/gen when generating function args.
Returns a lazy sequence of check result maps with the following
keys
:spec the spec tested
:sym optional symbol naming the var tested
:failure optional test failure
::stc/ret optional value returned by test.check/quick-check
The value for :failure can be any exception. Exceptions thrown by
spec itself will have an ::s/failure value in ex-data:
:check-failed at least one checked return did not conform
:no-args-spec no :args spec provided
:no-fn no fn provided
:no-fspec no fspec provided
:no-gen unable to generate :args
:instrument invalid args detected by instrument
"
([] (check (checkable-syms)))
([sym-or-syms] (check sym-or-syms nil))
([sym-or-syms opts]
(->> (collectionize sym-or-syms)
(filter (checkable-syms opts))
(pmap
#(check-1 (sym->check-map %) opts)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check reporting ;;;;;;;;;;;;;;;;;;;;;;;;
(defn- failure-type
[x]
(::s/failure (ex-data x)))
(defn- unwrap-failure
[x]
(if (failure-type x)
(ex-data x)
x))
(defn- result-type
"Returns the type of the check result. This can be any of the
::s/failure keywords documented in 'check', or:
:check-passed all checked fn returns conformed
:check-threw checked fn threw an exception"
[ret]
(let [failure (:failure ret)]
(cond
(nil? failure) :check-passed
(failure-type failure) (failure-type failure)
:default :check-threw)))
(defn abbrev-result
"Given a check result, returns an abbreviated version
suitable for summary use."
[x]
(if (:failure x)
(-> (dissoc x ::stc/ret)
(update :spec s/describe)
(update :failure unwrap-failure))
(dissoc x :spec ::stc/ret)))
(defn summarize-results
"Given a collection of check-results, e.g. from 'check', pretty
prints the summary-result (default abbrev-result) of each.
Returns a map with :total, the total number of results, plus a
key with a count for each different :type of result."
([check-results] (summarize-results check-results abbrev-result))
([check-results summary-result]
(reduce
(fn [summary result]
(pp/pprint (summary-result result))
(-> summary
(update :total inc)
(update (result-type result) (fnil inc 0))))
{:total 0}
check-results)))

2
sci

@ -1 +1 @@
Subproject commit e85433a0214114fdceb4ca896e1b9c27b1bdf713
Subproject commit afc1c010a71a0640a3c4466b7b3a1cce0ad88eee

View file

@ -8,7 +8,6 @@
(System/getenv "APPVEYOR_REPO_BRANCH")
(System/getenv "CIRCLE_BRANCH")
(System/getenv "GITHUB_REF_NAME")
(System/getenv "CIRRUS_BRANCH")
(-> (sh "git" "rev-parse" "--abbrev-ref" "HEAD")
:out
str/trim)))
@ -17,9 +16,7 @@
(let [ght (System/getenv "GITHUB_TOKEN")
_ (println "Github token found")
file (first args)
_ (println "File" file)
branch (current-branch)
_ (println "On branch:" branch)
current-version
(-> (slurp "resources/BABASHKA_VERSION")
str/trim)]
@ -30,9 +27,7 @@
:repo "babashka"
:file file
:tag (str "v" current-version)
:draft true
:overwrite (str/ends-with? current-version "SNAPSHOT")
:sha256 true})
:draft true})
(ghr/overwrite-asset {:org "babashka"
:repo "babashka-dev-builds"
:file file
@ -40,8 +35,6 @@
;; do not set, because we are posting to another repo
:target-commitish false
:draft false
:prerelease true
:overwrite (str/ends-with? current-version "SNAPSHOT")
:sha256 true}))
:prerelease true}))
(println "Skipping release artifact (no GITHUB_TOKEN or not on main branch)"))
nil))

View file

@ -1,16 +0,0 @@
#!/usr/bin/env bb
(ns built-in
(:require [babashka.fs :as fs]
[babashka.process :refer [shell]]))
;; copy clojure spec as built-in
(fs/with-temp-dir [tmp-dir {}]
(let [tmp-dir (fs/file tmp-dir)]
(shell {:dir tmp-dir} "git clone https://github.com/babashka/spec.alpha")
(let [spec-dir (fs/file tmp-dir "spec.alpha")]
(shell {:dir spec-dir} "git reset 951b49b8c173244e66443b8188e3ff928a0a71e7 --hard")
(fs/copy-tree (fs/file spec-dir "src" "main" "clojure") (fs/file "resources" "src" "babashka")
{:replace-existing true}))))

View file

@ -11,7 +11,7 @@
;; GraalVM Community Edition 19.3.2 based on OpenJDK 8u252
;; GraalVM Community Edition 19.3.2 based on OpenJDK 11.0.7
;;
;; Currently we use GraalVM java19-20.1.0
;; Currently we use GraalVM java11-20.1.0
(ns bump-graal-version
(:require [clojure.string :as str]
@ -31,8 +31,8 @@
""
"./bump_graal_version.clj -g 19.3.2 (the new version)"
"or"
"./bump_graal_version.clj -g 19.3.2 --java java19"
"(for GraalVM java19-19.3.2)"
"./bump_graal_version.clj -g 19.3.2 --java java11"
"(for GraalVM java11-19.3.2)"
""]
(str/join \newline))))
@ -43,10 +43,7 @@
".github/workflows/build.yml"
".circleci/config.yml"
"appveyor.yml"
"project.clj"
"script/bump_graal_version.clj"
".cirrus.yml"
"script/install-graalvm"])
"project.clj"])
;; We might have to keep changing these from
;; time to time whenever the version is bumped
@ -54,7 +51,10 @@
;; OR
;;
;; We could have them as environment variables
(def current-graal-version "24")
(def current-graal-version "22.0.0.2")
(def current-java-version "java11")
(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0" "21.0.0" "21.1.0" "21.2.0" "21.3.0" "22.0.0.2" "22.1.0"])
(def valid-java-bumps ["java8" "java11"])
(def cl-options
[["-g" "--graal VERSION" "graal version"]
@ -65,8 +65,8 @@
(:options (cli/parse-opts *command-line-args* cl-options)))
(defn is-valid-bump?
[_version _valid-bumps]
true)
[version valid-bumps]
(some #(= % version) valid-bumps))
(defn replace-current
[file current new]
@ -90,12 +90,19 @@
[args]
(when (empty? args)
(display-help))
(let [new-graal-version (:graal args)]
(let [new-graal-version (:graal args)
new-java-version (:java args)]
(when (not (nil? new-graal-version))
(if (is-valid-bump? new-graal-version nil)
(if (is-valid-bump? new-graal-version valid-graal-bumps)
(do
(println "Performing Graal bump...")
(bump-current current-graal-version new-graal-version))
(show-error new-graal-version)))))
(show-error new-graal-version)))
(when (not (nil? new-java-version))
(if (is-valid-bump? new-java-version valid-java-bumps)
(do
(println "Performing Java bump...")
(bump-current current-java-version new-java-version))
(show-error new-java-version)))))
(exec-script cl-args)

View file

@ -1,15 +0,0 @@
#!/usr/bin/env bash
function ver_lte() {
printf '%s\n%s' "$1" "$2" | sort -C -V
}
max_glibc_version="2.31"
current_glibc_version=$(ldd --version | head -1 | awk '{print $4}' | cut -d "-" -f 1)
function bail() {
echo "glibc greater than max version ${max_glibc_version}: ${current_glibc_version}"
exit 1
}
ver_lte "${current_glibc_version}" "${max_glibc_version}" || bail

View file

@ -26,6 +26,17 @@ fi
export JAVA_HOME=$GRAALVM_HOME
export PATH=$GRAALVM_HOME/bin:$PATH
rm -rf resources/*.class
# SVM_JAR=$(find -L "$GRAALVM_HOME" | grep svm.jar)
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffCoreServicesDependencies.java
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffSunAwtWwwContentAudioAiff.java
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffMisc.java
if [ -z "$BABASHKA_JAR" ]; then
lein with-profiles +reflection,+native-image "do" run
lein "do" clean, uberjar, metabom
BABASHKA_JAR=${BABASHKA_JAR:-"target/babashka-$BABASHKA_VERSION-standalone.jar"}
fi
# because script/test cleans target during ci before the jar can we saved
cp target/metabom.jar .
@ -39,29 +50,24 @@ args=("-jar" "$BABASHKA_JAR"
# "-H:DashboardDump=reports/dump"
# "-H:+DashboardPretty"
# "-H:+DashboardJson"
# "-H:ReportAnalysisForbiddenType=java.awt.Toolkit:Instantiated"
"-H:ReportAnalysisForbiddenType=java.awt.Toolkit:InHeap,Allocated"
"--verbose"
"--no-fallback"
"--native-image-info"
"--install-exit-handlers"
# --trace-class-initialization=jdk.internal.net.http.common.DebugLogger,jdk.internal.net.http.websocket.WebSocketImpl,jdk.internal.net.http.common.Utils
"$BABASHKA_XMX"
"--enable-preview"
"-march=compatibility" # necessary for compatibility with older machines, e.g. see https://github.com/borkdude/deps.clj/actions/runs/6337277754/job/17212028399
"-O1")
"$BABASHKA_XMX")
BABASHKA_STATIC=${BABASHKA_STATIC:-}
BABASHKA_MUSL=${BABASHKA_MUSL:-}
if [ "$BABASHKA_STATIC" = "true" ]; then
args+=("--static")
if [ "$BABASHKA_MUSL" = "true" ]; then
args+=("--static")
args+=("--libc=musl"
# see https://github.com/oracle/graal/issues/3398
"-H:CCompilerOption=-Wl,-z,stack-size=2097152")
else
# see https://github.com/oracle/graal/issues/3737
args+=("-H:+UnlockExperimentalVMOptions")
args+=("-H:+StaticExecutableWithDynamicLibC")
fi
fi
@ -72,12 +78,6 @@ if [ "$BABASHKA_FEATURE_HSQLDB" = "true" ]; then
args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql")
fi
BABASHKA_FEATURE_POSTGRESQL=${BABASHKA_FEATURE_POSTGRESQL:-}
if [ "$BABASHKA_FEATURE_POSTGRESQL" = "true" ]; then
args+=("--initialize-at-build-time=org.postgresql.PGProperty")
fi
BABASHKA_FEATURE_SELMER=${BABASHKA_FEATURE_SELMER:-}
if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then
@ -92,7 +92,7 @@ then
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}"
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
@ -107,14 +107,4 @@ then
export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}"
fi
if [[ -z "${BABASHKA_SHA:-}" ]]
then
sha=$(git rev-parse HEAD)
if [[ $? -eq 0 ]]; then
export BABASHKA_SHA=$sha
fi
fi
"$GRAALVM_HOME/bin/native-image" "${args[@]}" "$@"
./"$BABASHKA_BINARY" describe
"$GRAALVM_HOME/bin/native-image" "${args[@]}"

View file

@ -23,27 +23,14 @@ Rem -H:EnableURLProtocols=jar,http,https is also not supported.
call %GRAALVM_HOME%\bin\gu.cmd install native-image
if "%BABASHKA_SHA%"=="" (
for /f %%i in ('git rev-parse HEAD') do set sha=%%i
if not errorlevel 1 (
set BABASHKA_SHA=%sha%
)
)
call %GRAALVM_HOME%\bin\native-image.cmd ^
"-jar" "target/babashka-%BABASHKA_VERSION%-standalone.jar" ^
"-H:Name=bb" ^
"-H:+ReportExceptionStackTraces" ^
"--verbose" ^
"--no-fallback" ^
"--enable-preview" ^
"--install-exit-handlers" ^
"-march=compatibility" ^
"-O1" ^
"%BABASHKA_XMX%" ^
%*
"%BABASHKA_XMX%"
if %errorlevel% neq 0 exit /b %errorlevel%
call bb "(+ 1 2 3)"
call bb describe

View file

@ -2,7 +2,7 @@
set -euo pipefail
CLOJURE_TOOLS_VERSION="1.11.1.1200"
CLOJURE_TOOLS_VERSION="1.10.3.1040"
install_dir="${1:-/usr/local}"
mkdir -p "$install_dir"

View file

@ -4,33 +4,34 @@ set -euo pipefail
INSTALL_DIR="${1:-$HOME}"
GRAALVM_VERSION="${GRAALVM_VERSION:-24}"
GRAALVM_VERSION="${GRAALVM_VERSION:-21.2.0}"
GRAALVM_PLATFORM=$BABASHKA_PLATFORM
case "${BABASHKA_ARCH:-}" in
aarch64)
GRAALVM_ARCH="aarch64"
;;
*)
GRAALVM_ARCH="x64"
;;
case "$BABASHKA_PLATFORM" in
macos)
GRAALVM_PLATFORM="darwin"
;;
linux)
GRAALVM_PLATFORM="linux"
;;
esac
GRAALVM_DIR_NAME="graalvm-$GRAALVM_VERSION"
GRAALVM_FILENAME="graalvm-jdk-${GRAALVM_VERSION}_${GRAALVM_PLATFORM}-${GRAALVM_ARCH}_bin.tar.gz"
DOWNLOAD_URL="https://download.oracle.com/graalvm/${GRAALVM_VERSION}/archive/${GRAALVM_FILENAME}"
case "${BABASHKA_ARCH:-}" in
aarch64)
GRAALVM_ARCH="aarch64"
;;
*)
GRAALVM_ARCH="amd64"
;;
esac
GRAALVM_FILENAME="graalvm-ce-java11-$GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION.tar.gz"
pushd "$INSTALL_DIR" >/dev/null
if ! [ -d "$GRAALVM_DIR_NAME" ]; then
echo "Downloading GraalVM $GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION on '$PWD'..."
echo "$DOWNLOAD_URL"
curl --fail -LO "$DOWNLOAD_URL"
ls -la
mkdir "$GRAALVM_DIR_NAME"
tar xzvf "$GRAALVM_FILENAME" -C "$GRAALVM_DIR_NAME" --strip-components 1
ls -la "$GRAALVM_DIR_NAME"
if ! [ -d "graalvm-ce-java11-$GRAALVM_VERSION" ]; then
echo "Downloading GraalVM $GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION on '$PWD'..."
curl -O -sL "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-$GRAALVM_VERSION/$GRAALVM_FILENAME"
tar xzf "$GRAALVM_FILENAME"
fi
popd >/dev/null

View file

@ -2,20 +2,14 @@
set -eo pipefail
: "${BABASHKA_TEST_ENV:=jvm}"
export BABASHKA_TEST_ENV
if [ "$BABASHKA_TEST_ENV" = "native" ]; then
BB_CMD="./bb"
else
BB_CMD="lein bb"
fi
export PATH
PATH=$(pwd)/process/target/test/on-path:$PATH
export BABASHKA_CLASSPATH
BABASHKA_CLASSPATH=$(clojure -Spath -A:lib-tests)
BABASHKA_CLASSPATH=$(clojure -A:lib-tests -Spath)
$BB_CMD -cp "$BABASHKA_CLASSPATH" \
-f "test-resources/lib_tests/babashka/run_all_libtests.clj" "$@"

View file

@ -1,11 +1,7 @@
if not defined BABASHKA_TEST_ENV set BABASHKA_TEST_ENV=jvm
if "%BABASHKA_TEST_ENV%" EQU "native" (set BB_CMD=.\bb) else (set BB_CMD=lein bb)
set EDN=lib_tests.edn
set PATH=%CD%\process\target\test\on-path;%PATH%
.\bb -f script/lib_tests/bb_edn_from_deps.clj %EDN%
%BB_CMD% --config %EDN% --deps-root . -f test-resources/lib_tests/babashka/run_all_libtests.clj %*

View file

@ -19,8 +19,8 @@ fi
apt-get update -y && apt-get install musl-tools -y
ZLIB_VERSION="1.2.13"
ZLIB_SHA256="b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30"
ZLIB_VERSION="1.2.11"
ZLIB_SHA256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1"
# stable archive path
curl -O -sL --fail --show-error "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz"

View file

@ -1,7 +1,5 @@
#!/usr/bin/env bash
set -eo pipefail
if [ "$GRAALVM_HOME" != "" ]
then
export JAVA_HOME=$GRAALVM_HOME
@ -10,6 +8,7 @@ fi
java -version
set -eo pipefail
unset BABASHKA_PRELOADS
unset BABASHKA_CLASSPATH
unset BABASHKA_PRELOADS_TEST
@ -17,9 +16,6 @@ unset BABASHKA_PRELOADS_TEST
echo "running tests part 1"
lein "do" clean, test "$@"
echo "running flaky tests"
lein "do" clean, test :flaky || true
export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'
export BABASHKA_PRELOADS_TEST=true
echo "running tests part 2"
@ -41,13 +37,3 @@ lein test :only babashka.pod-test
export BABASHKA_SOCKET_REPL_TEST=true
lein test :only babashka.impl.socket-repl-test
# test invoking script in subdir with bb.edn in parent dir
unset BABASHKA_PRELOADS
unset BABASHKA_CLASSPATH
pushd test-resources/bb_in_root_script_in_other_dir
if [[ $BABASHKA_TEST_ENV = "native" ]]
then
../../bb dir/script.clj
fi
popd

View file

@ -16,11 +16,7 @@ set BABASHKA_POD_TEST=
set BABASHKA_SOCKET_REPL_TEST=
echo "running tests part 1"
call lein do clean, test %* || exit /B 1
echo "running flaky tests"
REM there's no "or exit" here because we don't want flaky tests to fail the script
call lein do clean, test :flaky
call lein do clean, test :windows || exit /B 1
set BABASHKA_PRELOADS=(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")
set BABASHKA_PRELOADS_TEST=true

View file

@ -16,7 +16,7 @@ then
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}"
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
@ -175,18 +175,8 @@ else
BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector"
fi
#lein with-profiles "$BABASHKA_LEIN_PROFILES,+reflection,-uberjar" deps :tree
#exit 0
mkdir -p resources/META-INF/babashka
cp deps.edn resources/META-INF/babashka/deps.edn
rm -rf resources/*.class
# SVM_JAR=$(find -L "$GRAALVM_HOME" | grep svm.jar)
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/UrlClassLoaderSubstitutions.java
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffSunAwtWwwContentAudioAiff.java
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffMisc.java
if [ -z "$BABASHKA_JAR" ]; then
lein with-profiles "$BABASHKA_LEIN_PROFILES,+reflection,-uberjar" do run
lein with-profiles "$BABASHKA_LEIN_PROFILES" do clean, uberjar, metabom

View file

@ -1,49 +1,4 @@
(ns aaaa-this-has-to-be-first.because-patches
;; we need pprint loaded first, it patches pprint to not bloat the GraalVM binary
(:require [babashka.impl.patches.datafy]
[babashka.impl.pprint]
))
;; Enable this for scanning requiring usage:
(def enable-require-scan
"(do
(def old-require require)
(def old-resolve resolve)
(def our-requiring-resolve (fn [sym]
(let [ns (symbol (namespace sym))]
(old-require ns)
(old-resolve sym))))
(defn static-requiring-resolve [form _ _]
(prn :req-resolve form :args (rest form))
`(let [res# (our-requiring-resolve ~@(rest form))]
res#))
(alter-var-root #'requiring-resolve (constantly @#'static-requiring-resolve))
(doto #'requiring-resolve (.setMacro))
(defn static-require [& [&form _bindings & syms]]
(when (meta &form)
(prn :require &form (meta &form) *file*))
`(old-require ~@syms))
(alter-var-root #'require (constantly @#'static-require))
(doto #'require (.setMacro))
(alter-var-root #'clojure.core/serialized-require (constantly (fn [& args]
(prn :serialized-req args)))))
(defn static-resolve [& [&form _bindings & syms]]
(when (meta &form)
(prn :require &form (meta &form) *file*))
`(old-resolve ~@syms))
(alter-var-root #'resolve (constantly @#'static-resolve))
(doto #'resolve (.setMacro))
")
(when (System/getenv "BABASHKA_REQUIRE_SCAN")
(load-string enable-require-scan))
;; ---
[babashka.impl.pprint]))

View file

@ -22,29 +22,30 @@
Examples:
(-> (clojure {:out :string} '-M '-e '(+ 1 2 3)]) deref :out) returns
(-> (clojure '[-M -e (+ 1 2 3)] {:out :string}) deref :out) returns
\"6\n\".
(-> @(clojure) :exit) starts a clojure REPL, waits for it
to finish and returns the exit code from the process."
[& args]
(let [{:keys [cmd opts prev]} (p/parse-args args)
opts (merge {:in :inherit
:out :inherit
:err :inherit
:shutdown p/destroy-tree}
opts)]
(binding [*in* @sci/in
*out* @sci/out
*err* @sci/err
deps/*dir* (:dir opts)
deps/*aux-process-fn* (fn [{:keys [cmd out]}]
(pp/shell (assoc opts :out out :cmd cmd)))
deps/*clojure-process-fn* (fn [{:keys [cmd]}]
(pp/process* {:cmd cmd
:prev prev
:opts opts}))
deps/*exit-fn* (fn [{:keys [message]}]
(when message
(throw (Exception. message))))]
(apply deps/-main cmd))))
([] (clojure []))
([args] (clojure args nil))
([args opts]
(let [opts (merge {:in :inherit
:out :inherit
:err :inherit
:shutdown p/destroy-tree}
opts)]
(binding [*in* @sci/in
*out* @sci/out
*err* @sci/err
deps/*dir* (:dir opts)
deps/*env* (:env opts)
deps/*extra-env* (:extra-env opts)
deps/*process-fn* (fn
([cmd] (pp/process cmd opts))
([cmd _] (pp/process cmd opts)))
deps/*exit-fn* (fn
([_])
([_exit-code msg]
(throw (Exception. msg))))]
(apply deps/-main (map str args))))))

View file

@ -1,8 +0,0 @@
(ns babashka.dude
(:require [clojure-csv.core :as csv]
[clojure.java.io :as io]
[clojure.string :as string]))
csv/x
io/x
string/x

View file

@ -1,10 +1,10 @@
(ns babashka.impl.bencode
{:no-doc true}
(:require
[bencode.core :as bencode]
[sci.core :as sci :refer [copy-var]]))
(:require [bencode.core :as bencode]
[sci.impl.namespaces :refer [copy-var]]
[sci.impl.vars :as vars]))
(def tns (sci/create-ns 'bencode.core nil))
(def tns (vars/->SciNamespace 'bencode.core nil))
(def bencode-namespace
{'read-bencode (copy-var bencode/read-bencode tns)

View file

@ -1,120 +1,26 @@
(ns babashka.impl.cheshire
{:no-doc true}
(:require [cheshire.core :as json]
[cheshire.factory :as fact]
[sci.core :as sci :refer [copy-var]]))
[sci.impl.namespaces :refer [copy-var]]
[sci.impl.vars :as vars]))
(def tns (sci/create-ns 'cheshire.core nil))
(def fns (sci/create-ns 'cheshire.factory nil))
(def json-factory (sci/new-dynamic-var '*json-factory* nil {:ns fns}))
;; wrap cheshire fns to support `*json-factory*` dynamic var
(defn generate-string
([obj]
(binding [fact/*json-factory* @json-factory]
(json/generate-string obj)))
([obj opt-map]
(binding [fact/*json-factory* @json-factory]
(json/generate-string obj opt-map))))
(defn generate-stream
([obj writer]
(binding [fact/*json-factory* @json-factory]
(json/generate-stream obj writer)))
([obj writer opt-map]
(binding [fact/*json-factory* @json-factory]
(json/generate-stream obj writer opt-map))))
(defn parse-string
([string]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string string))))
([string key-fn]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string string key-fn))))
([^String string key-fn array-coerce-fn]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string string key-fn array-coerce-fn)))))
(defn parse-string-strict
([string]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string-strict string))))
([string key-fn]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string-strict string key-fn))))
([^String string key-fn array-coerce-fn]
(when string
(binding [fact/*json-factory* @json-factory]
(json/parse-string-strict string key-fn array-coerce-fn)))))
(defn parse-stream
([rdr]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream rdr))))
([rdr key-fn]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream rdr key-fn))))
([rdr key-fn array-coerce-fn]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream rdr key-fn array-coerce-fn)))))
(defn parse-stream-strict
([rdr]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream-strict rdr))))
([rdr key-fn]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream-strict rdr key-fn))))
([rdr key-fn array-coerce-fn]
(when rdr
(binding [fact/*json-factory* @json-factory]
(json/parse-stream-strict rdr key-fn array-coerce-fn)))))
(defn parsed-seq
([reader]
(binding [fact/*json-factory* @json-factory]
(json/parsed-seq reader)))
([reader key-fn]
(binding [fact/*json-factory* @json-factory]
(json/parsed-seq reader key-fn)))
([reader key-fn array-coerce-fn]
(binding [fact/*json-factory* @json-factory]
(json/parsed-seq reader key-fn array-coerce-fn))))
(def tns (vars/->SciNamespace 'cheshire.core nil))
(def cheshire-core-namespace
{'encode (copy-var generate-string tns)
'generate-string (copy-var generate-string tns)
'encode-stream (copy-var generate-stream tns)
'generate-stream (copy-var generate-stream tns)
{'encode (copy-var json/encode tns)
'generate-string (copy-var json/generate-string tns)
'encode-stream (copy-var json/encode-stream tns)
'generate-stream (copy-var json/generate-stream tns)
;;'encode-smile (copy-var json/encode-smile tns)
;;'generate-smile (copy-var json/generate-smile tns)
'decode (copy-var parse-string tns)
'parse-string (copy-var parse-string tns)
'parse-string-strict (copy-var parse-string-strict tns)
'decode (copy-var json/decode tns)
'parse-string (copy-var json/parse-string tns)
'parse-string-strict (copy-var json/parse-string-strict tns)
;;'parse-smile (copy-var json/parse-smile tns)
'parse-stream (copy-var parse-stream tns)
'parse-stream-strict (copy-var parse-stream-strict tns)
'parsed-seq (copy-var parsed-seq tns)
'parse-stream (copy-var json/parse-stream tns)
'parse-stream-strict (copy-var json/parse-stream-strict tns)
'parsed-seq (copy-var json/parsed-seq tns)
;;'parsed-smile-seq (copy-var json/parsed-smile-seq tns)
;;'decode-smile (copy-var json/decode-smile tns)
'default-pretty-print-options (copy-var json/default-pretty-print-options tns)
'create-pretty-printer (copy-var json/create-pretty-printer tns)})
(def cheshire-factory-namespace
{'*json-factory* json-factory
'default-factory-options (copy-var fact/default-factory-options fns)
'json-factory (copy-var fact/json-factory fns)
'make-json-factory (copy-var fact/make-json-factory fns)})

View file

@ -4,22 +4,8 @@
[babashka.impl.features :as features]
[babashka.impl.proxy :as proxy]
[cheshire.core :as json]
[clojure.core.async]
[sci.core :as sci]
[sci.impl.types :as t]))
(set! *warn-on-reflection* true)
(def has-of-virtual?
(some #(= "ofVirtual" (.getName ^java.lang.reflect.Method %))
(.getMethods Thread)))
(def has-domain-sockets?
(resolve 'java.net.UnixDomainSocketAddress))
(def has-graal-process-properties?
(resolve 'org.graalvm.nativeimage.ProcessProperties))
(def base-custom-map
`{clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
:allPublicMethods true}
@ -59,10 +45,7 @@
{:name "sleep"}
{:name "start"}
{:name "toString"}
{:name "yield"}
~@(when has-of-virtual? [{:name "ofVirtual"}
{:name "startVirtualThread"}
{:name "isVirtual"}])]}
{:name "yield"}]}
java.net.URL
{:allPublicConstructors true
:allPublicFields true
@ -91,30 +74,15 @@
java.util.Arrays
{:methods [{:name "copyOf"}
{:name "copyOfRange"}
{:name "equals"}
{:name "fill"}]}
{:name "equals"}]}
;; this fixes clojure.lang.Reflector for Java 11
java.lang.reflect.AccessibleObject
{:methods [{:name "canAccess"}]}
java.lang.Package
{:methods [{:name "getName"}]}
java.lang.reflect.Member
{:methods [{:name "getModifiers"}]}
java.lang.reflect.Method
{:methods [{:name "getName"}
{:name "getModifiers"}
{:name "getParameterTypes"}
{:name "getReturnType"}]}
java.lang.reflect.Modifier
{:methods [{:name "isStatic"}]}
java.lang.reflect.Field
{:methods [{:name "getName"}
{:name "getModifiers"}]}
{:methods [{:name "getName"}]}
java.lang.reflect.Array
{:methods [{:name "newInstance"}
{:name "set"}]}
java.lang.Runnable
{:methods [{:name "run"}]}
java.net.Inet4Address
{:methods [{:name "getHostAddress"}]}
java.net.Inet6Address
@ -127,22 +95,13 @@
clojure.lang.RT
{:methods [{:name "aget"}
{:name "aset"}
{:name "aclone"}
{:name "iter"}
;; we expose this via the Compiler/LOADER dynamic var
{:name "baseLoader"}]}
{:name "aclone"}]}
clojure.lang.Compiler
{:fields [{:name "specials"}
{:name "CHAR_MAP"}]}
{:fields [{:name "specials"}]}
clojure.lang.PersistentHashMap
{:fields [{:name "EMPTY"}]}
clojure.lang.APersistentVector
{:methods [{:name "indexOf"}
{:name "contains"}]}
clojure.lang.LazySeq
{:allPublicConstructors true,
:methods [{:name "indexOf"}
{:name "contains"}]}
{:methods [{:name "indexOf"}]}
clojure.lang.ILookup
{:methods [{:name "valAt"}]}
clojure.lang.IPersistentMap
@ -154,46 +113,22 @@
clojure.lang.Ratio
{:fields [{:name "numerator"}
{:name "denominator"}]}
clojure.lang.Agent
{:fields [{:name "pooledExecutor"}
{:name "soloExecutor"}]}
java.util.Iterator
{:methods [{:name "hasNext"}
{:name "next"}]}
java.util.TimeZone
{:methods [{:name "getTimeZone"}]}
java.net.URLClassLoader
{:methods [{:name "close"}
{:name "findResource"}
{:name "findResources"}
{:name "getResourceAsStream"}
{:name "getURLs"}]}
java.lang.ClassLoader
{:methods [{:name "getResource"}
{:name "getResources"}
{:name "getResourceAsStream"}
{:name "getParent"}]}
clojure.lang.ARef
{:methods [{:name "getWatches"}]}
clojure.lang.MapEntry
{:allPublicConstructors true
:methods [{:name "create"}]}})
{:methods [{:name "getTimeZone"}]}})
(def custom-map
(cond->
(merge base-custom-map
proxy/custom-reflect-map)
(merge base-custom-map
proxy/custom-reflect-map)
features/hsqldb? (assoc `org.hsqldb.dbinfo.DatabaseInformationFull
{:methods [{:name "<init>"
:parameterTypes ["org.hsqldb.Database"]}]}
`java.util.ResourceBundle
{:methods [{:name "getBundle"
:parameterTypes ["java.lang.String","java.util.Locale",
"java.lang.ClassLoader"]}]})
has-graal-process-properties?
(assoc `org.graalvm.nativeimage.ProcessProperties
{:methods [{:name "exec"}]})))
:parameterTypes ["java.lang.String","java.util.Locale","java.lang.ClassLoader"]}]})))
(def java-net-http-classes
"These classes must be initialized at run time since GraalVM 22.1"
@ -205,7 +140,6 @@
java.net.HttpCookie
java.net.PasswordAuthentication
java.net.ProxySelector
java.net.SocketTimeoutException
java.net.http.HttpClient
java.net.http.HttpClient$Builder
java.net.http.HttpClient$Redirect
@ -223,30 +157,17 @@
java.net.http.WebSocket$Builder
java.net.http.WebSocket$Listener
java.security.cert.X509Certificate
java.security.cert.CertificateFactory
java.security.Signature
javax.crypto.Cipher
javax.crypto.KeyAgreement
javax.crypto.Mac
javax.crypto.SecretKey
javax.crypto.SecretKeyFactory
javax.crypto.spec.GCMParameterSpec
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.PBEKeySpec
javax.crypto.spec.SecretKeySpec
javax.net.ssl.HostnameVerifier ;; clj-http-lite
javax.net.ssl.HttpsURLConnection ;; clj-http-lite
javax.net.ssl.KeyManagerFactory
javax.net.ssl.SSLContext
javax.net.ssl.SSLException
javax.net.ssl.SSLParameters
javax.net.ssl.SSLSession ;; clj-http-lite
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.X509TrustManager
javax.net.ssl.X509ExtendedTrustManager
javax.net.ssl.SSLSocket
javax.net.ssl.SSLSocketFactory
jdk.internal.net.http.HttpClientBuilderImpl
jdk.internal.net.http.HttpClientFacade
jdk.internal.net.http.HttpRequestBuilderImpl
@ -255,10 +176,6 @@
jdk.internal.net.http.websocket.BuilderImpl
jdk.internal.net.http.websocket.WebSocketImpl])
(def thread-builder
(try (Class/forName "java.lang.Thread$Builder")
(catch Exception _ nil)))
(def classes
`{:all [clojure.lang.ArityException
clojure.lang.BigInt
@ -283,7 +200,6 @@
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter
java.io.LineNumberReader
java.io.RandomAccessFile
java.io.InputStream
java.io.IOException
@ -313,7 +229,6 @@
java.lang.ClassNotFoundException
java.lang.Comparable
java.lang.Double
java.lang.Error
java.lang.Exception
java.lang.Float
java.lang.IllegalArgumentException
@ -335,43 +250,29 @@
java.lang.ProcessBuilder$Redirect
java.lang.Runtime
java.lang.RuntimeException
java.lang.SecurityException
java.lang.Short
java.lang.StackTraceElement
java.lang.String
java.lang.StringBuilder
java.lang.System
java.lang.Throwable
java.lang.ThreadLocal
java.lang.Thread$UncaughtExceptionHandler
~@(when thread-builder
'[java.lang.Thread$Builder])
java.lang.UnsupportedOperationException
java.lang.ref.WeakReference
java.lang.ref.ReferenceQueue
java.lang.ref.Cleaner
;; java.lang.UnsupportedOperationException
java.math.BigDecimal
java.math.BigInteger
java.math.MathContext
java.math.RoundingMode
java.net.BindException
java.net.ConnectException
java.net.DatagramSocket
java.net.DatagramPacket
java.net.HttpURLConnection
java.net.InetAddress
java.net.InetSocketAddress
java.net.StandardProtocolFamily
java.net.ServerSocket
java.net.Socket
java.net.SocketException
~@(when has-domain-sockets?
'[java.net.UnixDomainSocketAddress])
java.net.UnknownHostException
java.net.URI
java.net.URISyntaxException
;; java.net.URL, see custom map
java.net.URLConnection
;; java.net.URL, see below
java.net.URLEncoder
java.net.URLDecoder
~@(when features/java-nio?
@ -383,14 +284,8 @@
java.nio.MappedByteBuffer
java.nio.file.OpenOption
java.nio.file.StandardOpenOption
java.nio.channels.ByteChannel
java.nio.channels.Channels
java.nio.channels.FileChannel
java.nio.channels.FileChannel$MapMode
java.nio.channels.ReadableByteChannel
java.nio.channels.WritableByteChannel
java.nio.channels.ServerSocketChannel
java.nio.channels.SocketChannel
java.nio.charset.Charset
java.nio.charset.CoderResult
java.nio.charset.CharsetEncoder
@ -404,7 +299,6 @@
java.nio.file.FileVisitOption
java.nio.file.FileVisitResult
java.nio.file.Files
java.nio.file.DirectoryStream$Filter
java.nio.file.LinkOption
java.nio.file.NoSuchFileException
java.nio.file.Path
@ -414,28 +308,18 @@
java.nio.file.attribute.BasicFileAttributes
java.nio.file.attribute.FileAttribute
java.nio.file.attribute.FileTime
java.nio.file.attribute.PosixFileAttributes
java.nio.file.attribute.PosixFilePermission
java.nio.file.attribute.PosixFilePermissions
java.nio.file.attribute.UserDefinedFileAttributeView])
java.security.DigestInputStream
java.security.KeyFactory
java.security.KeyPairGenerator
java.security.KeyPair
java.security.KeyStore
java.nio.file.attribute.PosixFilePermissions])
java.security.MessageDigest
java.security.DigestInputStream
java.security.Provider
java.security.KeyStore
java.security.SecureRandom
java.security.Security
java.security.spec.ECGenParameterSpec
java.security.spec.PKCS8EncodedKeySpec
java.security.spec.X509EncodedKeySpec
java.sql.Date
java.text.ParseException
java.text.ParsePosition
;; adds about 200kb, same functionality provided by java.time:
java.text.SimpleDateFormat
java.text.BreakIterator
~@(when features/java-time?
`[java.time.format.DateTimeFormatter
java.time.Clock
@ -454,14 +338,12 @@
java.time.Year
java.time.YearMonth
java.time.ZoneRegion
java.time.zone.ZoneRules
java.time.ZonedDateTime
java.time.ZoneId
java.time.ZoneOffset
java.time.format.DateTimeFormatterBuilder
java.time.format.DateTimeParseException
java.time.format.DecimalStyle
java.time.format.FormatStyle
java.time.format.ResolverStyle
java.time.format.SignStyle
java.time.temporal.ChronoField
@ -470,53 +352,15 @@
java.time.temporal.TemporalAdjusters
java.time.temporal.TemporalAmount
java.time.temporal.TemporalField
java.time.temporal.WeekFields
~(symbol "[Ljava.time.temporal.TemporalField;")
java.time.format.TextStyle
java.time.temporal.Temporal
java.time.temporal.TemporalAccessor
java.time.temporal.TemporalAdjuster
java.time.temporal.TemporalQuery
~(symbol "[Ljava.time.temporal.TemporalQuery;")
java.time.chrono.ChronoLocalDate
java.time.temporal.TemporalUnit
java.time.chrono.ChronoLocalDateTime
java.time.chrono.ChronoZonedDateTime
java.time.chrono.Chronology])
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong
java.util.concurrent.atomic.AtomicReference
java.util.concurrent.Callable
java.util.concurrent.CancellationException
java.util.concurrent.CompletionException
java.util.concurrent.CountDownLatch
java.time.temporal.TemporalAdjuster])
java.util.concurrent.ExecutionException
java.util.concurrent.Executor
java.util.concurrent.ExecutorService
java.util.concurrent.BlockingQueue
java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.ScheduledFuture
java.util.concurrent.ScheduledThreadPoolExecutor
java.util.concurrent.Semaphore
java.util.concurrent.ThreadFactory
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$AbortPolicy
java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy
java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy
java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
java.util.concurrent.ExecutorService
java.util.concurrent.ScheduledExecutorService
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.CompletableFuture
java.util.concurrent.Executors
java.util.concurrent.TimeUnit
java.util.concurrent.CompletionStage
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.ThreadLocalRandom
java.util.concurrent.ConcurrentHashMap
java.util.jar.Attributes
java.util.jar.Attributes$Name
java.util.jar.JarFile
java.util.jar.JarEntry
@ -526,11 +370,9 @@
java.util.jar.Manifest
java.util.stream.BaseStream
java.util.stream.Stream
java.util.stream.IntStream
java.util.Random
java.util.regex.Matcher
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
java.util.ArrayDeque
java.util.ArrayList
java.util.Collections
@ -539,11 +381,6 @@
java.util.Base64$Decoder
java.util.Base64$Encoder
java.util.Date
java.util.HashMap
java.util.HashSet
java.util.IdentityHashMap
java.util.InputMismatchException
java.util.List
java.util.Locale
java.util.Map
java.util.MissingResourceException
@ -553,16 +390,15 @@
java.util.Scanner
java.util.Set
java.util.StringTokenizer
java.util.WeakHashMap
java.util.UUID
java.util.concurrent.Future
java.util.concurrent.CompletableFuture
java.util.concurrent.Executors
java.util.concurrent.TimeUnit
java.util.function.Consumer
java.util.function.Function
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.Predicate
java.util.function.Supplier
java.util.zip.CheckedInputStream
java.util.zip.CRC32
java.util.zip.Inflater
java.util.zip.InflaterInputStream
java.util.zip.Deflater
@ -575,8 +411,6 @@
java.util.zip.ZipEntry
java.util.zip.ZipException
java.util.zip.ZipFile
sun.misc.Signal
sun.misc.SignalHandler
~(symbol "[B")
~(symbol "[I")
~(symbol "[Ljava.lang.Object;")
@ -592,22 +426,9 @@
~(symbol "[Ljava.util.regex.Pattern;")
~(symbol "[Lclojure.core$range;")])
~@(when features/yaml? '[org.yaml.snakeyaml.error.YAMLException])
~@(when features/hsqldb? '[org.hsqldb.jdbcDriver])
org.jsoup.Jsoup
org.jsoup.nodes.Attribute
org.jsoup.nodes.Attributes
org.jsoup.nodes.Comment
org.jsoup.nodes.DataNode
org.jsoup.nodes.Document
org.jsoup.nodes.DocumentType
org.jsoup.nodes.Element
org.jsoup.nodes.Node
org.jsoup.nodes.TextNode
org.jsoup.nodes.XmlDeclaration
org.jsoup.parser.Tag
org.jsoup.parser.Parser]
~@(when features/hsqldb? '[org.hsqldb.jdbcDriver])]
:constructors [clojure.lang.Delay
clojure.lang.DynamicClassLoader
clojure.lang.MapEntry
clojure.lang.LineNumberingPushbackReader
java.io.EOFException]
:methods [borkdude.graal.LockFix] ;; support for locking
@ -619,7 +440,7 @@
;; list above and then everything reachable via the public class will be
;; visible in the native image.
:instance-checks [clojure.lang.AFn
clojure.lang.AFunction
clojure.lang.Agent
clojure.lang.AMapEntry ;; for proxy
clojure.lang.APersistentMap ;; for proxy
clojure.lang.APersistentSet
@ -647,27 +468,20 @@
clojure.lang.IRef
clojure.lang.ISeq
clojure.lang.IPersistentVector
clojure.lang.ITransientSet
clojure.lang.ITransientVector
clojure.lang.Iterate
clojure.lang.LazySeq
clojure.lang.LispReader$Resolver
clojure.lang.LongRange
clojure.lang.Named
clojure.lang.Keyword
clojure.lang.PersistentArrayMap
clojure.lang.PersistentArrayMap$TransientArrayMap
clojure.lang.PersistentHashMap$TransientHashMap
clojure.lang.PersistentHashSet
clojure.lang.PersistentHashSet$TransientHashSet
clojure.lang.PersistentList
clojure.lang.PersistentList$EmptyList
clojure.lang.PersistentQueue
clojure.lang.PersistentStructMap
clojure.lang.PersistentTreeMap
clojure.lang.PersistentTreeSet
clojure.lang.PersistentVector
clojure.lang.PersistentVector$TransientVector
clojure.lang.Range
clojure.lang.Ratio
clojure.lang.ReaderConditional
clojure.lang.Repeat
@ -677,22 +491,13 @@
clojure.lang.Sequential
clojure.lang.Seqable
clojure.lang.Volatile
;; the only way to check if something is a channel is to
;; call instance? on this...
clojure.core.async.impl.channels.ManyToManyChannel
java.lang.AbstractMethodError
java.lang.ExceptionInInitializerError
java.lang.LinkageError
java.lang.ThreadDeath
java.lang.VirtualMachineError
java.lang.NoSuchFieldException
java.sql.Timestamp
java.util.concurrent.TimeoutException
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong
java.util.Collection
java.util.List
java.util.Map$Entry
java.util.AbstractMap
java.util.AbstractSet
java.util.AbstractList
~@(when features/xml? ['clojure.data.xml.node.Element])]
:custom ~custom-map})
@ -705,150 +510,71 @@
(:instance-checks classes))
m (apply hash-map
(for [c classes
c [(list 'quote c) (cond-> `{:class ~c}
(= 'java.lang.Class c)
(assoc :static-methods
{(list 'quote 'forName)
`(fn
([_# ^String class-name#]
(Class/forName class-name#))
([_# ^String class-name# initialize# ^java.lang.ClassLoader clazz-loader#]
(Class/forName class-name#)))}))]]
c [(list 'quote c) c]]
c))
m (assoc m :public-class
(fn [v]
;; (prn :v v)
;; NOTE: a series of instance check, so far, is still cheaper
;; than piggybacking on defmulti or defprotocol
(let [res (cond (instance? java.lang.Process v)
java.lang.Process
(instance? java.lang.ProcessHandle v)
java.lang.ProcessHandle
(instance? java.lang.ProcessHandle$Info v)
java.lang.ProcessHandle$Info
;; added for calling .put on .environment from ProcessBuilder
(instance? java.util.Map v)
java.util.Map
;; added for issue #239 regarding clj-http-lite
;; can potentially be removed due to fix for #1061
(instance? java.io.ByteArrayOutputStream v)
java.io.ByteArrayOutputStream
(instance? java.security.MessageDigest v)
java.security.MessageDigest
;; streams
(instance? java.io.InputStream v)
java.io.InputStream
(instance? java.io.OutputStream v)
java.io.OutputStream
;; java nio
(instance? java.nio.file.Path v)
java.nio.file.Path
(instance? java.nio.file.FileSystem v)
java.nio.file.FileSystem
(instance? java.nio.file.PathMatcher v)
java.nio.file.PathMatcher
(instance? java.util.stream.Stream v)
java.util.stream.Stream
(instance? java.util.stream.IntStream v)
java.util.stream.IntStream
(instance? java.util.stream.BaseStream v)
java.util.stream.BaseStream
(instance? java.nio.ByteBuffer v)
java.nio.ByteBuffer
(instance? java.nio.charset.Charset v)
java.nio.charset.Charset
(instance? java.nio.charset.CharsetEncoder v)
java.nio.charset.CharsetEncoder
(instance? java.nio.CharBuffer v)
java.nio.CharBuffer
(instance? java.nio.channels.FileChannel v)
java.nio.channels.FileChannel
(instance? java.nio.channels.ServerSocketChannel v)
java.nio.channels.ServerSocketChannel
(instance? java.nio.channels.SocketChannel v)
java.nio.channels.SocketChannel
(instance? java.net.CookieStore v)
java.net.CookieStore
;; this makes interop on reified classes work
;; see java_net_http_test/interop-test
(instance? sci.impl.types.IReified v)
(first (t/getInterfaces v))
;; fix for #1061
(instance? java.net.URLClassLoader v)
java.net.URLClassLoader
(instance? java.lang.ClassLoader v)
java.lang.ClassLoader
(instance? java.nio.file.attribute.PosixFileAttributes v)
java.nio.file.attribute.PosixFileAttributes
(instance? java.nio.file.attribute.BasicFileAttributes v)
java.nio.file.attribute.BasicFileAttributes
(instance? java.nio.file.attribute.UserDefinedFileAttributeView v)
java.nio.file.attribute.UserDefinedFileAttributeView
(instance? java.util.concurrent.Future v)
java.util.concurrent.Future
(instance? java.util.concurrent.ScheduledExecutorService v)
java.util.concurrent.ScheduledExecutorService
(instance? java.util.concurrent.ExecutorService v)
java.util.concurrent.ExecutorService
(instance? java.util.Iterator v)
java.util.Iterator
(instance? javax.crypto.SecretKey v)
javax.crypto.SecretKey
(instance? javax.net.ssl.SSLSocketFactory v)
javax.net.ssl.SSLSocketFactory
(instance? javax.net.ssl.SSLSocket v)
javax.net.ssl.SSLSocket
(instance? java.lang.Thread v)
java.lang.Thread
(instance? java.util.concurrent.ThreadFactory v)
java.util.concurrent.ThreadFactory
(instance? java.security.cert.X509Certificate v)
java.security.cert.X509Certificate
(instance? java.io.Console v)
java.io.Console
(instance? java.security.KeyPairGenerator v)
java.security.KeyPairGenerator
(instance? java.security.Signature v)
java.security.Signature
(instance? java.security.Key v)
java.security.Key
(instance? java.util.Set v)
java.util.Set
(instance? java.io.Closeable v)
java.io.Closeable
(instance? java.util.Collection v)
java.util.Collection
(instance? java.lang.Throwable v)
java.lang.Throwable
(instance? org.jsoup.nodes.Element v)
org.jsoup.nodes.Element
(and thread-builder
(instance? thread-builder v))
thread-builder
(instance? java.text.BreakIterator v)
java.text.BreakIterator
;; keep commas for merge friendliness
,)]
;; (prn :res res)
res)))
m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)
m (assoc m (list 'quote 'clojure.lang.Namespace) 'sci.lang.Namespace)]
(cond (instance? java.lang.Process v)
java.lang.Process
(instance? java.lang.ProcessHandle v)
java.lang.ProcessHandle
(instance? java.lang.ProcessHandle$Info v)
java.lang.ProcessHandle$Info
;; added for calling .put on .environment from ProcessBuilder
(instance? java.util.Map v)
java.util.Map
;; added for issue #239 regarding clj-http-lite
;; can potentially be removed due to fix for #1061
(instance? java.io.ByteArrayOutputStream v)
java.io.ByteArrayOutputStream
(instance? java.security.MessageDigest v)
java.security.MessageDigest
;; streams
(instance? java.io.InputStream v)
java.io.InputStream
(instance? java.io.OutputStream v)
java.io.OutputStream
;; java nio
(instance? java.nio.file.Path v)
java.nio.file.Path
(instance? java.nio.file.FileSystem v)
java.nio.file.FileSystem
(instance? java.nio.file.PathMatcher v)
java.nio.file.PathMatcher
(instance? java.util.stream.BaseStream v)
java.util.stream.BaseStream
(instance? java.nio.ByteBuffer v)
java.nio.ByteBuffer
(instance? java.nio.charset.Charset v)
java.nio.charset.Charset
(instance? java.nio.charset.CharsetEncoder v)
java.nio.charset.CharsetEncoder
(instance? java.nio.CharBuffer v)
java.nio.CharBuffer
(instance? java.nio.channels.FileChannel v)
java.nio.channels.FileChannel
(instance? java.net.CookieStore v)
java.net.CookieStore
;; this makes interop on reified classes work
;; see java_net_http_test/interop-test
(instance? sci.impl.types.IReified v)
(first (t/getInterfaces v))
;; fix for #1061
(instance? java.io.Closeable v)
java.io.Closeable
(instance? java.nio.file.attribute.BasicFileAttributes v)
java.nio.file.attribute.BasicFileAttributes
(instance? java.util.concurrent.Future v)
java.util.concurrent.Future
;; keep commas for merge friendliness
,,,)))]
m))
(def class-map*
"This contains mapping of symbol to class of all classes that are
allowed to be initialized at build time."
"This contains mapping of symbol to class of all classes that are allowed to be initialized at build time."
(gen-class-map))
#_(let [class-name (str c)]
(cond-> (Class/forName class-name)
(= "java.lang.Class" class-name)
(->> (hash-map :static-methods {'forName (fn [class-name]
(prn :class-for)
(Class/forName class-name))}
:class))))
(def class-map
"A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1"
(delay (persistent! (reduce (fn [acc c]
@ -857,15 +583,13 @@
java-net-http-classes)))))
(def imports
'{AbstractMethodError java.lang.AbstractMethodError
Appendable java.lang.Appendable
'{Appendable java.lang.Appendable
ArithmeticException java.lang.ArithmeticException
AssertionError java.lang.AssertionError
BigDecimal java.math.BigDecimal
BigInteger java.math.BigInteger
Boolean java.lang.Boolean
Byte java.lang.Byte
Callable java.util.concurrent.Callable
Character java.lang.Character
CharSequence java.lang.CharSequence
Class java.lang.Class
@ -873,7 +597,6 @@
ClassNotFoundException java.lang.ClassNotFoundException
Comparable java.lang.Comparable
Double java.lang.Double
Error java.lang.Error
Exception java.lang.Exception
ExceptionInInitializerError java.lang.ExceptionInInitializerError
IndexOutOfBoundsException java.lang.IndexOutOfBoundsException
@ -882,37 +605,27 @@
Integer java.lang.Integer
InterruptedException java.lang.InterruptedException
Iterable java.lang.Iterable
;; NOTE: in hindsight File never belonged to the default imports of Clojure,
;; but it's been here to long to remove probably
File java.io.File
Float java.lang.Float
Long java.lang.Long
LinkageError java.lang.LinkageError
Math java.lang.Math
NullPointerException java.lang.NullPointerException
Number java.lang.Number
NumberFormatException java.lang.NumberFormatException
Object java.lang.Object
Runnable java.lang.Runnable
Runtime java.lang.Runtime
RuntimeException java.lang.RuntimeException
Process java.lang.Process
Process java.lang.Process
ProcessBuilder java.lang.ProcessBuilder
SecurityException java.lang.SecurityException
Short java.lang.Short
StackTraceElement java.lang.StackTraceElement
String java.lang.String
StringBuilder java.lang.StringBuilder
System java.lang.System
Thread java.lang.Thread
ThreadLocal java.lang.ThreadLocal
Thread$UncaughtExceptionHandler java.lang.Thread$UncaughtExceptionHandler
Throwable java.lang.Throwable
VirtualMachineError java.lang.VirtualMachineError
ThreadDeath java.lang.ThreadDeath
UnsupportedOperationException java.lang.UnsupportedOperationException})
;; (eval (vec (keys imports)))
;; UnsupportedOperationException java.lang.UnsupportedOperationException
})
(defn reflection-file-entries []
(let [entries (vec (for [c (sort (concat (:all classes)
@ -951,16 +664,15 @@
(let [all-entries (reflection-file-entries)]
(spit (or
(first args)
"resources/META-INF/native-image/babashka/babashka/reflect-config.json")
(json/generate-string all-entries {:pretty true}))))
"resources/META-INF/native-image/babashka/babashka/reflect-config.json") (json/generate-string all-entries {:pretty true}))))
(defn public-declared-method? [^Class c ^java.lang.reflect.Method m]
(defn public-declared-method? [c m]
(and (= c (.getDeclaringClass m))
(not (.getAnnotation m Deprecated))))
(defn public-declared-method-names [^Class c]
(defn public-declared-method-names [c]
(->> (.getMethods c)
(keep (fn [^java.lang.reflect.Method m]
(keep (fn [m]
(when (public-declared-method? c m)
{:class c
:name (.getName m)})))
@ -968,24 +680,18 @@
(sort-by :name)
(vec)))
(defn all-classes
"Returns every java.lang.Class instance Babashka supports."
[]
(defn all-methods []
(->> (reflection-file-entries)
(map :name)
(map #(Class/forName %))))
(defn all-methods []
(mapcat public-declared-method-names (all-classes)))
(def cns (sci/create-ns 'babashka.classes nil))
(def classes-namespace
{:obj cns
'all-classes (sci/copy-var all-classes cns)})
(map #(Class/forName %))
(mapcat public-declared-method-names)))
(comment
(public-declared-method-names java.net.URL)
(public-declared-method-names java.util.Properties)
(all-classes))
(->> (reflection-file-entries)
(map :name)
(map #(Class/forName %)))
)

View file

@ -5,64 +5,75 @@
[clojure.java.io :as io]
[clojure.string :as str]
[sci.core :as sci])
(:import [java.util.jar Manifest]
(:import [java.util.jar JarFile Manifest]
(java.net URL)))
(set! *warn-on-reflection* true)
(defn getResource [^babashka.impl.URLClassLoader class-loader resource-paths url?]
(some (fn [resource]
(when-let [^java.net.URL res (.findResource class-loader resource)]
(if url?
res
{:file (if (= "jar" (.getProtocol res))
resource
(.getFile res))
:source (slurp res)})))
resource-paths))
(defprotocol IResourceResolver
(getResource [this paths opts])
(getResources [this paths opts]))
(deftype DirectoryResolver [path]
IResourceResolver
(getResource [_ resource-paths url?]
(some
(fn [resource-path]
(let [f (io/file path resource-path)]
(when (.exists f)
(if url?
;; manual conversion, faster than going through .toURI
(java.net.URL. "file" nil (.getAbsolutePath f))
{:file (.getAbsolutePath f)
:source (slurp f)}))))
resource-paths)))
(defn path-from-jar
[^java.io.File jar-file resource-paths url?]
(with-open [jar (JarFile. jar-file)]
(some (fn [path]
(when-let [entry (.getEntry jar path)]
(if url?
;; manual conversion, faster than going through .toURI
(java.net.URL. "jar" nil
(str "file:" (.getAbsolutePath jar-file) "!/" path))
{:file path
:source (slurp (.getInputStream jar entry))})))
resource-paths)))
(deftype JarFileResolver [jar-file]
IResourceResolver
(getResource [_ resource-paths url?]
(path-from-jar jar-file resource-paths url?)))
(defn part->entry [part]
(when-not (str/blank? part)
(if (str/ends-with? part ".jar")
(JarFileResolver. (io/file part))
(DirectoryResolver. (io/file part)))))
(deftype Loader [entries]
IResourceResolver
(getResource [_ resource-paths opts]
(some #(getResource % resource-paths opts) entries))
(getResources [_ resource-paths opts]
(keep #(getResource % resource-paths opts) entries)))
(def path-sep (System/getProperty "path.separator"))
(defn ->url ^java.net.URL [^String s]
(.toURL (java.io.File. s)))
(defn loader [^String classpath]
(let [parts (.split classpath path-sep)
entries (keep part->entry parts)]
(Loader. entries)))
(defn new-loader ^babashka.impl.URLClassLoader
([paths]
(babashka.impl.URLClassLoader. (into-array java.net.URL (map ->url paths)))))
(def ^babashka.impl.URLClassLoader the-url-loader (delay (new-loader [])))
(defn add-classpath
"Adds extra-classpath, a string as for example returned by clojure
-Spath, to the current classpath."
[^String extra-classpath]
(let [paths (.split extra-classpath path-sep)
paths (map ->url paths)
loader @the-url-loader]
(run! (fn [path]
(._addURL ^babashka.impl.URLClassLoader loader path)
loader)
paths)
;; (run! prn (.getURLs the-url-loader))
(System/setProperty "java.class.path"
(let [system-cp (System/getProperty "java.class.path")]
(-> (cond-> system-cp
(not (str/blank? system-cp)) (str path-sep))
(str extra-classpath)))))
nil)
(defn resource-paths [namespace]
(defn source-for-namespace [loader namespace opts]
(let [ns-str (name namespace)
^String ns-str (namespace-munge ns-str)
^String ns-str (munge ns-str)
;; do NOT pick the platform specific file separator here, since that doesn't work for searching in .jar files
;; (io/file "foo" "bar/baz") does work on Windows, despite the forward slash
base-path (.replace ns-str "." "/")
resource-paths (mapv #(str base-path %) [".bb" ".clj" ".cljc"])]
resource-paths))
(defn source-for-namespace [loader namespace opts]
(let [rps (resource-paths namespace)]
(getResource loader rps opts)))
(getResource loader resource-paths opts)))
(defn main-ns [manifest-resource]
(with-open [is (io/input-stream manifest-resource)]
@ -71,21 +82,34 @@
(.getValue "Main-Class")
(demunge))))
(def cp-state (atom nil))
(defn add-classpath
"Adds extra-classpath, a string as for example returned by clojure
-Spath, to the current classpath."
[extra-classpath]
(swap! cp-state
(fn [{:keys [:cp]}]
(let [new-cp
(if-not cp extra-classpath
(str cp path-sep extra-classpath))]
{:loader (loader new-cp)
:cp new-cp})))
nil)
(defn split-classpath
"Returns the classpath as a seq of strings, split by the platform
specific path separator."
([^String cp] (vec (when cp (.split cp path-sep)))))
([^String cp] (vec (.split cp path-sep))))
(defn get-classpath
"Returns the current classpath as set by --classpath, BABASHKA_CLASSPATH and add-classpath."
[]
(let [cp (System/getProperty "java.class.path")]
(when-not (str/blank? cp)
cp)))
(:cp @cp-state))
(defn resource
(^URL [path] (resource path @the-url-loader))
(^URL [path loader]
(^URL [path] (when-let [st @cp-state] (resource (:loader st) path)))
(^URL [loader path]
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
(getResource loader [path] true))))
@ -104,3 +128,4 @@
(def l (loader cp))
(source-for-namespace l 'babashka.impl.cheshire nil)
(time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms

View file

@ -1,41 +0,0 @@
(ns babashka.impl.cli
(:require
[babashka.cli]
[sci.core :as sci]))
(def cns (sci/create-ns 'babashka.cli))
(def cli-namespace
(sci/copy-ns babashka.cli cns))
(defn exec-fn-snippet
([sym] (exec-fn-snippet sym nil))
([sym extra-opts]
(format "
(ns exec-%s
(:require [babashka.cli :as cli]))
(let [extra-opts '%s
sym `%s
the-var (requiring-resolve sym)
_ (when-not the-var
(throw (ex-info (str \"Could not resolve sym to a function: \" sym) {:babashka/exit 1})))
the-var-meta (meta the-var)
ns (:ns (meta the-var))
ns-meta (meta ns)
ct (babashka.tasks/current-task)
exec-args (babashka.cli/merge-opts (:exec-args (:org.babashka/cli ns-meta))
(:exec-args (:org.babashka/cli the-var-meta))
(:exec-args (:org.babashka/cli ct))
(:exec-args ct)
(:exec-args extra-opts))
cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta)
(:org.babashka/cli the-var-meta)
(:org.babashka/cli ct)
extra-opts)
cli-opts (assoc cli-opts :exec-args exec-args)
opts (babashka.cli/parse-opts *command-line-args* cli-opts)]
(the-var opts))"
(random-uuid)
(pr-str extra-opts)
sym
)))

View file

@ -3,13 +3,25 @@
(:refer-clojure :exclude [future read+string clojure-version with-precision
send-via send send-off sync into-array])
(:require [babashka.impl.common :as common]
[borkdude.graal.locking :as locking]
[clojure.core :as c]
[clojure.string :as str]
[sci.core :as sci]
[sci.impl.copy-vars :refer [copy-core-var new-var macrofy]]
[sci.impl.namespaces :refer [copy-core-var core-var macrofy]]
[sci.impl.parser :as parser]
[sci.impl.utils :refer [clojure-core-ns]]
[sci.impl.vars :as vars]))
[sci.impl.vars :as vars :refer [clojure-core-ns]]))
(defn locking* [form bindings v f & args]
(apply @#'locking/locking form bindings v f args))
(defn time*
"Evaluates expr and prints the time it took. Returns the value of
expr."
[_ _ expr]
`(let [start# (. System (nanoTime))
ret# ~expr]
(prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs"))
ret#))
(defn core-dynamic-var
([sym] (core-dynamic-var sym nil))
@ -21,9 +33,6 @@
(def compile-files (core-dynamic-var '*compile-files* false))
(def unchecked-math (core-dynamic-var '*unchecked-math* false))
(def math-context (core-dynamic-var '*math-context*))
(def compile-path (core-dynamic-var '*compile-path* *compile-path*))
(def compiler-options (core-dynamic-var '*compiler-options*))
(def repl (core-dynamic-var '*repl* true)) ;; set to true, basically just a dummy for now
(defn read+string
"Added for compatibility. Must be used with
@ -52,7 +61,7 @@
The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,
HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP."
[precision & exprs]
(let [[body rm] (if (= :rounding (first exprs))
(let [[body rm] (if (= (first exprs) :rounding)
[(next (next exprs))
`((. java.math.RoundingMode ~(second exprs)))]
[exprs nil])]
@ -118,7 +127,7 @@
:static true}
([aseq]
(try (clojure.lang.RT/seqToTypedArray (seq aseq))
(catch Throwable _
(catch IllegalArgumentException _
(clojure.lang.RT/seqToTypedArray Object (seq aseq)))))
([type aseq]
(clojure.lang.RT/seqToTypedArray type (seq aseq))))
@ -144,9 +153,11 @@
'file-seq (copy-core-var file-seq)
'promise (copy-core-var promise)
'deliver (copy-core-var deliver)
'locking (macrofy 'locking locking*)
'shutdown-agents (copy-core-var shutdown-agents)
'slurp (copy-core-var slurp)
'spit (copy-core-var spit)
'time (macrofy 'time time*)
'Throwable->map (copy-core-var Throwable->map)
'tap> (copy-core-var tap>)
'add-tap (copy-core-var add-tap)
@ -154,16 +165,13 @@
'*data-readers* data-readers
'default-data-readers (copy-core-var default-data-readers)
'xml-seq (copy-core-var xml-seq)
'read+string (new-var 'read+string (fn [& args]
(apply read+string (common/ctx) args)))
'read+string (core-var 'read+string (fn [& args]
(apply read+string @common/ctx args)))
'*command-line-args* command-line-args
'*warn-on-reflection* warn-on-reflection
'*compile-files* compile-files
'*unchecked-math* unchecked-math
'*math-context* math-context
'*compiler-options* compiler-options
'*compile-path* compile-path
'*source-path* sci/file
'with-precision (sci/copy-var with-precision clojure-core-ns)
'-with-precision (sci/copy-var -with-precision clojure-core-ns)
;; STM
@ -174,8 +182,6 @@
'sync (sci/copy-var sync clojure-core-ns)
'ref (sci/copy-var ref clojure-core-ns)
'ref-set (sci/copy-var ref-set clojure-core-ns)
'ensure (sci/copy-var ensure clojure-core-ns)
;; end STM
'update-vals (sci/copy-var update-vals clojure-core-ns)
'update-keys (sci/copy-var update-keys clojure-core-ns)
'parse-boolean (sci/copy-var parse-boolean clojure-core-ns)
@ -188,20 +194,6 @@
'iteration (sci/copy-var iteration clojure-core-ns)
'abs (sci/copy-var abs clojure-core-ns)
'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns)
'into-array (sci/copy-var into-array clojure-core-ns)
'print-method (sci/copy-var print-method clojure-core-ns)
'print-dup (sci/copy-var print-dup clojure-core-ns)
'PrintWriter-on (sci/copy-var PrintWriter-on clojure-core-ns)
'set-agent-send-executor! (sci/copy-var set-agent-send-executor! clojure-core-ns)
'set-agent-send-off-executor! (sci/copy-var set-agent-send-off-executor! clojure-core-ns)
;; 1.12
'splitv-at (sci/copy-var splitv-at clojure-core-ns)
'stream-transduce! (sci/copy-var stream-transduce! clojure-core-ns)
'partitionv (sci/copy-var partitionv clojure-core-ns)
'stream-into! (sci/copy-var stream-into! clojure-core-ns)
'stream-reduce! (sci/copy-var stream-reduce! clojure-core-ns)
'stream-seq! (sci/copy-var stream-seq! clojure-core-ns)
'partitionv-all (sci/copy-var partitionv-all clojure-core-ns)
'*repl* repl
}
'memfn (sci/copy-var memfn clojure-core-ns)
'into-array (sci/copy-var into-array clojure-core-ns)}
)

View file

@ -2,94 +2,32 @@
{:no-doc true}
(:require [clojure.core.async :as async]
[clojure.core.async.impl.protocols :as protocols]
[clojure.core.async.impl.dispatch :as dispatch]
[sci.core :as sci :refer [copy-var]]
[sci.impl.copy-vars :refer [macrofy]]
[sci.impl.vars :as vars])
(:import [java.util.concurrent Executors ExecutorService ThreadFactory]))
[sci.impl.namespaces :refer [copy-var macrofy]]
[sci.impl.vars :as vars]))
(set! *warn-on-reflection* true)
#_(def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor)
(def executor-for
"Given a workload tag, returns an ExecutorService instance and memoizes the result. By
default, core.async will defer to a user factory (if provided via sys prop) or construct
a specialized ExecutorService instance for each tag :io, :compute, and :mixed. When
given the tag :core-async-dispatch it will default to the executor service for :io."
(memoize
(fn ^ExecutorService [workload]
(let [sysprop-factory nil #_(when-let [esf (System/getProperty "clojure.core.async.executor-factory")]
(requiring-resolve (symbol esf)))
sp-exec (and sysprop-factory (sysprop-factory workload))]
(or sp-exec
(if (= workload :core-async-dispatch)
(executor-for :io)
(@#'dispatch/create-default-executor workload)))))))
(alter-var-root #'dispatch/executor-for (constantly executor-for))
#_#_(defn exec
[^Runnable r workload]
(prn :r r :w workload)
(let [^ExecutorService e (executor-for workload)]
(.execute e r)))
(alter-var-root #'dispatch/exec (constantly exec))
(def ^java.util.concurrent.Executor virtual-executor
(try (eval '(java.util.concurrent.Executors/newVirtualThreadPerTaskExecutor))
(catch Exception _ nil)))
(def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor)
(defn thread-call
"Executes f in another thread, returning immediately to the calling
thread. Returns a channel which will receive the result of calling
f when completed, then close. workload is a keyword that describes
the work performed by f, where:
:io - may do blocking I/O but must not do extended computation
:compute - must not ever block
:mixed - anything else (default)
when workload not supplied, defaults to :mixed"
([f] (thread-call f :mixed))
([f workload]
(let [c (async/chan 1)
returning-to-chan (fn [bf]
#(try
(when-some [ret (bf)]
(async/>!! c ret))
(finally (async/close! c))))
f (vars/binding-conveyor-fn f)]
(-> f #_bound-fn* returning-to-chan (dispatch/exec workload))
c)))
(defn -vthread-call
"Executes f in another virtual thread, returning immediately to the calling
thread. Returns a channel which will receive the result of calling
f when completed, then close."
[f]
(let [c (async/chan 1)]
(let [returning-to-chan (fn [bf]
#(try
(when-some [ret (bf)]
(async/>!! c ret))
(finally (async/close! c))))
f (vars/binding-conveyor-fn f)]
(.execute virtual-executor
(-> f returning-to-chan)))
(let [binds (vars/get-thread-binding-frame)]
(.execute executor
(fn []
(vars/reset-thread-binding-frame binds)
(try
(let [ret (f)]
(when-not (nil? ret)
(async/>!! c ret)))
(finally
(async/close! c))))))
c))
(defn thread
[_ _ & body]
`(~'clojure.core.async/thread-call (fn [] ~@body) :mixed))
(defn io-thread
[_ _ & body]
`(~'clojure.core.async/thread-call (fn [] ~@body) :io))
(defn -vthread
[_ _ & body]
`(~'clojure.core.async/-vthread-call (fn [] ~@body)))
`(~'clojure.core.async/thread-call (fn [] ~@body)))
(defn alt!!
"Like alt!, except as if by alts!!, will block until completed, and
@ -99,18 +37,9 @@
(defn go-loop
[_ _ bindings & body]
(list 'clojure.core.async/go (list* 'loop bindings body)))
(list 'clojure.core.async/thread (list* 'loop bindings body)))
(def core-async-namespace (sci/create-ns 'clojure.core.async nil))
(defn timeout [ms]
(if virtual-executor
(let [chan (async/chan nil)]
(.execute virtual-executor (fn []
(Thread/sleep (long ms))
(async/close! chan)))
chan)
(async/timeout ms)))
(def core-async-namespace (vars/->SciNamespace 'clojure.core.async nil))
(def async-namespace
{:obj core-async-namespace
@ -138,8 +67,6 @@
'mult (copy-var async/mult core-async-namespace)
'offer! (copy-var async/offer! core-async-namespace)
'onto-chan (copy-var async/onto-chan core-async-namespace)
'onto-chan! (copy-var async/onto-chan! core-async-namespace)
'onto-chan!! (copy-var async/onto-chan!! core-async-namespace)
'partition (copy-var async/partition core-async-namespace)
'partition-by (copy-var async/partition-by core-async-namespace)
'pipe (copy-var async/pipe core-async-namespace)
@ -161,13 +88,9 @@
'take! (copy-var async/take! core-async-namespace)
'tap (copy-var async/tap core-async-namespace)
'thread (macrofy 'thread thread core-async-namespace)
'io-thread (macrofy 'io-thread io-thread core-async-namespace)
'thread-call (copy-var thread-call core-async-namespace)
'-vthread-call (copy-var -vthread-call core-async-namespace)
'timeout (copy-var timeout core-async-namespace)
'timeout (copy-var async/timeout core-async-namespace)
'to-chan (copy-var async/to-chan core-async-namespace)
'to-chan! (copy-var async/to-chan! core-async-namespace)
'to-chan!! (copy-var async/to-chan!! core-async-namespace)
'toggle (copy-var async/toggle core-async-namespace)
'transduce (copy-var async/transduce core-async-namespace)
'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace)
@ -179,18 +102,15 @@
'untap (copy-var async/untap core-async-namespace)
'untap-all (copy-var async/untap-all core-async-namespace)
;; polyfill
'go (if virtual-executor
(macrofy 'go -vthread core-async-namespace)
(macrofy 'go thread core-async-namespace))
'go (macrofy 'go thread core-async-namespace)
'<! (copy-var async/<!! core-async-namespace {:name '<!})
'>! (copy-var async/>!! core-async-namespace {:name '>!})
'alt! (macrofy 'alt! alt!! core-async-namespace)
'alts! (copy-var async/alts!! core-async-namespace {:name 'alts!})
'go-loop (macrofy 'go-loop go-loop core-async-namespace)})
(def async-protocols-ns (sci/create-ns 'clojure.core.async.impl.protocols nil))
(def async-protocols-ns (vars/->SciNamespace 'clojure.core.async.impl.protocols nil))
(def async-protocols-namespace
{:obj async-protocols-ns
'ReadPort (copy-var protocols/ReadPort async-protocols-ns)})
;; trigger CI

View file

@ -18,7 +18,7 @@
[babashka.impl.common :refer [debug]]
[sci.core :as sci]
[sci.impl.parser :as p]
[sci.impl.utils :as utils])
[sci.impl.vars :as vars])
(:import
[clojure.lang LineNumberingPushbackReader]
[java.io BufferedWriter InputStreamReader OutputStreamWriter]
@ -214,7 +214,7 @@
:val (if (instance? Throwable ret)
(Throwable->map ret)
ret)
:ns (str (utils/current-ns-name))
:ns (str (vars/current-ns-name))
:ms ms
:form s})
true)))

Some files were not shown because too many files have changed in this diff Show more