From 7fa01b2d0868d398f746a7153c4c0ab10e502fed Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 10:20:31 +0100 Subject: [PATCH 01/35] Added examples/poly-rcf. --- .../next.jdbc/config.edn | 5 ++ .../github/seancorfield/next_jdbc.clj_kondo | 18 ++++ examples/poly-rcf/.gitignore | 41 +++++++++ examples/poly-rcf/.vscode/settings.json | 12 +++ examples/poly-rcf/bases/mybase/deps.edn | 4 + .../bases/mybase/src/poly_rcf/mybase/core.clj | 1 + .../mybase/test/poly_rcf/mybase/core_test.clj | 5 ++ examples/poly-rcf/bases/rcf/deps.edn | 6 ++ .../bases/rcf/src/poly_rcf/rcf/config.clj | 8 ++ .../bases/rcf/src/poly_rcf/rcf/src_ns.clj | 8 ++ .../rcf/test/poly_rcf/rcf/sample2_test.clj | 11 +++ .../rcf/test/poly_rcf/rcf/sample_test.clj | 8 ++ .../bases/rcf/test/poly_rcf/rcf/test_ns.clj | 8 ++ examples/poly-rcf/components/sqldb/deps.edn | 9 ++ .../sqldb/src/poly_rcf/sqldb/core.clj | 57 +++++++++++++ .../sqldb/src/poly_rcf/sqldb/interface.clj | 8 ++ .../test/poly_rcf/sqldb/interface_test.clj | 35 ++++++++ examples/poly-rcf/deps.edn | 20 +++++ examples/poly-rcf/development/src/.keep | 1 + examples/poly-rcf/logo.png | Bin 0 -> 37382 bytes examples/poly-rcf/projects/poly261/deps.edn | 8 ++ examples/poly-rcf/projects/rcf/deps.edn | 5 ++ examples/poly-rcf/readme.md | 78 ++++++++++++++++++ examples/poly-rcf/workspace.edn | 13 +++ 24 files changed, 369 insertions(+) create mode 100644 examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/config.edn create mode 100644 examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/hooks/com/github/seancorfield/next_jdbc.clj_kondo create mode 100644 examples/poly-rcf/.gitignore create mode 100644 examples/poly-rcf/.vscode/settings.json create mode 100644 examples/poly-rcf/bases/mybase/deps.edn create mode 100644 examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj create mode 100644 examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj create mode 100644 examples/poly-rcf/bases/rcf/deps.edn create mode 100644 examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/config.clj create mode 100644 examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/src_ns.clj create mode 100644 examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample2_test.clj create mode 100644 examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample_test.clj create mode 100644 examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/test_ns.clj create mode 100644 examples/poly-rcf/components/sqldb/deps.edn create mode 100644 examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/core.clj create mode 100644 examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/interface.clj create mode 100644 examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj create mode 100644 examples/poly-rcf/deps.edn create mode 100644 examples/poly-rcf/development/src/.keep create mode 100644 examples/poly-rcf/logo.png create mode 100644 examples/poly-rcf/projects/poly261/deps.edn create mode 100644 examples/poly-rcf/projects/rcf/deps.edn create mode 100644 examples/poly-rcf/readme.md create mode 100644 examples/poly-rcf/workspace.edn diff --git a/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/config.edn b/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/config.edn new file mode 100644 index 000000000..57911b617 --- /dev/null +++ b/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/config.edn @@ -0,0 +1,5 @@ +{:hooks + {:analyze-call + {next.jdbc/with-transaction + hooks.com.github.seancorfield.next-jdbc/with-transaction}} + :lint-as {next.jdbc/on-connection clojure.core/with-open}} \ No newline at end of file diff --git a/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/hooks/com/github/seancorfield/next_jdbc.clj_kondo b/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/hooks/com/github/seancorfield/next_jdbc.clj_kondo new file mode 100644 index 000000000..daedc45b2 --- /dev/null +++ b/examples/poly-rcf/.clj-kondo/com.github.seancorfield/next.jdbc/hooks/com/github/seancorfield/next_jdbc.clj_kondo @@ -0,0 +1,18 @@ +(ns hooks.com.github.seancorfield.next-jdbc + (:require [clj-kondo.hooks-api :as api])) + +(defn with-transaction + "Expands (with-transaction [tx expr opts] body) + to (let [tx expr] opts body) per clj-kondo examples." + [{:keys [:node]}] + (let [[binding-vec & body] (rest (:children node)) + [sym val opts] (:children binding-vec)] + (when-not (and sym val) + (throw (ex-info "No sym and val provided" {}))) + (let [new-node (api/list-node + (list* + (api/token-node 'let) + (api/vector-node [sym val]) + opts + body))] + {:node new-node}))) diff --git a/examples/poly-rcf/.gitignore b/examples/poly-rcf/.gitignore new file mode 100644 index 000000000..90ce098be --- /dev/null +++ b/examples/poly-rcf/.gitignore @@ -0,0 +1,41 @@ +**/classes +**/target +**/.artifacts +**/.cpcache +**/.DS_Store +**/.gradle + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/shelf +.idea/**/statistic.xml +.idea/dictionaries/** +.idea/libraries/** + +# File-based project format +*.iws +*.ipr + +# Cursive Clojure plugin +.idea/replstate.xml +*.iml + +/example/example/** +artifacts +projects/**/pom.xml + +# nrepl +.nrepl-port + +# clojure-lsp +.lsp/.cache + +# clj-kondo +.clj-kondo/.cache + +# Calva VS Code Extension +.calva/output-window/output.calva-repl + +.portal diff --git a/examples/poly-rcf/.vscode/settings.json b/examples/poly-rcf/.vscode/settings.json new file mode 100644 index 000000000..6a8ee7562 --- /dev/null +++ b/examples/poly-rcf/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "calva.replConnectSequences": [ + { + "projectType": "deps.edn", + "name": "poly-rcf", + "cljsType": "none", + "menuSelections": { + "cljAliases": ["dev", "test", "+default"] + } + } + ] +} diff --git a/examples/poly-rcf/bases/mybase/deps.edn b/examples/poly-rcf/bases/mybase/deps.edn new file mode 100644 index 000000000..86e1d9049 --- /dev/null +++ b/examples/poly-rcf/bases/mybase/deps.edn @@ -0,0 +1,4 @@ +{:paths ["src" "resources"] + :deps {};;poly/sqldb {:local/root "../../components/sqldb"}} + :aliases {:test {:extra-paths ["test"] + :extra-deps {}}}} diff --git a/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj b/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj new file mode 100644 index 000000000..b96a03f0d --- /dev/null +++ b/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj @@ -0,0 +1 @@ +(ns poly-rcf.mybase.core) diff --git a/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj b/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj new file mode 100644 index 000000000..399e786d5 --- /dev/null +++ b/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj @@ -0,0 +1,5 @@ +(ns poly-rcf.mybase.core-test + (:require [clojure.test :as test :refer :all])) + +(deftest dummy-test + (is (= 1 1))) diff --git a/examples/poly-rcf/bases/rcf/deps.edn b/examples/poly-rcf/bases/rcf/deps.edn new file mode 100644 index 000000000..ec57c79f6 --- /dev/null +++ b/examples/poly-rcf/bases/rcf/deps.edn @@ -0,0 +1,6 @@ +{:paths ["src"] + :deps {com.hyperfiddle/rcf {:mvn/version "20220405"}} + :aliases {:test {:extra-paths ["test" + ;; Adding src here makes poly tool discover RCF tests under src/ + "src"] + :extra-deps {org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"}}}}} diff --git a/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/config.clj b/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/config.clj new file mode 100644 index 000000000..e48d0cff1 --- /dev/null +++ b/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/config.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.config) +;; A master configuration file. +;; Can be overriden with configuration files down in the classpath, +;; environment variables, and system properties + +{:dre {} + :sentry {:dsn "" + :environment ""}} diff --git a/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/src_ns.clj b/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/src_ns.clj new file mode 100644 index 000000000..2f8ee4ae5 --- /dev/null +++ b/examples/poly-rcf/bases/rcf/src/poly_rcf/rcf/src_ns.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.src-ns + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (+ 1 1) := 2 + + ) \ No newline at end of file diff --git a/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample2_test.clj b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample2_test.clj new file mode 100644 index 000000000..88fa51e68 --- /dev/null +++ b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample2_test.clj @@ -0,0 +1,11 @@ +(ns poly-rcf.rcf.sample2-test + (:require [clojure.test :as t :refer [deftest is testing]])) + +(deftest math-works + (testing "basic addition and subtraction" + (is (= 42 (+ 40 2))) + (is (= 42 (- 44 2))))) + +(deftest ^:integration test-i + (is (= 1 1))) + diff --git a/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample_test.clj b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample_test.clj new file mode 100644 index 000000000..58bbc9545 --- /dev/null +++ b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/sample_test.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.sample-test + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (= 1 1) := true + + ) \ No newline at end of file diff --git a/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/test_ns.clj b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/test_ns.clj new file mode 100644 index 000000000..38228943a --- /dev/null +++ b/examples/poly-rcf/bases/rcf/test/poly_rcf/rcf/test_ns.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.test-ns + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (+ 1 1) := 2 + + ) \ No newline at end of file diff --git a/examples/poly-rcf/components/sqldb/deps.edn b/examples/poly-rcf/components/sqldb/deps.edn new file mode 100644 index 000000000..42397a164 --- /dev/null +++ b/examples/poly-rcf/components/sqldb/deps.edn @@ -0,0 +1,9 @@ +{:paths ["src"] + :deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} + com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} + com.zaxxer/HikariCP {:mvn/version "5.0.1" + :exclusions [org.slf4j/slf4j-api]} + org.clojure/tools.logging {:mvn/version "1.2.4"}} + :aliases {:test {:extra-paths ["test" "src"] ;; Adding src makes poly tool discover RCF tests under src/ + :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} + com.stuartsierra/component {:mvn/version "1.1.0"}}}}} diff --git a/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/core.clj b/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/core.clj new file mode 100644 index 000000000..f411615ae --- /dev/null +++ b/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/core.clj @@ -0,0 +1,57 @@ +;; Copyright (C) 2022, Doctor Evidence. All rights reserved. + +(ns poly-rcf.sqldb.core + "SQL DB client impl." + {:authors ["Jozef Wagner"]} + (:require [clojure.tools.logging :refer [info]] + [next.jdbc.connection :as connection]) + (:import [com.zaxxer.hikari HikariDataSource])) + +(defn get-connection + [sqlconn] + (or (:hikari-datasource sqlconn) sqlconn)) + +;;; SQLDB + +;;; System Component + +(defn start-component + [new-sqldb] + (info "Create component with db" new-sqldb) + (let [db-spec (:db-spec new-sqldb) + hikari-datasource (connection/->pool HikariDataSource db-spec)] + (assoc new-sqldb + :hikari-datasource hikari-datasource))) + +(defn stop-component + [sqldb] + (when-let [^HikariDataSource ds (:hikari-datasource sqldb)] + (when-not (.isClosed ds) + (.close ds))) + (dissoc sqldb :hikari-datasource)) + +(defn suspend-component + [sqldb] + (info "Suspending SQLDB component") + sqldb) + +(defn resume-component + [_new-sqldb suspended-sqldb] + ;; TODO: Proper reconnect when cfg changes + (info "Resuming SQLDB component") + suspended-sqldb) + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (let [db-config (get-in cfg [:dre tag])] + (-> db-config + (with-meta {'com.stuartsierra.component/start start-component + 'com.stuartsierra.component/stop stop-component + 'suspendable.core/suspend suspend-component + 'suspendable.core/resume resume-component})))) + +(comment + + (set! *warn-on-reflection* true)) + diff --git a/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/interface.clj b/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/interface.clj new file mode 100644 index 000000000..c38e93f46 --- /dev/null +++ b/examples/poly-rcf/components/sqldb/src/poly_rcf/sqldb/interface.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.sqldb.interface + (:require [poly-rcf.sqldb.core :as core])) + + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (core/new-component cfg tag)) \ No newline at end of file diff --git a/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj new file mode 100644 index 000000000..db897cfbd --- /dev/null +++ b/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj @@ -0,0 +1,35 @@ +(ns poly-rcf.sqldb.interface-test + (:require [clojure.set :as set] + [clojure.test :as test :refer :all] + [clojure.tools.logging :as log] + [com.stuartsierra.component :as component] + [next.jdbc :as jdbc] + [next.jdbc.result-set :as rs] + [poly-rcf.sqldb.interface :as sqldb])) + +;; This fails because of https://github.com/polyfy/polylith/issues/261 +(deftest new-component-test + "Test component works by starting a system and running a query." + (let [config {:dre {:test {:db-spec {:maximum-pool-size 10 + :connection-timeout 30000 + :idle-timeout 600000 + :validation-timeout 5000 + :max-lifetime 1800000 + :jdbcUrl "jdbc:h2:mem:semmed"}}}} + sys (component/system-map + :sqldb (sqldb/new-component config :test)) + s (component/start-system sys) + sqldb (:sqldb s) + data-source (:hikari-datasource sqldb) + _ (log/info "datasource" sqldb) + ;; read table metadata + d (with-open [con (jdbc/get-connection data-source)] + (-> (.getMetaData con) ; produces java.sql.DatabaseMetaData + (.getTables nil nil nil (into-array ["TABLE" "VIEW"])) + (rs/datafiable-result-set con))) + some-tables #{"CONSTANTS" "ENUM_VALUES" "INDEXES" + "INDEX_COLUMNS" "INFORMATION_SCHEMA_CATALOG_NAME"} + all-tables (into #{} (map :TABLE_NAME d))] + ;; test that some tables are present in metadata + (is (true? (set/subset? some-tables all-tables))) + (component/stop-system s))) diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn new file mode 100644 index 000000000..d4d119150 --- /dev/null +++ b/examples/poly-rcf/deps.edn @@ -0,0 +1,20 @@ +{:aliases {:dev {:extra-paths ["development/src"] + :extra-deps {;; bases + poly/rcf {:local/root "bases/rcf"} + poly/issue-261 {:local/root "bases/mybase"} + ;; components + poly/sqldb {:local/root "components/sqldb"} + + org.clojure/clojure {:mvn/version "1.11.1"}}} + + :test {:extra-paths ["bases/rcf/test" + "bases/mybase/test"]} + + :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + :jvm-opts [;; Run RCF tests when loading files in REPL + ;; https://github.com/hyperfiddle/rcf#ci + "-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polyfy/polylith + {:git/url "https://github.com/polyfy/polylith" + :sha "1209a81e6b8f70987050d65d106e99d1a902969a" + :deps/root "projects/poly"}}}}} diff --git a/examples/poly-rcf/development/src/.keep b/examples/poly-rcf/development/src/.keep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/poly-rcf/development/src/.keep @@ -0,0 +1 @@ + diff --git a/examples/poly-rcf/logo.png b/examples/poly-rcf/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bca2f999b5ed6ab63ed83623570dabbf4f9b50 GIT binary patch literal 37382 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 DBo@l4 literal 0 HcmV?d00001 diff --git a/examples/poly-rcf/projects/poly261/deps.edn b/examples/poly-rcf/projects/poly261/deps.edn new file mode 100644 index 000000000..694a1dcc9 --- /dev/null +++ b/examples/poly-rcf/projects/poly261/deps.edn @@ -0,0 +1,8 @@ +{:deps {org.clojure/clojure {:mvn/version "1.11.1"} + org.clojure/tools.deps.alpha {:mvn/version "0.12.985"} + + poly/mybase {:local/root "../../bases/mybase"} + poly/sqldb {:local/root "../../components/sqldb"}} + + :aliases {:test {:extra-paths [] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} diff --git a/examples/poly-rcf/projects/rcf/deps.edn b/examples/poly-rcf/projects/rcf/deps.edn new file mode 100644 index 000000000..6c95ce159 --- /dev/null +++ b/examples/poly-rcf/projects/rcf/deps.edn @@ -0,0 +1,5 @@ +{:paths [] + :deps {poly/rcf {:local/root "../../bases/rcf"} + poly/sqldb {:local/root "../../components/sqldb"}} + :aliases {:test {:extra-paths [] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md new file mode 100644 index 000000000..226b68614 --- /dev/null +++ b/examples/poly-rcf/readme.md @@ -0,0 +1,78 @@ + + +Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). + +This repo has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): +* Renamed the `issue-261` base to `mybase`. +* Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. +* Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). +* Cleanup: removed unused `resources` and references to project `test` directories. +* Added `:all` to the `test` command, to make sure all tests are executed. + +To make RCF tests work with polylith you need to pass `"-Dhyperfiddle.rcf.generate-tests=true"` via **:jvm-opts** of **:poly** alias in `./deps.edn` . + +``` +:poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + ;; Run RCF tests when loading files in REPL + ;; https://github.com/hyperfiddle/rcf#ci + :jvm-opts ["-Dhyperfiddle.rcf.generate-tests=true"] +``` + +This will work, except for RCF tests under `src/` . +Polylith does not pass source paths to tests so to make tests under `src/` work, +you will have to add them to your **:extra-paths** in **:test** alias. +Hopefully this issue is going to be fixed and RCF will work out of the box, just by providing the JVM option. + +Add src to you test paths in each base / component (brick). +``` +:test { + ;; Adding src here makes poly tool discover RCF tests under src/ + :extra-paths [ "test" "src"]} + +``` + + +Clone this repo, change directory to it and then run `clojure -Srepro -M:poly test :all` + +If all is well, you should see output that contains: `Testing poly-rcf.rcf.src-ns`. This means your test under `src/` was run as well. + + +```shell +clojure -Srepro -M:poly test :all +Projects to run tests from: rcf + +Running tests for the rcf project using test runner: Polylith built-in clojure.test runner... +Running tests from the rcf project, including 1 brick: rcf + +Testing poly-rcf.rcf.test-ns +✅. +Ran 1 tests containing 1 assertions. +0 failures, 0 errors. + +Test results: 1 passes, 0 failures, 0 errors. + +Testing poly-rcf.rcf.sample2-test +.. +Ran 2 tests containing 3 assertions. +0 failures, 0 errors. + +Test results: 3 passes, 0 failures, 0 errors. + +Testing poly-rcf.rcf.sample-test +✅. +Ran 1 tests containing 1 assertions. +0 failures, 0 errors. + +Test results: 1 passes, 0 failures, 0 errors. + +Testing poly-rcf.rcf.src-ns +✅. +Ran 1 tests containing 1 assertions. +0 failures, 0 errors. + +Test results: 1 passes, 0 failures, 0 errors. + +Execution time: 2 seconds +``` + +NOTE: To see more details, use `clojure -Srepro -M:poly test :verbose` \ No newline at end of file diff --git a/examples/poly-rcf/workspace.edn b/examples/poly-rcf/workspace.edn new file mode 100644 index 000000000..9f0c098e4 --- /dev/null +++ b/examples/poly-rcf/workspace.edn @@ -0,0 +1,13 @@ +{:top-namespace "poly-rcf" + :interface-ns "interface" + :default-profile-name "default" + :compact-views #{} + :vcs {:name "git" + :auto-add false} + :tag-patterns {:stable "stable-*" + :release "v[0-9]*"} + :projects {"development" {:alias "dev"} + "rcf" {:alias "rcf" + :necessary ["sqldb"]} + "poly261" {:alias "poly261" + :necessary ["sqldb"]}}} From e6a44e9a025a1b6d8881960e3698993b8119daea Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 12:52:41 +0100 Subject: [PATCH 02/35] Fixed some problems + added the monolith project. --- examples/poly-rcf/deps.edn | 5 +- examples/poly-rcf/monolith/deps.edn | 23 ++++++++ .../monolith/src/poly_rcf/mybase/core.clj | 1 + .../monolith/src/poly_rcf/sqldb/core.clj | 57 +++++++++++++++++++ .../monolith/src/poly_rcf/sqldb/interface.clj | 8 +++ .../test/poly_rcf/sqldb/interface_test.clj | 35 ++++++++++++ examples/poly-rcf/readme.md | 7 ++- 7 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 examples/poly-rcf/monolith/deps.edn create mode 100644 examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj create mode 100644 examples/poly-rcf/monolith/src/poly_rcf/sqldb/core.clj create mode 100644 examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj create mode 100644 examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn index d4d119150..4d3099795 100644 --- a/examples/poly-rcf/deps.edn +++ b/examples/poly-rcf/deps.edn @@ -14,7 +14,4 @@ :jvm-opts [;; Run RCF tests when loading files in REPL ;; https://github.com/hyperfiddle/rcf#ci "-Dhyperfiddle.rcf.generate-tests=true"] - :extra-deps {polyfy/polylith - {:git/url "https://github.com/polyfy/polylith" - :sha "1209a81e6b8f70987050d65d106e99d1a902969a" - :deps/root "projects/poly"}}}}} + :extra-deps {polylith/clj-poly {:mvn/version "0.2.19"}}}}} diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn new file mode 100644 index 000000000..b2db1eec2 --- /dev/null +++ b/examples/poly-rcf/monolith/deps.edn @@ -0,0 +1,23 @@ +{:paths ["src"] + :deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} + com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} + com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} + org.clojure/tools.logging {:mvn/version "1.2.4"} + org.clojure/clojure {:mvn/version "1.11.1"}} + + :aliases {;; https://clojure.org/guides/deps_and_cli#test_runner + ;; Run tests with: clj -X:test + :test {:extra-paths ["test" "src"] + :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} + com.stuartsierra/component {:mvn/version "1.1.0"} + org.clojure/test.check {:mvn/version "1.1.1"} + org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"} + io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test} + + :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + :jvm-opts [;; Run RCF tests when loading files in REPL + ;; https://github.com/hyperfiddle/rcf#ci + "-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polylith/clj-poly {:mvn/version "0.2.19"}}}}} diff --git a/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj b/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj new file mode 100644 index 000000000..b96a03f0d --- /dev/null +++ b/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj @@ -0,0 +1 @@ +(ns poly-rcf.mybase.core) diff --git a/examples/poly-rcf/monolith/src/poly_rcf/sqldb/core.clj b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/core.clj new file mode 100644 index 000000000..f411615ae --- /dev/null +++ b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/core.clj @@ -0,0 +1,57 @@ +;; Copyright (C) 2022, Doctor Evidence. All rights reserved. + +(ns poly-rcf.sqldb.core + "SQL DB client impl." + {:authors ["Jozef Wagner"]} + (:require [clojure.tools.logging :refer [info]] + [next.jdbc.connection :as connection]) + (:import [com.zaxxer.hikari HikariDataSource])) + +(defn get-connection + [sqlconn] + (or (:hikari-datasource sqlconn) sqlconn)) + +;;; SQLDB + +;;; System Component + +(defn start-component + [new-sqldb] + (info "Create component with db" new-sqldb) + (let [db-spec (:db-spec new-sqldb) + hikari-datasource (connection/->pool HikariDataSource db-spec)] + (assoc new-sqldb + :hikari-datasource hikari-datasource))) + +(defn stop-component + [sqldb] + (when-let [^HikariDataSource ds (:hikari-datasource sqldb)] + (when-not (.isClosed ds) + (.close ds))) + (dissoc sqldb :hikari-datasource)) + +(defn suspend-component + [sqldb] + (info "Suspending SQLDB component") + sqldb) + +(defn resume-component + [_new-sqldb suspended-sqldb] + ;; TODO: Proper reconnect when cfg changes + (info "Resuming SQLDB component") + suspended-sqldb) + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (let [db-config (get-in cfg [:dre tag])] + (-> db-config + (with-meta {'com.stuartsierra.component/start start-component + 'com.stuartsierra.component/stop stop-component + 'suspendable.core/suspend suspend-component + 'suspendable.core/resume resume-component})))) + +(comment + + (set! *warn-on-reflection* true)) + diff --git a/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj new file mode 100644 index 000000000..c38e93f46 --- /dev/null +++ b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.sqldb.interface + (:require [poly-rcf.sqldb.core :as core])) + + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (core/new-component cfg tag)) \ No newline at end of file diff --git a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj new file mode 100644 index 000000000..db897cfbd --- /dev/null +++ b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj @@ -0,0 +1,35 @@ +(ns poly-rcf.sqldb.interface-test + (:require [clojure.set :as set] + [clojure.test :as test :refer :all] + [clojure.tools.logging :as log] + [com.stuartsierra.component :as component] + [next.jdbc :as jdbc] + [next.jdbc.result-set :as rs] + [poly-rcf.sqldb.interface :as sqldb])) + +;; This fails because of https://github.com/polyfy/polylith/issues/261 +(deftest new-component-test + "Test component works by starting a system and running a query." + (let [config {:dre {:test {:db-spec {:maximum-pool-size 10 + :connection-timeout 30000 + :idle-timeout 600000 + :validation-timeout 5000 + :max-lifetime 1800000 + :jdbcUrl "jdbc:h2:mem:semmed"}}}} + sys (component/system-map + :sqldb (sqldb/new-component config :test)) + s (component/start-system sys) + sqldb (:sqldb s) + data-source (:hikari-datasource sqldb) + _ (log/info "datasource" sqldb) + ;; read table metadata + d (with-open [con (jdbc/get-connection data-source)] + (-> (.getMetaData con) ; produces java.sql.DatabaseMetaData + (.getTables nil nil nil (into-array ["TABLE" "VIEW"])) + (rs/datafiable-result-set con))) + some-tables #{"CONSTANTS" "ENUM_VALUES" "INDEXES" + "INDEX_COLUMNS" "INFORMATION_SCHEMA_CATALOG_NAME"} + all-tables (into #{} (map :TABLE_NAME d))] + ;; test that some tables are present in metadata + (is (true? (set/subset? some-tables all-tables))) + (component/stop-system s))) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 226b68614..e3252bd6b 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -4,10 +4,13 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) test This repo has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `mybase`. +* Don't include `sqldb` as a dependency from `mybase` in its `deps.edn`. * Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. * Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). -* Cleanup: removed unused `resources` and references to project `test` directories. +* Use 0.2.19 of the poly tool, in the :poly alias in ./deps.edn. +* Removed unused `resources` and references to project `test` directories. * Added `:all` to the `test` command, to make sure all tests are executed. +* Added the `monolith` directory at the root. To make RCF tests work with polylith you need to pass `"-Dhyperfiddle.rcf.generate-tests=true"` via **:jvm-opts** of **:poly** alias in `./deps.edn` . @@ -75,4 +78,4 @@ Test results: 1 passes, 0 failures, 0 errors. Execution time: 2 seconds ``` -NOTE: To see more details, use `clojure -Srepro -M:poly test :verbose` \ No newline at end of file +NOTE: To see more details, use `clojure -Srepro -M:poly test :all :verbose` \ No newline at end of file From bdd6e3057a01cdbf9687debfdd5f63419229c107 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 12:55:55 +0100 Subject: [PATCH 03/35] Removed unused namespace. --- .../poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj index db897cfbd..3d4a76266 100644 --- a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj +++ b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj @@ -1,6 +1,5 @@ (ns poly-rcf.sqldb.interface-test (:require [clojure.set :as set] - [clojure.test :as test :refer :all] [clojure.tools.logging :as log] [com.stuartsierra.component :as component] [next.jdbc :as jdbc] From 039432f22a8b66fdc1cdf49360542a9ca4053ba9 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 12:56:08 +0100 Subject: [PATCH 04/35] Removed empty line. --- examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj index c38e93f46..607c57c81 100644 --- a/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj +++ b/examples/poly-rcf/monolith/src/poly_rcf/sqldb/interface.clj @@ -1,7 +1,6 @@ (ns poly-rcf.sqldb.interface (:require [poly-rcf.sqldb.core :as core])) - (defn new-component "Returns new sqldb system component." [cfg tag] From fb0d3f23a620e53b4c7c0ee6682e67a6471024f1 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 12:56:21 +0100 Subject: [PATCH 05/35] Fixed formatting. --- examples/poly-rcf/monolith/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn index b2db1eec2..9a2a9a768 100644 --- a/examples/poly-rcf/monolith/deps.edn +++ b/examples/poly-rcf/monolith/deps.edn @@ -18,6 +18,6 @@ :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] :jvm-opts [;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci + ;; https://github.com/hyperfiddle/rcf#ci "-Dhyperfiddle.rcf.generate-tests=true"] :extra-deps {polylith/clj-poly {:mvn/version "0.2.19"}}}}} From 35149b6d306221195bd1e84081e2a1ea7269df92 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 16:57:30 +0100 Subject: [PATCH 06/35] Renamed from mybase to emptybase. --- examples/poly-rcf/bases/mybase/deps.edn | 4 ---- .../poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj | 1 - .../bases/mybase/test/poly_rcf/mybase/core_test.clj | 5 ----- .../sqldb/test/poly_rcf/sqldb/interface_test.clj | 2 +- examples/poly-rcf/deps.edn | 8 ++++---- examples/poly-rcf/monolith/src/poly_rcf/empty/core.clj | 1 + examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj | 1 - .../monolith/test/poly_rcf/sqldb/interface_test.clj | 1 + examples/poly-rcf/readme.md | 4 ++-- 9 files changed, 9 insertions(+), 18 deletions(-) delete mode 100644 examples/poly-rcf/bases/mybase/deps.edn delete mode 100644 examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj delete mode 100644 examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj create mode 100644 examples/poly-rcf/monolith/src/poly_rcf/empty/core.clj delete mode 100644 examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj diff --git a/examples/poly-rcf/bases/mybase/deps.edn b/examples/poly-rcf/bases/mybase/deps.edn deleted file mode 100644 index 86e1d9049..000000000 --- a/examples/poly-rcf/bases/mybase/deps.edn +++ /dev/null @@ -1,4 +0,0 @@ -{:paths ["src" "resources"] - :deps {};;poly/sqldb {:local/root "../../components/sqldb"}} - :aliases {:test {:extra-paths ["test"] - :extra-deps {}}}} diff --git a/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj b/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj deleted file mode 100644 index b96a03f0d..000000000 --- a/examples/poly-rcf/bases/mybase/src/poly_rcf/mybase/core.clj +++ /dev/null @@ -1 +0,0 @@ -(ns poly-rcf.mybase.core) diff --git a/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj b/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj deleted file mode 100644 index 399e786d5..000000000 --- a/examples/poly-rcf/bases/mybase/test/poly_rcf/mybase/core_test.clj +++ /dev/null @@ -1,5 +0,0 @@ -(ns poly-rcf.mybase.core-test - (:require [clojure.test :as test :refer :all])) - -(deftest dummy-test - (is (= 1 1))) diff --git a/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj index db897cfbd..f49c03ee2 100644 --- a/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj +++ b/examples/poly-rcf/components/sqldb/test/poly_rcf/sqldb/interface_test.clj @@ -1,6 +1,6 @@ (ns poly-rcf.sqldb.interface-test (:require [clojure.set :as set] - [clojure.test :as test :refer :all] + [clojure.test :refer :all] [clojure.tools.logging :as log] [com.stuartsierra.component :as component] [next.jdbc :as jdbc] diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn index 4d3099795..e34644467 100644 --- a/examples/poly-rcf/deps.edn +++ b/examples/poly-rcf/deps.edn @@ -1,14 +1,14 @@ {:aliases {:dev {:extra-paths ["development/src"] :extra-deps {;; bases - poly/rcf {:local/root "bases/rcf"} - poly/issue-261 {:local/root "bases/mybase"} + poly/rcf {:local/root "bases/rcf"} + poly/empty {:local/root "bases/empty"} ;; components - poly/sqldb {:local/root "components/sqldb"} + poly/sqldb {:local/root "components/sqldb"} org.clojure/clojure {:mvn/version "1.11.1"}}} :test {:extra-paths ["bases/rcf/test" - "bases/mybase/test"]} + "bases/empty/test"]} :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] :jvm-opts [;; Run RCF tests when loading files in REPL diff --git a/examples/poly-rcf/monolith/src/poly_rcf/empty/core.clj b/examples/poly-rcf/monolith/src/poly_rcf/empty/core.clj new file mode 100644 index 000000000..d23fdf4d0 --- /dev/null +++ b/examples/poly-rcf/monolith/src/poly_rcf/empty/core.clj @@ -0,0 +1 @@ +(ns poly-rcf.empty.core) diff --git a/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj b/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj deleted file mode 100644 index b96a03f0d..000000000 --- a/examples/poly-rcf/monolith/src/poly_rcf/mybase/core.clj +++ /dev/null @@ -1 +0,0 @@ -(ns poly-rcf.mybase.core) diff --git a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj index 3d4a76266..f49c03ee2 100644 --- a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj +++ b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj @@ -1,5 +1,6 @@ (ns poly-rcf.sqldb.interface-test (:require [clojure.set :as set] + [clojure.test :refer :all] [clojure.tools.logging :as log] [com.stuartsierra.component :as component] [next.jdbc :as jdbc] diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index e3252bd6b..eb02e5996 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -3,8 +3,8 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). This repo has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): -* Renamed the `issue-261` base to `mybase`. -* Don't include `sqldb` as a dependency from `mybase` in its `deps.edn`. +* Renamed the `issue-261` base to `empty`. +* Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. * Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. * Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). * Use 0.2.19 of the poly tool, in the :poly alias in ./deps.edn. From 49ebc52903fec8e9dff9da17b6c3e8281e1578d0 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 17:22:22 +0100 Subject: [PATCH 07/35] Updated comment. --- .../poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj index f49c03ee2..5ddddd2a1 100644 --- a/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj +++ b/examples/poly-rcf/monolith/test/poly_rcf/sqldb/interface_test.clj @@ -7,7 +7,7 @@ [next.jdbc.result-set :as rs] [poly-rcf.sqldb.interface :as sqldb])) -;; This fails because of https://github.com/polyfy/polylith/issues/261 +;; This works when we execute the code as a monolith (deftest new-component-test "Test component works by starting a system and running a query." (let [config {:dre {:test {:db-spec {:maximum-pool-size 10 From a9affa3cb4a8626055b4728ce1bad9f5730e96e7 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 17:24:47 +0100 Subject: [PATCH 08/35] Use the local poly tool. --- examples/poly-rcf/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn index e34644467..20af99de4 100644 --- a/examples/poly-rcf/deps.edn +++ b/examples/poly-rcf/deps.edn @@ -14,4 +14,4 @@ :jvm-opts [;; Run RCF tests when loading files in REPL ;; https://github.com/hyperfiddle/rcf#ci "-Dhyperfiddle.rcf.generate-tests=true"] - :extra-deps {polylith/clj-poly {:mvn/version "0.2.19"}}}}} + :extra-deps {polylith/clj-poly {:local/root "../../projects/poly"}}}}} From b2b61e4e1c798c19ec7dfd9f19a2bc4d2a2ba509 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 17:25:17 +0100 Subject: [PATCH 09/35] Removed the :poly alias (this is not a Polylith workspace). --- examples/poly-rcf/monolith/deps.edn | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn index 9a2a9a768..257520b6e 100644 --- a/examples/poly-rcf/monolith/deps.edn +++ b/examples/poly-rcf/monolith/deps.edn @@ -14,10 +14,4 @@ org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"} io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test} - - :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] - :jvm-opts [;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci - "-Dhyperfiddle.rcf.generate-tests=true"] - :extra-deps {polylith/clj-poly {:mvn/version "0.2.19"}}}}} + :exec-fn cognitect.test-runner.api/test}}} From 9eebec1d82c7a010cf281b040a41dee6d7b09ceb Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 18:54:16 +0100 Subject: [PATCH 10/35] Changed from repo to workspace. --- examples/poly-rcf/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index eb02e5996..93f6ee3a8 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -2,7 +2,7 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). -This repo has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): +This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. * Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. * Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. From dab4b899f5d6cf4deb2b1772d0366156dd565b50 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 18:55:59 +0100 Subject: [PATCH 11/35] Use latest version of the poly tool. --- examples/poly-rcf/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 93f6ee3a8..7cbd65659 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -7,7 +7,7 @@ This workspace has been cloned and slightly modified from [Poly 261 - Classpath * Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. * Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. * Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). -* Use 0.2.19 of the poly tool, in the :poly alias in ./deps.edn. +* Use the latest version of the poly tool, in the :poly alias in ./deps.edn. * Removed unused `resources` and references to project `test` directories. * Added `:all` to the `test` command, to make sure all tests are executed. * Added the `monolith` directory at the root. From bfed2ac7441066a0a07f7e6d6ec2e9733b07357c Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:05:19 +0100 Subject: [PATCH 12/35] Removed text that can be found in the PR. --- examples/poly-rcf/readme.md | 73 +++---------------------------------- 1 file changed, 5 insertions(+), 68 deletions(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 7cbd65659..16b488614 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -2,6 +2,11 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). +To reproduce [issue 261](https://github.com/polyfy/polylith/issues/261): +* Execute `clojure -M:poly test :all` from the root. To get more details: `clojure -M:poly test :all :verbose`. +* Or execute `clj -X:test` from the `monolith` directory, to verify that this code works as a monolith. + + This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. * Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. @@ -11,71 +16,3 @@ This workspace has been cloned and slightly modified from [Poly 261 - Classpath * Removed unused `resources` and references to project `test` directories. * Added `:all` to the `test` command, to make sure all tests are executed. * Added the `monolith` directory at the root. - -To make RCF tests work with polylith you need to pass `"-Dhyperfiddle.rcf.generate-tests=true"` via **:jvm-opts** of **:poly** alias in `./deps.edn` . - -``` -:poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] - ;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci - :jvm-opts ["-Dhyperfiddle.rcf.generate-tests=true"] -``` - -This will work, except for RCF tests under `src/` . -Polylith does not pass source paths to tests so to make tests under `src/` work, -you will have to add them to your **:extra-paths** in **:test** alias. -Hopefully this issue is going to be fixed and RCF will work out of the box, just by providing the JVM option. - -Add src to you test paths in each base / component (brick). -``` -:test { - ;; Adding src here makes poly tool discover RCF tests under src/ - :extra-paths [ "test" "src"]} - -``` - - -Clone this repo, change directory to it and then run `clojure -Srepro -M:poly test :all` - -If all is well, you should see output that contains: `Testing poly-rcf.rcf.src-ns`. This means your test under `src/` was run as well. - - -```shell -clojure -Srepro -M:poly test :all -Projects to run tests from: rcf - -Running tests for the rcf project using test runner: Polylith built-in clojure.test runner... -Running tests from the rcf project, including 1 brick: rcf - -Testing poly-rcf.rcf.test-ns -✅. -Ran 1 tests containing 1 assertions. -0 failures, 0 errors. - -Test results: 1 passes, 0 failures, 0 errors. - -Testing poly-rcf.rcf.sample2-test -.. -Ran 2 tests containing 3 assertions. -0 failures, 0 errors. - -Test results: 3 passes, 0 failures, 0 errors. - -Testing poly-rcf.rcf.sample-test -✅. -Ran 1 tests containing 1 assertions. -0 failures, 0 errors. - -Test results: 1 passes, 0 failures, 0 errors. - -Testing poly-rcf.rcf.src-ns -✅. -Ran 1 tests containing 1 assertions. -0 failures, 0 errors. - -Test results: 1 passes, 0 failures, 0 errors. - -Execution time: 2 seconds -``` - -NOTE: To see more details, use `clojure -Srepro -M:poly test :all :verbose` \ No newline at end of file From 19e449680f8f8e42504b8ca12c44b6b08f47e1b8 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:05:40 +0100 Subject: [PATCH 13/35] Removed blank line. --- examples/poly-rcf/readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 16b488614..62e83e153 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -6,7 +6,6 @@ To reproduce [issue 261](https://github.com/polyfy/polylith/issues/261): * Execute `clojure -M:poly test :all` from the root. To get more details: `clojure -M:poly test :all :verbose`. * Or execute `clj -X:test` from the `monolith` directory, to verify that this code works as a monolith. - This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. * Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. From 405d619b1cc780f7b6fd9f7035990763dd2f95e3 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:06:28 +0100 Subject: [PATCH 14/35] Removed the logo image. --- examples/poly-rcf/logo.png | Bin 37382 -> 0 bytes examples/poly-rcf/readme.md | 1 - 2 files changed, 1 deletion(-) delete mode 100644 examples/poly-rcf/logo.png diff --git a/examples/poly-rcf/logo.png b/examples/poly-rcf/logo.png deleted file mode 100644 index f0bca2f999b5ed6ab63ed83623570dabbf4f9b50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37382 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 DBo@l4 diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 62e83e153..62f87c1e9 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -1,4 +1,3 @@ - Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). From 758d172bf72258fdf3f8694f834ff1c1686ed3aa Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:10:38 +0100 Subject: [PATCH 15/35] Updated the instructions. --- examples/poly-rcf/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 62f87c1e9..1f8bc7d00 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -2,8 +2,8 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). To reproduce [issue 261](https://github.com/polyfy/polylith/issues/261): -* Execute `clojure -M:poly test :all` from the root. To get more details: `clojure -M:poly test :all :verbose`. -* Or execute `clj -X:test` from the `monolith` directory, to verify that this code works as a monolith. +* Execute `clojure -M:poly test :all` from the `examples/poly-rcf` directory. To get more details: `clojure -M:poly test :all :verbose`. +* Verify that the same code executes without problems as a monolith by executing `clj -X:test` from the `examples/poly-rcf/monolith` directory. This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. From 449ba840d7ba360ba302c6a1732c72fca8a420d6 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:12:27 +0100 Subject: [PATCH 16/35] Minor change. --- examples/poly-rcf/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 1f8bc7d00..93b988356 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -13,4 +13,4 @@ This workspace has been cloned and slightly modified from [Poly 261 - Classpath * Use the latest version of the poly tool, in the :poly alias in ./deps.edn. * Removed unused `resources` and references to project `test` directories. * Added `:all` to the `test` command, to make sure all tests are executed. -* Added the `monolith` directory at the root. +* Added the `monolith` directory. From 2ea98590aea91c82d0a5352d57d0e0c144613748 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Sun, 3 Mar 2024 19:13:17 +0100 Subject: [PATCH 17/35] Minor change. --- examples/poly-rcf/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 93b988356..a760af5a8 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -10,7 +10,7 @@ This workspace has been cloned and slightly modified from [Poly 261 - Classpath * Don't include `sqldb` as a dependency from `empty` in its `deps.edn`. * Changed top namespace from `poly-rcf.rcf` to `poly-rcf`. * Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). -* Use the latest version of the poly tool, in the :poly alias in ./deps.edn. +* Use the latest version of the poly tool, in the `:poly` alias in ./deps.edn. * Removed unused `resources` and references to project `test` directories. * Added `:all` to the `test` command, to make sure all tests are executed. * Added the `monolith` directory. From 9411c7168ffc365a3e665b219cc611b57da0c3b5 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Mon, 4 Mar 2024 07:33:33 +0100 Subject: [PATCH 18/35] Moved code to the :dev alias. --- examples/poly-rcf/monolith/deps.edn | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn index 257520b6e..db3af30ca 100644 --- a/examples/poly-rcf/monolith/deps.edn +++ b/examples/poly-rcf/monolith/deps.edn @@ -1,17 +1,17 @@ -{:paths ["src"] - :deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} - com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} - com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} - org.clojure/tools.logging {:mvn/version "1.2.4"} - org.clojure/clojure {:mvn/version "1.11.1"}} +{:aliases {:dev {:extra-paths ["src"] + :extra-deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} + com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} + com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} + org.clojure/tools.logging {:mvn/version "1.2.4"} + org.clojure/clojure {:mvn/version "1.11.1"}}} - :aliases {;; https://clojure.org/guides/deps_and_cli#test_runner - ;; Run tests with: clj -X:test - :test {:extra-paths ["test" "src"] - :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} - com.stuartsierra/component {:mvn/version "1.1.0"} - org.clojure/test.check {:mvn/version "1.1.1"} - org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"} - io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} - :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test}}} + ;; https://clojure.org/guides/deps_and_cli#test_runner + ;; Run tests with: clojure -A:dev -X:test + :test {:extra-paths ["test" "src"] + :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} + com.stuartsierra/component {:mvn/version "1.1.0"} + org.clojure/test.check {:mvn/version "1.1.1"} + org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"} + io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test}}} From d503ccdce6104a51e515b57b0c83571b271ed129 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Mon, 4 Mar 2024 08:12:31 +0100 Subject: [PATCH 19/35] Removed the "src" directory from the test paths. --- examples/poly-rcf/monolith/deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn index db3af30ca..a3d31764c 100644 --- a/examples/poly-rcf/monolith/deps.edn +++ b/examples/poly-rcf/monolith/deps.edn @@ -1,3 +1,4 @@ +;; Run tests with: clojure -A:dev -X:test {:aliases {:dev {:extra-paths ["src"] :extra-deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} @@ -6,8 +7,7 @@ org.clojure/clojure {:mvn/version "1.11.1"}}} ;; https://clojure.org/guides/deps_and_cli#test_runner - ;; Run tests with: clojure -A:dev -X:test - :test {:extra-paths ["test" "src"] + :test {:extra-paths ["test"] :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} com.stuartsierra/component {:mvn/version "1.1.0"} org.clojure/test.check {:mvn/version "1.1.1"} From ac12779b5c9bd7a1aef2a2efeeaf4728244ea954 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Mon, 4 Mar 2024 08:12:43 +0100 Subject: [PATCH 20/35] Formatting change. --- .../src/polylith/clj/core/clojure_test_test_runner/core.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/clojure-test-test-runner/src/polylith/clj/core/clojure_test_test_runner/core.clj b/components/clojure-test-test-runner/src/polylith/clj/core/clojure_test_test_runner/core.clj index 6d86d260e..481d039a0 100644 --- a/components/clojure-test-test-runner/src/polylith/clj/core/clojure_test_test_runner/core.clj +++ b/components/clojure-test-test-runner/src/polylith/clj/core/clojure_test_test_runner/core.clj @@ -73,7 +73,7 @@ reflected in: * https://github.com/imrekoszo/polylith-kaocha * https://github.com/seancorfield/polylith-external-test-runner - and any others that get built by the community." + and any others that get built by the community." [{:keys [workspace project]}] (let [{:keys [bases components]} workspace {:keys [name bricks-to-test projects-to-test namespaces paths]} project From fd216ba6d78da3bf6346a9c37f490551bf218dcd Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Tue, 5 Mar 2024 19:40:24 +0100 Subject: [PATCH 21/35] Added examples/poly-rcf/mix-src-and-test --- deps.edn | 3 + examples/poly-rcf/bases/empty/deps.edn | 4 ++ .../bases/empty/src/poly_rcf/empty/core.clj | 1 + .../empty/test/poly_rcf/empty/core_test.clj | 5 ++ .../mix-src-and-test/bases/empty/deps.edn | 4 ++ .../bases/empty/src/poly_rcf/empty/core.clj | 1 + .../empty/test/poly_rcf/empty/core_test.clj | 5 ++ .../mix-src-and-test/bases/rcf/deps.edn | 4 ++ .../bases/rcf/src/poly_rcf/rcf/config.clj | 8 +++ .../bases/rcf/src/poly_rcf/rcf/src_ns.clj | 8 +++ .../rcf/test/poly_rcf/rcf/sample2_test.clj | 11 ++++ .../rcf/test/poly_rcf/rcf/sample_test.clj | 8 +++ .../bases/rcf/test/poly_rcf/rcf/test_ns.clj | 8 +++ .../components/sqldb/deps.edn | 8 +++ .../sqldb/src/poly_rcf/sqldb/core.clj | 57 +++++++++++++++++++ .../sqldb/src/poly_rcf/sqldb/interface.clj | 8 +++ .../test/poly_rcf/sqldb/interface_test.clj | 35 ++++++++++++ examples/poly-rcf/mix-src-and-test/deps.edn | 26 +++++++++ .../mix-src-and-test/development/src/.keep | 1 + .../projects/poly261/deps.edn | 8 +++ .../mix-src-and-test/projects/rcf/deps.edn | 10 ++++ examples/poly-rcf/mix-src-and-test/readme.md | 2 + .../poly-rcf/mix-src-and-test/workspace.edn | 13 +++++ examples/poly-rcf/monolith/deps.edn | 8 +-- 24 files changed, 242 insertions(+), 4 deletions(-) create mode 100644 examples/poly-rcf/bases/empty/deps.edn create mode 100644 examples/poly-rcf/bases/empty/src/poly_rcf/empty/core.clj create mode 100644 examples/poly-rcf/bases/empty/test/poly_rcf/empty/core_test.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj create mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj create mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj create mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj create mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj create mode 100644 examples/poly-rcf/mix-src-and-test/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/development/src/.keep create mode 100644 examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn create mode 100644 examples/poly-rcf/mix-src-and-test/readme.md create mode 100644 examples/poly-rcf/mix-src-and-test/workspace.edn diff --git a/deps.edn b/deps.edn index d6d2f4c07..26f41402b 100644 --- a/deps.edn +++ b/deps.edn @@ -69,6 +69,9 @@ "components/ws-explorer/test" "bases/poly-cli/test" "projects/poly/test"]} +; :extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} +; :main-opts ["-m" "cognitect.test-runner"] +; :exec-fn cognitect.test-runner.api/test} ;; Any sha :polys {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] diff --git a/examples/poly-rcf/bases/empty/deps.edn b/examples/poly-rcf/bases/empty/deps.edn new file mode 100644 index 000000000..8dd73c332 --- /dev/null +++ b/examples/poly-rcf/bases/empty/deps.edn @@ -0,0 +1,4 @@ +{:paths ["src"] + :deps {} + :aliases {:test {:extra-paths ["test"] + :extra-deps {}}}} diff --git a/examples/poly-rcf/bases/empty/src/poly_rcf/empty/core.clj b/examples/poly-rcf/bases/empty/src/poly_rcf/empty/core.clj new file mode 100644 index 000000000..d23fdf4d0 --- /dev/null +++ b/examples/poly-rcf/bases/empty/src/poly_rcf/empty/core.clj @@ -0,0 +1 @@ +(ns poly-rcf.empty.core) diff --git a/examples/poly-rcf/bases/empty/test/poly_rcf/empty/core_test.clj b/examples/poly-rcf/bases/empty/test/poly_rcf/empty/core_test.clj new file mode 100644 index 000000000..d0b07e810 --- /dev/null +++ b/examples/poly-rcf/bases/empty/test/poly_rcf/empty/core_test.clj @@ -0,0 +1,5 @@ +(ns poly-rcf.empty.core-test + (:require [clojure.test :as test :refer :all])) + +(deftest dummy-test + (is (= 1 1))) diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn b/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn new file mode 100644 index 000000000..20cc8e331 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn @@ -0,0 +1,4 @@ +{:paths ["src" "test"] + :deps {} + :aliases {:test {:extra-paths [] + :extra-deps {}}}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj b/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj new file mode 100644 index 000000000..d23fdf4d0 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj @@ -0,0 +1 @@ +(ns poly-rcf.empty.core) diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj b/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj new file mode 100644 index 000000000..d0b07e810 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj @@ -0,0 +1,5 @@ +(ns poly-rcf.empty.core-test + (:require [clojure.test :as test :refer :all])) + +(deftest dummy-test + (is (= 1 1))) diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn b/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn new file mode 100644 index 000000000..53b252cb7 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn @@ -0,0 +1,4 @@ +{:paths ["src" "test"] + :deps {com.hyperfiddle/rcf {:mvn/version "20220405"}} + :aliases {:test {:extra-paths [] + :extra-deps {org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj new file mode 100644 index 000000000..e48d0cff1 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.config) +;; A master configuration file. +;; Can be overriden with configuration files down in the classpath, +;; environment variables, and system properties + +{:dre {} + :sentry {:dsn "" + :environment ""}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj new file mode 100644 index 000000000..2f8ee4ae5 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.src-ns + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (+ 1 1) := 2 + + ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj new file mode 100644 index 000000000..88fa51e68 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj @@ -0,0 +1,11 @@ +(ns poly-rcf.rcf.sample2-test + (:require [clojure.test :as t :refer [deftest is testing]])) + +(deftest math-works + (testing "basic addition and subtraction" + (is (= 42 (+ 40 2))) + (is (= 42 (- 44 2))))) + +(deftest ^:integration test-i + (is (= 1 1))) + diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj new file mode 100644 index 000000000..58bbc9545 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.sample-test + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (= 1 1) := true + + ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj new file mode 100644 index 000000000..38228943a --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.rcf.test-ns + (:require [hyperfiddle.rcf :refer [tests]])) + +(tests + + (+ 1 1) := 2 + + ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn b/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn new file mode 100644 index 000000000..b3fb9cdda --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn @@ -0,0 +1,8 @@ +{:paths ["src" "test"] + :deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} + com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} + com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} + org.clojure/tools.logging {:mvn/version "1.2.4"}} + :aliases {:test {:extra-paths [] + :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} + com.stuartsierra/component {:mvn/version "1.1.0"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj new file mode 100644 index 000000000..f411615ae --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj @@ -0,0 +1,57 @@ +;; Copyright (C) 2022, Doctor Evidence. All rights reserved. + +(ns poly-rcf.sqldb.core + "SQL DB client impl." + {:authors ["Jozef Wagner"]} + (:require [clojure.tools.logging :refer [info]] + [next.jdbc.connection :as connection]) + (:import [com.zaxxer.hikari HikariDataSource])) + +(defn get-connection + [sqlconn] + (or (:hikari-datasource sqlconn) sqlconn)) + +;;; SQLDB + +;;; System Component + +(defn start-component + [new-sqldb] + (info "Create component with db" new-sqldb) + (let [db-spec (:db-spec new-sqldb) + hikari-datasource (connection/->pool HikariDataSource db-spec)] + (assoc new-sqldb + :hikari-datasource hikari-datasource))) + +(defn stop-component + [sqldb] + (when-let [^HikariDataSource ds (:hikari-datasource sqldb)] + (when-not (.isClosed ds) + (.close ds))) + (dissoc sqldb :hikari-datasource)) + +(defn suspend-component + [sqldb] + (info "Suspending SQLDB component") + sqldb) + +(defn resume-component + [_new-sqldb suspended-sqldb] + ;; TODO: Proper reconnect when cfg changes + (info "Resuming SQLDB component") + suspended-sqldb) + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (let [db-config (get-in cfg [:dre tag])] + (-> db-config + (with-meta {'com.stuartsierra.component/start start-component + 'com.stuartsierra.component/stop stop-component + 'suspendable.core/suspend suspend-component + 'suspendable.core/resume resume-component})))) + +(comment + + (set! *warn-on-reflection* true)) + diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj new file mode 100644 index 000000000..c38e93f46 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj @@ -0,0 +1,8 @@ +(ns poly-rcf.sqldb.interface + (:require [poly-rcf.sqldb.core :as core])) + + +(defn new-component + "Returns new sqldb system component." + [cfg tag] + (core/new-component cfg tag)) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj new file mode 100644 index 000000000..f49c03ee2 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj @@ -0,0 +1,35 @@ +(ns poly-rcf.sqldb.interface-test + (:require [clojure.set :as set] + [clojure.test :refer :all] + [clojure.tools.logging :as log] + [com.stuartsierra.component :as component] + [next.jdbc :as jdbc] + [next.jdbc.result-set :as rs] + [poly-rcf.sqldb.interface :as sqldb])) + +;; This fails because of https://github.com/polyfy/polylith/issues/261 +(deftest new-component-test + "Test component works by starting a system and running a query." + (let [config {:dre {:test {:db-spec {:maximum-pool-size 10 + :connection-timeout 30000 + :idle-timeout 600000 + :validation-timeout 5000 + :max-lifetime 1800000 + :jdbcUrl "jdbc:h2:mem:semmed"}}}} + sys (component/system-map + :sqldb (sqldb/new-component config :test)) + s (component/start-system sys) + sqldb (:sqldb s) + data-source (:hikari-datasource sqldb) + _ (log/info "datasource" sqldb) + ;; read table metadata + d (with-open [con (jdbc/get-connection data-source)] + (-> (.getMetaData con) ; produces java.sql.DatabaseMetaData + (.getTables nil nil nil (into-array ["TABLE" "VIEW"])) + (rs/datafiable-result-set con))) + some-tables #{"CONSTANTS" "ENUM_VALUES" "INDEXES" + "INDEX_COLUMNS" "INFORMATION_SCHEMA_CATALOG_NAME"} + all-tables (into #{} (map :TABLE_NAME d))] + ;; test that some tables are present in metadata + (is (true? (set/subset? some-tables all-tables))) + (component/stop-system s))) diff --git a/examples/poly-rcf/mix-src-and-test/deps.edn b/examples/poly-rcf/mix-src-and-test/deps.edn new file mode 100644 index 000000000..a7fbc13f1 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/deps.edn @@ -0,0 +1,26 @@ + +{:aliases {:dev {:extra-paths ["development/src"] + :extra-deps {;; bases + poly/rcf {:local/root "bases/rcf"} + poly/empty {:local/root "bases/empty"} + ;; components + poly/sqldb {:local/root "components/sqldb"} + + org.clojure/clojure {:mvn/version "1.11.1"}}} + + + :test {:extra-paths ["bases/rcf/test" + "bases/empty/test"] + ;; Run tests with: clojure -A:dev -X:test + :extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :jvm-opts [;; Run RCF tests when loading files in REPL + ;; https://github.com/hyperfiddle/rcf#ci + "-Dhyperfiddle.rcf.generate-tests=true"] + :exec-fn cognitect.test-runner.api/test} + + :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + :jvm-opts [;; Run RCF tests when loading files in REPL + ;; https://github.com/hyperfiddle/rcf#ci + "-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polylith/clj-poly {:local/root "../../../projects/poly"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/development/src/.keep b/examples/poly-rcf/mix-src-and-test/development/src/.keep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/development/src/.keep @@ -0,0 +1 @@ + diff --git a/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn b/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn new file mode 100644 index 000000000..694a1dcc9 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn @@ -0,0 +1,8 @@ +{:deps {org.clojure/clojure {:mvn/version "1.11.1"} + org.clojure/tools.deps.alpha {:mvn/version "0.12.985"} + + poly/mybase {:local/root "../../bases/mybase"} + poly/sqldb {:local/root "../../components/sqldb"}} + + :aliases {:test {:extra-paths [] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn b/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn new file mode 100644 index 000000000..164b6fc80 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn @@ -0,0 +1,10 @@ +;; Run tests with: clojure -A:dev -X:test +{:paths [] + :deps {poly/rcf {:local/root "../../bases/rcf"} + poly/sqldb {:local/root "../../components/sqldb"}} + ;; We get the warnings: WARNING: Use of :paths external to the project has been deprecated, please remove: ../../bases/rcf/test + :aliases {:test {:extra-paths [] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"} + io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test}}} diff --git a/examples/poly-rcf/mix-src-and-test/readme.md b/examples/poly-rcf/mix-src-and-test/readme.md new file mode 100644 index 000000000..9c80dd24b --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/readme.md @@ -0,0 +1,2 @@ + +This is an attempt to run the tests with the Cognitect test runner. diff --git a/examples/poly-rcf/mix-src-and-test/workspace.edn b/examples/poly-rcf/mix-src-and-test/workspace.edn new file mode 100644 index 000000000..9f0c098e4 --- /dev/null +++ b/examples/poly-rcf/mix-src-and-test/workspace.edn @@ -0,0 +1,13 @@ +{:top-namespace "poly-rcf" + :interface-ns "interface" + :default-profile-name "default" + :compact-views #{} + :vcs {:name "git" + :auto-add false} + :tag-patterns {:stable "stable-*" + :release "v[0-9]*"} + :projects {"development" {:alias "dev"} + "rcf" {:alias "rcf" + :necessary ["sqldb"]} + "poly261" {:alias "poly261" + :necessary ["sqldb"]}}} diff --git a/examples/poly-rcf/monolith/deps.edn b/examples/poly-rcf/monolith/deps.edn index a3d31764c..6f04a6342 100644 --- a/examples/poly-rcf/monolith/deps.edn +++ b/examples/poly-rcf/monolith/deps.edn @@ -1,9 +1,9 @@ ;; Run tests with: clojure -A:dev -X:test {:aliases {:dev {:extra-paths ["src"] - :extra-deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} - com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} - com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} - org.clojure/tools.logging {:mvn/version "1.2.4"} + :extra-deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} + com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} + com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} + org.clojure/tools.logging {:mvn/version "1.2.4"} org.clojure/clojure {:mvn/version "1.11.1"}}} ;; https://clojure.org/guides/deps_and_cli#test_runner From 39cdfbef816d10e8e6de38bba3f500522451e95f Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 05:01:28 +0100 Subject: [PATCH 22/35] Removed mix-src-and-test. --- .../mix-src-and-test/bases/empty/deps.edn | 4 -- .../bases/empty/src/poly_rcf/empty/core.clj | 1 - .../empty/test/poly_rcf/empty/core_test.clj | 5 -- .../mix-src-and-test/bases/rcf/deps.edn | 4 -- .../bases/rcf/src/poly_rcf/rcf/config.clj | 8 --- .../bases/rcf/src/poly_rcf/rcf/src_ns.clj | 8 --- .../rcf/test/poly_rcf/rcf/sample2_test.clj | 11 ---- .../rcf/test/poly_rcf/rcf/sample_test.clj | 8 --- .../bases/rcf/test/poly_rcf/rcf/test_ns.clj | 8 --- .../components/sqldb/deps.edn | 8 --- .../sqldb/src/poly_rcf/sqldb/core.clj | 57 ------------------- .../sqldb/src/poly_rcf/sqldb/interface.clj | 8 --- .../test/poly_rcf/sqldb/interface_test.clj | 35 ------------ examples/poly-rcf/mix-src-and-test/deps.edn | 26 --------- .../mix-src-and-test/development/src/.keep | 1 - .../projects/poly261/deps.edn | 8 --- .../mix-src-and-test/projects/rcf/deps.edn | 10 ---- examples/poly-rcf/mix-src-and-test/readme.md | 2 - .../poly-rcf/mix-src-and-test/workspace.edn | 13 ----- 19 files changed, 225 deletions(-) delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj delete mode 100644 examples/poly-rcf/mix-src-and-test/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/development/src/.keep delete mode 100644 examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn delete mode 100644 examples/poly-rcf/mix-src-and-test/readme.md delete mode 100644 examples/poly-rcf/mix-src-and-test/workspace.edn diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn b/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn deleted file mode 100644 index 20cc8e331..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/empty/deps.edn +++ /dev/null @@ -1,4 +0,0 @@ -{:paths ["src" "test"] - :deps {} - :aliases {:test {:extra-paths [] - :extra-deps {}}}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj b/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj deleted file mode 100644 index d23fdf4d0..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/empty/src/poly_rcf/empty/core.clj +++ /dev/null @@ -1 +0,0 @@ -(ns poly-rcf.empty.core) diff --git a/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj b/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj deleted file mode 100644 index d0b07e810..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/empty/test/poly_rcf/empty/core_test.clj +++ /dev/null @@ -1,5 +0,0 @@ -(ns poly-rcf.empty.core-test - (:require [clojure.test :as test :refer :all])) - -(deftest dummy-test - (is (= 1 1))) diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn b/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn deleted file mode 100644 index 53b252cb7..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/deps.edn +++ /dev/null @@ -1,4 +0,0 @@ -{:paths ["src" "test"] - :deps {com.hyperfiddle/rcf {:mvn/version "20220405"}} - :aliases {:test {:extra-paths [] - :extra-deps {org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj deleted file mode 100644 index e48d0cff1..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/config.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns poly-rcf.rcf.config) -;; A master configuration file. -;; Can be overriden with configuration files down in the classpath, -;; environment variables, and system properties - -{:dre {} - :sentry {:dsn "" - :environment ""}} diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj deleted file mode 100644 index 2f8ee4ae5..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/src/poly_rcf/rcf/src_ns.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns poly-rcf.rcf.src-ns - (:require [hyperfiddle.rcf :refer [tests]])) - -(tests - - (+ 1 1) := 2 - - ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj deleted file mode 100644 index 88fa51e68..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample2_test.clj +++ /dev/null @@ -1,11 +0,0 @@ -(ns poly-rcf.rcf.sample2-test - (:require [clojure.test :as t :refer [deftest is testing]])) - -(deftest math-works - (testing "basic addition and subtraction" - (is (= 42 (+ 40 2))) - (is (= 42 (- 44 2))))) - -(deftest ^:integration test-i - (is (= 1 1))) - diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj deleted file mode 100644 index 58bbc9545..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/sample_test.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns poly-rcf.rcf.sample-test - (:require [hyperfiddle.rcf :refer [tests]])) - -(tests - - (= 1 1) := true - - ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj b/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj deleted file mode 100644 index 38228943a..000000000 --- a/examples/poly-rcf/mix-src-and-test/bases/rcf/test/poly_rcf/rcf/test_ns.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns poly-rcf.rcf.test-ns - (:require [hyperfiddle.rcf :refer [tests]])) - -(tests - - (+ 1 1) := 2 - - ) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn b/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn deleted file mode 100644 index b3fb9cdda..000000000 --- a/examples/poly-rcf/mix-src-and-test/components/sqldb/deps.edn +++ /dev/null @@ -1,8 +0,0 @@ -{:paths ["src" "test"] - :deps {com.github.seancorfield/next.jdbc {:mvn/version "1.3.874"} - com.github.seancorfield/honeysql {:mvn/version "2.4.1026"} - com.zaxxer/HikariCP {:mvn/version "5.0.1" :exclusions [org.slf4j/slf4j-api]} - org.clojure/tools.logging {:mvn/version "1.2.4"}} - :aliases {:test {:extra-paths [] - :extra-deps {com.h2database/h2 {:mvn/version "2.1.214"} - com.stuartsierra/component {:mvn/version "1.1.0"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj deleted file mode 100644 index f411615ae..000000000 --- a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/core.clj +++ /dev/null @@ -1,57 +0,0 @@ -;; Copyright (C) 2022, Doctor Evidence. All rights reserved. - -(ns poly-rcf.sqldb.core - "SQL DB client impl." - {:authors ["Jozef Wagner"]} - (:require [clojure.tools.logging :refer [info]] - [next.jdbc.connection :as connection]) - (:import [com.zaxxer.hikari HikariDataSource])) - -(defn get-connection - [sqlconn] - (or (:hikari-datasource sqlconn) sqlconn)) - -;;; SQLDB - -;;; System Component - -(defn start-component - [new-sqldb] - (info "Create component with db" new-sqldb) - (let [db-spec (:db-spec new-sqldb) - hikari-datasource (connection/->pool HikariDataSource db-spec)] - (assoc new-sqldb - :hikari-datasource hikari-datasource))) - -(defn stop-component - [sqldb] - (when-let [^HikariDataSource ds (:hikari-datasource sqldb)] - (when-not (.isClosed ds) - (.close ds))) - (dissoc sqldb :hikari-datasource)) - -(defn suspend-component - [sqldb] - (info "Suspending SQLDB component") - sqldb) - -(defn resume-component - [_new-sqldb suspended-sqldb] - ;; TODO: Proper reconnect when cfg changes - (info "Resuming SQLDB component") - suspended-sqldb) - -(defn new-component - "Returns new sqldb system component." - [cfg tag] - (let [db-config (get-in cfg [:dre tag])] - (-> db-config - (with-meta {'com.stuartsierra.component/start start-component - 'com.stuartsierra.component/stop stop-component - 'suspendable.core/suspend suspend-component - 'suspendable.core/resume resume-component})))) - -(comment - - (set! *warn-on-reflection* true)) - diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj deleted file mode 100644 index c38e93f46..000000000 --- a/examples/poly-rcf/mix-src-and-test/components/sqldb/src/poly_rcf/sqldb/interface.clj +++ /dev/null @@ -1,8 +0,0 @@ -(ns poly-rcf.sqldb.interface - (:require [poly-rcf.sqldb.core :as core])) - - -(defn new-component - "Returns new sqldb system component." - [cfg tag] - (core/new-component cfg tag)) \ No newline at end of file diff --git a/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj b/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj deleted file mode 100644 index f49c03ee2..000000000 --- a/examples/poly-rcf/mix-src-and-test/components/sqldb/test/poly_rcf/sqldb/interface_test.clj +++ /dev/null @@ -1,35 +0,0 @@ -(ns poly-rcf.sqldb.interface-test - (:require [clojure.set :as set] - [clojure.test :refer :all] - [clojure.tools.logging :as log] - [com.stuartsierra.component :as component] - [next.jdbc :as jdbc] - [next.jdbc.result-set :as rs] - [poly-rcf.sqldb.interface :as sqldb])) - -;; This fails because of https://github.com/polyfy/polylith/issues/261 -(deftest new-component-test - "Test component works by starting a system and running a query." - (let [config {:dre {:test {:db-spec {:maximum-pool-size 10 - :connection-timeout 30000 - :idle-timeout 600000 - :validation-timeout 5000 - :max-lifetime 1800000 - :jdbcUrl "jdbc:h2:mem:semmed"}}}} - sys (component/system-map - :sqldb (sqldb/new-component config :test)) - s (component/start-system sys) - sqldb (:sqldb s) - data-source (:hikari-datasource sqldb) - _ (log/info "datasource" sqldb) - ;; read table metadata - d (with-open [con (jdbc/get-connection data-source)] - (-> (.getMetaData con) ; produces java.sql.DatabaseMetaData - (.getTables nil nil nil (into-array ["TABLE" "VIEW"])) - (rs/datafiable-result-set con))) - some-tables #{"CONSTANTS" "ENUM_VALUES" "INDEXES" - "INDEX_COLUMNS" "INFORMATION_SCHEMA_CATALOG_NAME"} - all-tables (into #{} (map :TABLE_NAME d))] - ;; test that some tables are present in metadata - (is (true? (set/subset? some-tables all-tables))) - (component/stop-system s))) diff --git a/examples/poly-rcf/mix-src-and-test/deps.edn b/examples/poly-rcf/mix-src-and-test/deps.edn deleted file mode 100644 index a7fbc13f1..000000000 --- a/examples/poly-rcf/mix-src-and-test/deps.edn +++ /dev/null @@ -1,26 +0,0 @@ - -{:aliases {:dev {:extra-paths ["development/src"] - :extra-deps {;; bases - poly/rcf {:local/root "bases/rcf"} - poly/empty {:local/root "bases/empty"} - ;; components - poly/sqldb {:local/root "components/sqldb"} - - org.clojure/clojure {:mvn/version "1.11.1"}}} - - - :test {:extra-paths ["bases/rcf/test" - "bases/empty/test"] - ;; Run tests with: clojure -A:dev -X:test - :extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} - :main-opts ["-m" "cognitect.test-runner"] - :jvm-opts [;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci - "-Dhyperfiddle.rcf.generate-tests=true"] - :exec-fn cognitect.test-runner.api/test} - - :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] - :jvm-opts [;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci - "-Dhyperfiddle.rcf.generate-tests=true"] - :extra-deps {polylith/clj-poly {:local/root "../../../projects/poly"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/development/src/.keep b/examples/poly-rcf/mix-src-and-test/development/src/.keep deleted file mode 100644 index 8b1378917..000000000 --- a/examples/poly-rcf/mix-src-and-test/development/src/.keep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn b/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn deleted file mode 100644 index 694a1dcc9..000000000 --- a/examples/poly-rcf/mix-src-and-test/projects/poly261/deps.edn +++ /dev/null @@ -1,8 +0,0 @@ -{:deps {org.clojure/clojure {:mvn/version "1.11.1"} - org.clojure/tools.deps.alpha {:mvn/version "0.12.985"} - - poly/mybase {:local/root "../../bases/mybase"} - poly/sqldb {:local/root "../../components/sqldb"}} - - :aliases {:test {:extra-paths [] - :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} diff --git a/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn b/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn deleted file mode 100644 index 164b6fc80..000000000 --- a/examples/poly-rcf/mix-src-and-test/projects/rcf/deps.edn +++ /dev/null @@ -1,10 +0,0 @@ -;; Run tests with: clojure -A:dev -X:test -{:paths [] - :deps {poly/rcf {:local/root "../../bases/rcf"} - poly/sqldb {:local/root "../../components/sqldb"}} - ;; We get the warnings: WARNING: Use of :paths external to the project has been deprecated, please remove: ../../bases/rcf/test - :aliases {:test {:extra-paths [] - :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"} - io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} - :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test}}} diff --git a/examples/poly-rcf/mix-src-and-test/readme.md b/examples/poly-rcf/mix-src-and-test/readme.md deleted file mode 100644 index 9c80dd24b..000000000 --- a/examples/poly-rcf/mix-src-and-test/readme.md +++ /dev/null @@ -1,2 +0,0 @@ - -This is an attempt to run the tests with the Cognitect test runner. diff --git a/examples/poly-rcf/mix-src-and-test/workspace.edn b/examples/poly-rcf/mix-src-and-test/workspace.edn deleted file mode 100644 index 9f0c098e4..000000000 --- a/examples/poly-rcf/mix-src-and-test/workspace.edn +++ /dev/null @@ -1,13 +0,0 @@ -{:top-namespace "poly-rcf" - :interface-ns "interface" - :default-profile-name "default" - :compact-views #{} - :vcs {:name "git" - :auto-add false} - :tag-patterns {:stable "stable-*" - :release "v[0-9]*"} - :projects {"development" {:alias "dev"} - "rcf" {:alias "rcf" - :necessary ["sqldb"]} - "poly261" {:alias "poly261" - :necessary ["sqldb"]}}} From 92d6338d53e2f49fb57281699fb31209a6226d1f Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 05:22:03 +0100 Subject: [PATCH 23/35] Show how to execute the test from development. --- examples/poly-rcf/readme.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index a760af5a8..66c348af7 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -2,8 +2,12 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). To reproduce [issue 261](https://github.com/polyfy/polylith/issues/261): -* Execute `clojure -M:poly test :all` from the `examples/poly-rcf` directory. To get more details: `clojure -M:poly test :all :verbose`. -* Verify that the same code executes without problems as a monolith by executing `clj -X:test` from the `examples/poly-rcf/monolith` directory. +* Execute `clojure -M:poly test :all :verbose` from the `examples/poly-rcf` directory. + +To execute the tests so that they work: + +* From the `development` project: `clojure -M:poly test :dev project:development` +* If we organise the code as a monolith, from `examples/poly-rcf/monolith` with `clj -X:test`. This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. From 7c68af3f9fc0f419674f0b2e78702f6440384943 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 05:57:44 +0100 Subject: [PATCH 24/35] Rearranged the deps. --- examples/poly-rcf/projects/poly261/deps.edn | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/poly-rcf/projects/poly261/deps.edn b/examples/poly-rcf/projects/poly261/deps.edn index 694a1dcc9..932d2f0c8 100644 --- a/examples/poly-rcf/projects/poly261/deps.edn +++ b/examples/poly-rcf/projects/poly261/deps.edn @@ -1,8 +1,9 @@ -{:deps {org.clojure/clojure {:mvn/version "1.11.1"} - org.clojure/tools.deps.alpha {:mvn/version "0.12.985"} - - poly/mybase {:local/root "../../bases/mybase"} - poly/sqldb {:local/root "../../components/sqldb"}} +{:paths [] + :deps {poly/mybase {:local/root "../../bases/empty"} + poly/sqldb {:local/root "../../components/sqldb"} + + org.clojure/clojure {:mvn/version "1.11.1"} + org.clojure/tools.deps.alpha {:mvn/version "0.12.985"}} :aliases {:test {:extra-paths [] :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} From c52e674d39c1166043e7ce957e663945dac02cf7 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 05:58:10 +0100 Subject: [PATCH 25/35] Rearranged the deps + added dependency to org.clojure/clojure. --- examples/poly-rcf/projects/rcf/deps.edn | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/poly-rcf/projects/rcf/deps.edn b/examples/poly-rcf/projects/rcf/deps.edn index 6c95ce159..6d70797a6 100644 --- a/examples/poly-rcf/projects/rcf/deps.edn +++ b/examples/poly-rcf/projects/rcf/deps.edn @@ -1,5 +1,7 @@ {:paths [] :deps {poly/rcf {:local/root "../../bases/rcf"} - poly/sqldb {:local/root "../../components/sqldb"}} + poly/sqldb {:local/root "../../components/sqldb"} + + org.clojure/clojure {:mvn/version "1.11.1"}} :aliases {:test {:extra-paths [] :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"}}}}} From 9e07246e6f411890c7287cf739489416b669033d Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 06:01:07 +0100 Subject: [PATCH 26/35] Cleaned up deps. --- examples/poly-rcf/deps.edn | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn index 20af99de4..6e031f968 100644 --- a/examples/poly-rcf/deps.edn +++ b/examples/poly-rcf/deps.edn @@ -1,9 +1,7 @@ {:aliases {:dev {:extra-paths ["development/src"] - :extra-deps {;; bases - poly/rcf {:local/root "bases/rcf"} + :extra-deps {poly/sqldb {:local/root "components/sqldb"} + poly/rcf {:local/root "bases/rcf"} poly/empty {:local/root "bases/empty"} - ;; components - poly/sqldb {:local/root "components/sqldb"} org.clojure/clojure {:mvn/version "1.11.1"}}} @@ -12,6 +10,6 @@ :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] :jvm-opts [;; Run RCF tests when loading files in REPL - ;; https://github.com/hyperfiddle/rcf#ci + ;; https://github.com/hyperfiddle/rcf#ci "-Dhyperfiddle.rcf.generate-tests=true"] :extra-deps {polylith/clj-poly {:local/root "../../projects/poly"}}}}} From 299c54b49229a03dfaf6b899ebf7505f7623a26c Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:44:32 +0100 Subject: [PATCH 27/35] Removed "src" from :test > :extra-paths. --- examples/poly-rcf/bases/rcf/deps.edn | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/poly-rcf/bases/rcf/deps.edn b/examples/poly-rcf/bases/rcf/deps.edn index ec57c79f6..42d4e1b7b 100644 --- a/examples/poly-rcf/bases/rcf/deps.edn +++ b/examples/poly-rcf/bases/rcf/deps.edn @@ -1,6 +1,4 @@ {:paths ["src"] :deps {com.hyperfiddle/rcf {:mvn/version "20220405"}} - :aliases {:test {:extra-paths ["test" - ;; Adding src here makes poly tool discover RCF tests under src/ - "src"] + :aliases {:test {:extra-paths ["test"] ;; We don't need "src" here. :extra-deps {org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"}}}}} From 6a6041c88d984a7036e1ac9f8a3cb90351939184 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:45:20 +0100 Subject: [PATCH 28/35] Add hyperfiddle/rcf and slf4j src deps + test path. --- examples/poly-rcf/bases/empty/deps.edn | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/poly-rcf/bases/empty/deps.edn b/examples/poly-rcf/bases/empty/deps.edn index 8dd73c332..56c4f39ef 100644 --- a/examples/poly-rcf/bases/empty/deps.edn +++ b/examples/poly-rcf/bases/empty/deps.edn @@ -1,4 +1,5 @@ +;; I had to add hyperfiddle/rcf + slf4j, for the tests to run. {:paths ["src"] - :deps {} + :deps {com.hyperfiddle/rcf {:mvn/version "20220405"}} :aliases {:test {:extra-paths ["test"] - :extra-deps {}}}} + :extra-deps {org.slf4j/slf4j-simple {:mvn/version "2.0.0-beta1"}}}}} From 246d5015bfc1e4970b9dfe5e75ec5ac0f02ce26e Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:45:37 +0100 Subject: [PATCH 29/35] Renamed deps key. --- examples/poly-rcf/projects/poly261/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/projects/poly261/deps.edn b/examples/poly-rcf/projects/poly261/deps.edn index 932d2f0c8..732775627 100644 --- a/examples/poly-rcf/projects/poly261/deps.edn +++ b/examples/poly-rcf/projects/poly261/deps.edn @@ -1,5 +1,5 @@ {:paths [] - :deps {poly/mybase {:local/root "../../bases/empty"} + :deps {poly/empty {:local/root "../../bases/empty"} poly/sqldb {:local/root "../../components/sqldb"} org.clojure/clojure {:mvn/version "1.11.1"} From de753d1dcd2951fd64cedc5280fca01757e3f2fb Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:47:52 +0100 Subject: [PATCH 30/35] Added config files that mimics the poly-261 and rcf project files (if renamed to deps.edn). --- examples/poly-rcf/deps-261.edn | 17 +++++++++++++++++ examples/poly-rcf/deps-rcf.edn | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 examples/poly-rcf/deps-261.edn create mode 100644 examples/poly-rcf/deps-rcf.edn diff --git a/examples/poly-rcf/deps-261.edn b/examples/poly-rcf/deps-261.edn new file mode 100644 index 000000000..7900b8006 --- /dev/null +++ b/examples/poly-rcf/deps-261.edn @@ -0,0 +1,17 @@ +;; To test this config, rename the file to deps.edn. +{:aliases {:dev {:extra-paths ["development/src"] + :extra-deps {poly/sqldb {:local/root "components/sqldb"} + poly/empty {:local/root "bases/empty"} + + org.clojure/clojure {:mvn/version "1.11.1"}}} + + :test {:extra-paths ["bases/rcf/test" + "bases/empty/test"] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"} + io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test} + + :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + :jvm-opts ["-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polylith/clj-poly {:local/root "../../projects/poly"}}}}} diff --git a/examples/poly-rcf/deps-rcf.edn b/examples/poly-rcf/deps-rcf.edn new file mode 100644 index 000000000..01cec4e33 --- /dev/null +++ b/examples/poly-rcf/deps-rcf.edn @@ -0,0 +1,16 @@ +;; To test this config, rename the file to deps.edn. +{:aliases {:dev {:extra-paths ["development/src"] + :extra-deps {poly/sqldb {:local/root "components/sqldb"} + poly/rcf {:local/root "bases/rcf"} + + org.clojure/clojure {:mvn/version "1.11.1"}}} + + :test {:extra-paths ["bases/rcf/test"] + :extra-deps {org.clojure/test.check {:mvn/version "1.1.1"} + io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test} + + :poly {:main-opts ["-m" "polylith.clj.core.poly-cli.core"] + :jvm-opts ["-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polylith/clj-poly {:local/root "../../projects/poly"}}}}} From 00babd497076cb9504dd19d3485c7e7179510f40 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:48:20 +0100 Subject: [PATCH 31/35] Updated text. --- examples/poly-rcf/readme.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 66c348af7..06f44f86b 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -1,13 +1,14 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). -To reproduce [issue 261](https://github.com/polyfy/polylith/issues/261): -* Execute `clojure -M:poly test :all :verbose` from the `examples/poly-rcf` directory. +I figured out that I could run the tests from the development project with `clojure -M:poly test :dev project:dev`. I then created `deps-rcf.edn` and `deps-261.edn` and tested both with the same statement by first copying them to `deps.edn`. I figured out that I had to add hyperfiddle/rcf + slf4j to `bases/empty/deps.edn` for the `poly261` to work. I also removed "src" from `:extra-paths` in the `:test` alias in `bases/rcf/deps.edn`, because it wasn't needed. -To execute the tests so that they work: +With these changes, the workspace (using the original `deps.edn` file) behaves like this: +* I can run the `rcf` project with `clojure -M:poly test project:rcf`. +* I can run the `poly261` project with `clojure -M:poly test project:poly261`. +* If I run both `rcf` and `poly261` with `clojure -M:poly test :all`, then `rfc` works, but `poly261` fails. -* From the `development` project: `clojure -M:poly test :dev project:development` -* If we organise the code as a monolith, from `examples/poly-rcf/monolith` with `clj -X:test`. +Before the change in `bases/empty/deps.edn`, I could reproduce the problem in [issue 261](https://github.com/polyfy/polylith/issues/261) by executing `clojure -M:poly test :all :verbose` from the `examples/poly-rcf` directory. This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. @@ -16,5 +17,5 @@ This workspace has been cloned and slightly modified from [Poly 261 - Classpath * Made sure all bricks live in the correct namespace (the `rcf` base needed one extra `rcf` directory). * Use the latest version of the poly tool, in the `:poly` alias in ./deps.edn. * Removed unused `resources` and references to project `test` directories. -* Added `:all` to the `test` command, to make sure all tests are executed. -* Added the `monolith` directory. +* Added hyperfiddle/rcf + slf4j to `bases/empty/deps.edn`. +* Added the `monolith` directory, so that we can execute the code as a monolith with `clj -X:test`. From dbf7264dac1f052876d2bb5e926ca639bda8951b Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:50:10 +0100 Subject: [PATCH 32/35] Minor update. --- examples/poly-rcf/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 06f44f86b..5b77adb5a 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -1,7 +1,7 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). -I figured out that I could run the tests from the development project with `clojure -M:poly test :dev project:dev`. I then created `deps-rcf.edn` and `deps-261.edn` and tested both with the same statement by first copying them to `deps.edn`. I figured out that I had to add hyperfiddle/rcf + slf4j to `bases/empty/deps.edn` for the `poly261` to work. I also removed "src" from `:extra-paths` in the `:test` alias in `bases/rcf/deps.edn`, because it wasn't needed. +I figured out that I could run the tests from the development project with `clojure -M:poly test :dev project:dev`. I then created `deps-rcf.edn` and `deps-261.edn` and tested both with the same statement by first copying them to `deps.edn`. I had to add hyperfiddle/rcf + slf4j to `bases/empty/deps.edn` for the `poly261` to work. I also removed "src" from `:extra-paths` in the `:test` alias in `bases/rcf/deps.edn`, because it wasn't needed. With these changes, the workspace (using the original `deps.edn` file) behaves like this: * I can run the `rcf` project with `clojure -M:poly test project:rcf`. From e01192fe05e2111da118c551986a5c700d7b3d1b Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 07:54:58 +0100 Subject: [PATCH 33/35] Update the text. --- examples/poly-rcf/readme.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 5b77adb5a..858cc329f 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -1,14 +1,12 @@ Example on how to run [Hyperfiddle rcf](https://github.com/hyperfiddle/rcf) tests with [Polylith poly tool](https://polylith.gitbook.io/poly/). -I figured out that I could run the tests from the development project with `clojure -M:poly test :dev project:dev`. I then created `deps-rcf.edn` and `deps-261.edn` and tested both with the same statement by first copying them to `deps.edn`. I had to add hyperfiddle/rcf + slf4j to `bases/empty/deps.edn` for the `poly261` to work. I also removed "src" from `:extra-paths` in the `:test` alias in `bases/rcf/deps.edn`, because it wasn't needed. +I figured out that I could run the tests from the development project with `clojure -M:poly test :dev project:dev`. I then created `deps-rcf.edn` and `deps-261.edn` and tested both with the same statement by first copying them to `deps.edn`. I had to add `hyperfiddle/rcf` + `slf4j` to `bases/empty/deps.edn` for the `poly261` project to work. I also removed "src" from `:extra-paths` in the `:test` alias in `bases/rcf/deps.edn`, because it wasn't needed. With these changes, the workspace (using the original `deps.edn` file) behaves like this: * I can run the `rcf` project with `clojure -M:poly test project:rcf`. * I can run the `poly261` project with `clojure -M:poly test project:poly261`. -* If I run both `rcf` and `poly261` with `clojure -M:poly test :all`, then `rfc` works, but `poly261` fails. - -Before the change in `bases/empty/deps.edn`, I could reproduce the problem in [issue 261](https://github.com/polyfy/polylith/issues/261) by executing `clojure -M:poly test :all :verbose` from the `examples/poly-rcf` directory. +* If I run both `rcf` and `poly261` with `clojure -M:poly test :all`, then `rfc` works, but `poly261` fails. This is the same behaviour I had before the changes, see [issue 261](https://github.com/polyfy/polylith/issues/261). This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. From d8cb1f5a5ab03dd4554a7dfd3202ba30031da585 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 08:04:49 +0100 Subject: [PATCH 34/35] We can run both projects using the external test runner. --- examples/poly-rcf/deps.edn | 3 +++ examples/poly-rcf/readme.md | 1 + examples/poly-rcf/workspace.edn | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/examples/poly-rcf/deps.edn b/examples/poly-rcf/deps.edn index 6e031f968..67a688ca5 100644 --- a/examples/poly-rcf/deps.edn +++ b/examples/poly-rcf/deps.edn @@ -12,4 +12,7 @@ :jvm-opts [;; Run RCF tests when loading files in REPL ;; https://github.com/hyperfiddle/rcf#ci "-Dhyperfiddle.rcf.generate-tests=true"] + :extra-deps {polylith/clj-poly {:local/root "../../projects/poly"}}}}} + ;; Add this line to use the external test runner + a row in workspace.edn. + ;;io.github.seancorfield/polylith-external-test-runner {:git/tag "v0.4.0" :git/sha "eb954fe" :deps/root "projects/runner"}}}}} diff --git a/examples/poly-rcf/readme.md b/examples/poly-rcf/readme.md index 858cc329f..f85ad94a0 100644 --- a/examples/poly-rcf/readme.md +++ b/examples/poly-rcf/readme.md @@ -7,6 +7,7 @@ With these changes, the workspace (using the original `deps.edn` file) behaves l * I can run the `rcf` project with `clojure -M:poly test project:rcf`. * I can run the `poly261` project with `clojure -M:poly test project:poly261`. * If I run both `rcf` and `poly261` with `clojure -M:poly test :all`, then `rfc` works, but `poly261` fails. This is the same behaviour I had before the changes, see [issue 261](https://github.com/polyfy/polylith/issues/261). +* If I run both using the [polylith-external-test-runner](https://github.com/seancorfield/polylith-external-test-runner) then I can run tests for both projecs with `clojure -M:poly test :all`! This workspace has been cloned and slightly modified from [Poly 261 - Classpath stability for tests](https://github.com/ieugen/poly-rcf/pull/1): * Renamed the `issue-261` base to `empty`. diff --git a/examples/poly-rcf/workspace.edn b/examples/poly-rcf/workspace.edn index 9f0c098e4..91b2050ab 100644 --- a/examples/poly-rcf/workspace.edn +++ b/examples/poly-rcf/workspace.edn @@ -6,6 +6,10 @@ :auto-add false} :tag-patterns {:stable "stable-*" :release "v[0-9]*"} + + ;; Add this line to use the external test runner. + ;; :test {:create-test-runner [org.corfield.external-test-runner.interface/create]} + :projects {"development" {:alias "dev"} "rcf" {:alias "rcf" :necessary ["sqldb"]} From 86e84b4633a9bd50b707ce666c2fa397aa891b67 Mon Sep 17 00:00:00 2001 From: Joakim Tengstrand Date: Wed, 6 Mar 2024 21:04:55 +0100 Subject: [PATCH 35/35] 0.2.20-SNAPSHOT #6. --- .../version/src/polylith/clj/core/version/interface.clj | 4 ++-- readme.adoc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/version/src/polylith/clj/core/version/interface.clj b/components/version/src/polylith/clj/core/version/interface.clj index fc6867617..bb066d76a 100644 --- a/components/version/src/polylith/clj/core/version/interface.clj +++ b/components/version/src/polylith/clj/core/version/interface.clj @@ -25,7 +25,7 @@ (def minor 2) (def patch 20) (def revision SNAPSHOT) ;; Set to SNAPSHOT or RELEASE. -(def snapshot 5) ;; Increase by one for every snapshot release, or set to 0 if a release. +(def snapshot 6) ;; Increase by one for every snapshot release, or set to 0 if a release. ;; Also update :snapshot-version: at the top of readme.adoc. (def snapshot? (= SNAPSHOT revision)) @@ -37,7 +37,7 @@ (def tool (if system/extended? "polyx" "poly")) -(def date "2024-03-02") +(def date "2024-03-06") ;; Execute 'poly doc version' to see when different changes was introduced. (def api-version {:breaking 1, :non-breaking 0}) diff --git a/readme.adoc b/readme.adoc index 8649e1634..78945f6c7 100644 --- a/readme.adoc +++ b/readme.adoc @@ -1,5 +1,5 @@ image::doc/images/logo.png[width=400] -:snapshot-version: 5 +:snapshot-version: 6 :cljdoc-doc-url: https://cljdoc.org/d/polylith/clj-poly/CURRENT/doc https://cljdoc.org/d/polylith/clj-poly/0.2.19/doc/readme[image:https://badgen.net/badge/doc/0.2.19/blue[]]