Merge branch 'master' into spec1

This commit is contained in:
Michiel Borkent 2022-09-28 11:41:18 +02:00
commit 62a22ca864
127 changed files with 3181 additions and 1281 deletions

View file

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

View file

@ -3,484 +3,38 @@
# Check https://circleci.com/docs/2.0/language-clojure/ for more details # Check https://circleci.com/docs/2.0/language-clojure/ for more details
# #
version: 2.1 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
jobs:
jvm:
docker:
- 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: "Pull Submodules"
command: |
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: Install Clojure
command: |
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.0.0.2"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2
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.0.0.2
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.0.0.2"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2
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.0.0.2
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:
enabled: true
image: ubuntu-2004:202101-01
resource_class: arm.large
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.0.0.2"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2
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.0.0.2
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:
enabled: true
image: ubuntu-2004:202101-01
resource_class: arm.large
working_directory: ~/repo
environment:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.0.0.2"
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2
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.0.0.2
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.0.0.2"
GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.0.0.2/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.0.0.2/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
- setup-docker-buildx
- attach_workspace:
at: /tmp
- run:
name: Build Docker image
environment:
PLATFORM: linux/amd64,linux/arm64
command: .circleci/script/docker
# 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:
docker:
- image: cimg/clojure:1.11.1
steps:
- checkout
- run:
name: Bootstrap Babashka
command: |
curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
sudo bash install --dir /tmp
- run:
name: Rename bb binary
command: mv /tmp/bb /tmp/bbb
- run:
name: Generate config
command: |
/tmp/bbb .circleci/script/short_ci.clj > generated_config.yml
- continuation/continue:
configuration_path: generated_config.yml
# our single workflow, that triggers the setup job defined above
workflows: workflows:
version: 2 setup:
ci:
jobs: jobs:
- jvm - setup
- linux
- linux-static
- mac
- linux-aarch64
- linux-aarch64-static
- deploy:
filters:
branches:
only: master
requires:
- jvm
- linux
- mac
- docker:
filters:
branches:
only:
- master
requires:
- linux
- linux-static
- linux-aarch64

View file

