From 12cf5271b7ac41a7ef19fc619344d94861b7556a Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:14:53 +0200 Subject: [PATCH 01/13] Some ignores --- .gitignore | 7 +++++++ tmp/.keep | 0 2 files changed, 7 insertions(+) create mode 100644 tmp/.keep diff --git a/.gitignore b/.gitignore index 1548a67..07ed09e 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,10 @@ /checkouts /classes /target + +/.worktree.yml +/.claude +/bin/worktree-dev + +/tmp/* +!/tmp/.keep diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000..e69de29 From a823bb81d6fb1c796dffe754908151de3a59f955 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:26:54 +0200 Subject: [PATCH 02/13] Add updates via dependabot --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..40cca84 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" # covers all .github/workflows/* + schedule: + interval: "weekly" From 4bb4759cf8843f6ddc4a7024caa165f3e6952bfb Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:27:12 +0200 Subject: [PATCH 03/13] Pin gh actions --- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b83a0c..433a5bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,11 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Install clojure tools - uses: DeLaGuardo/setup-clojure@10.0 + uses: DeLaGuardo/setup-clojure@4c7a6f613e5089821bb3bb2a33a3ee115578580d # 13.6.1 with: cli: latest - name: Run tests diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 25b2ba7..39323f6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,12 +13,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Install clojure tools - uses: DeLaGuardo/setup-clojure@10.0 + uses: DeLaGuardo/setup-clojure@4c7a6f613e5089821bb3bb2a33a3ee115578580d # 13.6.1 with: cli: latest From a98b300f05cd365d1bb4f81b2bcad338c7840bf4 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:35:26 +0200 Subject: [PATCH 04/13] Document releasing --- RELEASING.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 RELEASING.md diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 0000000..93295db --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,87 @@ +# Releasing + +Releases are fully automated: pushing a git tag triggers the +[release workflow](.github/workflows/release.yml), which tests, builds and +deploys `dk.thinkcreate/malli-select` to [Clojars](https://clojars.org/dk.thinkcreate/malli-select). + +## TL;DR + +Local tags must be *signed* (`-s`): + +```sh +# snapshot release (publishes X.Y.Z-SNAPSHOT) +git tag -s vX.Y.Z-pre.1 -m "vX.Y.Z-pre.1" +git push origin vX.Y.Z-pre.1 + +# full release (publishes X.Y.Z) +git tag -s vX.Y.Z -m "vX.Y.Z" +git push origin vX.Y.Z +``` + +Watch the run with `gh run watch`. + +Alternatively create a [release on GitHub](https://github.com/eval/malli-select/releases/new) +(or `gh release create vX.Y.Z`) and let it create the tag — mark it as a +prerelease when using a `-pre` tag. Tags created this way aren't locally +signed but are attributed to your GitHub account. + +## How it works + +The workflow runs on every push to `main` and on every tag: + +```sh +clojure -T:build release :build/git-version $(printf '"%s"' $(git describe --tags)) :deploy/only-jar-version-type :full-and-snapshot +``` + +`release` (see [build.clj](build.clj)) chains `test` → `build` → `deploy`. +The output of `git describe --tags` determines the version and whether the +built jar is actually deployed: + +| `git describe --tags` | jar version | deployed? | +|-----------------------------------|-------------------|-------------------------------| +| `v1.2.3` (exact release tag) | `1.2.3` | yes — full release | +| `v1.2.3-pre.1` (pre-tag, or any commit after one) | `1.2.3-SNAPSHOT` | yes — snapshot | +| `v1.2.3-5-gabc123` (commits after a release tag) | `1.2.3-5-gabc123` | no — build only | + +Consequences: + +- A full release requires an *exact* `vX.Y.Z` tag on the commit. +- After pushing a `vX.Y.Z-pre.N` tag, every subsequent push to `main` + re-publishes `X.Y.Z-SNAPSHOT` — until the next exact release tag. +- Ordinary pushes to `main` after a release tag act as a dry run: + tests run and the jar is built, but nothing is deployed. +- Pick pre-tag versions to match the *next* intended release, e.g. after + releasing `v0.7.0` the next pre-tag should be `v0.8.0-pre.1`. +- For a full release the POM's `` is set to `vX.Y.Z`. + +## Credentials + +`deploy` authenticates with the `CLOJARS_USERNAME` and `CLOJARS_PASSWORD` +[repository secrets](https://github.com/eval/malli-select/settings/secrets/actions). + +- `CLOJARS_USERNAME`: the Clojars account name. +- `CLOJARS_PASSWORD`: a Clojars [deploy token](https://clojars.org/tokens) — + *not* the account password. Prefer a token scoped to the `dk.thinkcreate` + group. + +To rotate: create a new token on Clojars, then +`gh secret set CLOJARS_PASSWORD --repo eval/malli-select`, and delete the old +token. The cheapest end-to-end check of the credentials is publishing a +snapshot via a `-pre` tag (see TL;DR); the token's "last used" date on the +Clojars tokens page should update. + +## Local release + +The same can be done locally (e.g. when CI is down): + +```sh +CLOJARS_USERNAME=... CLOJARS_PASSWORD= \ + clojure -T:build release :build/git-version $(printf '"%s"' $(git describe --tags)) :deploy/only-jar-version-type :full-and-snapshot +``` + +## Gotchas + +- `git describe --tags` needs the full history: the checkout step uses + `fetch-depth: 0` for this — keep it when touching the workflow. +- Tests run against the `:test` alias; a test failure aborts the release + before anything is built or deployed. From b0fbed5133971d4a9a7dc24650e6e4299d1b41a7 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:43:32 +0200 Subject: [PATCH 05/13] Add extra malli aliases and have test-matrix --- .github/workflows/ci.yml | 22 ++++++++++++++++++++-- deps.edn | 33 ++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 433a5bd..d63e79b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,11 @@ on: [push, pull_request] jobs: Test: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + malli: ["0.14", "0.15", "0.16", "0.17", "0.18", "0.19", "latest", "head"] + continue-on-error: ${{ matrix.malli == 'head' }} steps: - name: Check out repository code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -15,5 +20,18 @@ jobs: uses: DeLaGuardo/setup-clojure@4c7a6f613e5089821bb3bb2a33a3ee115578580d # 13.6.1 with: cli: latest - - name: Run tests - run: clojure -T:build test + - name: Run tests (malli ${{ matrix.malli }}) + run: | + case "${{ matrix.malli }}" in + latest) + clojure -X:test + ;; + head) + sha=$(git ls-remote https://github.com/metosin/malli.git HEAD | cut -f1) + echo "Testing against metosin/malli@$sha" + clojure -Sdeps "{:aliases {:malli-head {:override-deps {metosin/malli {:git/url \"https://github.com/metosin/malli.git\" :git/sha \"$sha\"}}}}}" -X:test:malli-head + ;; + *) + clojure -X:test:malli-${{ matrix.malli }} + ;; + esac diff --git a/deps.edn b/deps.edn index bfb456a..1cac4cd 100644 --- a/deps.edn +++ b/deps.edn @@ -1,28 +1,35 @@ {:paths ["src"] :deps {org.clojure/clojure {:mvn/version "1.11.1" :scope "provided"} - metosin/malli {:mvn/version "0.13.0" :scope "provided"}} + metosin/malli {:mvn/version "0.20.1" :scope "provided"}} :aliases - {:dev {:extra-deps {metosin/malli {:mvn/version "0.8.9"} - criterium/criterium {:mvn/version "0.4.6"} + {:dev {:extra-deps {criterium/criterium {:mvn/version "0.4.6"} com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.0.5"}}} :neil {:project {:name malli-select/malli-select}} - :malli-0.9 - {:override-deps {metosin/malli {:mvn/version "0.9.2"}}} + :malli-0.13 + {:override-deps {metosin/malli {:mvn/version "0.13.0"}}} - :malli-0.10 - {:override-deps {metosin/malli {:mvn/version "0.10.4"}}} + :malli-0.14 + {:override-deps {metosin/malli {:mvn/version "0.14.0"}}} - :malli-0.11 - {:override-deps {metosin/malli {:mvn/version "0.11.0"}}} + :malli-0.15 + {:override-deps {metosin/malli {:mvn/version "0.15.0"}}} - :malli-0.12 - {:override-deps {metosin/malli {:mvn/version "0.12.0"}}} + :malli-0.16 + {:override-deps {metosin/malli {:mvn/version "0.16.4"}}} + + :malli-0.17 + {:override-deps {metosin/malli {:mvn/version "0.17.0"}}} + + :malli-0.18 + {:override-deps {metosin/malli {:mvn/version "0.18.0"}}} + + :malli-0.19 + {:override-deps {metosin/malli {:mvn/version "0.19.2"}}} :test ;; added by neil {:extra-paths ["test"] - :extra-deps {metosin/malli {:mvn/version "0.8.9"} - io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} :exec-fn cognitect.test-runner.api/test} :perf {#_#_:extra-paths ["perf"] :extra-deps {criterium/criterium {:mvn/version "0.4.6"} From 59f3c55c7be8c9f39b78a50d20bab70cdd691350 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:45:59 +0200 Subject: [PATCH 06/13] Revert "Update README.md" This reverts commit 0b17fd00b42339e65aabb7fc117f7e337bdcf6c1. --- README.md | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a46543..78da1d0 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,79 @@ It's based on Rich Hickey's ideas from his talk ["Maybe Not"](https://youtu.be/Y ## Quickstart -[deps-try](https://github.com/eval/deps-try/blob/master/README.md#installation) has a built-in recipe that walks you through malli-select's features on the REPL ([recipe source](https://github.com/eval/deps-try/blob/master/recipes/malli/malli_select.clj)). -Run like so: +Try it out using [deps-try](https://github.com/eval/deps-try/blob/master/README.md#installation): + ``` clojure -$ deps-try --recipe malli/malli-select +$ deps-try io.github.eval/malli-select metosin/malli + +user=> (require '[malli-select.core :as ms]) +user=> (def Person + [:map + [:name string?] + [:age pos-int?] + [:addresses [:vector [:map + [:street string?] [:zip string?]]]]]) + +;; require :name, everything else is optional +user=> (ms/select Person [:name]) +[:map + [:name string?] + [:age {:optional true} pos-int?] + [:addresses + {:optional true} + [:vector + [:map + [:street {:optional true} string?] + [:country {:optional true} string?]]]]] + +;; *if* any address is provided, it should at least have :street +user=> (ms/select Person [{:addresses [:street]}]) +[:map + [:name {:optional true} string?] + [:age {:optional true} pos-int?] + [:addresses + {:optional true} + [:vector + [:map [:street string?] [:country {:optional true} string?]]]]] + +;; example valid data: +;; {}, {:addresses []}, {:addresses [{:street "Main"}]} +;; +;; example invalid data: +;; {:addresses nil}, {:addresses [{}]}, {:addresses [{:street "Foo" :country :se}]} + +;; any address provided should be a full address +user=> (ms/select Person [{:addresses ['*]}]) +;; +;; require all attributes of a person (shallow, i.e. address attributes become optional) +user=> (ms/select Person ['*]) +;; example valid data: +;; {:name "Foo" :age 18 :addresses [{}]} + + +;; remove any optional attribute +user=> (ms/select Person [{:addresses ['*]}] {:prune-optionals true}) +;; or shorter: +user=> (ms/select Person ^:only [{:addresses ['*]}]) +;; example valid data: +;; {:name :not-a-string} +;; +;; Typically you'd use this to generate only specific data: +user=> (require '[malli.generator :as mg]) +user=> (mg/generate (ms/select Person ^:only [:name])) +{:name "sNeLdUI5KtPw"} + +;; selecting something not contained in the schema: +user=> (ms/select Person [:a]) +Execution error (AssertionError) at dk.thinkcreate.malli-select/select (malli_select.clj:175). +Assert failed: Selection contains unknown paths: ([:a]) + +Available: +([:addresses] [:age] [:name] [:addresses :street] [:addresses :zip]) + +(empty? invalid-selection-paths) +;; bypass this check: +user=> (ms/select Person [:a] {:verify-selection false}) ``` See [the tests](./test/malli_select/core_test.clj) for more. From cce118e32e76d48df0ebedf532bc4dbc7a4474cf Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Mon, 27 Jul 2026 12:50:18 +0200 Subject: [PATCH 07/13] Update copyright year --- LICENSE | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 4dbe32a..e70fc9e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Gert Goet, ThinkCreate +Copyright (c) 2026 Gert Goet, ThinkCreate Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 78da1d0..a294862 100644 --- a/README.md +++ b/README.md @@ -88,5 +88,5 @@ See [the tests](./test/malli_select/core_test.clj) for more. ## LICENSE -Copyright (c) 2023 Gert Goet, ThinkCreate. +Copyright (c) 2026 Gert Goet, ThinkCreate. Distributed under the MIT license. See [LICENSE](LICENSE). From 5019011b07bdd3030f605a7ecdccf72338864e56 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 20:05:20 +0200 Subject: [PATCH 08/13] Pass shellcheck SC2046 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 39323f6..49be626 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,4 +26,4 @@ jobs: env: CLOJARS_USERNAME: ${{ secrets.CLOJARS_USERNAME }} CLOJARS_PASSWORD: ${{ secrets.CLOJARS_PASSWORD }} - run: clojure -T:build release :build/git-version $(printf '"%s"' $(git describe --tags)) :deploy/only-jar-version-type :full-and-snapshot + run: clojure -T:build release :build/git-version "$(printf '"%s"' "$(git describe --tags)")" :deploy/only-jar-version-type :full-and-snapshot From 4a4f08d48a1bc1370214fc98289e0963973ec663 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 20:24:37 +0200 Subject: [PATCH 09/13] Update deps --- deps.edn | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/deps.edn b/deps.edn index 1cac4cd..35b85eb 100644 --- a/deps.edn +++ b/deps.edn @@ -1,9 +1,9 @@ {:paths ["src"] - :deps {org.clojure/clojure {:mvn/version "1.11.1" :scope "provided"} + :deps {org.clojure/clojure {:mvn/version "1.12.0" :scope "provided"} metosin/malli {:mvn/version "0.20.1" :scope "provided"}} :aliases {:dev {:extra-deps {criterium/criterium {:mvn/version "0.4.6"} - com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.0.5"}}} + com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.8.0"}}} :neil {:project {:name malli-select/malli-select}} :malli-0.13 @@ -33,13 +33,13 @@ :exec-fn cognitect.test-runner.api/test} :perf {#_#_:extra-paths ["perf"] :extra-deps {criterium/criterium {:mvn/version "0.4.6"} - org.clojure/clojure {:mvn/version "1.11.1"} - com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.0.5"}} + org.clojure/clojure {:mvn/version "1.12.0"} + com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.8.0"}} :jvm-opts ["-server" "-Xmx4096m" "-Dclojure.compiler.direct-linking=true" "-Djdk.attach.allowAttachSelf"]} :build {:deps {io.github.clojure/tools.build - {:mvn/version "0.9.6"} - slipset/deps-deploy {:mvn/version "0.2.1"}} + {:mvn/version "0.10.14"} + slipset/deps-deploy {:mvn/version "0.2.5"}} :ns-default build}}} From 472a8749970f875c04fc2f2c6ca945687f0ea7b3 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 20:28:18 +0200 Subject: [PATCH 10/13] Assert the monkey patch for provided deps worked --- build.clj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/build.clj b/build.clj index 1291702..9587f67 100644 --- a/build.clj +++ b/build.clj @@ -156,9 +156,13 @@ v (not s)))] (if deploy? - (dd/deploy {:installer :remote - :artifact (b/resolve-path jar-file) - :pom-file pom-file}) + (do + ;; guards against the write-pom patch (top of this file) silently losing effect + (when-not (re-find #"provided" (slurp pom-file)) + (throw (ex-info "No provided-scoped dependency in pom.xml" {:pom-file pom-file}))) + (dd/deploy {:installer :remote + :artifact (b/resolve-path jar-file) + :pom-file pom-file})) (println (str \newline "Skipping deploy of version " version " given only-jar-release-type " only-jar-version-type))) opts)) From 6654260b76bb4dd2f4198ee5a84cd05212d4aaf4 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 21:03:31 +0200 Subject: [PATCH 11/13] Update README for clarity and examples --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a294862..f852d67 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,15 @@ It's based on Rich Hickey's ideas from his talk ["Maybe Not"](https://youtu.be/Y ## Quickstart -Try it out using [deps-try](https://github.com/eval/deps-try/blob/master/README.md#installation): +Follow along using [deps-try](https://github.com/eval/deps-try/blob/master/README.md#installation): ``` clojure $ deps-try io.github.eval/malli-select metosin/malli +# no install/docker +$ docker run -it --rm -v deps-try:/home/deps-try-user ghcr.io/eval/deps-try io.github.eval/malli-select metosin/malli -user=> (require '[malli-select.core :as ms]) +user=> (require '[malli-select.core :as ms] + '[malli.core :as m :refer [form] :rename {form p}]) user=> (def Person [:map [:name string?] @@ -22,7 +25,7 @@ user=> (def Person [:street string?] [:zip string?]]]]]) ;; require :name, everything else is optional -user=> (ms/select Person [:name]) +user=> (p (ms/select Person [:name])) [:map [:name string?] [:age {:optional true} pos-int?] @@ -34,7 +37,7 @@ user=> (ms/select Person [:name]) [:country {:optional true} string?]]]]] ;; *if* any address is provided, it should at least have :street -user=> (ms/select Person [{:addresses [:street]}]) +user=> (p (ms/select Person [{:addresses [:street]}])) [:map [:name {:optional true} string?] [:age {:optional true} pos-int?] @@ -50,18 +53,18 @@ user=> (ms/select Person [{:addresses [:street]}]) ;; {:addresses nil}, {:addresses [{}]}, {:addresses [{:street "Foo" :country :se}]} ;; any address provided should be a full address -user=> (ms/select Person [{:addresses ['*]}]) +user=> (p (ms/select Person [{:addresses ['*]}])) ;; ;; require all attributes of a person (shallow, i.e. address attributes become optional) -user=> (ms/select Person ['*]) +user=> (p (ms/select Person ['*])) ;; example valid data: ;; {:name "Foo" :age 18 :addresses [{}]} ;; remove any optional attribute -user=> (ms/select Person [{:addresses ['*]}] {:prune-optionals true}) +user=> (p (ms/select Person [{:addresses ['*]}] {:prune-optionals true})) ;; or shorter: -user=> (ms/select Person ^:only [{:addresses ['*]}]) +user=> (p (ms/select Person ^:only [{:addresses ['*]}])) ;; example valid data: ;; {:name :not-a-string} ;; From bdaa9ce0b6a19467330f8dfae744150c4b05732e Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 21:06:40 +0200 Subject: [PATCH 12/13] Have CI badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f852d67..8a6eec5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # malli-select -[![Clojars Project](https://img.shields.io/clojars/v/dk.thinkcreate/malli-select.svg?include_prereleases)](https://clojars.org/dk.thinkcreate/malli-select) [![cljdoc badge](https://cljdoc.org/badge/dk.thinkcreate/malli-select)](https://cljdoc.org/d/dk.thinkcreate/malli-select) +[![Clojars Project](https://img.shields.io/clojars/v/dk.thinkcreate/malli-select.svg?include_prereleases)](https://clojars.org/dk.thinkcreate/malli-select) [![cljdoc badge](https://cljdoc.org/badge/dk.thinkcreate/malli-select)](https://cljdoc.org/d/dk.thinkcreate/malli-select) [![Tests](https://github.com/eval/malli-select/actions/workflows/ci.yml/badge.svg)](https://github.com/eval/malli-select/actions/workflows/ci.yml) Create subschemas of [malli](https://github.com/metosin/malli)-schemas using a spec2-inspired select notation. From 9384506f51993a1e64a4a0628b4fd7aff1b61a42 Mon Sep 17 00:00:00 2001 From: Gert Goet Date: Sun, 2 Aug 2026 21:11:17 +0200 Subject: [PATCH 13/13] Prevent running CI twice for PRs --- .github/workflows/ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d63e79b..9fe8ad2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,11 @@ --- name: Run tests -on: [push, pull_request] +on: + push: + branches: + - main + pull_request: jobs: Test: