diff --git a/clojure/gol/.gitignore b/clojure/.gitignore similarity index 100% rename from clojure/gol/.gitignore rename to clojure/.gitignore diff --git a/clojure/.tool-versions b/clojure/.tool-versions new file mode 100644 index 0000000..e746dd1 --- /dev/null +++ b/clojure/.tool-versions @@ -0,0 +1,2 @@ +java corretto-21 +leiningen 2.12 diff --git a/clojure/README.md b/clojure/README.md new file mode 100644 index 0000000..e7cf21e --- /dev/null +++ b/clojure/README.md @@ -0,0 +1,30 @@ +# Clojure + +Skeleton project for Clojure. + +## Prerequisites + +The toolchain this project needs is declared in [`.tool-versions`](./.tool-versions): + +``` +java corretto-21 +leiningen 2.12 +``` + +Install those however you prefer, as long as they end up on your `PATH`. The quickest route is +[mise](https://mise.jdx.dev/), which reads the file for you: + +```sh +mise install +``` + +## Usage +- `./script/setup` to fetch dependencies +- `./script/test` to run the tests +- `./script/start` to run the app + +## Structure +- Code located in [`core.clj`](./src/pairing/core.clj) +- Tests located in [`core_test.clj`](./test/pairing/core_test.clj) + +However, you're free to organise your code as you like. diff --git a/clojure/gol/README.md b/clojure/gol/README.md deleted file mode 100644 index 52826d9..0000000 --- a/clojure/gol/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Game of Life (Clojure) - -Game of Life skeleton - -## Getting started - -This project uses [Leiningen](http://leiningen.org/) which will self-install when you first run the tests. - -## Usage - -./lein test diff --git a/clojure/gol/lein b/clojure/gol/lein deleted file mode 100755 index 513be15..0000000 --- a/clojure/gol/lein +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/env bash - -# Ensure this file is executable via `chmod a+x lein`, then place it -# somewhere on your $PATH, like ~/bin. The rest of Leiningen will be -# installed upon first run into the ~/.lein/self-installs directory. - -export LEIN_VERSION="2.5.1" - -case $LEIN_VERSION in - *SNAPSHOT) SNAPSHOT="YES" ;; - *) SNAPSHOT="NO" ;; -esac - -if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then - delimiter=";" -else - delimiter=":" -fi - -if [[ "$OSTYPE" == "cygwin" ]]; then - cygwin=true -else - cygwin=false -fi - -function make_native_path { - # ensure we have native paths - if $cygwin && [[ "$1" == /* ]]; then - echo -n "$(cygpath -wp "$1")" - elif [[ "$OSTYPE" == "msys" && "$1" == /?/* ]]; then - echo -n "$(sh -c "(cd $1 2 /dev/null - download_failed_message "$LEIN_URL" "$exit_code" - exit 1 - fi -} - -if [ `id -u` -eq 0 ] && [ "$LEIN_ROOT" = "" ]; then - echo "WARNING: You're currently running as root; probably by accident." - echo "Press control-C to abort or Enter to continue as root." - echo "Set LEIN_ROOT to disable this warning." - read _ -fi - -NOT_FOUND=1 -ORIGINAL_PWD="$PWD" -while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ] -do - cd .. - if [ "$(dirname "$PWD")" = "/" ]; then - NOT_FOUND=0 - cd "$ORIGINAL_PWD" - fi -done - -export LEIN_HOME="${LEIN_HOME:-"$HOME/.lein"}" - -for f in "$LEIN_HOME/leinrc" ".leinrc"; do - if [ -e "$f" ]; then - source "$f" - fi -done - -if $cygwin; then - export LEIN_HOME=`cygpath -w "$LEIN_HOME"` -fi - -LEIN_JAR="$LEIN_HOME/self-installs/leiningen-$LEIN_VERSION-standalone.jar" - -# normalize $0 on certain BSDs -if [ "$(dirname "$0")" = "." ]; then - SCRIPT="$(which $(basename "$0"))" - if [ -z "$SCRIPT" ]; then - SCRIPT="$0" - fi -else - SCRIPT="$0" -fi - -# resolve symlinks to the script itself portably -while [ -h "$SCRIPT" ] ; do - ls=`ls -ld "$SCRIPT"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - SCRIPT="$link" - else - SCRIPT="$(dirname "$SCRIPT"$)/$link" - fi -done - -BIN_DIR="$(dirname "$SCRIPT")" - -export LEIN_JVM_OPTS="${LEIN_JVM_OPTS-"-XX:+TieredCompilation -XX:TieredStopAtLevel=1"}" - -# This needs to be defined before we call HTTP_CLIENT below -if [ "$HTTP_CLIENT" = "" ]; then - if type -p curl >/dev/null 2>&1; then - if [ "$https_proxy" != "" ]; then - CURL_PROXY="-x $https_proxy" - fi - HTTP_CLIENT="curl $CURL_PROXY -f -L -o" - else - HTTP_CLIENT="wget -O" - fi -fi - - -# When :eval-in :classloader we need more memory -grep -E -q '^\s*:eval-in\s+:classloader\s*$' project.clj 2> /dev/null && \ - export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Xms64m -Xmx512m" - -if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then - # Running from source checkout - LEIN_DIR="$(dirname "$BIN_DIR")" - - # Need to use lein release to bootstrap the leiningen-core library (for aether) - if [ ! -r "$LEIN_DIR/leiningen-core/.lein-bootstrap" ]; then - echo "Leiningen is missing its dependencies." - echo "Please run \"lein bootstrap\" in the leiningen-core/ directory" - echo "with a stable release of Leiningen. See CONTRIBUTING.md for details." - exit 1 - fi - - # If project.clj for lein or leiningen-core changes, we must recalculate - LAST_PROJECT_CHECKSUM=$(cat "$LEIN_DIR/.lein-project-checksum" 2> /dev/null) - PROJECT_CHECKSUM=$(sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj") - if [ "$PROJECT_CHECKSUM" != "$LAST_PROJECT_CHECKSUM" ]; then - if [ -r "$LEIN_DIR/.lein-classpath" ]; then - rm "$LEIN_DIR/.lein-classpath" - fi - fi - - # Use bin/lein to calculate its own classpath. - if [ ! -r "$LEIN_DIR/.lein-classpath" ] && [ "$1" != "classpath" ]; then - echo "Recalculating Leiningen's classpath." - ORIG_PWD="$PWD" - cd "$LEIN_DIR" - - LEIN_NO_USER_PROFILES=1 $0 classpath .lein-classpath - sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj" > \ - .lein-project-checksum - cd "$ORIG_PWD" - fi - - mkdir -p "$LEIN_DIR/target/classes" - export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Dclojure.compile.path=$LEIN_DIR/target/classes" - add_path CLASSPATH "$LEIN_DIR/leiningen-core/src/" "$LEIN_DIR/leiningen-core/resources/" \ - "$LEIN_DIR/test:$LEIN_DIR/target/classes" "$LEIN_DIR/src" ":$LEIN_DIR/resources" - - if [ -r "$LEIN_DIR/.lein-classpath" ]; then - add_path CLASSPATH "$(cat "$LEIN_DIR/.lein-classpath" 2> /dev/null)" - else - add_path CLASSPATH "$(cat "$LEIN_DIR/leiningen-core/.lein-bootstrap" 2> /dev/null)" - fi -else # Not running from a checkout - add_path CLASSPATH "$LEIN_JAR" - - BOOTCLASSPATH="-Xbootclasspath/a:$LEIN_JAR" - - if [ ! -r "$LEIN_JAR" -a "$1" != "self-install" ]; then - self_install - fi -fi - -# TODO: explain what to do when Java is missing -export JAVA_CMD="${JAVA_CMD:-"java"}" -export LEIN_JAVA_CMD="${LEIN_JAVA_CMD:-$JAVA_CMD}" - -if [[ -z "${DRIP_INIT+x}" && "$(basename "$LEIN_JAVA_CMD")" == *drip* ]]; then - export DRIP_INIT="$(printf -- '-e\n(require (quote leiningen.repl))')" - export DRIP_INIT_CLASS="clojure.main" -fi - -# Support $JAVA_OPTS for backwards-compatibility. -export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}" - -# Handle jline issue with cygwin not propagating OSTYPE through java subprocesses: https://github.com/jline/jline2/issues/62 -cygterm=false -if $cygwin; then - case "$TERM" in - rxvt* | xterm* | vt*) cygterm=true ;; - esac -fi - -if $cygterm; then - LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Djline.terminal=jline.UnixTerminal" - stty -icanon min 1 -echo > /dev/null 2>&1 -fi - -# TODO: investigate http://skife.org/java/unix/2011/06/20/really_executable_jars.html -# If you're packaging this for a package manager (.deb, homebrew, etc) -# you need to remove the self-install and upgrade functionality or see lein-pkg. -if [ "$1" = "self-install" ]; then - if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then - echo "Running self-install from a checkout is not supported." - echo "See CONTRIBUTING.md for SNAPSHOT-specific build instructions." - exit 1 - fi - echo "Manual self-install is deprecated; it will run automatically when necessary." - self_install -elif [ "$1" = "upgrade" ] || [ "$1" = "downgrade" ]; then - if [ "$LEIN_DIR" != "" ]; then - echo "The upgrade task is not meant to be run from a checkout." - exit 1 - fi - if [ $SNAPSHOT = "YES" ]; then - echo "The upgrade task is only meant for stable releases." - echo "See the \"Hacking\" section of the README." - exit 1 - fi - if [ ! -w "$SCRIPT" ]; then - echo "You do not have permission to upgrade the installation in $SCRIPT" - exit 1 - else - TARGET_VERSION="${2:-stable}" - echo "The script at $SCRIPT will be upgraded to the latest $TARGET_VERSION version." - echo -n "Do you want to continue [Y/n]? " - read RESP - case "$RESP" in - y|Y|"") - echo - echo "Upgrading..." - TARGET="/tmp/lein-$$-upgrade" - if $cygwin; then - TARGET=`cygpath -w $TARGET` - fi - LEIN_SCRIPT_URL="https://github.com/technomancy/leiningen/raw/$TARGET_VERSION/bin/lein" - $HTTP_CLIENT "$TARGET" "$LEIN_SCRIPT_URL" - if [ $? == 0 ]; then - cmp -s "$TARGET" "$SCRIPT" - if [ $? == 0 ]; then - echo "Leiningen is already up-to-date." - fi - mv "$TARGET" "$SCRIPT" && chmod +x "$SCRIPT" - exec "$SCRIPT" version - else - download_failed_message "$LEIN_SCRIPT_URL" - fi;; - *) - echo "Aborted." - exit 1;; - esac - fi -else - if $cygwin; then - # When running on Cygwin, use Windows-style paths for java - ORIGINAL_PWD=`cygpath -w "$ORIGINAL_PWD"` - fi - - # apply context specific CLASSPATH entries - if [ -f .lein-classpath ]; then - add_path CLASSPATH "$(cat .lein-classpath)" - fi - - if [ $DEBUG ]; then - echo "Leiningen's classpath: $CLASSPATH" - fi - - if [ -r .lein-fast-trampoline ]; then - export LEIN_FAST_TRAMPOLINE='y' - fi - - if [ "$LEIN_FAST_TRAMPOLINE" != "" ] && [ -r project.clj ]; then - INPUTS="$@ $(cat project.clj) $LEIN_VERSION $(test -f "$LEIN_HOME/profiles.clj" && cat "$LEIN_HOME/profiles.clj")" - export INPUT_CHECKSUM=$(echo $INPUTS | shasum - | cut -f 1 -d " ") - # Just don't change :target-path in project.clj, mkay? - TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM" - else - if hash mktemp 2>/dev/null; then - # Check if mktemp is available before using it - TRAMPOLINE_FILE="$(mktemp /tmp/lein-trampoline-XXXXXXXXXXXXX)" - else - TRAMPOLINE_FILE="/tmp/lein-trampoline-$$" - fi - trap "rm -f $TRAMPOLINE_FILE" EXIT - fi - - if $cygwin; then - TRAMPOLINE_FILE=`cygpath -w $TRAMPOLINE_FILE` - fi - - if [ "$INPUT_CHECKSUM" != "" ] && [ -r "$TRAMPOLINE_FILE" ]; then - if [ $DEBUG ]; then - echo "Fast trampoline with $TRAMPOLINE_FILE." - fi - exec sh -c "exec $(cat $TRAMPOLINE_FILE)" - else - export TRAMPOLINE_FILE - "$LEIN_JAVA_CMD" \ - "${BOOTCLASSPATH[@]}" \ - -Dfile.encoding=UTF-8 \ - -Dmaven.wagon.http.ssl.easy=false \ - -Dmaven.wagon.rto=10000 \ - $LEIN_JVM_OPTS \ - -Dleiningen.original.pwd="$ORIGINAL_PWD" \ - -Dleiningen.script="$SCRIPT" \ - -classpath "$CLASSPATH" \ - clojure.main -m leiningen.core.main "$@" - - EXIT_CODE=$? - - if $cygterm ; then - stty icanon echo > /dev/null 2>&1 - fi - - ## TODO: [ -r "$TRAMPOLINE_FILE" ] may be redundant? A trampoline file - ## is always generated these days. - if [ -r "$TRAMPOLINE_FILE" ] && [ "$LEIN_TRAMPOLINE_WARMUP" = "" ]; then - TRAMPOLINE="$(cat $TRAMPOLINE_FILE)" - if [ "$INPUT_CHECKSUM" = "" ]; then - rm $TRAMPOLINE_FILE - fi - if [ "$TRAMPOLINE" = "" ]; then - exit $EXIT_CODE - else - exec sh -c "exec $TRAMPOLINE" - fi - else - exit $EXIT_CODE - fi - fi -fi diff --git a/clojure/gol/project.clj b/clojure/gol/project.clj deleted file mode 100644 index 547f2d7..0000000 --- a/clojure/gol/project.clj +++ /dev/null @@ -1,5 +0,0 @@ -(defproject gol "0.1.0-SNAPSHOT" - :description "Game of Life pairing test" - :min-lein-version "2.5.1" - :dependencies [[org.clojure/clojure "1.11.1"]] - :main gol.core) diff --git a/clojure/project.clj b/clojure/project.clj new file mode 100644 index 0000000..a14eea5 --- /dev/null +++ b/clojure/project.clj @@ -0,0 +1,5 @@ +(defproject pairing "0.1.0-SNAPSHOT" + :description "Skeleton project for a pairing test" + :min-lein-version "2.5.1" + :dependencies [[org.clojure/clojure "1.11.1"]] + :main pairing.core) diff --git a/clojure/script/setup b/clojure/script/setup new file mode 100755 index 0000000..33f273c --- /dev/null +++ b/clojure/script/setup @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +lein deps diff --git a/clojure/script/start b/clojure/script/start new file mode 100755 index 0000000..77e49bf --- /dev/null +++ b/clojure/script/start @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +lein run diff --git a/clojure/script/test b/clojure/script/test new file mode 100755 index 0000000..2fe6eff --- /dev/null +++ b/clojure/script/test @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +lein test diff --git a/clojure/gol/src/gol/core.clj b/clojure/src/pairing/core.clj similarity index 89% rename from clojure/gol/src/gol/core.clj rename to clojure/src/pairing/core.clj index 3106727..79c15a5 100644 --- a/clojure/gol/src/gol/core.clj +++ b/clojure/src/pairing/core.clj @@ -1,4 +1,4 @@ -(ns gol.core) +(ns pairing.core) (defn greeting "Builds a greeting for the given name." diff --git a/clojure/gol/test/gol/core_test.clj b/clojure/test/pairing/core_test.clj similarity index 72% rename from clojure/gol/test/gol/core_test.clj rename to clojure/test/pairing/core_test.clj index 37b165e..5993d91 100644 --- a/clojure/gol/test/gol/core_test.clj +++ b/clojure/test/pairing/core_test.clj @@ -1,6 +1,6 @@ -(ns gol.core-test +(ns pairing.core-test (:require [clojure.test :refer :all] - [gol.core :refer :all])) + [pairing.core :refer :all])) (deftest greeting-test (testing "greeting addresses the name it is given"