@ -1,61 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
image_name="babashka/babashka"
image_tag=$(cat resources/BABASHKA_VERSION)
platform=${PLATFORM:-"linux/amd64"}
latest_tag="latest"
label_args=("--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'"
"--label" "org.opencontainers.image.title=Babashka"
"--label" "org.opencontainers.image.created=$(date -Iseconds)"
"--label" "org.opencontainers.image.url=${CIRCLE_REPOSITORY_URL}"
"--label" "org.opencontainers.image.documentation=${CIRCLE_REPOSITORY_URL}"
"--label" "org.opencontainers.image.source=${CIRCLE_REPOSITORY_URL}"
"--label" "org.opencontainers.image.revision=${CIRCLE_SHA1}"
"--label" "org.opencontainers.image.ref.name=${CIRCLE_TAG}:${CIRCLE_BRANCH}"
"--label" "org.opencontainers.image.version=${image_tag}")
if [[ $image_tag =~ SNAPSHOT$ ]]; then
echo "This is a snapshot version"
snapshot="true"
else
echo "This is a non-snapshot version"
snapshot="false"
fi
if [ -z "$CIRCLE_PULL_REQUEST" ] && [ "$CIRCLE_BRANCH" = "master" ]; then
echo "Building & pushing $platform Docker image(s) $image_name:$image_tag"
echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USER" --password-stdin
IFS=',' read -r -a platforms <<< "$platform"
for p in "${platforms[@]}"; do
tarball_platform=${p//\//-}
if [[ $tarball_platform == "linux-arm64" ]]; then tarball_platform="linux-aarch64"; fi
mkdir -p $p
tar zxvf "/tmp/release/babashka-${image_tag}-${tarball_platform}.tar.gz" -C $p
# this overwrites, but this is to work around having built the uberjar/metabom multiple times
cp "/tmp/release/${tarball_platform}-metabom.jar" ./metabom.jar
done
docker buildx build -t "$image_name:$image_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci .
if [[ $snapshot == "false" ]]; then
echo "Building & pushing $platform Docker image(s) $image_name:$latest_tag"
docker buildx build -t "$image_name:$latest_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci .
fi
for p in "${platforms[@]}"; do
rm -rf $p
done
# build alpine image for linux-amd64 only (no upstream arm64 support yet)
tar zxvf "/tmp/release/babashka-${image_tag}-linux-amd64-static.tar.gz"
echo "Building & pushing Docker image $image_name:$image_tag-alpine"
docker buildx build -t "$image_name:$image_tag-alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine .
if [[ $snapshot == "false" ]]; then
echo "Building & pushing Docker image $image_name:alpine"
docker buildx build -t "$image_name:alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine .
fi
else
echo "Not publishing Docker image"
fi
exit 0;

View file

@ -0,0 +1,98 @@
(require '[clojure.string :as str]
'[babashka.process :as proc]
'[babashka.fs :as fs])
(import '[java.time Instant])
(defn read-env
([k]
(read-env k nil))
([k default]
(or (System/getenv k)
default)))
(def image-name "babashka/babashka")
(def image-tag (slurp "resources/BABASHKA_VERSION"))
(def latest-tag "latest")
(def platforms (read-env "PLATFORMS" "linux/amd64"))
(def circle-repository-url (read-env "CIRCLE_REPOSITORY_URL"))
(def label-args
["--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'"
"--label" "org.opencontainers.image.title=Babashka"
"--label" (str "org.opencontainers.image.created=" (Instant/now))
"--label" (str "org.opencontainers.image.url=" circle-repository-url)
"--label" (str "org.opencontainers.image.documentation=" circle-repository-url)
"--label" (str "org.opencontainers.image.source=" circle-repository-url)
"--label" (str "org.opencontainers.image.revision=" (read-env "CIRCLE_SHA1"))
"--label"
(format "org.opencontainers.image.ref.name=%s:%s"
(read-env "CIRCLE_TAG")
(read-env "CIRCLE_BRANCH"))
"--label" (str "org.opencontainers.image.version=" image-tag)])
(def snapshot? (str/includes? image-tag "SNAPSHOT"))
(defn exec
[cmd]
(-> cmd
(proc/process {:out :inherit :err :inherit})
(proc/check)))
(defn docker-login
[username password]
(exec ["docker" "login" "-u" username "-p" password]))
(defn build-push
[image-tag platform docker-file]
(println (format "Building and pushing %s Docker image(s) %s:%s"
platform
image-name
image-tag))
(let [base-cmd ["docker" "buildx" "build"
"-t" (str image-name ":" image-tag)
"--platform" platform
"--push"
"-f" docker-file]]
(exec (concat base-cmd label-args ["."]))))
(defn build-push-images
[]
(doseq [platform (str/split platforms #",")]
(let [tarball-platform (str/replace platform #"\/" "-")
tarball-platform (if (= "linux-arm64" tarball-platform)
"linux-aarch64"
tarball-platform)
tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz"
image-tag
tarball-platform)]
(fs/create-dirs platform)
(exec ["tar" "zxvf" tarball-path "-C" platform])
; 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")
(when-not snapshot?
(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")
(when-not snapshot?
(build-push "alpine" "linux/amd64" "Dockerfile.alpine")))
(when (= *file* (System/getProperty "babashka.file"))
(if (and (nil? (read-env "CIRCLE_PULL_REQUEST"))
(= "master" (read-env "CIRCLE_BRANCH")))
(do
(if snapshot?
(println "This is a snapshot version")
(println "This is a non-snapshot version"))
(docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS"))
(build-push-images)
(build-push-alpine-images))
(println "Not publishing docker image(s).")))

View file

@ -0,0 +1,271 @@
(ns short-ci
(:require
[babashka.tasks :as tasks]
[clj-yaml.core :as yaml]
[clojure.string :as str]
[flatland.ordered.map :refer [ordered-map]]))
(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:202111-01"}
: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?]
(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"}
: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
"Run JVM tests"
"export BABASHKA_FEATURE_JDBC=true
export BABASHKA_FEATURE_POSTGRESQL=true
script/test\nscript/run_lib_tests")
(run "Run as lein command" ".circleci/script/lein")
(run
"Create uberjar"
"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\" }}"}}]))))
(defn unix
[shorted? static? musl? arch executor-conf resource-class graalvm-home platform]
(let [env {:LEIN_ROOT "true"
:GRAALVM_VERSION "22.2.0"
:GRAALVM_HOME graalvm-home
:BABASHKA_PLATFORM (if (= "mac" platform)
"macos"
platform)
:BABASHKA_TEST_ENV "native"
:BABASHKA_XMX "-J-Xmx6500m"}
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
{:attach_workspace {:at "/tmp"}}
(run "Pull Submodules" "git submodule init\ngit submodule update")
{:restore_cache
{:keys [cache-key]}}
(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 "Build binary" "script/uberjar\nscript/compile" "30m")
(run "Run tests" "script/test\nscript/run_lib_tests")
(run "Release" ".circleci/script/release")
{:persist_to_workspace {:root "/tmp"
:paths ["release"]}}
{:save_cache
{:paths ["~/.m2" "~/graalvm-ce-java11-22.2.0"]
: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:202111-01"}}
mac-executor-conf {:macos {:xcode "14.0.0"}}
linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0"
mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"]
(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 (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 (unix shorted?
false
false
"aarch64"
machine-executor-conf
"arm.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 "large" mac-graalvm-home "mac")
:deploy (deploy shorted?)
:docker (docker shorted?))
:workflows (ordered-map
:version 2
:ci {:jobs ["jvm"
"linux"
"linux-static"
"mac"
"linux-aarch64"
"linux-aarch64-static"
{:deploy {:filters {:branches {:only "master"}}
:requires ["jvm" "linux"]}}
{:docker {:filters {:branches {:only "master"}}
:requires ["linux" "linux-static" "linux-aarch64"]}}]}))))
(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))

38
.cirrus.yml Normal file
View file

@ -0,0 +1,38 @@
macos_instance:
image: ghcr.io/cirruslabs/macos-monterey-base:latest
task:
skip: "changesIncludeOnly('logo/*', '**.md')"
env:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.1.0"
GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.1.0/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
sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license
java -version
script/uberjar
script/compile
# 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

@ -2,82 +2,77 @@ name: build
on: on:
push: push:
paths-ignore:
- "**.md"
- "logo/**"
branches:
- master
pull_request:
paths-ignore:
- "**.md"
- "logo/**"
branches: branches:
- master - master
# TODO: Add deploy if needed
jobs: jobs:
scratch:
if: "!contains(github.event.head_commit.message, 'skip ci')"
runs-on: ubuntu-18.04
steps:
- name: Git checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
submodules: 'true'
- name: Scratch
run: |
echo "Scratch"
jvm: jvm:
if: "!contains(github.event.head_commit.message, 'skip ci')" if: ${{ false }} # Disabled
# ubuntu 18.04 comes with lein + java8 installed # if: "!contains(github.event.head_commit.message, 'skip ci')"
runs-on: ubuntu-18.04 runs-on: ubuntu-latest
env:
LEIN_ROOT: "true"
BABASHKA_PLATFORM: linux # could be used in jar name
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v1 uses: actions/checkout@v2
with: with:
fetch-depth: 1 fetch-depth: 1
submodules: 'true' submodules: 'true'
- name: Cache deps - name: Cache deps
uses: actions/cache@v1 uses: actions/cache@v2
id: cache-deps id: cache-deps
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
restore-keys: | restore-keys: ${{ runner.os }}-maven-
${{ runner.os }}-maven-
- name: Cache GraalVM - name: Prepare java
uses: actions/cache@v1 uses: actions/setup-java@v2
id: cache-graalvm
with: with:
path: ~/graalvm-ce-java11-22.0.0.2 distribution: 'adopt-hotspot'
key: ${{ runner.os }}-graalvm-22.0.0.2 java-version: '11'
restore-keys: |
${{ runner.os }}-graalvm-22.0.0.2
- name: Download GraalVM - name: Install clojure tools
run: | uses: DeLaGuardo/setup-clojure@5.0
cd ~ with:
if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then cli: 1.10.3.1040
curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz lein: 2.9.8
tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
fi
- name: Fetch deps
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
lein deps
- name: Run tests - name: Run tests
env:
BABASHKA_FEATURE_JDBC: "true"
BABASHKA_FEATURE_POSTGRESQL: "true"
run: | run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
script/test script/test
- name: Test libraries
run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
sudo script/install-clojure
script/run_lib_tests script/run_lib_tests
- name: Run as lein command
run: echo '{:a 1}' | lein bb '(:a *in*)'
- name: Build uberjar - name: Build uberjar
run: | run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" mkdir -p /tmp/release
script/uberjar 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"
- name: Babashka version - name: Babashka version
id: babashka-version id: babashka-version
@ -87,50 +82,76 @@ jobs:
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1
with: with:
name: jar name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
linux: native:
if: "!contains(github.event.head_commit.message, 'skip ci')" if: "!contains(github.event.head_commit.message, 'skip ci')"
needs: [jvm] strategy:
runs-on: ubuntu-18.04 matrix:
include:
- os: macos-12
name: macos
static: false
#- os: ubuntu-latest
# name: linux
# static: false
#- os: ubuntu-latest
# name: linux
# static: true
runs-on: ${{ matrix.os }}
env:
LEIN_ROOT: "true"
GRAALVM_VERSION: "22.2.0"
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
BABASHKA_TEST_ENV: native
BABASHKA_XMX: "-J-Xmx6500m"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v1 uses: actions/checkout@v2
with: with:
fetch-depth: 1 fetch-depth: 1
submodules: 'true' submodules: 'true'
- uses: actions/download-artifact@v1
with:
name: jar
path: .
- name: Cache deps - name: Cache deps
uses: actions/cache@v1 uses: actions/cache@v2
id: cache-deps id: cache-deps
with: with:
path: ~/.m2/repository path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
restore-keys: | restore-keys: ${{ runner.os }}-maven-
${{ runner.os }}-maven-
- name: Cache GraalVM - name: Setup GraalVM
uses: actions/cache@v1 if: "matrix.static == false"
id: cache-graalvm uses: graalvm/setup-graalvm@v1
with: with:
path: ~/graalvm-ce-java11-22.0.0.2 version: '22.2.0'
key: ${{ runner.os }}-graalvm-22.0.0.2 java-version: '11'
restore-keys: | components: 'native-image'
${{ runner.os }}-graalvm-22.0.0.2 github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Download GraalVM - name: Setup GraalVM+musl
if: "matrix.static == true"
uses: graalvm/setup-graalvm@v1
with:
version: '22.2.0'
java-version: '11'
components: 'native-image'
native-image-musl: true
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install clojure tools
uses: DeLaGuardo/setup-clojure@5.0
with:
cli: 1.10.3.1040
lein: 2.9.8
- name: Install native dev tools
if: matrix.os == 'ubuntu-latest'
run: | run: |
cd ~ sudo apt-get update
if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then sudo apt-get -y install build-essential zlib1g-dev
curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
fi
- name: Babashka version - name: Babashka version
id: babashka-version id: babashka-version
@ -138,209 +159,50 @@ jobs:
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION) BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
echo "##[set-output name=version;]${BABASHKA_VERSION}" echo "##[set-output name=version;]${BABASHKA_VERSION}"
- name: Build Linux native image - name: Build uberjar
run: | run: script/uberjar
export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
export BABASHKA_XMX="-J-Xmx6g"
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
script/compile
- name: Test binary - name: Build native image
run: | if: "matrix.static == false"
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" run: script/compile
BABASHKA_TEST_ENV=native script/test
- name: Install clojure - name: Build static native image
run: | if: "matrix.static == true"
sudo script/install-clojure /usr/local
- name: Test libraries
run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
BABASHKA_TEST_ENV=native script/run_lib_tests
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip
linux-static:
if: "!contains(github.event.head_commit.message, 'skip ci')"
needs: [jvm]
runs-on: ubuntu-16.04
steps:
- name: Git checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
submodules: 'true'
- uses: actions/download-artifact@v1
with:
name: jar
path: .
- name: Cache deps
uses: actions/cache@v1
id: cache-deps
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Cache GraalVM
uses: actions/cache@v1
id: cache-graalvm
with:
path: ~/graalvm-ce-java11-22.0.0.2
key: ${{ runner.os }}-graalvm-22.0.0.2
restore-keys: |
${{ runner.os }}-graalvm-22.0.0.2
- name: Download GraalVM
run: |
cd ~
if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then
curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
fi
- name: Babashka version
id: babashka-version
run: |
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
echo "##[set-output name=version;]${BABASHKA_VERSION}"
- name: Build Linux native image
run: |
export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
export BABASHKA_XMX="-J-Xmx6g"
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
export BABASHKA_STATIC=true
script/compile
- name: Test binary
run: |
./bb '(+ 1 2 3)'
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
BABASHKA_TEST_ENV=native script/test
- name: Install clojure
run: |
sudo script/install-clojure
- name: Test libraries
run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2"
BABASHKA_TEST_ENV=native script/run_lib_tests
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
mac:
if: "!contains(github.event.head_commit.message, 'skip ci')"
needs: [jvm]
runs-on: macos-latest
steps:
- name: Git checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
submodules: 'true'
- uses: actions/download-artifact@v1
with:
name: jar
path: .
- name: Cache GraalVM
uses: actions/cache@v1
id: cache-graalvm
with:
path: ~/graalvm-ce-java11-22.0.0.2
key: ${{ runner.os }}-graalvm-22.0.0.2
restore-keys: |
${{ runner.os }}-graalvm-22.0.0.2
- name: Download GraalVM
run: |
cd ~
if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then
curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-darwin-amd64-22.0.0.2.tar.gz
tar xzf graalvm-ce-java11-darwin-amd64-22.0.0.2.tar.gz
fi
- name: Babashka version
id: babashka-version
run: |
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
echo "##[set-output name=version;]${BABASHKA_VERSION}"
- name: Build macOS native image
run: |
export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
export BABASHKA_XMX="-J-Xmx6g"
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home"
script/compile
- name: Test binary
run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home"
sudo script/install-leiningen
BABASHKA_TEST_ENV=native script/test
- name: Test libraries
run: |
export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home"
sudo script/install-clojure
BABASHKA_TEST_ENV=native script/run_lib_tests
- uses: actions/upload-artifact@v1
with:
path: bb
name: babashka-${{ steps.babashka-version.outputs.version }}-macos-amd64.zip
deploy:
if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
needs: [jvm, linux, linux-static, mac]
runs-on: ubuntu-18.04
steps:
- name: Git checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
submodules: 'true'
- name: Cache deps
uses: actions/cache@v1
id: cache-deps
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Deploy
env: env:
CLOJARS_USER: "${{ secrets.CLOJARS_USER }}" BABASHKA_STATIC: "true"
CLOJARS_PASS: "${{ secrets.CLOJARS_PASS }}" BABASHKA_MUSL: "true"
run: script/compile
- name: Test binary and libs
run: | run: |
.github/script/deploy script/test
script/run_lib_tests
- 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: docker:
if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'" if: ${{ false }} # Disabled
# if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
needs: needs:
- linux - native
- linux-static runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v1 uses: actions/checkout@v2
with: with:
fetch-depth: 1 fetch-depth: 1
submodules: 'true' submodules: 'true'
@ -366,9 +228,16 @@ jobs:
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
path: /tmp/release-static path: /tmp/release-static
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: Build uberjar
run: script/uberjar
- name: Docker build - name: Docker build
env: env:
DOCKERHUB_USER: "${{ secrets.DOCKERHUB_USER }}" DOCKERHUB_USER: "${{ secrets.DOCKERHUB_USER }}"
DOCKERHUB_PASS: "${{ secrets.DOCKERHUB_PASS }}" DOCKERHUB_PASS: "${{ secrets.DOCKERHUB_PASS }}"
run: | PLATFORMS: linux/amd64,linux/arm64
.github/script/docker run: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj

3
.gitignore vendored
View file

@ -33,3 +33,6 @@ org_babashka*.h
.envrc .envrc
.lsp .lsp
bb.build_artifacts.txt bb.build_artifacts.txt
target
.nrepl-port
.DS_Store

View file

@ -5,12 +5,142 @@ For a list of breaking changes, check [here](#breaking-changes).
A preview of the next release can be installed from A preview of the next release can be installed from
[babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds).
## 0.8.0 (TBD) ## Unreleased
- Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit))
## 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!`
- `babashka.nrepl`: support pprint length
- SCI: support invoking field, without dash
- Add compatibility with clojure numeric tower
- Update deps.clj to tools jar `1.11.1.1113`
- Compatibility with fipp and puget
- Fix [#1233](https://github.com/babashka/babashka/issues/1233): don't print error to stdout in prepl
- Update process with `:pre-start-fn` option
- Update fs with `cwd` and Windows glob improvements
- Expose edamame, fixes [#549](https://github.com/babashka/babashka/issues/549) and [#1258](https://github.com/babashka/babashka/issues/1258) (#1259)
- Support `BABASBHKA_PODS_DIR` environment variable
## 0.8.1 (2022-04-15)
- Add `prepare` subcommand to download deps & pods and cache pod metadata
- [#1041](https://github.com/babashka/babashka/issues/1041): Improve error message when regex literal in EDN config
- [#1223](https://github.com/babashka/babashka/issues/1223): Ensure that var metadata (specifically `:name`) aligns with the var's symbol (which in turn ensures that `doc` will print the var's name)
- [#556](https://github.com/babashka/babashka/issues/556) Add server-status to org.httpkit.server
- [#1231](https://github.com/babashka/babashka/issues/1231): missing methods in `reify` should fall back to default interface methods
- Fix destructuring in defrecord protocol impls
- Support `*print-dup*`
## 0.8.0 (2022-04-04)
### New ### New
- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required - [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required. See [pod library docs](https://github.com/babashka/pods#in-a-babashka-project) and the entry in the [babashka book](https://book.babashka.org/#_pods_in_bb_edn) for details.
- See [updated pod library docs for details](TODO: link)
### Enhanced ### Enhanced
@ -19,7 +149,7 @@ A preview of the next release can be installed from
- [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint
- [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`.
- [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before - [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before
- #1216: fix `core.async` alts example with polyfill - [#1216](https://github.com/babashka/babashka/issues/1216): fix `core.async` alts example with polyfill
- SCI: support `let*` special form - SCI: support `let*` special form
- Add compatibility with GraalVM 22.1 - Add compatibility with GraalVM 22.1
- Bump timbre - Bump timbre
@ -30,6 +160,8 @@ A preview of the next release can be installed from
- Proxy support for PipedInputStream and PipedOutputStream - Proxy support for PipedInputStream and PipedOutputStream
- Expose `java.util.Scanner` for interop - Expose `java.util.Scanner` for interop
- Bump Selmer - Bump Selmer
- Add `->Eduction`
- Add `*unchecked-math` for compatibility
## 0.7.8 (2022-03-13) ## 0.7.8 (2022-03-13)

View file

@ -5,7 +5,7 @@ RUN apt update
RUN apt install --no-install-recommends -yy build-essential zlib1g-dev RUN apt install --no-install-recommends -yy build-essential zlib1g-dev
WORKDIR "/opt" WORKDIR "/opt"
ENV GRAALVM_VERSION="22.0.0.2" ENV GRAALVM_VERSION="22.2.0"
ARG TARGETARCH ARG TARGETARCH
ENV BABASHKA_ARCH=${TARGETARCH} ENV BABASHKA_ARCH=${TARGETARCH}
ENV GRAALVM_ARCH=${TARGETARCH} ENV GRAALVM_ARCH=${TARGETARCH}
@ -34,7 +34,7 @@ ARG BABASHKA_FEATURE_CSV=
ARG BABASHKA_FEATURE_JAVA_NET_HTTP= ARG BABASHKA_FEATURE_JAVA_NET_HTTP=
ARG BABASHKA_FEATURE_JAVA_NIO= ARG BABASHKA_FEATURE_JAVA_NIO=
ARG BABASHKA_FEATURE_JAVA_TIME= ARG BABASHKA_FEATURE_JAVA_TIME=
ARG BABAHSKA_FEATURE_TRANSIT= ARG BABASHKA_FEATURE_TRANSIT=
ARG BABASHKA_FEATURE_XML= ARG BABASHKA_FEATURE_XML=
ARG BABASHKA_FEATURE_YAML= ARG BABASHKA_FEATURE_YAML=
ARG BABASHKA_FEATURE_HTTPKIT_CLIENT= ARG BABASHKA_FEATURE_HTTPKIT_CLIENT=
@ -51,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_NET_HTTP=$BABASHKA_FEATURE_JAVA_NET_HTTP
ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO
ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME
ENV BABAHSKA_FEATURE_TRANSIT=$BABAHSKA_FEATURE_TRANSIT ENV BABASHKA_FEATURE_TRANSIT=$BABASHKA_FEATURE_TRANSIT
ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML
ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML
ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT

108
README.md
View file

@ -1,4 +1,4 @@
<img src="logo/babashka.svg" width="425px"> [<img src="logo/babashka.svg" alt="Babashka" width="425px">](https://babashka.org)
[![CircleCI](https://circleci.com/gh/babashka/babashka/tree/master.svg?style=shield)](https://circleci.com/gh/babashka/babashka/tree/master) [![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) [![project chat](https://img.shields.io/badge/slack-join_chat-brightgreen.svg)](https://app.slack.com/client/T03RZGPFR/CLX41ASCS)
@ -153,15 +153,33 @@ Install:
brew install borkdude/brew/babashka brew install borkdude/brew/babashka
On macOS with an M1 processor: <!-- On macOS with an M1 processor: -->
softwareupdate --install-rosetta <!-- softwareupdate --install-rosetta -->
arch -x86_64 brew install borkdude/brew/babashka <!-- arch -x86_64 brew install borkdude/brew/babashka -->
Upgrade: Upgrade:
brew upgrade babashka 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).
### Arch (Linux) ### 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 `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
@ -180,6 +198,8 @@ Babashka can be installed using a plugin as follows:
### Windows ### Windows
#### Scoop
On Windows you can install using [scoop](https://scoop.sh/) and the On Windows you can install using [scoop](https://scoop.sh/) and the
[scoop-clojure](https://github.com/littleli/scoop-clojure) bucket. [scoop-clojure](https://github.com/littleli/scoop-clojure) bucket.
@ -194,6 +214,12 @@ scoop bucket add extras
scoop install babashka 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.
### Installer script ### Installer script
Install via the installer script: Install via the installer script:
@ -260,13 +286,68 @@ 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. Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list of built-in namespaces.
## [Projects](doc/projects.md) ## [Compatible Projects](doc/projects.md)
A list of projects (scripts, libraries, pods and tools) known to work with babashka. A list of projects (scripts, libraries, pods and tools) known to work with babashka.
Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo! ## Badges
<!-- note to editor: it seems a blank line must appear before code blocks within <details> -->
[![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) [![bb compatible](/logo/badge.svg)](https://babashka.org)
The babashka compatible badge indicates that a [library can be used as babashka dependency](doc/projects.md).
If this is the case for your library, we encourage you to proudly display this badge.
<details><summary>Markdown</summary>
```markdown
[![bb compatible](https://raw.githubusercontent.com/babashka/babashka/master/logo/badge.svg)](https://babashka.org)
```
</details>
<details><summary>AsciiDoc</summary>
```asciidoc
https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/badge.svg[bb compatible]]
```
</details>
<details><summary>HTML</summary>
```html
<a href="https://babashka.org" rel="nofollow"><img src="https://github.com/babashka/babashka/raw/master/logo/badge.svg" alt="bb compatible" style="max-width: 100%;"></a>
```
</details>
<br/>
[![bb built-in](/logo/built-in-badge.svg)](https://babashka.org)
The babashka built-in badge means that a [library has been built directly into babashka](https://book.babashka.org/#built-in-namespaces) and requires no extra dependencies to use it.
If this rare honor belongs to your library, you should display this badge.
<details><summary>Markdown</summary>
```markdown
[![bb built-in](https://raw.githubusercontent.com/babashka/babashka/master/logo/built-in-badge.svg)](https://babashka.org)
```
</details>
<details><summary>AsciiDoc</summary>
```asciidoc
https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/built-in-badge.svg[bb built-in]]
```
</details>
<details><summary>HTML</summary>
```html
<a href="https://babashka.org" rel="nofollow"><img src="https://github.com/babashka/babashka/raw/master/logo/built-in-badge.svg" alt="bb built-in" style="max-width: 100%;"></a>
```
</details>
</br>
## [Pods](https://github.com/babashka/babashka.pods) ## [Pods](https://github.com/babashka/babashka.pods)
@ -316,7 +397,18 @@ handling of SIGINT and SIGPIPE. This can be done by setting
## Articles, podcasts and videos ## Articles, podcasts and videos
- [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](Breakneck Babashka on K8s) 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
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [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 - [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 - [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ý - [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý
@ -365,7 +457,7 @@ binary, these evaluation criteria are considered:
- The library cannot be interpreted by with babashka using `--classpath`. - The library cannot be interpreted by with babashka using `--classpath`.
- The functionality can't be met by shelling out to another CLI or can't be - The functionality can't be met by shelling out to another CLI or can't be
written as a small layer over an existing CLI (like `babashka.curl`) instead. written as a small layer over an existing CLI (like `babashka.curl`) instead.
- The library cannot be implemented a - The library cannot be implemented as a
[pod](https://github.com/babashka/babashka.pods). [pod](https://github.com/babashka/babashka.pods).
If not all of the criteria are met, but adding a feature is still useful to a If not all of the criteria are met, but adding a feature is still useful to a

View file

@ -7,10 +7,15 @@ image: Visual Studio 2017
clone_folder: C:\projects\babashka clone_folder: C:\projects\babashka
environment: environment:
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.0.0.2 GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.0.0.2 JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0
BABASHKA_XMX: "-J-Xmx5g" BABASHKA_XMX: "-J-Xmx5g"
skip_commits:
files:
- "logo/*"
- "**/*.md"
cache: cache:
- C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml - C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml
- '%USERPROFILE%\.m2 -> project.clj' - '%USERPROFILE%\.m2 -> project.clj'
@ -33,7 +38,7 @@ clone_script:
build_script: build_script:
- cmd: >- - cmd: >-
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-windows-amd64-22.0.0.2.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.2.0/graalvm-ce-java11-windows-amd64-22.2.0.zip', 'graalvm.zip') }"
powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }" powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }"

@ -1 +1 @@
Subproject commit d3fce67198b042707f01d841c032f841cc57ab7f Subproject commit c8c8a766e026d5f87e0968a179dad70e13aa13ee

@ -1 +1 @@
Subproject commit c948c2f5c1e240c0e0ea4201877695f729ee309e Subproject commit d4d6d720c0d62eb3e2230fa85291a5fd68398d6a

View file

@ -10,14 +10,18 @@
"feature-selmer" "feature-selmer"
"feature-logging" "feature-logging"
"feature-priority-map" "feature-priority-map"
"feature-rrb-vector"
"feature-jdbc" "feature-jdbc"
"pods/src" "pods/src"
"babashka.nrepl/src" "babashka.nrepl/src"
"depstar/src" "process/src" "depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources" "deps.clj/src" "deps.clj/resources"
"resources" "sci/resources"], "resources" "sci/resources"
:deps {org.clojure/clojure {:mvn/version "1.11.0"}, "reify/src"],
borkdude/sci {:local/root "sci"} :deps {org.clojure/clojure {:mvn/version "1.11.1"},
org.babashka/sci {:local/root "sci"}
org.babashka/babashka.impl.reify {:mvn/version "0.1.3"}
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
babashka/babashka.curl {:local/root "babashka.curl"} babashka/babashka.curl {:local/root "babashka.curl"}
babashka/fs {:local/root "fs"} babashka/fs {:local/root "fs"}
babashka/babashka.core {:local/root "babashka.core"} babashka/babashka.core {:local/root "babashka.core"}
@ -25,9 +29,9 @@
org.clojure/core.async {:mvn/version "1.5.648"}, org.clojure/core.async {:mvn/version "1.5.648"},
org.clojure/tools.cli {:mvn/version "1.0.206"}, org.clojure/tools.cli {:mvn/version "1.0.206"},
org.clojure/data.csv {:mvn/version "1.0.0"}, org.clojure/data.csv {:mvn/version "1.0.0"},
cheshire/cheshire {:mvn/version "5.10.2"} cheshire/cheshire {:mvn/version "5.11.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
clj-commons/clj-yaml {:mvn/version "0.7.108"} clj-commons/clj-yaml {:mvn/version "0.7.169"}
com.cognitect/transit-clj {:mvn/version "1.0.329"} com.cognitect/transit-clj {:mvn/version "1.0.329"}
org.clojure/test.check {:mvn/version "1.1.1"} org.clojure/test.check {:mvn/version "1.1.1"}
nrepl/bencode {:mvn/version "1.1.0"} nrepl/bencode {:mvn/version "1.1.0"}
@ -35,15 +39,18 @@
org.postgresql/postgresql {:mvn/version "42.2.18"} org.postgresql/postgresql {:mvn/version "42.2.18"}
org.hsqldb/hsqldb {:mvn/version "2.5.1"} org.hsqldb/hsqldb {:mvn/version "2.5.1"}
datascript/datascript {:mvn/version "1.0.1"} datascript/datascript {:mvn/version "1.0.1"}
http-kit/http-kit {:mvn/version "2.5.3"} http-kit/http-kit {:mvn/version "2.6.0-RC1"}
babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"} babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"}
org.clojure/core.match {:mvn/version "1.0.0"} org.clojure/core.match {:mvn/version "1.0.0"}
hiccup/hiccup {:mvn/version "2.0.0-alpha2"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"}
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} rewrite-clj/rewrite-clj {:mvn/version "1.1.45"}
selmer/selmer {:mvn/version "1.12.50"} selmer/selmer {:mvn/version "1.12.50"}
com.taoensso/timbre {:mvn/version "5.2.1"} com.taoensso/timbre {:mvn/version "5.2.1"}
org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/tools.logging {:mvn/version "1.1.0"}
org.clojure/data.priority-map {: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.4.37"}}
:aliases {:babashka/dev :aliases {:babashka/dev
{:main-opts ["-m" "babashka.main"]} {:main-opts ["-m" "babashka.main"]}
:profile :profile
@ -129,9 +136,25 @@
clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"} clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"}
cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"} cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"}
aysylu/loom {:mvn/version "1.0.2"} aysylu/loom {:mvn/version "1.0.2"}
com.layerware/hugsql-core {:mvn/version "0.5.1"} com.layerware/hugsql-core {:mvn/version "0.5.3"}
com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.github.seancorfield/expectations {:mvn/version "2.0.157"}
com.rpl/specter {:mvn/version "1.1.4"}} 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}}
:classpath-overrides {org.clojure/clojure nil :classpath-overrides {org.clojure/clojure nil
org.clojure/spec.alpha nil}} org.clojure/spec.alpha nil}}
:clj-nvd :clj-nvd
@ -147,3 +170,4 @@
:test-pod :test-pod
{:extra-paths ["test-resources"] {:extra-paths ["test-resources"]
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}} :main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
;; release

View file

@ -3,24 +3,24 @@
## Prerequisites ## Prerequisites
- Install [lein](https://leiningen.org/) for producing uberjars - Install [lein](https://leiningen.org/) for producing uberjars
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.0.0.2*. - Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.2.0*.
- For Windows, installing Visual Studio 2019 with the "Desktop development - For Windows, installing Visual Studio 2019 with the "Desktop development
with C++" workload is recommended. with C++" workload is recommended.
- Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like: - Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like:
``` shell ``` shell
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.0.0.2/Contents/Home export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.0/Contents/Home
``` ```
On linux: On linux:
``` shell ``` shell
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.0.0.2 export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.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): 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-java11-22.0.0.2 set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.2.0
``` ```
If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using: If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using:
``` ```

View file

@ -61,6 +61,7 @@ Sponsoring via [Cognitect](https://www.cognitect.com/).
- [Datil](https://datil.com/) - [Datil](https://datil.com/)
- [Deon Digital](https://www.deondigital.com/) - [Deon Digital](https://www.deondigital.com/)
- [Fluent](https://fluent.to/) - [Fluent](https://fluent.to/)
- [Fluree](https://flur.ee/)
- [Hi](https://www.hi.group/) - [Hi](https://www.hi.group/)
- [Juxt](https://www.juxt.pro/) - [Juxt](https://www.juxt.pro/)
- [Latacora](https://www.latacora.com/) - [Latacora](https://www.latacora.com/)

View file

@ -37,7 +37,7 @@ reasons:
## Requirements ## Requirements
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.0.0.2. 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.2.0.
## Clone repository ## Clone repository

5
doc/fly_io/Dockerfile Normal file
View file

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

19
doc/fly_io/README.md Normal file
View file

@ -0,0 +1,19 @@
# 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.

21
doc/fly_io/example.clj Normal file
View file

@ -0,0 +1,21 @@
(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)

41
doc/fly_io/fly.toml Normal file
View file

@ -0,0 +1,41 @@
# 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

@ -17,6 +17,7 @@ clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv
clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack
clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors
com.exoscale/lingo,https://github.com/exoscale/lingo com.exoscale/lingo,https://github.com/exoscale/lingo
com.github.askonomm/clarktown,https://github.com/askonomm/clarktown
com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test
com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql
com.grammarly/omniconf,https://github.com/grammarly/omniconf com.grammarly/omniconf,https://github.com/grammarly/omniconf
@ -73,6 +74,7 @@ org.clojure/data.generators,https://github.com/clojure/data.generators
org.clojure/data.json,https://github.com/clojure/data.json org.clojure/data.json,https://github.com/clojure/data.json
org.clojure/data.zip,https://github.com/clojure/data.zip org.clojure/data.zip,https://github.com/clojure/data.zip
org.clojure/math.combinatorics,https://github.com/clojure/math.combinatorics 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/test.check,https://github.com/clojure/test.check
org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs
org.clojure/tools.namespace,https://github.com/babashka/tools.namespace org.clojure/tools.namespace,https://github.com/babashka/tools.namespace

1 maven-name git-url
17 clojure-msgpack/clojure-msgpack https://github.com/edma2/clojure-msgpack
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
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
74 org.clojure/data.json https://github.com/clojure/data.json
75 org.clojure/data.zip https://github.com/clojure/data.zip
76 org.clojure/math.combinatorics https://github.com/clojure/math.combinatorics
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/babashka/tools.namespace

View file

@ -5,13 +5,88 @@ you have anything to add. Also see
[#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on [#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on
Twitter. Twitter.
<!-- ## [2022-07](https://twitter.com/search?q=(%23babashka)%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live)
## 2022-03 - [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=(%23babashka)%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=(%23babashka)%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=(%23babashka)%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=(%23babashka)%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 - [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=(%23babashka)%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=(%23babashka)%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 ## 2021-12
@ -74,7 +149,7 @@ Twitter.
- [Cursive](https://twitter.com/CursiveIDE/status/1439022267187433472) adds support for babashka in 1.11.0 - [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) - 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 - [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 ## 2021-08

119
doc/nix.md Normal file
View file

@ -0,0 +1,119 @@
# 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).
Here is an example `flake.nix` using `cowsay` as an external dependency:
```nix
{
inputs.wbba.url = "github:sohalt/write-babashka-application";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { nixpkgs, flake-utils, wbba, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ wbba.overlay ];
};
hello-babashka = pkgs.writeBabashkaApplication {
name = "hello";
runtimeInputs = with pkgs;[
cowsay # add your dependencies here
];
text = ''
(ns hello
(:require [babashka.process :refer [sh]]))
(-> (sh ["cowsay" "hello from babashka"])
:out
print)
'';
};
in
{
defaultApp = hello-babashka;
defaultPackage = hello-babashka;
});
}
```
You can then build the application using `nix build` or run it using `nix run`.

View file

@ -7,7 +7,6 @@ The following libraries and projects are known to work with babashka.
- [tools.namespace](#toolsnamespace) - [tools.namespace](#toolsnamespace)
- [test-runner](#test-runner) - [test-runner](#test-runner)
- [spec.alpha](#specalpha) - [spec.alpha](#specalpha)
- [tools.bbuild](#toolsbbuild)
- [clj-http-lite](#clj-http-lite) - [clj-http-lite](#clj-http-lite)
- [spartan.spec](#spartanspec) - [spartan.spec](#spartanspec)
- [missing.test.assertions](#missingtestassertions) - [missing.test.assertions](#missingtestassertions)
@ -62,6 +61,10 @@ The following libraries and projects are known to work with babashka.
- [datalog-parser](#datalog-parser) - [datalog-parser](#datalog-parser)
- [at-at](#at-at) - [at-at](#at-at)
- [aysylu/loom](#aysyluloom) - [aysylu/loom](#aysyluloom)
- [Clarktown](#clarktown)
- [Malli](#malli)
- [Meander](#meander)
- [Schema](#schema)
- [Pods](#pods) - [Pods](#pods)
- [Projects](#projects-1) - [Projects](#projects-1)
- [babashka-test-action](#babashka-test-action) - [babashka-test-action](#babashka-test-action)
@ -88,6 +91,7 @@ The following libraries and projects are known to work with babashka.
- [Babashka + scittle guestbook](#babashka--scittle-guestbook) - [Babashka + scittle guestbook](#babashka--scittle-guestbook)
- [bb htmx todo app](#bb-htmx-todo-app) - [bb htmx todo app](#bb-htmx-todo-app)
- [bb aws lambda runtime](#bb-aws-lambda-runtime) - [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 Also keep an eye on the [news](news.md) page for new projects, gists and other
developments around babashka. developments around babashka.
@ -114,9 +118,9 @@ A fork of `clojure.spec.alpha` that includes support for generation and
instrumentation! Its readme also contains instructions on how to use instrumentation! Its readme also contains instructions on how to use
`clojure.core.specs.alpha`. `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) ### [clj-http-lite](https://github.com/clj-commons/clj-http-lite)
@ -808,6 +812,22 @@ Ahead-of-time function scheduler. Compatible with babashka 0.7.7+.
Graph library for Clojure. Compatible with babashka 0.7.8+. Graph library for Clojure. Compatible with babashka 0.7.8+.
### [Clarktown](https://github.com/askonomm/clarktown)
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
## Pods ## Pods
[Babashka pods](https://github.com/babashka/babashka.pods) are programs that can [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can
@ -875,7 +895,7 @@ A babashka script to obtain covid-19 related information.
### [bb-spotify](https://github.com/kolharsam/bb-spotify) ### [bb-spotify](https://github.com/kolharsam/bb-spotify)
Contol your spotify player using babashka. Control your spotify player using babashka.
### [lambdaisland/open-source](https://github.com/lambdaisland/open-source) ### [lambdaisland/open-source](https://github.com/lambdaisland/open-source)
@ -935,3 +955,8 @@ Quick example of a todo list SPA using Babashka and htmx.
### [bb aws lambda runtime](https://github.com/tatut/bb-lambda) ### [bb aws lambda runtime](https://github.com/tatut/bb-lambda)
AWS Lambda custom runtime for Babashka scripts. 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

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

View file

@ -52,10 +52,10 @@
util/raw-string) util/raw-string)
(def hiccup-namespace (def hiccup-namespace
{'html (copy-var html-1 hns)}) {'html (copy-var html-1 hns {:name 'html})})
(def hiccup2-namespace (def hiccup2-namespace
{'html (copy-var html-2 hns2)}) {'html (copy-var html-2 hns2 {:name 'html})})
(def html-mode (copy-var util/*html-mode* uns)) (def html-mode (copy-var util/*html-mode* uns))
(def escape-strings? (copy-var util/*escape-strings?* uns)) (def escape-strings? (copy-var util/*escape-strings?* uns))

View file

@ -76,4 +76,4 @@
(def sni-client-namespace (def sni-client-namespace
{'ssl-configurer (copy-var sni-client/ssl-configurer sns) {'ssl-configurer (copy-var sni-client/ssl-configurer sns)
'default-client (sci/new-var 'sni-client sni-client {:ns sns})}) 'default-client (sci/new-var 'default-client sni-client {:ns sns})})

View file

@ -8,6 +8,7 @@
{:obj sns {:obj sns
'server-stop! (copy-var server/server-stop! sns) 'server-stop! (copy-var server/server-stop! sns)
'server-port (copy-var server/server-port sns) 'server-port (copy-var server/server-port sns)
'server-status (copy-var server/server-status sns)
'run-server (copy-var server/run-server sns) 'run-server (copy-var server/run-server sns)
'sec-websocket-accept (copy-var server/sec-websocket-accept sns) 'sec-websocket-accept (copy-var server/sec-websocket-accept sns)
'websocket-handshake-check (copy-var server/websocket-handshake-check sns) 'websocket-handshake-check (copy-var server/websocket-handshake-check sns)

View file

@ -1,12 +1,13 @@
(ns babashka.impl.jdbc (ns babashka.impl.jdbc
{:no-doc true} {:no-doc true}
(:require [next.jdbc :as njdbc] (:require
[next.jdbc.result-set :as rs] [next.jdbc :as njdbc]
[next.jdbc.sql :as sql] [next.jdbc.result-set :as rs]
[sci.impl.namespaces :refer [copy-var macrofy]] [next.jdbc.sql :as sql]
[sci.impl.vars :as vars])) [sci.core :as sci]
[sci.impl.namespaces :refer [copy-var macrofy]]))
(def next-ns (vars/->SciNamespace 'next.jdbc nil)) (def next-ns (sci/create-ns 'next.jdbc nil))
(defn with-transaction (defn with-transaction
"Given a transactable object, gets a connection and binds it to `sym`, "Given a transactable object, gets a connection and binds it to `sym`,
@ -31,12 +32,12 @@
'transact (copy-var njdbc/transact next-ns) 'transact (copy-var njdbc/transact next-ns)
'with-transaction (macrofy 'with-transaction with-transaction next-ns)}) 'with-transaction (macrofy 'with-transaction with-transaction next-ns)})
(def sns (vars/->SciNamespace 'next.jdbc.sql nil)) (def sns (sci/create-ns 'next.jdbc.sql nil))
(def next-sql-namespace (def next-sql-namespace
{'insert-multi! (copy-var sql/insert-multi! sns)}) {'insert-multi! (copy-var sql/insert-multi! sns)})
(def rsns (vars/->SciNamespace 'next.jdbc.result-set nil)) (def rsns (sci/create-ns 'next.jdbc.result-set nil))
(def result-set-namespace (def result-set-namespace
{'as-maps (copy-var rs/as-maps rsns) {'as-maps (copy-var rs/as-maps rsns)

View file

@ -0,0 +1,7 @@
(ns babashka.impl.rrb-vector
(:require [clojure.core.rrb-vector :as rrb]
[sci.core :as sci]))
(def rrbns (sci/create-ns 'clojure.core.rrb-vector))
(def rrb-vector-namespace {'catvec (sci/copy-var rrb/catvec rrbns)})

View file

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

View file

@ -12,7 +12,7 @@
(def xtns (sci/create-ns 'clojure.data.xml.tree nil)) (def xtns (sci/create-ns 'clojure.data.xml.tree nil))
(defn- clj-ns-name [ns] (defn- clj-ns-name [ns]
(cond (instance? sci.impl.vars.SciNamespace ns) (str ns) (cond (instance? sci.lang.Namespace ns) (str ns)
(keyword? ns) (name ns) (keyword? ns) (name ns)
:else (str ns))) :else (str ns)))

2
fs

@ -1 +1 @@
Subproject commit f421d50c1e48c14dd5be61daadab85be2f8e956b Subproject commit 73210e83808b8bfe664cba7d2148464a2fa38aae

36
install
View file

@ -74,7 +74,7 @@ if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then
fi fi
if [[ "$version" == "" ]]; then if [[ "$version" == "" ]]; then
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)" version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
fi fi
case "$(uname -s)" in case "$(uname -s)" in
@ -82,21 +82,27 @@ case "$(uname -s)" in
Darwin*) platform=macos;; Darwin*) platform=macos;;
esac esac
case "$(uname -m)" in
aarch64) arch=aarch64;;
*) arch=amd64;;
esac
# Ugly ugly conversion of version to a comparable number # Ugly ugly conversion of version to a comparable number
IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}" IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}") vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
case "$(uname -m)" in
aarch64) arch=aarch64;;
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
arch="amd64"
else
arch="aarch64"
fi
;;
*) arch=amd64;;
esac
if [[ 10#$vernum -le 10#000002013 ]]; then if [[ 10#$vernum -le 10#000002013 ]]; then
ext="zip" ext="zip"
util="$(which unzip) -qqo" util="$(which unzip) -qqo"
else else
ext="tar.gz" ext="tar.gz"
util="$(which tar) -zxf" util="$(which tar) -zxf"
fi fi
case "$platform-$static_binary" in case "$platform-$static_binary" in
@ -121,13 +127,13 @@ download_url="https://github.com/babashka/$repo/releases/download/v$version/$fil
# macOS only have shasum available by default # macOS only have shasum available by default
# Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both) # Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both)
if command -v sha256sum >/dev/null; then if command -v sha256sum >/dev/null; then
sha256sum_cmd="sha256sum" sha256sum_cmd="sha256sum"
elif command -v shasum >/dev/null; then elif command -v shasum >/dev/null; then
sha256sum_cmd="shasum -a 256" sha256sum_cmd="shasum -a 256"
else else
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!" >&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
>&2 echo "Exiting..." >&2 echo "Exiting..."
exit 1 exit 1
fi fi
# Running this part in a subshell so when it finishes we go back to the previous directory # Running this part in a subshell so when it finishes we go back to the previous directory

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View file

@ -0,0 +1,25 @@
<?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>

After

Width:  |  Height:  |  Size: 11 KiB

BIN
logo/babashka_red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

31
logo/babashka_red.svg Normal file
View file

@ -0,0 +1,31 @@
<?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>

After

Width:  |  Height:  |  Size: 11 KiB

1
logo/badge.svg Normal file
View file

@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 4.8 KiB

1
logo/built-in-badge.svg Normal file
View file

@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 4.8 KiB

2
pods

@ -1 +1 @@
Subproject commit e075b13bfe3666a73f82c12817bdf5f1d6c692e3 Subproject commit 53f79da09d5da542204f3cb0161724221276dfcb

@ -1 +1 @@
Subproject commit 8d72f2097a1dc49b81a52af6733b8beb836efbdc Subproject commit bd203b79a21b6155b61b4b4efda5a497dec2567d

View file

@ -10,30 +10,36 @@
:source-paths ["src" "sci/src" "babashka.curl/src" "fs/src" "pods/src" :source-paths ["src" "sci/src" "babashka.curl/src" "fs/src" "pods/src"
"babashka.core/src" "babashka.core/src"
"babashka.nrepl/src" "depstar/src" "process/src" "babashka.nrepl/src" "depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources"] "deps.clj/src" "deps.clj/resources"
"reify/src"]
;; for debugging Reflector.java code: ;; for debugging Reflector.java code:
;; :java-source-paths ["sci/reflector/src-java"] ;; :java-source-paths ["sci/reflector/src-java"]
:java-source-paths ["src-java"] :java-source-paths ["src-java"]
:resource-paths ["resources" "sci/resources"] :resource-paths ["resources" "sci/resources"]
:test-selectors {:default (complement :windows-only) :test-selectors {:default (complement :windows-only)
:windows (complement :skip-windows)} :windows (complement :skip-windows)}
:dependencies [[org.clojure/clojure "1.11.0"] :dependencies [[org.clojure/clojure "1.11.1"]
[borkdude/edamame "0.0.19"] [borkdude/edamame "1.0.0"]
[borkdude/graal.locking "0.0.2"] [borkdude/graal.locking "0.0.2"]
[org.clojure/tools.cli "1.0.206"] [org.clojure/tools.cli "1.0.206"]
[cheshire "5.10.2"] [cheshire "5.11.0"]
[nrepl/bencode "1.1.0"] [nrepl/bencode "1.1.0"]
[borkdude/sci.impl.reflector "0.0.1"] [borkdude/sci.impl.reflector "0.0.1"]
[org.babashka/sci.impl.types "0.0.2"]
[org.babashka/babashka.impl.reify "0.1.3"]
[org.clojure/core.async "1.5.648"] [org.clojure/core.async "1.5.648"]
[org.clojure/test.check "1.1.1"] [org.clojure/test.check "1.1.1"]
[com.github.clj-easy/graal-build-time "0.1.0"] [com.github.clj-easy/graal-build-time "0.1.0"]
[rewrite-clj/rewrite-clj "1.0.699-alpha"]] [rewrite-clj/rewrite-clj "1.1.45"]
[insn/insn "0.5.2"]
[org.babashka/cli "0.4.37"]]
:plugins [[org.kipz/lein-meta-bom "0.1.1"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]]
:metabom {:jar-name "metabom.jar"} :metabom {:jar-name "metabom.jar"}
:profiles {:feature/xml {:source-paths ["feature-xml"] :profiles {:feature/xml {:source-paths ["feature-xml"]
:dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]} :dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]}
:feature/yaml {:source-paths ["feature-yaml"] :feature/yaml {:source-paths ["feature-yaml"]
:dependencies [[clj-commons/clj-yaml "0.7.108"]]} :dependencies [[clj-commons/clj-yaml "0.7.169"
#_#_clj-commons/clj-yaml "0.7.110"]]}
:feature/jdbc {:source-paths ["feature-jdbc"] :feature/jdbc {:source-paths ["feature-jdbc"]
:dependencies [[seancorfield/next.jdbc "1.1.610"]]} :dependencies [[seancorfield/next.jdbc "1.1.610"]]}
:feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}] :feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}]
@ -48,9 +54,9 @@
:feature/datascript {:source-paths ["feature-datascript"] :feature/datascript {:source-paths ["feature-datascript"]
:dependencies [[datascript "1.3.10"]]} :dependencies [[datascript "1.3.10"]]}
:feature/httpkit-client {:source-paths ["feature-httpkit-client"] :feature/httpkit-client {:source-paths ["feature-httpkit-client"]
:dependencies [[http-kit "2.5.3"]]} :dependencies [[http-kit "2.6.0-RC1"]]}
:feature/httpkit-server {:source-paths ["feature-httpkit-server"] :feature/httpkit-server {:source-paths ["feature-httpkit-server"]
:dependencies [[http-kit "2.5.3"]]} :dependencies [[http-kit "2.6.0-RC1"]]}
:feature/lanterna {:source-paths ["feature-lanterna"] :feature/lanterna {:source-paths ["feature-lanterna"]
:dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]} :dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]}
:feature/core-match {:source-paths ["feature-core-match"] :feature/core-match {:source-paths ["feature-core-match"]
@ -66,6 +72,8 @@
[org.clojure/tools.logging "1.1.0"]]} [org.clojure/tools.logging "1.1.0"]]}
:feature/priority-map {:source-paths ["feature-priority-map"] :feature/priority-map {:source-paths ["feature-priority-map"]
:dependencies [[org.clojure/data.priority-map "1.1.0"]]} :dependencies [[org.clojure/data.priority-map "1.1.0"]]}
:feature/rrb-vector {:source-paths ["feature-rrb-vector"]
:dependencies [[org.clojure/core.rrb-vector "0.1.2"]]}
:test [:feature/xml :test [:feature/xml
:feature/lanterna :feature/lanterna
:feature/yaml :feature/yaml
@ -83,6 +91,7 @@
:feature/selmer :feature/selmer
:feature/logging :feature/logging
:feature/priority-map :feature/priority-map
:feature/rrb-vector
{:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"] {:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
[com.opentable.components/otj-pg-embedded "0.13.3"]]}] [com.opentable.components/otj-pg-embedded "0.13.3"]]}]
:uberjar {:global-vars {*assert* false} :uberjar {:global-vars {*assert* false}

2
reify/.dir-locals.el Normal file
View file

@ -0,0 +1,2 @@
((nil
(cider-clojure-cli-global-options . "-A:test:build")))

2
reify/bb.edn Normal file
View file

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

50
reify/build.clj Normal file
View file

@ -0,0 +1,50 @@
(ns build
(:require [build.reify2 :as reify2]
[clojure.tools.build.api :as b]))
(def lib 'org.babashka/babashka.impl.reify)
(def version "0.1.3")
(def class-dir "target/classes")
(def basis (b/create-basis {:project "deps.edn"}))
(def jar-file (format "target/%s-%s.jar" (name lib) version))
(defn clean [_]
(b/delete {:path "target"}))
(defn gen-classes [_]
(reify2/gen-classes nil))
(defn jar [_]
(gen-classes nil)
(b/write-pom {:class-dir class-dir
:lib lib
:version version
:basis basis
:src-dirs ["src"]})
(b/copy-dir {:src-dirs ["src"]
:target-dir class-dir})
(b/jar {:class-dir class-dir
:jar-file jar-file}))
(defn install [_]
(jar nil)
(b/install {:basis basis
:lib lib
:version version
:jar-file jar-file
:class-dir class-dir}))
(defn deploy [opts]
(jar opts)
((requiring-resolve 'deps-deploy.deps-deploy/deploy)
(merge {:installer :remote
:artifact jar-file
:pom-file (b/pom-path {:lib lib :class-dir class-dir})}
opts))
opts)
;;;; Scratch
(comment
(gen-classes nil)
)

188
reify/build/reify2.clj Normal file
View file

@ -0,0 +1,188 @@
(ns build.reify2
{:no-doc true}
(:require [babashka.impl.reify2.interfaces :refer [interfaces]]
[insn.core :as insn]))
(set! *warn-on-reflection* false)
(defn set-symbol! [s]
[[:aconst-null]
[:ldc s]
[:invokestatic clojure.lang.Symbol "intern" [String String clojure.lang.Symbol]]
[:putstatic :this (str "_sym_" s) clojure.lang.Symbol]])
(defn return [desc]
(case (last desc)
:void [:return]
(:boolean :int) [:ireturn]
[:areturn]))
(defn loads [desc cast?]
(let [desc (butlast desc)]
(vec
(mapcat (fn [i e]
(case e
:boolean [[:iload i]
(when cast? [:invokestatic Boolean "valueOf" [:boolean Boolean]])]
:int [[:iload i]
(when cast? [:invokestatic Integer "valueOf" [:int Integer]])]
[[:aload i]]))
(range 1 (inc (count desc)))
desc))))
(defn emit-method [class meth desc default]
(let [args (dec (count desc))]
[[[:aload 0]
[:getfield :this "_methods" java.util.Map]
[:getstatic :this (str "_sym_" meth) clojure.lang.Symbol]
[:invokeinterface java.util.Map "get" [Object Object]]
[:checkcast clojure.lang.IFn]
[:astore (inc args)]
[:aload (inc args)]
[:ifnull :fallback]
[:aload (inc args)]
;; load this, always the first argument of IFn
[:aload 0]]
;; load remaining args
(loads desc true)
[[:invokeinterface clojure.lang.IFn "invoke" (vec (repeat (inc (count desc)) Object))]
(let [ret-type* (last desc)
ret-type (if (class? ret-type*)
(.getName ^Class ret-type*)
ret-type*)]
(case ret-type
:void [:pop]
:boolean [[:checkcast Boolean]
[:invokevirtual Boolean "booleanValue"]]
:int [[:checkcast Integer]
[:invokevirtual Integer "intValue"]]
"java.lang.Object" nil
(when (class? ret-type*)
[[:checkcast ret-type*]])))
(return desc)
[:mark :fallback]]
(if default
[[[:aload 0]]
(loads desc false)
[[:invokespecial class meth desc true]
(return desc)]]
[[:new java.lang.UnsupportedOperationException]
[:dup]
[:ldc (format "No implementation of method found: %s %s" meth desc)]
[:invokespecial java.lang.UnsupportedOperationException :init [String :void]]
[:athrow]])]))
(defn interface-data [^Class interface methods]
(let [class-sym (symbol (.getName interface))
method-names (distinct (map :name methods))]
{:name (symbol (str "babashka.impl." (.getName interface)))
:version 1.8
:interfaces [class-sym
'sci.impl.types.IReified
'clojure.lang.IMeta
'clojure.lang.IObj]
:flags [:super :public]
:fields (into [{:flags #{:private},
:name "_methods" :type java.util.Map}
{:flags #{:private},
:name "_interfaces" :type Object}
{:flags #{:private},
:name "_protocols" :type Object}
{:flags #{:private},
:name "_meta" :type clojure.lang.IPersistentMap}]
(for [name method-names]
{:flags #{:private :static},
:name (str "_sym_" name) :type clojure.lang.Symbol}))
:methods (into [{:name :clinit
:emit (reduce into
[]
(conj
(mapv set-symbol! method-names)
[[:return]]))}
{:name :init
:desc [:void]
:emit [[:aload 0]
[:invokespecial :super :init [:void]]
[:return]]}
{:name :init
:desc [java.util.Map Object Object :void]
:emit [[:aload 0]
[:invokespecial :super :init [:void]]
[:aload 0]
[:aload 1]
[:putfield :this "_methods" java.util.Map]
[:aload 0]
[:aload 2]
[:putfield :this "_interfaces" Object]
[:aload 0]
[:aload 3]
[:putfield :this "_protocols" Object]
[:return]]}
{:name :meta
:desc [clojure.lang.IPersistentMap]
:emit [[:aload 0]
[:getfield :this "_meta" clojure.lang.IPersistentMap]
[:areturn]]}
{:name :withMeta
:desc [clojure.lang.IPersistentMap clojure.lang.IObj]
:emit [[:aload 0]
[:aload 1]
[:putfield :this "_meta" clojure.lang.IPersistentMap]
[:aload 0]
[:areturn]]}
{:name :getInterfaces
:desc [Object]
:emit [[:aload 0]
[:getfield :this "_interfaces" Object]
[:areturn]]}
{:name :getMethods
:desc [Object]
:emit [[:aload 0]
[:getfield :this "_methods" java.util.Map]
[:areturn]]}
{:name :getProtocols
:desc [Object]
:emit [[:aload 0]
[:getfield :this "_protocols" Object]
[:areturn]]}]
(for [{:keys [name desc default]} methods]
{:flags #{:public}, :name name
:desc desc
:emit (emit-method interface name desc default)}
))}))
(set! *warn-on-reflection* true)
(defn type->kw [type]
(condp = type
Void/TYPE :void
Boolean/TYPE :boolean
Integer/TYPE :int
type))
(defn class->methods [^Class clazz]
(let [meths (.getMethods clazz)
meths (mapv bean meths)
;; TODO: fix problems with clojure.lang.IFn, special cased for now
;; The problem is that the 20-arity (highest one) could not be reified
;; meths (filter #(<= (:parameterCount %) 19) meths)
meths (mapv (fn [{:keys [name
parameterTypes
returnType
default]}]
(let [ret-type (type->kw returnType)]
{:name name
:desc (conj (mapv type->kw parameterTypes) ret-type)
:default default}))
meths)]
(distinct meths)))
(let [i clojure.lang.IFn]
(insn/define (insn/visit (interface-data i (class->methods i)))))
(def reified (babashka.impl.clojure.lang.IFn. {'invoke (fn [& _args] :yep)} {} {}))
(defn gen-classes [_]
(doseq [i interfaces]
(insn/write (doto (insn/visit (interface-data i (class->methods i)))
insn/define) "target/classes")))

13
reify/deps.edn Normal file
View file

@ -0,0 +1,13 @@
{:deps {org.babashka/sci.impl.types {:mvn/version "0.0.2"}}
:aliases
{:build ;; added by neil
{:paths ["." "build" "src"]
: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"}
insn/insn {
:git/sha "f85da286d429b507480f8527b12ce3e1e0e17296"
:git/url "https://github.com/phronmophobic/insn"
}}
:ns-default build}}}

View file

@ -0,0 +1,90 @@
(ns babashka.impl.reify2
(:require [babashka.impl.reify2.interfaces :refer [interfaces]]))
(set! *warn-on-reflection* false)
(defn method-or-bust [methods k]
(or (get methods k)
(throw (UnsupportedOperationException. "Method not implemented: " k))))
(defn reify-ifn [m]
(let [methods (:methods m)
invoke-fn (or (get methods 'invoke)
(fn [& _args]
(throw (UnsupportedOperationException. "Method not implemented: invoke"))))
apply-fn (or (get methods 'applyTo)
(fn [& _args]
(throw (UnsupportedOperationException. "Method not implemented: applyTo"))))]
(reify
sci.impl.types.IReified
(getMethods [_] (:methods m))
(getInterfaces [_] (:interfaces m))
(getProtocols [_] (:protocols m))
clojure.lang.IFn
(invoke [this] (invoke-fn this))
(invoke [this a0] (invoke-fn this a0))
(invoke [this a0 a1] (invoke-fn this a0 a1))
(invoke [this a0 a1 a2] (invoke-fn this a0 a1 a2))
(invoke [this a0 a1 a2 a3] (invoke-fn this a0 a1 a2 a3))
(invoke [this a0 a1 a2 a3 a4] (invoke-fn this a0 a1 a2 a3 a4))
(invoke [this a0 a1 a2 a3 a4 a5] (invoke-fn this a0 a1 a2 a3 a4 a5))
(invoke [this a0 a1 a2 a3 a4 a5 a6] (invoke-fn this a0 a1 a2 a3 a4 a5 a6))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18))
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19))
(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
(getMethods [_] (:methods ~'m))
(getInterfaces [_] (:interfaces ~'m))
(getProtocols [_] (:protocols ~'m)))
(case (.getName ~(with-meta `(first (:interfaces ~'m))
{:tag 'Class}))
~@(mapcat identity
(cons
["clojure.lang.IFn"
`(reify-ifn ~'m)
"java.lang.Object"
`(reify-object ~'m)]
(for [i interfaces]
(let [in (.getName ^Class i)]
[in
`(new ~(symbol (str "babashka.impl." in))
(:methods ~'m)
(:interfaces ~'m)
(:protocols ~'m))]))))))))
(def reify-fn (gen-reify-fn))

View file

@ -0,0 +1,34 @@
(ns babashka.impl.reify2.interfaces)
(def interfaces [java.nio.file.FileVisitor
java.io.FileFilter
java.io.FilenameFilter
clojure.lang.Associative
clojure.lang.ILookup
java.util.Map$Entry
;; TODO: fix problems with clojure.lang.IFn, special cased for now
;; The problem is that the 20-arity (highest one) could not be reified
;; clojure.lang.IFn
clojure.lang.IPersistentCollection
clojure.lang.IReduce
clojure.lang.IReduceInit
clojure.lang.IKVReduce
clojure.lang.Indexed
clojure.lang.IPersistentMap
clojure.lang.IPersistentStack
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])

View file

@ -1 +1 @@
0.7.8 0.10.163

View file

@ -1 +1 @@
0.7.9-SNAPSHOT 0.10.164-SNAPSHOT

View file

@ -1,149 +0,0 @@
{:paths ["src" "feature-xml"
"feature-yaml" "feature-csv" "feature-transit"
"feature-java-time" "feature-java-nio"
"feature-httpkit-client" "feature-httpkit-server"
"feature-lanterna"
"feature-core-match"
"feature-hiccup"
"feature-test-check"
"feature-spec-alpha"
"feature-selmer"
"feature-logging"
"feature-priority-map"
"feature-jdbc"
"pods/src"
"babashka.nrepl/src"
"depstar/src" "process/src"
"deps.clj/src" "deps.clj/resources"
"resources" "sci/resources"],
:deps {org.clojure/clojure {:mvn/version "1.11.0"},
borkdude/sci {:local/root "sci"}
babashka/babashka.curl {:local/root "babashka.curl"}
babashka/fs {:local/root "fs"}
babashka/babashka.core {:local/root "babashka.core"}
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 "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.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.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-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"}}
:aliases {:babashka/dev
{:main-opts ["-m" "babashka.main"]}
:profile
{:extra-deps
{com.clojure-goes-fast/clj-async-profiler {:mvn/version "0.5.0"}}
:extra-paths ["test"]
:jvm-opts ["-Djdk.attach.allowAttachSelf"
"-Dclojure.compiler.direct-linking=true"]
:main-opts ["-m" "babashka.profile"]}
: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"}
lambdaisland/regal {:mvn/version "0.0.143"}
cprop/cprop {:mvn/version "0.1.16"}
comb/comb {:mvn/version "0.1.1"}
mvxcvi/arrangement {:mvn/version "2.0.0"}
org.clojure/data.zip {:mvn/version "1.0.0"}
clojure-csv/clojure-csv {:mvn/version "2.0.2"}
org.clojure/math.combinatorics {:mvn/version "0.1.6"}
doric/doric {:mvn/version "0.9.0"}
henryw374/cljc.java-time
{:git/url "https://github.com/henryw374/cljc.java-time.git"
:sha "e3d184b78e933322b3fcaa6ca66cbb8f42a6b35c"}
camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}
aero/aero {:mvn/version "1.1.6"}
org.clojure/data.generators {:mvn/version "1.0.0"}
honeysql/honeysql {:mvn/version "1.0.461"}
com.github.seancorfield/honeysql {:mvn/version "2.2.840"}
minimallist/minimallist {:mvn/version "0.0.10"}
circleci/bond {:mvn/version "0.6.0"}
version-clj/version-clj {:mvn/version "2.0.2"}
gaka/gaka {:mvn/version "0.3.0"}
failjure/failjure {:mvn/version "2.2.0"}
io.helins/binf {:mvn/version "1.1.0-beta0"}
rm-hull/jasentaa {:mvn/version "0.2.5"}
slingshot/slingshot {:mvn/version "0.12.2"}
io.replikativ/hasch {:mvn/version "0.3.7"}
com.grammarly/omniconf {:mvn/version "0.4.3"}
crispin/crispin {:mvn/version "0.3.8"}
org.clojure/data.json {:mvn/version "2.4.0"}
clj-commons/multigrep {:mvn/version "0.5.0"}
amperity/vault-clj {:mvn/version "1.0.4"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
com.stuartsierra/component {:mvn/version "1.0.0"}
org.clojars.askonomm/ruuter {:mvn/version "1.2.2"}
org.clj-commons/digest {:mvn/version "1.4.100"}
hato/hato {:mvn/version "0.8.2"}
better-cond/better-cond {:mvn/version "2.1.1"}
org.clojure/core.specs.alpha {:mvn/version "0.2.62"}
reifyhealth/specmonstah {:git/url "https://github.com/reifyhealth/specmonstah", :sha "a2b357009a3aa99a0c2d2361f3bbcd0b0e36505e"}
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 {: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/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
medley/medley {:mvn/version "1.3.0"}
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.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"}
progrock/progrock {:mvn/version "0.1.2"}
djblue/portal {:mvn/version "0.19.0"}
com.wsscode/cljc-misc {:mvn/version "2021.10.16"}
edn-query-language/eql {:mvn/version "2021.07.18"}
meta-merge/meta-merge {:mvn/version "1.0.0"}
com.exoscale/lingo {:mvn/version "1.0.0-alpha14"}
io.github.swirrl/dogstatsd {:mvn/version "0.1.39"}
org.clojure/algo.monads {:mvn/version "0.1.6"}
io.lambdaforge/datalog-parser {:mvn/version "0.1.9"}
clj-stacktrace/clj-stacktrace {:mvn/version "0.2.8"}
clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"}
cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"}
aysylu/loom {:mvn/version "1.0.2"}
com.layerware/hugsql-core {:mvn/version "0.5.1"}
com.github.seancorfield/expectations {:mvn/version "2.0.157"}
com.rpl/specter {:mvn/version "1.1.4"}}
:classpath-overrides {org.clojure/clojure nil
org.clojure/spec.alpha nil}}
:clj-nvd
{:extra-deps {clj-nvd/clj-nvd {:git/url "https://github.com/miikka/clj-nvd.git"
:sha "f2ec98699e057a379baf170cb49cf7ad76874a70"}}
:main-opts ["-m" "clj-nvd.core"]}
:test
{:extra-paths ["test"]
:extra-deps {io.github.cognitect-labs/test-runner
{: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"]}}}

View file

@ -13,6 +13,7 @@ Args=-H:+ReportExceptionStackTraces \
--report-unsupported-elements-at-runtime \ --report-unsupported-elements-at-runtime \
--initialize-at-build-time=com.fasterxml.jackson \ --initialize-at-build-time=com.fasterxml.jackson \
--initialize-at-build-time=java.sql.SQLException \ --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.postgresql.sspi.SSPIClient \
--initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \ --initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \
-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \ -H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \

2
sci

@ -1 +1 @@
Subproject commit 4e6d8e215a379e3c1a36e39dce43148c8ab0915b Subproject commit 42bd17def34633b03d663211693eff972c9735bb

View file

@ -11,11 +11,11 @@
(:require [babashka.deps :as deps] (:require [babashka.deps :as deps]
[babashka.fs :as fs] [babashka.fs :as fs]
[babashka.tasks :refer [shell]] [babashka.tasks :refer [shell]]
[org.httpkit.client :as http] [clojure.edn :as edn]
[clojure.string :as str]
[clojure.java.io :as io] [clojure.java.io :as io]
[clojure.string :as str]
[clojure.tools.cli :as cli] [clojure.tools.cli :as cli]
[clojure.edn :as edn])) [org.httpkit.client :as http]))
(deps/add-deps '{:deps {org.clojure/tools.gitlibs {:mvn/version "2.4.172"} (deps/add-deps '{:deps {org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
borkdude/rewrite-edn {:mvn/version "0.1.0"} borkdude/rewrite-edn {:mvn/version "0.1.0"}

View file

@ -7,19 +7,25 @@
(or (System/getenv "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH") (or (System/getenv "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH")
(System/getenv "APPVEYOR_REPO_BRANCH") (System/getenv "APPVEYOR_REPO_BRANCH")
(System/getenv "CIRCLE_BRANCH") (System/getenv "CIRCLE_BRANCH")
(System/getenv "GITHUB_REF_NAME")
(System/getenv "CIRRUS_BRANCH")
(-> (sh "git" "rev-parse" "--abbrev-ref" "HEAD") (-> (sh "git" "rev-parse" "--abbrev-ref" "HEAD")
:out :out
str/trim))) str/trim)))
(defn release [& args] (defn release [& args]
(let [ght (System/getenv "GITHUB_TOKEN") (let [ght (System/getenv "GITHUB_TOKEN")
_ (println "Github token found")
file (first args) file (first args)
_ (println "File" file)
branch (current-branch) branch (current-branch)
_ (println "On branch:" branch)
current-version current-version
(-> (slurp "resources/BABASHKA_VERSION") (-> (slurp "resources/BABASHKA_VERSION")
str/trim)] str/trim)]
(if (and ght (contains? #{"master" "main"} branch)) (if (and ght (contains? #{"master" "main"} branch))
(do (assert file "File name must be provided") (do (assert file "File name must be provided")
(println "On main branch. Publishing asset.")
(ghr/overwrite-asset {:org "babashka" (ghr/overwrite-asset {:org "babashka"
:repo "babashka" :repo "babashka"
:file file :file file

View file

@ -43,7 +43,9 @@
".github/workflows/build.yml" ".github/workflows/build.yml"
".circleci/config.yml" ".circleci/config.yml"
"appveyor.yml" "appveyor.yml"
"project.clj"]) "project.clj"
"script/bump_graal_version.clj"
".circleci/script/short_ci.clj"])
;; We might have to keep changing these from ;; We might have to keep changing these from
;; time to time whenever the version is bumped ;; time to time whenever the version is bumped
@ -51,10 +53,8 @@
;; OR ;; OR
;; ;;
;; We could have them as environment variables ;; We could have them as environment variables
(def current-graal-version "21.3.0") (def current-graal-version "22.2.0")
(def current-java-version "java11") (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"])
(def valid-java-bumps ["java8" "java11"])
(def cl-options (def cl-options
[["-g" "--graal VERSION" "graal version"] [["-g" "--graal VERSION" "graal version"]
@ -65,8 +65,8 @@
(:options (cli/parse-opts *command-line-args* cl-options))) (:options (cli/parse-opts *command-line-args* cl-options)))
(defn is-valid-bump? (defn is-valid-bump?
[version valid-bumps] [_version _valid-bumps]
(some #(= % version) valid-bumps)) true)
(defn replace-current (defn replace-current
[file current new] [file current new]
@ -93,13 +93,13 @@
(let [new-graal-version (:graal args) (let [new-graal-version (:graal args)
new-java-version (:java args)] new-java-version (:java args)]
(when (not (nil? new-graal-version)) (when (not (nil? new-graal-version))
(if (is-valid-bump? new-graal-version valid-graal-bumps) (if (is-valid-bump? new-graal-version nil)
(do (do
(println "Performing Graal bump...") (println "Performing Graal bump...")
(bump-current current-graal-version new-graal-version)) (bump-current current-graal-version new-graal-version))
(show-error new-graal-version))) (show-error new-graal-version)))
(when (not (nil? new-java-version)) (when (not (nil? new-java-version))
(if (is-valid-bump? new-java-version valid-java-bumps) (if (is-valid-bump? new-java-version nil)
(do (do
(println "Performing Java bump...") (println "Performing Java bump...")
(bump-current current-java-version new-java-version)) (bump-current current-java-version new-java-version))

View file

@ -78,6 +78,12 @@ if [ "$BABASHKA_FEATURE_HSQLDB" = "true" ]; then
args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql") args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql")
fi 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:-} BABASHKA_FEATURE_SELMER=${BABASHKA_FEATURE_SELMER:-}
if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then
@ -92,7 +98,7 @@ then
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}" export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}" export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}" export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}" export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-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_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}" export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"

View file

@ -16,7 +16,7 @@ then
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}" export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}" export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}" export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}" export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-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_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}" export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
@ -168,6 +168,13 @@ else
BABASHKA_LEIN_PROFILES+=",-feature/priority-map" BABASHKA_LEIN_PROFILES+=",-feature/priority-map"
fi fi
if [ "$BABASHKA_FEATURE_RRB_VECTOR" = "true" ]
then
BABASHKA_LEIN_PROFILES+=",+feature/rrb-vector"
else
BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector"
fi
cp deps.edn resources/META-INF/babashka/deps.edn cp deps.edn resources/META-INF/babashka/deps.edn
if [ -z "$BABASHKA_JAR" ]; then if [ -z "$BABASHKA_JAR" ]; then

View file

@ -130,6 +130,12 @@ set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,+feature/priority-map
set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,-feature/priority-map set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,-feature/priority-map
) )
if not "%BABASHKA_FEATURE_RRB_VECTOR%"=="false" (
set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,+feature/rrb-vector
) else (
set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,-feature/rrb-vector
)
call lein with-profiles %BABASHKA_LEIN_PROFILES% bb "(+ 1 2 3)" call lein with-profiles %BABASHKA_LEIN_PROFILES% bb "(+ 1 2 3)"
call lein with-profiles %BABASHKA_LEIN_PROFILES%,+reflection,-uberjar do run call lein with-profiles %BABASHKA_LEIN_PROFILES%,+reflection,-uberjar do run

View file

@ -1,5 +1,6 @@
(ns babashka.deps (ns babashka.deps
(:require [babashka.process :as p] (:require [babashka.impl.process :as pp]
[babashka.process :as p]
[borkdude.deps :as deps] [borkdude.deps :as deps]
[sci.core :as sci])) [sci.core :as sci]))
@ -41,8 +42,8 @@
deps/*env* (:env opts) deps/*env* (:env opts)
deps/*extra-env* (:extra-env opts) deps/*extra-env* (:extra-env opts)
deps/*process-fn* (fn deps/*process-fn* (fn
([cmd] (p/process cmd opts)) ([cmd] (pp/process cmd opts))
([cmd _] (p/process cmd opts))) ([cmd _] (pp/process cmd opts)))
deps/*exit-fn* (fn deps/*exit-fn* (fn
([_]) ([_])
([_exit-code msg] ([_exit-code msg]

View file

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

View file

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

View file

@ -4,6 +4,8 @@
[babashka.impl.features :as features] [babashka.impl.features :as features]
[babashka.impl.proxy :as proxy] [babashka.impl.proxy :as proxy]
[cheshire.core :as json] [cheshire.core :as json]
[clojure.core.async]
[sci.core :as sci]
[sci.impl.types :as t])) [sci.impl.types :as t]))
(def base-custom-map (def base-custom-map
@ -78,11 +80,25 @@
;; this fixes clojure.lang.Reflector for Java 11 ;; this fixes clojure.lang.Reflector for Java 11
java.lang.reflect.AccessibleObject java.lang.reflect.AccessibleObject
{:methods [{:name "canAccess"}]} {:methods [{:name "canAccess"}]}
java.lang.reflect.Method java.lang.Package
{:methods [{:name "getName"}]} {: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"}]}
java.lang.reflect.Array java.lang.reflect.Array
{:methods [{:name "newInstance"} {:methods [{:name "newInstance"}
{:name "set"}]} {:name "set"}]}
java.lang.Runnable
{:methods [{:name "run"}]}
java.net.Inet4Address java.net.Inet4Address
{:methods [{:name "getHostAddress"}]} {:methods [{:name "getHostAddress"}]}
java.net.Inet6Address java.net.Inet6Address
@ -97,7 +113,8 @@
{:name "aset"} {:name "aset"}
{:name "aclone"}]} {:name "aclone"}]}
clojure.lang.Compiler clojure.lang.Compiler
{:fields [{:name "specials"}]} {:fields [{:name "specials"}
{:name "CHAR_MAP"}]}
clojure.lang.PersistentHashMap clojure.lang.PersistentHashMap
{:fields [{:name "EMPTY"}]} {:fields [{:name "EMPTY"}]}
clojure.lang.APersistentVector clojure.lang.APersistentVector
@ -110,10 +127,17 @@
{:methods [{:name "disjoin"}]} {:methods [{:name "disjoin"}]}
clojure.lang.Indexed clojure.lang.Indexed
{:methods [{:name "nth"}]} {:methods [{:name "nth"}]}
clojure.lang.Ratio
{:fields [{:name "numerator"}
{:name "denominator"}]}
clojure.lang.Agent
{:fields [{:name "pooledExecutor"}
{:name "soloExecutor"}]}
java.util.Iterator java.util.Iterator
{:methods [{:name "hasNext"} {:methods [{:name "hasNext"}
{:name "next"}]} {:name "next"}]}
}) java.util.TimeZone
{:methods [{:name "getTimeZone"}]}})
(def custom-map (def custom-map
(cond-> (cond->
@ -124,7 +148,8 @@
:parameterTypes ["org.hsqldb.Database"]}]} :parameterTypes ["org.hsqldb.Database"]}]}
`java.util.ResourceBundle `java.util.ResourceBundle
{:methods [{:name "getBundle" {:methods [{:name "getBundle"
:parameterTypes ["java.lang.String","java.util.Locale","java.lang.ClassLoader"]}]}))) :parameterTypes ["java.lang.String","java.util.Locale",
"java.lang.ClassLoader"]}]})))
(def java-net-http-classes (def java-net-http-classes
"These classes must be initialized at run time since GraalVM 22.1" "These classes must be initialized at run time since GraalVM 22.1"
@ -136,6 +161,7 @@
java.net.HttpCookie java.net.HttpCookie
java.net.PasswordAuthentication java.net.PasswordAuthentication
java.net.ProxySelector java.net.ProxySelector
java.net.SocketTimeoutException
java.net.http.HttpClient java.net.http.HttpClient
java.net.http.HttpClient$Builder java.net.http.HttpClient$Builder
java.net.http.HttpClient$Redirect java.net.http.HttpClient$Redirect
@ -159,6 +185,7 @@
javax.net.ssl.HttpsURLConnection ;; clj-http-lite javax.net.ssl.HttpsURLConnection ;; clj-http-lite
javax.net.ssl.KeyManagerFactory javax.net.ssl.KeyManagerFactory
javax.net.ssl.SSLContext javax.net.ssl.SSLContext
javax.net.ssl.SSLException
javax.net.ssl.SSLParameters javax.net.ssl.SSLParameters
javax.net.ssl.SSLSession ;; clj-http-lite javax.net.ssl.SSLSession ;; clj-http-lite
javax.net.ssl.TrustManager javax.net.ssl.TrustManager
@ -253,10 +280,14 @@
java.lang.System java.lang.System
java.lang.Throwable java.lang.Throwable
;; java.lang.UnsupportedOperationException ;; java.lang.UnsupportedOperationException
java.lang.ref.WeakReference
java.lang.ref.ReferenceQueue
java.lang.ref.Cleaner
java.math.BigDecimal java.math.BigDecimal
java.math.BigInteger java.math.BigInteger
java.math.MathContext java.math.MathContext
java.math.RoundingMode java.math.RoundingMode
java.net.BindException
java.net.ConnectException java.net.ConnectException
java.net.DatagramSocket java.net.DatagramSocket
java.net.DatagramPacket java.net.DatagramPacket
@ -353,10 +384,26 @@
java.time.temporal.Temporal java.time.temporal.Temporal
java.time.temporal.TemporalAccessor java.time.temporal.TemporalAccessor
java.time.temporal.TemporalAdjuster]) java.time.temporal.TemporalAdjuster])
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong
java.util.concurrent.atomic.AtomicReference
java.util.concurrent.CancellationException
java.util.concurrent.CompletionException
java.util.concurrent.ExecutionException java.util.concurrent.ExecutionException
java.util.concurrent.Executor
java.util.concurrent.LinkedBlockingQueue java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.ScheduledThreadPoolExecutor java.util.concurrent.ScheduledThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor 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.ScheduledExecutorService
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.CompletableFuture
java.util.concurrent.Executors
java.util.concurrent.TimeUnit
java.util.jar.Attributes$Name java.util.jar.Attributes$Name
java.util.jar.JarFile java.util.jar.JarFile
java.util.jar.JarEntry java.util.jar.JarEntry
@ -377,6 +424,9 @@
java.util.Base64$Decoder java.util.Base64$Decoder
java.util.Base64$Encoder java.util.Base64$Encoder
java.util.Date java.util.Date
java.util.HashMap
java.util.IdentityHashMap
java.util.List
java.util.Locale java.util.Locale
java.util.Map java.util.Map
java.util.MissingResourceException java.util.MissingResourceException
@ -386,12 +436,13 @@
java.util.Scanner java.util.Scanner
java.util.Set java.util.Set
java.util.StringTokenizer java.util.StringTokenizer
java.util.WeakHashMap
java.util.UUID java.util.UUID
java.util.concurrent.Future java.util.function.Consumer
java.util.concurrent.CompletableFuture
java.util.concurrent.Executors
java.util.concurrent.TimeUnit
java.util.function.Function java.util.function.Function
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.Predicate
java.util.function.Supplier java.util.function.Supplier
java.util.zip.Inflater java.util.zip.Inflater
java.util.zip.InflaterInputStream java.util.zip.InflaterInputStream
@ -405,6 +456,8 @@
java.util.zip.ZipEntry java.util.zip.ZipEntry
java.util.zip.ZipException java.util.zip.ZipException
java.util.zip.ZipFile java.util.zip.ZipFile
sun.misc.Signal
sun.misc.SignalHandler
~(symbol "[B") ~(symbol "[B")
~(symbol "[I") ~(symbol "[I")
~(symbol "[Ljava.lang.Object;") ~(symbol "[Ljava.lang.Object;")
@ -434,6 +487,7 @@
;; list above and then everything reachable via the public class will be ;; list above and then everything reachable via the public class will be
;; visible in the native image. ;; visible in the native image.
:instance-checks [clojure.lang.AFn :instance-checks [clojure.lang.AFn
clojure.lang.AFunction
clojure.lang.AMapEntry ;; for proxy clojure.lang.AMapEntry ;; for proxy
clojure.lang.APersistentMap ;; for proxy clojure.lang.APersistentMap ;; for proxy
clojure.lang.APersistentSet clojure.lang.APersistentSet
@ -484,10 +538,17 @@
clojure.lang.Sequential clojure.lang.Sequential
clojure.lang.Seqable clojure.lang.Seqable
clojure.lang.Volatile clojure.lang.Volatile
java.util.concurrent.atomic.AtomicInteger ;; the only way to check if something is a channel is to
java.util.concurrent.atomic.AtomicLong ;; 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.sql.Timestamp
java.util.concurrent.TimeoutException
java.util.Collection java.util.Collection
java.util.List
java.util.Map$Entry java.util.Map$Entry
~@(when features/xml? ['clojure.data.xml.node.Element])] ~@(when features/xml? ['clojure.data.xml.node.Element])]
:custom ~custom-map}) :custom ~custom-map})
@ -505,6 +566,8 @@
c)) c))
m (assoc m :public-class m (assoc m :public-class
(fn [v] (fn [v]
;; NOTE: a series of instance check, so far, is still cheaper
;; than piggybacking on defmulti or defprotocol
(cond (instance? java.lang.Process v) (cond (instance? java.lang.Process v)
java.lang.Process java.lang.Process
(instance? java.lang.ProcessHandle v) (instance? java.lang.ProcessHandle v)
@ -557,13 +620,19 @@
java.nio.file.attribute.BasicFileAttributes java.nio.file.attribute.BasicFileAttributes
(instance? java.util.concurrent.Future v) (instance? java.util.concurrent.Future v)
java.util.concurrent.Future java.util.concurrent.Future
(instance? java.util.concurrent.ScheduledExecutorService v)
java.util.concurrent.ScheduledExecutorService
(instance? java.util.Iterator v)
java.util.Iterator
;; keep commas for merge friendliness ;; keep commas for merge friendliness
,,,)))] ,,,)))
m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)]
m)) m))
(def class-map* (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)) (gen-class-map))
(def class-map (def class-map
@ -574,7 +643,8 @@
java-net-http-classes))))) java-net-http-classes)))))
(def imports (def imports
'{Appendable java.lang.Appendable '{AbstractMethodError java.lang.AbstractMethodError
Appendable java.lang.Appendable
ArithmeticException java.lang.ArithmeticException ArithmeticException java.lang.ArithmeticException
AssertionError java.lang.AssertionError AssertionError java.lang.AssertionError
BigDecimal java.math.BigDecimal BigDecimal java.math.BigDecimal
@ -589,6 +659,7 @@
Comparable java.lang.Comparable Comparable java.lang.Comparable
Double java.lang.Double Double java.lang.Double
Exception java.lang.Exception Exception java.lang.Exception
ExceptionInInitializerError java.lang.ExceptionInInitializerError
IndexOutOfBoundsException java.lang.IndexOutOfBoundsException IndexOutOfBoundsException java.lang.IndexOutOfBoundsException
IllegalArgumentException java.lang.IllegalArgumentException IllegalArgumentException java.lang.IllegalArgumentException
IllegalStateException java.lang.IllegalStateException IllegalStateException java.lang.IllegalStateException
@ -598,6 +669,7 @@
File java.io.File File java.io.File
Float java.lang.Float Float java.lang.Float
Long java.lang.Long Long java.lang.Long
LinkageError java.lang.LinkageError
Math java.lang.Math Math java.lang.Math
NullPointerException java.lang.NullPointerException NullPointerException java.lang.NullPointerException
Number java.lang.Number Number java.lang.Number
@ -614,6 +686,8 @@
System java.lang.System System java.lang.System
Thread java.lang.Thread Thread java.lang.Thread
Throwable java.lang.Throwable Throwable java.lang.Throwable
VirtualMachineError java.lang.VirtualMachineError
ThreadDeath java.lang.ThreadDeath
;; UnsupportedOperationException java.lang.UnsupportedOperationException ;; UnsupportedOperationException java.lang.UnsupportedOperationException
}) })
@ -654,7 +728,8 @@
(let [all-entries (reflection-file-entries)] (let [all-entries (reflection-file-entries)]
(spit (or (spit (or
(first args) (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? [c m] (defn public-declared-method? [c m]
(and (= c (.getDeclaringClass m)) (and (= c (.getDeclaringClass m))
@ -670,18 +745,25 @@
(sort-by :name) (sort-by :name)
(vec))) (vec)))
(defn all-methods [] (defn all-classes []
"Returns every java.lang.Class instance Babashka supports."
(->> (reflection-file-entries) (->> (reflection-file-entries)
(map :name) (map :name)
(map #(Class/forName %)) (map #(Class/forName %))))
(mapcat public-declared-method-names)))
(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)})
(comment (comment
(public-declared-method-names java.net.URL) (public-declared-method-names java.net.URL)
(public-declared-method-names java.util.Properties) (public-declared-method-names java.util.Properties)
(->> (reflection-file-entries) (all-classes)
(map :name)
(map #(Class/forName %)))
) )

36
src/babashka/impl/cli.clj Normal file
View file

@ -0,0 +1,36 @@
(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)
the-var-meta (meta the-var)
ns (:ns (meta the-var))
ns-meta (meta ns)
ct (babashka.tasks/current-task)
cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta)
(:org.babashka/cli the-var-meta)
(:org.babashka/cli ct)
extra-opts)
opts (babashka.cli/parse-opts *command-line-args* cli-opts)
task-exec-args (:exec-args ct)
cli-exec-args (:exec-args cli-opts)
opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)]
(the-var opts))"
(random-uuid)
(pr-str extra-opts)
sym
)))

View file

@ -9,7 +9,8 @@
[sci.core :as sci] [sci.core :as sci]
[sci.impl.namespaces :refer [copy-core-var core-var macrofy]] [sci.impl.namespaces :refer [copy-core-var core-var macrofy]]
[sci.impl.parser :as parser] [sci.impl.parser :as parser]
[sci.impl.vars :as vars :refer [clojure-core-ns]])) [sci.impl.utils :refer [clojure-core-ns]]
[sci.impl.vars :as vars]))
(defn locking* [form bindings v f & args] (defn locking* [form bindings v f & args]
(apply @#'locking/locking form bindings v f args)) (apply @#'locking/locking form bindings v f args))
@ -31,6 +32,7 @@
(def command-line-args (core-dynamic-var '*command-line-args*)) (def command-line-args (core-dynamic-var '*command-line-args*))
(def warn-on-reflection (core-dynamic-var '*warn-on-reflection* false)) (def warn-on-reflection (core-dynamic-var '*warn-on-reflection* false))
(def compile-files (core-dynamic-var '*compile-files* false)) (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 math-context (core-dynamic-var '*math-context*))
(defn read+string (defn read+string
@ -169,6 +171,7 @@
'*command-line-args* command-line-args '*command-line-args* command-line-args
'*warn-on-reflection* warn-on-reflection '*warn-on-reflection* warn-on-reflection
'*compile-files* compile-files '*compile-files* compile-files
'*unchecked-math* unchecked-math
'*math-context* math-context '*math-context* math-context
'with-precision (sci/copy-var with-precision clojure-core-ns) 'with-precision (sci/copy-var with-precision clojure-core-ns)
'-with-precision (sci/copy-var -with-precision clojure-core-ns) '-with-precision (sci/copy-var -with-precision clojure-core-ns)
@ -192,6 +195,8 @@
'iteration (sci/copy-var iteration clojure-core-ns) 'iteration (sci/copy-var iteration clojure-core-ns)
'abs (sci/copy-var abs clojure-core-ns) 'abs (sci/copy-var abs clojure-core-ns)
'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns) 'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns)
'memfn (sci/copy-var memfn clojure-core-ns) 'into-array (sci/copy-var into-array 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)}
) )

View file

@ -2,7 +2,8 @@
{:no-doc true} {:no-doc true}
(:require [clojure.core.async :as async] (:require [clojure.core.async :as async]
[clojure.core.async.impl.protocols :as protocols] [clojure.core.async.impl.protocols :as protocols]
[sci.impl.namespaces :refer [copy-var macrofy]] [sci.core :as sci :refer [copy-var]]
[sci.impl.namespaces :refer [macrofy]]
[sci.impl.vars :as vars])) [sci.impl.vars :as vars]))
(def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor) (def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor)
@ -39,7 +40,7 @@
[_ _ bindings & body] [_ _ bindings & body]
(list 'clojure.core.async/thread (list* 'loop bindings body))) (list 'clojure.core.async/thread (list* 'loop bindings body)))
(def core-async-namespace (vars/->SciNamespace 'clojure.core.async nil)) (def core-async-namespace (sci/create-ns 'clojure.core.async nil))
(def async-namespace (def async-namespace
{:obj core-async-namespace {:obj core-async-namespace
@ -67,6 +68,8 @@
'mult (copy-var async/mult core-async-namespace) 'mult (copy-var async/mult core-async-namespace)
'offer! (copy-var async/offer! 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)
'onto-chan!! (copy-var async/onto-chan!! core-async-namespace)
'partition (copy-var async/partition core-async-namespace) 'partition (copy-var async/partition core-async-namespace)
'partition-by (copy-var async/partition-by core-async-namespace) 'partition-by (copy-var async/partition-by core-async-namespace)
'pipe (copy-var async/pipe core-async-namespace) 'pipe (copy-var async/pipe core-async-namespace)
@ -91,6 +94,8 @@
'thread-call (copy-var thread-call core-async-namespace) 'thread-call (copy-var thread-call core-async-namespace)
'timeout (copy-var async/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)
'to-chan!! (copy-var async/to-chan!! core-async-namespace)
'toggle (copy-var async/toggle core-async-namespace) 'toggle (copy-var async/toggle core-async-namespace)
'transduce (copy-var async/transduce core-async-namespace) 'transduce (copy-var async/transduce core-async-namespace)
'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace) 'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace)
@ -103,13 +108,13 @@
'untap-all (copy-var async/untap-all core-async-namespace) 'untap-all (copy-var async/untap-all core-async-namespace)
;; polyfill ;; polyfill
'go (macrofy 'go thread core-async-namespace) 'go (macrofy 'go thread core-async-namespace)
'<! (copy-var async/<!! core-async-namespace) '<! (copy-var async/<!! core-async-namespace {:name '<!})
'>! (copy-var async/>!! core-async-namespace) '>! (copy-var async/>!! core-async-namespace {:name '>!})
'alt! (macrofy 'alt! alt!! core-async-namespace) 'alt! (macrofy 'alt! alt!! core-async-namespace)
'alts! (copy-var async/alts!! core-async-namespace) 'alts! (copy-var async/alts!! core-async-namespace {:name 'alts!})
'go-loop (macrofy 'go-loop go-loop core-async-namespace)}) 'go-loop (macrofy 'go-loop go-loop core-async-namespace)})
(def async-protocols-ns (vars/->SciNamespace 'clojure.core.async.impl.protocols nil)) (def async-protocols-ns (sci/create-ns 'clojure.core.async.impl.protocols nil))
(def async-protocols-namespace (def async-protocols-namespace
{:obj async-protocols-ns {:obj async-protocols-ns

View file

@ -18,7 +18,7 @@
[babashka.impl.common :refer [debug]] [babashka.impl.common :refer [debug]]
[sci.core :as sci] [sci.core :as sci]
[sci.impl.parser :as p] [sci.impl.parser :as p]
[sci.impl.vars :as vars]) [sci.impl.utils :as utils])
(:import (:import
[clojure.lang LineNumberingPushbackReader] [clojure.lang LineNumberingPushbackReader]
[java.io BufferedWriter InputStreamReader OutputStreamWriter] [java.io BufferedWriter InputStreamReader OutputStreamWriter]
@ -214,12 +214,11 @@
:val (if (instance? Throwable ret) :val (if (instance? Throwable ret)
(Throwable->map ret) (Throwable->map ret)
ret) ret)
:ns (str (vars/current-ns-name)) :ns (str (utils/current-ns-name))
:ms ms :ms ms
:form s}) :form s})
true))) true)))
(catch Throwable ex (catch Throwable ex
(prn (ex-message ex))
(set! *e ex) (set! *e ex)
(out-fn {:tag :ret :val (ex->data ex (or (-> ex ex-data :clojure.error/phase) :execution)) (out-fn {:tag :ret :val (ex->data ex (or (-> ex ex-data :clojure.error/phase) :execution))
:ns (str (.name *ns*)) :form s :ns (str (.name *ns*)) :form s

View file

@ -232,13 +232,13 @@
For additional event types, see the examples in the code. For additional event types, see the examples in the code.
"} "}
babashka.impl.clojure.test babashka.impl.clojure.test
(:require [babashka.impl.common :refer [ctx]] (:require
[clojure.stacktrace :as stack] [babashka.impl.common :refer [ctx]]
[clojure.template :as temp] [clojure.stacktrace :as stack]
[sci.core :as sci] [clojure.template :as temp]
[sci.impl.namespaces :as sci-namespaces] [sci.core :as sci]
[sci.impl.resolve :as resolve] [sci.impl.namespaces :as sci-namespaces]
[sci.impl.vars :as vars])) [sci.impl.resolve :as resolve]))
;; Nothing is marked "private" here, so you can rebind things to plug ;; Nothing is marked "private" here, so you can rebind things to plug
;; in your own testing or reporting frameworks. ;; in your own testing or reporting frameworks.
@ -332,7 +332,7 @@
:added "1.1"} :added "1.1"}
report-impl :type) report-impl :type)
(def report (sci/copy-var report-impl tns)) (def report (sci/copy-var report-impl tns {:name 'report}))
(defn do-report (defn do-report
"Add file and line information to a test result and call report. "Add file and line information to a test result and call report.
@ -409,7 +409,7 @@
[x] [x]
(if (symbol? x) (if (symbol? x)
(when-let [v (second (resolve/lookup @ctx x false))] (when-let [v (second (resolve/lookup @ctx x false))]
(when-let [value (if (vars/var? v) (when-let [value (if (instance? sci.lang.Var v)
(get-possibly-unbound-var v) (get-possibly-unbound-var v)
v)] v)]
(and (fn? value) (and (fn? value)
@ -667,7 +667,7 @@
value of key." value of key."
{:added "1.1"} {:added "1.1"}
[key coll] [key coll]
(swap! ns->fixtures assoc-in [(sci-namespaces/sci-ns-name @vars/current-ns) key] coll)) (swap! ns->fixtures assoc-in [(sci-namespaces/sci-ns-name @sci/ns) key] coll))
(defmulti use-fixtures (defmulti use-fixtures
"Wrap test runs in a fixture function to perform setup and "Wrap test runs in a fixture function to perform setup and
@ -722,7 +722,7 @@
:expected nil, :actual e}))) :expected nil, :actual e})))
(do-report {:type :end-test-var, :var v})))) (do-report {:type :end-test-var, :var v}))))
(def test-var (sci/copy-var test-var-impl tns)) (def test-var (sci/copy-var test-var-impl tns {:name 'test-var}))
(defn test-vars (defn test-vars
"Groups vars by their namespace and runs test-vars on them with "Groups vars by their namespace and runs test-vars on them with
@ -779,7 +779,7 @@
Defaults to current namespace if none given. Returns a map Defaults to current namespace if none given. Returns a map
summarizing test results." summarizing test results."
{:added "1.1"} {:added "1.1"}
([ctx] (run-tests ctx @vars/current-ns)) ([ctx] (run-tests ctx @sci/ns))
([ctx & namespaces] ([ctx & namespaces]
(let [summary (assoc (apply merge-with + (map #(test-ns ctx %) namespaces)) (let [summary (assoc (apply merge-with + (map #(test-ns ctx %) namespaces))
:type :summary)] :type :summary)]

View file

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

View file

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

View file

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

View file

@ -3,8 +3,7 @@
(:refer-clojure :exclude [create-ns]) (:refer-clojure :exclude [create-ns])
(:require (:require
[babashka.impl.protocols :as protocols] [babashka.impl.protocols :as protocols]
[sci.core :as sci :refer [copy-var]] [sci.core :as sci :refer [copy-var]]))
[sci.impl.vars]))
(def datafy-ns (sci/create-ns 'clojure.datafy nil)) (def datafy-ns (sci/create-ns 'clojure.datafy nil))

View file

@ -101,4 +101,4 @@
'clojure (sci/copy-var bdeps/clojure dns) 'clojure (sci/copy-var bdeps/clojure dns)
'merge-deps (sci/copy-var merge-deps dns) 'merge-deps (sci/copy-var merge-deps dns)
;; undocumented ;; undocumented
'merge-defaults (sci/copy-var merge-default-deps dns)}) 'merge-defaults (sci/copy-var merge-default-deps dns {:name 'merge-defaults})})

View file

@ -0,0 +1,7 @@
(ns babashka.impl.edamame
(:require [edamame.core]
[sci.core :as sci]))
(def ens (sci/create-ns 'edamame.core))
(def edamame-namespace (sci/copy-ns edamame.core ens))

View file

@ -108,7 +108,7 @@
stacktrace (dedupe stacktrace (dedupe
(concat (sequence (comp (map StackTraceElement->vec) (concat (sequence (comp (map StackTraceElement->vec)
(take-while #(not (str/starts-with? (first %) "sci.impl."))) (take-while #(not (str/starts-with? (first %) "sci.impl.")))
(map render-native-stacktrace-elem)) (keep render-native-stacktrace-elem))
(.getStackTrace (or (ex-cause e) e))) (.getStackTrace (or (ex-cause e) e)))
(sci/stacktrace e)))] (sci/stacktrace e)))]
(if exit-code (if exit-code

View file

@ -26,6 +26,7 @@
(def hsqldb? (= "true" (System/getenv "BABASHKA_FEATURE_HSQLDB"))) (def hsqldb? (= "true" (System/getenv "BABASHKA_FEATURE_HSQLDB")))
(def datascript? (= "true" (System/getenv "BABASHKA_FEATURE_DATASCRIPT"))) (def datascript? (= "true" (System/getenv "BABASHKA_FEATURE_DATASCRIPT")))
(def lanterna? (= "true" (System/getenv "BABASHKA_FEATURE_LANTERNA"))) (def lanterna? (= "true" (System/getenv "BABASHKA_FEATURE_LANTERNA")))
(def rrb-vector? (= "true" (System/getenv "BABASHKA_FEATURE_RRB_VECTOR")))
(when xml? (when xml?
(require '[babashka.impl.xml])) (require '[babashka.impl.xml]))
@ -75,3 +76,6 @@
(when priority-map? (when priority-map?
(require '[babashka.impl.priority-map])) (require '[babashka.impl.priority-map]))
(when rrb-vector?
(require '[babashka.impl.rrb-vector]))

View file

@ -0,0 +1,16 @@
(ns babashka.impl.nrepl-server
{:no-doc true}
(:require [babashka.impl.common :as common]
[babashka.nrepl.server :as server]
[sci.core :as sci]))
(defn start-server!
([]
(server/start-server! @common/ctx))
([opts]
(server/start-server! @common/ctx opts)))
(def nrepl-server-namespace
(let [ns-sci (sci/create-ns 'babashka.nrepl.server)]
{'start-server! (sci/copy-var start-server! ns-sci)
'stop-server! (sci/copy-var server/stop-server! ns-sci)}))

View file

@ -1,13 +1,15 @@
(ns babashka.impl.patches.datafy (ns babashka.impl.patches.datafy
(:require [babashka.impl.common :refer [ctx]] (:require ;; ensure datafy is loaded, we're going to override its
[clojure.core.protocols :as p] ;; clojure.lang.Namespace implementation for datafy
[clojure.datafy] [babashka.impl.common :refer [ctx]]
;; ensure datafy is loaded, we're going to override its [clojure.core.protocols :as p]
;; clojure.lang.Namespace implementation for datafy [clojure.datafy]
[clojure.reflect] [clojure.reflect]
[sci.impl.namespaces :refer [sci-ns-name sci-ns-publics sci-ns-imports sci-ns-interns]] [sci.impl.namespaces :refer [sci-ns-imports sci-ns-interns sci-ns-name
[sci.impl.vars]) sci-ns-publics]]
(:import [sci.impl.vars SciNamespace])) [sci.impl.vars])
(:import
[sci.lang Namespace]))
(defn- sortmap [m] (defn- sortmap [m]
(into (sorted-map) m)) (into (sorted-map) m))
@ -29,7 +31,7 @@
(assoc ret :name (-> c .getName symbol) :members (->> members (group-by :name) sortmap))))) (assoc ret :name (-> c .getName symbol) :members (->> members (group-by :name) sortmap)))))
(extend-protocol p/Datafiable (extend-protocol p/Datafiable
SciNamespace Namespace
(datafy [n] (datafy [n]
(with-meta {:name (sci-ns-name n) (with-meta {:name (sci-ns-name n)
:publics (->> n (sci-ns-publics @ctx) sortmap) :publics (->> n (sci-ns-publics @ctx) sortmap)

View file

@ -9,20 +9,20 @@
(defn load-pod [& args] (defn load-pod [& args]
(apply pods/load-pod @ctx args)) (apply pods/load-pod @ctx args))
(defn load-pods-metadata [pods-map] (defn load-pods-metadata [pods-map opts]
(reduce-kv (reduce-kv
(fn [pod-namespaces pod-spec coord] (fn [pod-namespaces pod-spec coord]
(merge pod-namespaces (merge pod-namespaces
(condp #(contains? %2 %1) coord (condp #(contains? %2 %1) coord
:version :version
(pods/load-pod-metadata pod-spec (pods/load-pod-metadata pod-spec
(merge {:cache true} (merge opts {:cache true}
(select-keys coord [:version :cache]))) (select-keys coord [:version :cache])))
:path :path
(pods/load-pod-metadata (-> @bb-edn :file io/file) (pods/load-pod-metadata (-> @bb-edn :file io/file)
pod-spec pod-spec
(merge {:cache true} (merge opts {:cache true}
(select-keys coord [:path :cache]))) (select-keys coord [:path :cache])))
(throw (IllegalArgumentException. (throw (IllegalArgumentException.

View file

@ -1,7 +1,8 @@
(ns babashka.impl.pprint (ns babashka.impl.pprint
{:no-doc true} {:no-doc true}
(:require [clojure.pprint :as pprint] (:require [clojure.pprint :as pprint]
[sci.core :as sci])) [sci.core :as sci]
[sci.pprint]))
(defonce patched? (volatile! false)) (defonce patched? (volatile! false))
@ -95,32 +96,33 @@
pprint/*print-pprint-dispatch* @print-pprint-dispatch pprint/*print-pprint-dispatch* @print-pprint-dispatch
pprint/*print-miser-width* @print-miser-width pprint/*print-miser-width* @print-miser-width
*print-meta* @sci/print-meta *print-meta* @sci/print-meta
*print-readably* @sci/print-readably] *print-readably* @sci/print-readably
*print-length* @sci/print-length]
(pprint/pprint s writer)))) (pprint/pprint s writer))))
(defn cl-format (defn cl-format
"An implementation of a Common Lisp compatible format function. cl-format formats its "An implementation of a Common Lisp compatible format function. cl-format formats its
arguments to an output stream or string based on the format control string given. It arguments to an output stream or string based on the format control string given. It
supports sophisticated formatting of structured data. supports sophisticated formatting of structured data.
Writer is an instance of java.io.Writer, true to output to *out* or nil to output Writer is an instance of java.io.Writer, true to output to *out* or nil to output
to a string, format-in is the format control string and the remaining arguments to a string, format-in is the format control string and the remaining arguments
are the data to be formatted. are the data to be formatted.
The format control string is a string to be output with embedded 'format directives' The format control string is a string to be output with embedded 'format directives'
describing how to format the various arguments passed in. describing how to format the various arguments passed in.
If writer is nil, cl-format returns the formatted result string. Otherwise, cl-format If writer is nil, cl-format returns the formatted result string. Otherwise, cl-format
returns nil. returns nil.
For example: For example:
(let [results [46 38 22]] (let [results [46 38 22]]
(cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\" (cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\"
(count results) results)) (count results) results))
Prints to *out*: Prints to *out*:
There are 3 results: 46, 38, 22 There are 3 results: 46, 38, 22
Detailed documentation on format control strings is available in the \"Common Lisp the Detailed documentation on format control strings is available in the \"Common Lisp the
Language, 2nd edition\", Chapter 22 (available online at: Language, 2nd edition\", Chapter 22 (available online at:
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000) http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000)
and in the Common Lisp HyperSpec at and in the Common Lisp HyperSpec at
http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm
" "
[& args] [& args]
;; bind *out* to sci/out, so with-out-str works ;; bind *out* to sci/out, so with-out-str works
(binding [*out* @sci/out] (binding [*out* @sci/out]
@ -134,36 +136,63 @@ http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm
(apply #'pprint/execute-format args))) (apply #'pprint/execute-format args)))
(defn get-pretty-writer (defn get-pretty-writer
"Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's "Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's
already a pretty writer. Generally, it is unnecessary to call this function, since pprint, already a pretty writer. Generally, it is unnecessary to call this function, since pprint,
write, and cl-format all call it if they need to. However if you want the state to be write, and cl-format all call it if they need to. However if you want the state to be
preserved across calls, you will want to wrap them with this. preserved across calls, you will want to wrap them with this.
For example, when you want to generate column-aware output with multiple calls to cl-format, For example, when you want to generate column-aware output with multiple calls to cl-format,
do it like in this example: do it like in this example:
(defn print-table [aseq column-width] (defn print-table [aseq column-width]
(binding [*out* (get-pretty-writer *out*)] (binding [*out* (get-pretty-writer *out*)]
(doseq [row aseq] (doseq [row aseq]
(doseq [col row] (doseq [col row]
(cl-format true \"~4D~7,vT\" col column-width)) (cl-format true \"~4D~7,vT\" col column-width))
(prn)))) (prn))))
Now when you run: Now when you run:
user> (print-table (map #(vector % (* % %) (* % % %)) (range 1 11)) 8) user> (print-table (map #(vector % (* % %) (* % % %)) (range 1 11)) 8)
It prints a table of squares and cubes for the numbers from 1 to 10: It prints a table of squares and cubes for the numbers from 1 to 10:
1 1 1 1 1 1
2 4 8 2 4 8
3 9 27 3 9 27
4 16 64 4 16 64
5 25 125 5 25 125
6 36 216 6 36 216
7 49 343 7 49 343
8 64 512 8 64 512
9 81 729 9 81 729
10 100 1000" 10 100 1000"
[writer] [writer]
(binding [pprint/*print-right-margin* @print-right-margin (binding [pprint/*print-right-margin* @print-right-margin
pprint/*print-miser-width* @print-miser-width] pprint/*print-miser-width* @print-miser-width]
(pprint/get-pretty-writer writer))) (pprint/get-pretty-writer writer)))
(def current-length #'pprint/*current-length*)
(defn write-out
"Write an object to *out* subject to the current bindings of the printer control
variables. Use the kw-args argument to override individual variables for this call (and
any recursive calls).
*out* must be a PrettyWriter if pretty printing is enabled. This is the responsibility
of the caller.
This method is primarily intended for use by pretty print dispatch functions that
already know that the pretty printer will have set up their environment appropriately.
Normal library clients should use the standard \"write\" interface. "
{:added "1.2"}
[object]
(let [length-reached (and
@current-length
@sci/print-length
(>= @current-length @sci/print-length))]
(if-not pprint/*print-pretty*
(pr object)
(if length-reached
(print "...")
(do
(when @current-length
(.set ^clojure.lang.Var current-length (inc @current-length)))
(print-pprint-dispatch object))))
length-reached))
(def pprint-namespace (def pprint-namespace
{'pp (sci/copy-var pprint/pp pprint-ns) {'pp (sci/copy-var pprint/pp pprint-ns)
'pprint (sci/copy-var pprint pprint-ns) 'pprint (sci/copy-var pprint pprint-ns)
@ -180,6 +209,7 @@ It prints a table of squares and cubes for the numbers from 1 to 10:
'with-pprint-dispatch (sci/copy-var pprint/with-pprint-dispatch pprint-ns) 'with-pprint-dispatch (sci/copy-var pprint/with-pprint-dispatch pprint-ns)
'*print-pprint-dispatch* print-pprint-dispatch '*print-pprint-dispatch* print-pprint-dispatch
'*print-miser-width* print-miser-width '*print-miser-width* print-miser-width
'get-pretty-writer (sci/copy-var get-pretty-writer pprint-ns)}) 'get-pretty-writer (sci/copy-var get-pretty-writer pprint-ns)
'write-out (sci/copy-var write-out pprint-ns)})
(vreset! patched? true) (vreset! patched? true)

View file

@ -20,6 +20,7 @@
:git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"}) :git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"})
deps (dissoc deps deps (dissoc deps
'borkdude/sci 'borkdude/sci
'org.babashka/sci
'borkdude/graal.locking 'borkdude/graal.locking
'org.postgresql/postgresql 'org.postgresql/postgresql
'babashka/clojure-lanterna 'babashka/clojure-lanterna

View file

@ -27,4 +27,6 @@
'tokenize (copy-var process/tokenize tns) 'tokenize (copy-var process/tokenize tns)
'*defaults* defaults '*defaults* defaults
'destroy (copy-var process/destroy tns) 'destroy (copy-var process/destroy tns)
'destroy-tree (copy-var process/destroy-tree tns)}) 'destroy-tree (copy-var process/destroy-tree tns)
'exec (copy-var process/exec tns)
'shell (copy-var process/shell tns)})

View file

@ -74,6 +74,11 @@
(proxy [javax.net.ssl.HostnameVerifier] [] (proxy [javax.net.ssl.HostnameVerifier] []
(verify [host-name session] ((method-or-bust methods 'verify) this host-name session))) (verify [host-name session] ((method-or-bust methods 'verify) this host-name session)))
["sun.misc.SignalHandler" #{}]
(proxy [sun.misc.SignalHandler] []
(handle [sig]
((method-or-bust methods 'handle) this sig)))
["java.io.PipedInputStream" #{}] ["java.io.PipedInputStream" #{}]
(proxy [java.io.PipedInputStream] [] (proxy [java.io.PipedInputStream] []
(available [] ((method-or-bust methods 'available) this)) (available [] ((method-or-bust methods 'available) this))
@ -81,8 +86,10 @@
(read (read
([] ([]
((method-or-bust methods 'read) this)) ((method-or-bust methods 'read) this))
([b off len] ([bs]
((method-or-bust methods 'read) this b off len))) ((method-or-bust methods 'read) this bs))
([bs off len]
((method-or-bust methods 'read) this bs off len)))
(receive [b] ((method-or-bust methods 'receive) this b))) (receive [b] ((method-or-bust methods 'receive) this b)))
["java.io.PipedOutputStream" #{}] ["java.io.PipedOutputStream" #{}]
@ -92,7 +99,9 @@
(flush [] ((method-or-bust methods 'flush) this)) (flush [] ((method-or-bust methods 'flush) this))
(write (write
([b] ((method-or-bust methods 'write) this b)) ([b] ((method-or-bust methods 'write) this b))
([b off len] ((method-or-bust methods 'write) this b off len))))))) ([b off len] ((method-or-bust methods 'write) this b off len))))
, ;; keep this for merge friendliness
)))
(defn class-sym [c] (symbol (class-name c))) (defn class-sym [c] (symbol (class-name c)))

View file

@ -161,7 +161,9 @@
java.util.Iterator java.util.Iterator
{hasNext [[this]] {hasNext [[this]]
next [[this]]} next [[this]]
remove [[this]]
forEachRemaining [[this action]]}
java.util.function.Function java.util.function.Function
{apply [[this t]]} {apply [[this t]]}
@ -183,4 +185,7 @@
resolveAlias [[this sym]] resolveAlias [[this sym]]
resolveVar [[this sym]]} resolveVar [[this sym]]}
sun.misc.SignalHandler
{handle [[this signal]]}
})) }))

View file

@ -9,7 +9,7 @@
[sci.impl.interpreter :refer [eval-form]] [sci.impl.interpreter :refer [eval-form]]
[sci.impl.io :as sio] [sci.impl.io :as sio]
[sci.impl.parser :as parser] [sci.impl.parser :as parser]
[sci.impl.vars :as vars])) [sci.impl.utils :as utils]))
(set! *warn-on-reflection* true) (set! *warn-on-reflection* true)
@ -80,7 +80,7 @@
(let [ret (eval-form sci-ctx expr)] (let [ret (eval-form sci-ctx expr)]
ret)))) ret))))
:need-prompt (or need-prompt (fn [] true)) :need-prompt (or need-prompt (fn [] true))
:prompt (or prompt #(sio/printf "%s=> " (vars/current-ns-name))) :prompt (or prompt #(sio/printf "%s=> " (utils/current-ns-name)))
:flush (or flush sio/flush) :flush (or flush sio/flush)
:print (or print sio/prn) :print (or print sio/prn)
:caught (or caught repl-caught))))) :caught (or caught repl-caught)))))

View file

@ -21,4 +21,5 @@
{'repl (sci/copy-var socket-repl/repl sns) {'repl (sci/copy-var socket-repl/repl sns)
'prepl (sci/copy-var prepl sns) 'prepl (sci/copy-var prepl sns)
'io-prepl (sci/copy-var io-prepl sns) 'io-prepl (sci/copy-var io-prepl sns)
'start-server (sci/copy-var start-server sns)}) 'start-server (sci/copy-var start-server sns)
'stop-server (sci/copy-var server/stop-server sns)})

View file

@ -1,15 +1,19 @@
(ns babashka.impl.tasks (ns babashka.impl.tasks
(:require [babashka.deps :as deps] (:require
[babashka.impl.common :refer [ctx bb-edn debug]] [babashka.deps :as deps]
[babashka.process :as p] [babashka.impl.cli :as cli]
[clojure.core.async :refer [<!!]] [babashka.impl.common :refer [bb-edn ctx debug]]
[clojure.java.io :as io] [babashka.impl.process :as pp]
[clojure.string :as str] [babashka.process :as p]
[rewrite-clj.node :as node] [clojure.core.async :refer [<!!]]
[rewrite-clj.parser :as parser] [clojure.java.io :as io]
[rewrite-clj.zip :as zip] [clojure.string :as str]
[sci.core :as sci]) [rewrite-clj.node :as node]
(:import [clojure.core.async.impl.channels ManyToManyChannel])) [rewrite-clj.parser :as parser]
[rewrite-clj.zip :as zip]
[sci.core :as sci])
(:import
[clojure.core.async.impl.channels ManyToManyChannel]))
(defn -chan? [x] (defn -chan? [x]
(instance? ManyToManyChannel x)) (instance? ManyToManyChannel x))
@ -20,7 +24,7 @@
;; (def task-name (sci/new-dynamic-var '*-task-name* nil {:ns sci-ns})) ;; (def task-name (sci/new-dynamic-var '*-task-name* nil {:ns sci-ns}))
(def task (sci/new-dynamic-var '*task* nil {:ns sci-ns})) (def task (sci/new-dynamic-var '*task* nil {:ns sci-ns}))
(def current-task (sci/new-var 'current-task (fn [] @task) {:ns sci-ns})) (def current-task (sci/new-var 'current-task (fn [] @task) {:ns sci-ns}))
(def state (sci/new-var 'state (atom {}) {:ns sci-ns})) (def state (sci/new-var 'current-state (atom {}) {:ns sci-ns}))
(defn log-info [& strs] (defn log-info [& strs]
(let [log-level @log-level] (let [log-level @log-level]
@ -85,7 +89,7 @@
local-log-level (:log-level opts)] local-log-level (:log-level opts)]
(sci/binding [log-level (or local-log-level @log-level)] (sci/binding [log-level (or local-log-level @log-level)]
(apply log-info cmd) (apply log-info cmd)
(handle-non-zero (p/process prev cmd (merge default-opts opts)) opts)))) (handle-non-zero (pp/process prev cmd (merge default-opts opts)) opts))))
(defn clojure [cmd & args] (defn clojure [cmd & args]
(let [[opts cmd args] (let [[opts cmd args]
@ -263,6 +267,9 @@
(when-not (resolve 'run) (when-not (resolve 'run)
(intern *ns* 'run babashka.tasks/run)) (intern *ns* 'run babashka.tasks/run))
(when-not (resolve 'exec)
(intern *ns* 'exec @(var babashka.tasks/exec)))
%s %s
%s %s
@ -450,6 +457,14 @@
(let [[[expr]] (assemble-task task parallel)] (let [[[expr]] (assemble-task task parallel)]
(sci/eval-string* @ctx expr)))) (sci/eval-string* @ctx expr))))
(defn exec
([sym]
(let [snippet (cli/exec-fn-snippet sym)]
(sci/eval-string* @ctx snippet)))
([sym extra-opts]
(let [snippet (cli/exec-fn-snippet sym extra-opts)]
(sci/eval-string* @ctx snippet))))
(def tasks-namespace (def tasks-namespace
{'shell (sci/copy-var shell sci-ns) {'shell (sci/copy-var shell sci-ns)
'clojure (sci/copy-var clojure sci-ns) 'clojure (sci/copy-var clojure sci-ns)
@ -460,4 +475,5 @@
'current-task current-task 'current-task current-task
'current-state state 'current-state state
'run (sci/copy-var run sci-ns) 'run (sci/copy-var run sci-ns)
'exec (sci/copy-var exec sci-ns)
#_#_'log log}) #_#_'log log})

View file

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

View file

@ -7,10 +7,12 @@
[babashka.fs :as fs] [babashka.fs :as fs]
[babashka.impl.bencode :refer [bencode-namespace]] [babashka.impl.bencode :refer [bencode-namespace]]
[babashka.impl.cheshire :refer [cheshire-core-namespace]] [babashka.impl.cheshire :refer [cheshire-core-namespace]]
[babashka.impl.classes :as classes] [babashka.impl.classes :as classes :refer [classes-namespace]]
[babashka.impl.classpath :as cp :refer [classpath-namespace]] [babashka.impl.classpath :as cp :refer [classpath-namespace]]
[babashka.impl.cli :as cli]
[babashka.impl.clojure.core :as core :refer [core-extras]] [babashka.impl.clojure.core :as core :refer [core-extras]]
[babashka.impl.clojure.core.async :refer [async-namespace async-protocols-namespace]] [babashka.impl.clojure.core.async :refer [async-namespace
async-protocols-namespace]]
[babashka.impl.clojure.instant :as instant] [babashka.impl.clojure.instant :as instant]
[babashka.impl.clojure.java.browse :refer [browse-namespace]] [babashka.impl.clojure.java.browse :refer [browse-namespace]]
[babashka.impl.clojure.java.io :refer [io-namespace]] [babashka.impl.clojure.java.io :refer [io-namespace]]
@ -18,7 +20,8 @@
[babashka.impl.clojure.main :as clojure-main :refer [demunge]] [babashka.impl.clojure.main :as clojure-main :refer [demunge]]
[babashka.impl.clojure.math :refer [math-namespace]] [babashka.impl.clojure.math :refer [math-namespace]]
[babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]] [babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]]
[babashka.impl.clojure.tools.reader-types :refer [edn-namespace reader-types-namespace]] [babashka.impl.clojure.tools.reader-types :refer [edn-namespace
reader-types-namespace]]
[babashka.impl.clojure.zip :refer [zip-namespace]] [babashka.impl.clojure.zip :refer [zip-namespace]]
[babashka.impl.common :as common] [babashka.impl.common :as common]
[babashka.impl.core :as bbcore] [babashka.impl.core :as bbcore]
@ -26,16 +29,18 @@
[babashka.impl.data :as data] [babashka.impl.data :as data]
[babashka.impl.datafy :refer [datafy-namespace]] [babashka.impl.datafy :refer [datafy-namespace]]
[babashka.impl.deps :as deps :refer [deps-namespace]] [babashka.impl.deps :as deps :refer [deps-namespace]]
[babashka.impl.edamame :refer [edamame-namespace]]
[babashka.impl.error-handler :refer [error-handler]] [babashka.impl.error-handler :refer [error-handler]]
[babashka.impl.features :as features] [babashka.impl.features :as features]
[babashka.impl.fs :refer [fs-namespace]] [babashka.impl.fs :refer [fs-namespace]]
[babashka.impl.nrepl-server :refer [nrepl-server-namespace]]
[babashka.impl.pods :as pods] [babashka.impl.pods :as pods]
[babashka.impl.pprint :refer [pprint-namespace]] [babashka.impl.pprint :refer [pprint-namespace]]
[babashka.impl.print-deps :as print-deps] [babashka.impl.print-deps :as print-deps]
[babashka.impl.process :refer [process-namespace]] [babashka.impl.process :refer [process-namespace]]
[babashka.impl.protocols :refer [protocols-namespace]] [babashka.impl.protocols :refer [protocols-namespace]]
[babashka.impl.proxy :refer [proxy-fn]] [babashka.impl.proxy :refer [proxy-fn]]
[babashka.impl.reify :refer [reify-fn]] [babashka.impl.reify2 :refer [reify-fn]]
[babashka.impl.repl :as repl] [babashka.impl.repl :as repl]
[babashka.impl.rewrite-clj :as rewrite] [babashka.impl.rewrite-clj :as rewrite]
[babashka.impl.server :refer [clojure-core-server-namespace]] [babashka.impl.server :refer [clojure-core-server-namespace]]
@ -84,6 +89,7 @@
(sci/alter-var-root sci/in (constantly *in*)) (sci/alter-var-root sci/in (constantly *in*))
(sci/alter-var-root sci/out (constantly *out*)) (sci/alter-var-root sci/out (constantly *out*))
(sci/alter-var-root sci/err (constantly *err*)) (sci/alter-var-root sci/err (constantly *err*))
(sci/alter-var-root sci/read-eval (constantly *read-eval*))
(set! *warn-on-reflection* true) (set! *warn-on-reflection* true)
;; To detect problems when generating the image, run: ;; To detect problems when generating the image, run:
@ -115,7 +121,8 @@
"socket-repl" "socket-repl"
"nrepl-server" "nrepl-server"
"describe" "describe"
"print-deps") true "print-deps"
"prepare") true
false)) false))
(defn print-error [& msgs] (defn print-error [& msgs]
@ -138,10 +145,11 @@ Global opts:
-cp, --classpath Classpath to use. Overrides bb.edn classpath. -cp, --classpath Classpath to use. Overrides bb.edn classpath.
--debug Print debug information and internal stacktrace in case of exception. --debug Print debug information and internal stacktrace in case of exception.
--force Passes -Sforce to deps.clj, forcing recalculation of the classpath.
--init <file> Load file after any preloads and prior to evaluation/subcommands. --init <file> Load file after any preloads and prior to evaluation/subcommands.
--config <file> Replacing bb.edn with file. Relative paths are resolved relative to file. --config <file> Replacing bb.edn with file. Relative paths are resolved relative to file.
--deps-root <dir> Treat dir as root of relative paths in config. --deps-root <dir> Treat dir as root of relative paths in config.
-Sforce Force recalculation of the classpath (don't use the cache)
-Sdeps Deps data to use as the last deps file to be merged
Help: Help:
@ -155,6 +163,7 @@ Evaluation:
-e, --eval <expr> Evaluate an expression. -e, --eval <expr> Evaluate an expression.
-f, --file <path> Evaluate a file. -f, --file <path> Evaluate a file.
-m, --main <ns|var> Call the -main function from a namespace or call a fully qualified var. -m, --main <ns|var> Call the -main function from a namespace or call a fully qualified var.
-x, --exec <var> Call the fully qualified var. Args are parsed by babashka CLI.
REPL: REPL:
@ -175,6 +184,7 @@ Packaging:
uberscript <file> [eval-opt] Collect all required namespaces from the classpath into a single file. Accepts additional eval opts, like `-m`. uberscript <file> [eval-opt] Collect all required namespaces from the classpath into a single file. Accepts additional eval opts, like `-m`.
uberjar <jar> [eval-opt] Similar to uberscript but creates jar file. uberjar <jar> [eval-opt] Similar to uberscript but creates jar file.
prepare Download deps & pods defined in bb.edn and cache their metadata. Only an optimization, this will happen on demand when needed.
In- and output flags (only to be used with -e one-liners): In- and output flags (only to be used with -e one-liners):
@ -244,6 +254,7 @@ Use bb run --help to show this help output.
:feature/yaml %s :feature/yaml %s
:feature/jdbc %s :feature/jdbc %s
:feature/postgresql %s :feature/postgresql %s
:feature/sqlite %s
:feature/hsqldb %s :feature/hsqldb %s
:feature/oracledb %s :feature/oracledb %s
:feature/httpkit-client %s :feature/httpkit-client %s
@ -262,8 +273,8 @@ Use bb run --help to show this help output.
features/xml? features/xml?
features/yaml? features/yaml?
features/jdbc? features/jdbc?
features/sqlite?
features/postgresql? features/postgresql?
features/sqlite?
features/hsqldb? features/hsqldb?
features/oracledb? features/oracledb?
features/httpkit-client? features/httpkit-client?
@ -309,7 +320,9 @@ Use bb run --help to show this help output.
(def aliases (def aliases
(cond-> (cond->
'{tools.cli clojure.tools.cli '{str clojure.string
set clojure.set
tools.cli clojure.tools.cli
edn clojure.edn edn clojure.edn
wait babashka.wait wait babashka.wait
signal babashka.signal signal babashka.signal
@ -333,6 +346,11 @@ Use bb run --help to show this help output.
(def clojure-main-ns (sci/create-ns 'clojure.main)) (def clojure-main-ns (sci/create-ns 'clojure.main))
(defn catvec [& xs]
(into [] cat xs))
(def sci-ns (sci/create-ns 'sci.core))
(def namespaces (def namespaces
(cond-> (cond->
{'user {'*input* (reify {'user {'*input* (reify
@ -342,6 +360,7 @@ Use bb run --help to show this help output.
'clojure.tools.cli tools-cli-namespace 'clojure.tools.cli tools-cli-namespace
'clojure.java.shell shell-namespace 'clojure.java.shell shell-namespace
'babashka.core bbcore/core-namespace 'babashka.core bbcore/core-namespace
'babashka.nrepl.server nrepl-server-namespace
'babashka.wait wait-namespace 'babashka.wait wait-namespace
'babashka.signal signal-ns 'babashka.signal signal-ns
'clojure.java.io io-namespace 'clojure.java.io io-namespace
@ -356,10 +375,12 @@ Use bb run --help to show this help output.
'repl (sci/new-var 'repl 'repl (sci/new-var 'repl
(fn [& opts] (fn [& opts]
(let [opts (apply hash-map opts)] (let [opts (apply hash-map opts)]
(repl/start-repl! @common/ctx opts))) {:ns clojure-main-ns})} (repl/start-repl! @common/ctx opts))) {:ns clojure-main-ns})
'with-bindings (sci/copy-var clojure-main/with-bindings clojure-main-ns)}
'clojure.test t/clojure-test-namespace 'clojure.test t/clojure-test-namespace
'clojure.math math-namespace 'clojure.math math-namespace
'babashka.classpath classpath-namespace 'babashka.classpath classpath-namespace
'babashka.classes classes-namespace
'clojure.pprint pprint-namespace 'clojure.pprint pprint-namespace
'babashka.curl curl-namespace 'babashka.curl curl-namespace
'babashka.fs fs-namespace 'babashka.fs fs-namespace
@ -380,7 +401,21 @@ Use bb run --help to show this help output.
'rewrite-clj.paredit rewrite/paredit-namespace 'rewrite-clj.paredit rewrite/paredit-namespace
'rewrite-clj.parser rewrite/parser-namespace 'rewrite-clj.parser rewrite/parser-namespace
'rewrite-clj.zip rewrite/zip-namespace 'rewrite-clj.zip rewrite/zip-namespace
'rewrite-clj.zip.subedit rewrite/subedit-namespace} 'rewrite-clj.zip.subedit rewrite/subedit-namespace
'clojure.core.rrb-vector (if features/rrb-vector?
@(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace)
{'catvec (sci/copy-var catvec
(sci/create-ns 'clojure.core.rrb-vector))})
'edamame.core edamame-namespace
'sci.core {'format-stacktrace (sci/copy-var sci/format-stacktrace sci-ns)
'stacktrace (sci/copy-var sci/stacktrace sci-ns)
;; 'eval-string (sci/copy-var sci/eval-string sci-ns)
;; 'eval-string* (sci/copy-var sci/eval-string* sci-ns)
;; 'init (sci/copy-var sci/init sci-ns)
;; 'fork (sci/copy-var sci/fork sci-ns)
}
'babashka.cli cli/cli-namespace
}
features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace)
'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace)
'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace))
@ -518,9 +553,6 @@ Use bb run --help to show this help output.
("--verbose") (recur (next options) ("--verbose") (recur (next options)
(assoc opts-map (assoc opts-map
:verbose? true)) :verbose? true))
("--force") (recur (next options)
(assoc opts-map
:force? true))
("--describe") (recur (next options) ("--describe") (recur (next options)
(assoc opts-map (assoc opts-map
:describe? true)) :describe? true))
@ -614,6 +646,12 @@ Use bb run --help to show this help output.
:command-line-args (if (= "--" (second options)) :command-line-args (if (= "--" (second options))
(nthrest options 2) (nthrest options 2)
(rest options)))) (rest options))))
("--exec", "-x",)
(let [options (next options)]
(assoc opts-map :exec (first options)
:command-line-args (if (= "--" (second options))
(nthrest options 2)
(rest options))))
("--run") ("--run")
(parse-run-opts opts-map (next options)) (parse-run-opts opts-map (next options))
("--tasks") ("--tasks")
@ -621,6 +659,10 @@ Use bb run --help to show this help output.
:command-line-args (next options)) :command-line-args (next options))
("--print-deps") ("--print-deps")
(parse-print-deps-opts opts-map (next options)) (parse-print-deps-opts opts-map (next options))
("--prepare")
(let [options (next options)]
(recur (next options)
(assoc opts-map :prepare true)))
;; fallback ;; fallback
(if (and opts-map (if (and opts-map
(some opts-map [:file :jar :socket-repl :expressions :main :run])) (some opts-map [:file :jar :socket-repl :expressions :main :run]))
@ -655,6 +697,12 @@ Use bb run --help to show this help output.
("--init") ("--init")
(recur (nnext options) (assoc opts-map :init (second options))) (recur (nnext options) (assoc opts-map :init (second options)))
("--force" "-Sforce")
(recur (next options) (assoc opts-map :force? true))
("-Sdeps")
(recur (nnext options) (assoc opts-map :merge-deps (second options)))
("--config") ("--config")
(recur (nnext options) (assoc opts-map :config (second options))) (recur (nnext options) (assoc opts-map :config (second options)))
@ -700,11 +748,32 @@ Use bb run --help to show this help output.
(def pod-namespaces (volatile! {})) (def pod-namespaces (volatile! {}))
(defn download-only?
"If we're preparing pods for another OS / arch, don't try to run them."
[]
(let [env-os-name (System/getenv "BABASHKA_PODS_OS_NAME")
env-os-name-present? (not (str/blank? env-os-name))
sys-os-name (System/getProperty "os.name")
env-os-arch (System/getenv "BABASHKA_PODS_OS_ARCH")
env-os-arch-present? (not (str/blank? env-os-arch))
sys-os-arch (System/getProperty "os.arch")]
(when @common/debug
(binding [*out* *err*]
(println "System OS name:" sys-os-name)
(when env-os-name-present? (println "BABASHKA_PODS_OS_NAME:" env-os-name))
(println "System OS arch:" sys-os-arch)
(when env-os-arch-present? (println "BABASHKA_PODS_OS_ARCH:" env-os-arch))))
(cond
env-os-name-present? (not= env-os-name sys-os-name)
env-os-arch-present? (not= env-os-arch sys-os-arch))))
(defn exec [cli-opts] (defn exec [cli-opts]
(binding [*unrestricted* true] (binding [*unrestricted* true]
(sci/binding [core/warn-on-reflection @core/warn-on-reflection (sci/binding [core/warn-on-reflection @core/warn-on-reflection
core/unchecked-math @core/unchecked-math
core/data-readers @core/data-readers core/data-readers @core/data-readers
sci/ns @sci/ns] sci/ns @sci/ns
sci/print-length @sci/print-length]
(let [{version-opt :version (let [{version-opt :version
:keys [:shell-in :edn-in :shell-out :edn-out :keys [:shell-in :edn-in :shell-out :edn-out
:help :file :command-line-args :help :file :command-line-args
@ -714,11 +783,13 @@ Use bb run --help to show this help output.
:main :uberscript :describe? :main :uberscript :describe?
:jar :uberjar :clojure :jar :uberjar :clojure
:doc :run :list-tasks :doc :run :list-tasks
:print-deps]} :print-deps :prepare]
exec-fn :exec}
cli-opts cli-opts
_ (when debug (vreset! common/debug true)) _ (when debug (vreset! common/debug true))
_ (do ;; set properties _ (do ;; set properties
(when main (System/setProperty "babashka.main" main)) (when main (System/setProperty "babashka.main" main))
;; TODO: what about exec here?
(System/setProperty "babashka.version" version)) (System/setProperty "babashka.version" version))
read-next (fn [*in*] read-next (fn [*in*]
(if (pipe-signal-received?) (if (pipe-signal-received?)
@ -750,40 +821,45 @@ Use bb run --help to show this help output.
_ (when jar _ (when jar
(cp/add-classpath jar)) (cp/add-classpath jar))
load-fn (fn [{:keys [:namespace :reload]}] load-fn (fn [{:keys [:namespace :reload]}]
(or (when-let [{:keys [:loader]} (let [{:keys [loader]}
@cp/cp-state] @cp/cp-state]
(if ;; ignore built-in namespaces when uberscripting, unless with :reload (or
(and uberscript (when ;; ignore built-in namespaces when uberscripting, unless with :reload
(not reload) (and uberscript
(or (contains? namespaces namespace) (not reload)
(contains? sci-namespaces/namespaces namespace))) (or (contains? namespaces namespace)
"" (contains? sci-namespaces/namespaces namespace)))
(when-let [res (cp/source-for-namespace loader namespace nil)] "")
(if uberscript ;; pod namespaces go before namespaces from source,
(do (swap! uberscript-sources conj (:source res)) ;; unless reload is used
(uberscript/uberscript {:ctx @common/ctx (when-not reload
:expressions [(:source res)]}) (when-let [pod (get @pod-namespaces namespace)]
{}) (if uberscript
res)))) (do
(if-let [pod (get @pod-namespaces namespace)] (swap! uberscript-sources conj
(if uberscript (format
(do "(babashka.pods/load-pod '%s \"%s\" '%s)\n"
(swap! uberscript-sources conj (:pod-spec pod) (:version (:opts pod))
(format (dissoc (:opts pod)
"(babashka.pods/load-pod '%s \"%s\" '%s)\n" :version :metadata)))
(:pod-spec pod) (:version (:opts pod)) {})
(dissoc (:opts pod) (pods/load-pod (:pod-spec pod) (:opts pod)))))
:version :metadata))) (when loader
{}) (when-let [res (cp/source-for-namespace loader namespace nil)]
(pods/load-pod (:pod-spec pod) (:opts pod))) (if uberscript
(case namespace (do (swap! uberscript-sources conj (:source res))
clojure.spec.alpha (uberscript/uberscript {:ctx @common/ctx
(binding [*out* *err*] :expressions [(:source res)]})
(println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) {})
clojure.core.specs.alpha res)))
(binding [*out* *err*] (case namespace
(println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) clojure.spec.alpha
nil)))) (binding [*out* *err*]
(println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha"))
clojure.core.specs.alpha
(binding [*out* *err*]
(println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency."))
nil))))
main (if (and jar (not main)) main (if (and jar (not main))
(when-let [res (cp/getResource (when-let [res (cp/getResource
(cp/loader jar) (cp/loader jar)
@ -809,7 +885,8 @@ Use bb run --help to show this help output.
sci-ctx (sci/init opts) sci-ctx (sci/init opts)
_ (vreset! common/ctx sci-ctx) _ (vreset! common/ctx sci-ctx)
_ (when-let [pods (:pods @common/bb-edn)] _ (when-let [pods (:pods @common/bb-edn)]
(let [pod-metadata (pods/load-pods-metadata pods)] (when-let [pod-metadata (pods/load-pods-metadata
pods {:download-only (download-only?)})]
(vreset! pod-namespaces pod-metadata))) (vreset! pod-namespaces pod-metadata)))
preloads (some-> (System/getenv "BABASHKA_PRELOADS") (str/trim)) preloads (some-> (System/getenv "BABASHKA_PRELOADS") (str/trim))
[expressions exit-code] [expressions exit-code]
@ -823,6 +900,9 @@ Use bb run --help to show this help output.
"-main")] "-main")]
[[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)" [[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)"
ns var-name)] nil]) ns var-name)] nil])
exec-fn
(let [sym (symbol exec-fn)]
[[(cli/exec-fn-snippet sym)] nil])
run (if (:run-help cli-opts) run (if (:run-help cli-opts)
[(print-run-help) 0] [(print-run-help) 0]
(do (do
@ -882,6 +962,7 @@ Use bb run --help to show this help output.
uberjar [nil 0] uberjar [nil 0]
list-tasks [(tasks/list-tasks sci-ctx) 0] list-tasks [(tasks/list-tasks sci-ctx) 0]
print-deps [(print-deps/print-deps (:print-deps-format cli-opts)) 0] print-deps [(print-deps/print-deps (:print-deps-format cli-opts)) 0]
prepare [nil 0]
uberscript uberscript
[nil (do (uberscript/uberscript {:ctx sci-ctx [nil (do (uberscript/uberscript {:ctx sci-ctx
:expressions expressions}) :expressions expressions})
@ -890,8 +971,8 @@ Use bb run --help to show this help output.
;; execute code ;; execute code
(sci/binding [sci/file abs-path] (sci/binding [sci/file abs-path]
(try (try
; when evaluating expression(s), add in repl-requires so things like ;; when evaluating expression(s), add in repl-requires so things like
; pprint and dir are available ;; pprint and dir are available
(sci/eval-form sci-ctx `(apply require (quote ~clojure-main/repl-requires))) (sci/eval-form sci-ctx `(apply require (quote ~clojure-main/repl-requires)))
(loop [] (loop []
(let [in (read-next *in*)] (let [in (read-next *in*)]
@ -963,20 +1044,31 @@ Use bb run --help to show this help output.
(and (= minor-current minor-min) (and (= minor-current minor-min)
(>= patch-current patch-min))))))) (>= patch-current patch-min)))))))
(defn load-bb-edn [string]
(try (edn/read-string {:default tagged-literal} string)
(catch java.lang.RuntimeException e
(if (re-find #"No dispatch macro for: \"" (.getMessage e))
(throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {}))
(throw e)))))
(defn main [& args] (defn main [& args]
(let [[args global-opts] (parse-global-opts args) (let [[args global-opts] (parse-global-opts args)
{:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile) {:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile)
(parse-file-opt args global-opts)) (parse-file-opt args global-opts))
config (:config global-opts) config (:config global-opts)
merge-deps (:merge-deps global-opts)
abs-path #(-> % io/file .getAbsolutePath) abs-path #(-> % io/file .getAbsolutePath)
bb-edn-file (cond bb-edn-file (cond
config (when (fs/exists? config) (abs-path config)) config (when (fs/exists? config) (abs-path config))
jar (some-> jar cp/loader (cp/resource "META-INF/bb.edn") .toString) jar (some-> jar cp/loader (cp/resource "META-INF/bb.edn") .toString)
:else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) :else (when (fs/exists? "bb.edn") (abs-path "bb.edn")))
bb-edn (when bb-edn-file bb-edn (when (or bb-edn-file merge-deps)
(System/setProperty "babashka.config" bb-edn-file) (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file))
(let [raw-string (slurp bb-edn-file) (let [raw-string (when bb-edn-file (slurp bb-edn-file))
edn (edn/read-string raw-string) edn (when bb-edn-file (load-bb-edn raw-string))
edn (if merge-deps
(deps/merge-deps [edn (load-bb-edn merge-deps)])
edn)
edn (assoc edn edn (assoc edn
:raw raw-string :raw raw-string
:file bb-edn-file) :file bb-edn-file)
@ -985,6 +1077,7 @@ Use bb run --help to show this help output.
(assoc edn :deps-root deps-root) (assoc edn :deps-root deps-root)
edn)] edn)]
(vreset! common/bb-edn edn))) (vreset! common/bb-edn edn)))
;; _ (.println System/err (str bb-edn))
min-bb-version (:min-bb-version bb-edn)] min-bb-version (:min-bb-version bb-edn)]
(when min-bb-version (when min-bb-version
(when-not (satisfies-min-version? min-bb-version) (when-not (satisfies-min-version? min-bb-version)

View file

@ -26,8 +26,9 @@
:wait-for-port.impl/timed-out :wait-for-port.impl/timed-out
:wait-for-port.impl/try-again))))] :wait-for-port.impl/try-again))))]
(cond (identical? :wait-for-port.impl/try-again v) (cond (identical? :wait-for-port.impl/try-again v)
(do (Thread/sleep (or pause 100)) (let [^long pause (or pause 100)]
(recur)) (Thread/sleep pause)
(recur))
(identical? :wait-for-port.impl/timed-out v) (identical? :wait-for-port.impl/timed-out v)
default default
:else :else
@ -51,8 +52,9 @@
:wait-for-path.impl/timed-out :wait-for-path.impl/timed-out
:wait-for-path.impl/try-again)))] :wait-for-path.impl/try-again)))]
(cond (identical? :wait-for-path.impl/try-again v) (cond (identical? :wait-for-path.impl/try-again v)
(do (Thread/sleep (or pause 100)) (let [^long pause (or pause 100)]
(recur)) (Thread/sleep pause)
(recur))
(identical? :wait-for-path.impl/timed-out v) (identical? :wait-for-path.impl/timed-out v)
default default
:else :else

View file

@ -0,0 +1,7 @@
(ns babashka.exec-test
{:org.babashka/cli {:coerce {:foo []}}})
(defn exec-test
{:org.babashka/cli {:coerce {:bar :keyword}}}
[m]
(prn m))

View file

@ -1,5 +1,7 @@
(ns babashka.run-all-libtests (ns babashka.run-all-libtests
(:require [babashka.core :refer [windows?]] (:require [babashka.classpath :as cp :refer [add-classpath]]
[babashka.core :refer [windows?]]
[babashka.fs :as fs]
[clojure.edn :as edn] [clojure.edn :as edn]
[clojure.java.io :as io] [clojure.java.io :as io]
[clojure.test :as t :refer [*report-counters*]])) [clojure.test :as t :refer [*report-counters*]]))
@ -42,7 +44,13 @@
;; Standard test-runner for libtests ;; Standard test-runner for libtests
(let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn")))] (let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn")))]
(doseq [{tns :test-namespaces skip-windows :skip-windows} (vals lib-tests)] (doseq [[libname {tns :test-namespaces skip-windows :skip-windows
:keys [test-paths
git-sha]}] lib-tests]
(let [git-dir (format ".gitlibs/libs/%s/%s" libname git-sha)
git-dir (fs/file (fs/home) git-dir)]
(doseq [p test-paths]
(add-classpath (str (fs/file git-dir p)))))
(when-not (and skip-windows (windows?)) (when-not (and skip-windows (windows?))
(apply test-namespaces tns)))) (apply test-namespaces tns))))

View file

@ -47,7 +47,7 @@
doric/doric {:git-sha "8747fdce565187a5c368c575cf4ca794084b0a5c", :git-url "https://github.com/joegallo/doric", :test-namespaces (doric.test.core doric.test.readme doric.test.doctest)} doric/doric {:git-sha "8747fdce565187a5c368c575cf4ca794084b0a5c", :git-url "https://github.com/joegallo/doric", :test-namespaces (doric.test.core doric.test.readme doric.test.doctest)}
com.github.seancorfield/honeysql {:git-sha "6e4e1f6928450788353c181f32474d930d6afe84", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honey.sql-test honey.sql.helpers-test honey.sql.postgres-test), :branch "develop"} com.github.seancorfield/honeysql {:git-sha "6e4e1f6928450788353c181f32474d930d6afe84", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honey.sql-test honey.sql.helpers-test honey.sql.postgres-test), :branch "develop"}
honeysql/honeysql {:git-sha "1137dd12350afdc30ad4976c3718279581390b36", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honeysql.format-test honeysql.core-test), :branch "v1"} honeysql/honeysql {:git-sha "1137dd12350afdc30ad4976c3718279581390b36", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honeysql.format-test honeysql.core-test), :branch "v1"}
; skip tests on Windows because of the :compressed thing ; skip tests on Windows because of the :compressed thing
babashka/babashka.curl {:git-url "https://github.com/babashka/babashka.curl", :test-namespaces [babashka.curl-test], :skip-windows true, :manually-added true} babashka/babashka.curl {:git-url "https://github.com/babashka/babashka.curl", :test-namespaces [babashka.curl-test], :skip-windows true, :manually-added true}
http-kit/http-kit {:git-url "https://github.com/http-kit/http-kit", :test-namespaces [httpkit.client-test], :manually-added true} http-kit/http-kit {:git-url "https://github.com/http-kit/http-kit", :test-namespaces [httpkit.client-test], :manually-added true}
org.clojure/core.match {:git-url "https://github.com/clojure/core.match", :test-namespaces [core-match.core-tests], :manually-added true} org.clojure/core.match {:git-url "https://github.com/clojure/core.match", :test-namespaces [core-match.core-tests], :manually-added true}
@ -112,4 +112,59 @@
com.layerware/hugsql-core {:test-namespaces (hugsql.babashka-test)} com.layerware/hugsql-core {:test-namespaces (hugsql.babashka-test)}
com.github.seancorfield/expectations {:git-url "https://github.com/clojure-expectations/clojure-test", :test-namespaces (expectations.clojure.test-test), :git-sha "b30fefd97d9eb7d1f47e06956521f354cb926b03"} com.github.seancorfield/expectations {:git-url "https://github.com/clojure-expectations/clojure-test", :test-namespaces (expectations.clojure.test-test), :git-sha "b30fefd97d9eb7d1f47e06956521f354cb926b03"}
com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"} com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"}
} com.github.askonomm/clarktown {:git-url "https://github.com/askonomm/clarktown", :test-namespaces (clarktown.core-test clarktown.parsers.horizontal-line-block-test clarktown.parsers.italic-test clarktown.parsers.link-and-image-test clarktown.parsers.empty-block-test clarktown.parsers.inline-code-test clarktown.parsers.heading-block-test clarktown.parsers.bold-test clarktown.parsers.quote-block-test clarktown.parsers.code-block-test clarktown.parsers.strikethrough-test), :git-sha "059bfa7bd9bfdde0c75646bf1dfc20d23da8a02c"}
org.clojure/math.numeric-tower {:git-url "https://github.com/clojure/math.numeric-tower", :test-namespaces (clojure.math.test-numeric-tower), :git-sha "97827be66f35feebc3c89ba81c546fef4adc7947"}
prismatic/schema {:test-namespaces [schema.core-test
schema.macros-test
schema.coerce-test
schema.experimental.abstract-map-test
schema.test-test
schema.utils-test]
:git-url "https://github.com/plumatic/schema"
:git-sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
:git-tag "schema-1.3.0"
;; specify for adding tests to classpath
:test-paths ["test/clj" "test/cljc"]}
metosin/malli {:test-namespaces [malli.clj-kondo-test
malli.core-test
malli.destructure-test
malli.dot-test
malli.error-test
malli.experimental-test
;; malli.generator-test
malli.instrument-test
malli.json-schema-test
malli.plantuml-test
malli.provider-test
malli.registry-test
malli.swagger-test
malli.transform-test
malli.util-test]
:git-url "https://github.com/metosin/malli"
:git-sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99"
:git-tag "0.8.9"
;; specify for adding tests to classpath
:test-paths ["test"]}
meander/epsilon {:test-namespaces [meander.epsilon-test
meander.defsyntax-test
meander.syntax.epsilon-test
meander.substitute.epsilon-test
meander.strategy.epsilon-test
meander.matrix.epsilon-test
meander.match.epsilon-test
meander.match.ir.epsilon-test
meander.match.check.epsilon-test
meander.interpreter.epsilon-test
meander.defsyntax-test.gh-145]
:test-paths ["test"]
:git-url "https://github.com/noprompt/meander"
:git-sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"}
cc.qbits/auspex {:git-url "https://github.com/mpenet/auspex"
:git-sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a"
:test-paths ["test"]
:test-namespaces [qbits.auspex-test]}
exoscale/interceptor {:git-url "https://github.com/exoscale/interceptor"
:git-sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e"
:test-paths ["test"]
:test-namespaces [exoscale.interceptor-test]}
}

View file

@ -0,0 +1,93 @@
Lorem ipsum dolor **sit** amet. Lorem ipsum *dolor* _sit_ __amet__.
There's a [link here](https://example.com/that_has_things?!???!#in-it).
1. List item
2. Another list item
1. Sub list item
2. Another sub list item
1. Sub sub list item
3. Continuing sub list item
3. Continuing list item
```javascript
// Detect horizontal line block
function isHorizontalLineBlock(block) {
return block === "***";
}
// Render horizontal line block
function horizontalLineBlock(block) {
return `<hr>`;
}
// Compose an array of parsers
const parsers = [{
matcher: isHorizontalLineBlock,
renderers: [horizontalLineBlock]
}];
// And finally, our parser itself
function markdownToHTML(markdown) {
// Create blocks
const blocks = content.split(/\n\n/);
// Parse blocks
const parsedBlocks = blocks.map((block) => {
// Let's find a parser that has a matcher that matches
const parser = parsers.find((parser) => parser.matcher(block));
// If match was found, let's run our renderers over `block`
if (parser) {
for (const renderer of match.renderers) {
block = renderer(block);
}
}
return block;
});
// And at last, join the blocks together for one big block.
return parsedBlocks.join("");
}
```
- Test 123
- Test 223
- Test 334
1. Test test
This is ___bold italic text___ and ***this is also***. *What about italic text that **has bold text***?
## Hi there, world!
* List item
* Another list ~~item~~
* Sub list item
* Another sub list item
* Sub sub list item
* Continuing sub list item
* Continuing list item
***
* List item
* Another list item
* Sub list item
* Another sub list item
1. Sub sub list item
2. Continuing sub list item
* Continuing list item
This is a H1 heading with settext
=================================
And this is a H2 heading with settext
-------------------------------------
Testing paragraph right before a code block
```
code goes here
```
# Heading goes here
Paragraph right after heading

View file

@ -0,0 +1,69 @@
<p>Lorem ipsum dolor <strong>sit</strong> amet. Lorem ipsum <em>dolor</em> <em>sit</em> <strong>amet</strong>.</p>
<p>There's a <a href="https://example.com/that&#95;has&#95;things?!???!#in-it">link here</a>.</p>
<ol><li>List item</li><li>Another list item<ol><li>Sub list item</li><li>Another sub list item<ol><li>Sub sub list item</li></ol></li><li>Continuing sub list item</li></ol></li><li>Continuing list item</li></ol>
<pre><code class="language-javascript">// Detect horizontal line block
function isHorizontalLineBlock(block) {
return block === "***";
}
// Render horizontal line block
function horizontalLineBlock(block) {
return `&lt;hr&gt;`;
}
// Compose an array of parsers
const parsers = [{
matcher: isHorizontalLineBlock,
renderers: [horizontalLineBlock]
}];
// And finally, our parser itself
function markdownToHTML(markdown) {
// Create blocks
const blocks = content.split(/\n\n/);
// Parse blocks
const parsedBlocks = blocks.map((block) =&gt; {
// Let's find a parser that has a matcher that matches
const parser = parsers.find((parser) =&gt; parser.matcher(block));
// If match was found, let's run our renderers over `block`
if (parser) {
for (const renderer of match.renderers) {
block = renderer(block);
}
}
return block;
});
// And at last, join the blocks together for one big block.
return parsedBlocks.join("");
}</code></pre>
<ul><li>Test 123</li><li>Test 223<ul><li>Test 334<ol><li>Test test</li></ol></li></ul></li></ul>
<p>This is <em><strong>bold italic text</strong></em> and <em><strong>this is also</strong></em>. <em>What about italic text that <strong>has bold text</strong></em>?</p>
<h2>Hi there, world!</h2>
<ul><li>List item</li><li>Another list <del>item</del><ul><li>Sub list item</li><li>Another sub list item<ul><li>Sub sub list item</li><li>Continuing sub list item</li></ul></li></ul></li><li>Continuing list item</li></ul>
<hr>
<ul><li>List item</li><li>Another list item<ul><li>Sub list item</li><li>Another sub list item<ol><li>Sub sub list item</li><li>Continuing sub list item</li></ol></li></ul></li><li>Continuing list item</li></ul>
<h1>This is a H1 heading with settext</h1>
<h2>And this is a H2 heading with settext</h2>
<p>Testing paragraph right before a code block</p>
<pre><code>code goes here</code></pre>
<h1>Heading goes here</h1>
<p>Paragraph right after heading</p>

View file

@ -0,0 +1,15 @@
(ns clarktown.core-test
(:require
;; BB-TEST-PATCH: require clojure.string for split-lines patch below
[clojure.string :as str]
[clojure.test :refer [deftest testing is]]
[clojure.java.io :as io]
[clarktown.core :as core]))
(deftest overall-test
(testing "Overall"
;; BB-TEST-PATCH: library uses hard-coded \n, so using split-lines for platform-agnostic testing
;; BB-TEST-PATCH: change file paths to match bb folder structure (and copy resource files)
(is (= (str/split-lines (core/render (slurp (io/file (io/resource "clarktown/core.md")))))
(str/split-lines (slurp (io/file (io/resource "clarktown/core_result.html"))))))))

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