diff --git a/deps.edn b/deps.edn index ff024e61..ab9af51a 100644 --- a/deps.edn +++ b/deps.edn @@ -69,7 +69,8 @@ honeysql/honeysql {:mvn/version "1.0.444"} minimallist/minimallist {:mvn/version "0.0.6"} circleci/bond {:mvn/version "0.4.0"} - version-clj/version-clj {:mvn/version "0.1.2"}}} + version-clj/version-clj {:mvn/version "0.1.2"} + gaka/gaka {:mvn/version "0.3.0"}}} :clj-nvd {:extra-deps {clj-nvd/clj-nvd {:git/url "https://github.com/miikka/clj-nvd.git" :sha "f2ec98699e057a379baf170cb49cf7ad76874a70"}} diff --git a/doc/projects.md b/doc/projects.md index 5ef20e22..4b41d311 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -399,6 +399,41 @@ Library for managing environment variables in Clojure. (prn (:path env)) ``` +### [gaka](https://github.com/cdaddr/gaka) + +``` clojure +(ns script + (:require [babashka.deps :as deps])) + +(deps/add-deps '{:deps {gaka/gaka {:mvn/version "0.3.0"}}}) + +(require '[gaka.core :as gaka]) + +(def rules [:div#foo + :margin "0px" + [:span.bar + :color "black" + :font-weight "bold" + [:a:hover + :text-decoration "none"]]]) + +(println (gaka/css rules)) +``` + +Output: + +``` css +div#foo { + margin: 0px;} + + div#foo span.bar { + color: black; + font-weight: bold;} + + div#foo span.bar a:hover { + text-decoration: none;} +``` + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can diff --git a/test-resources/lib_tests/babashka/run_all_libtests.clj b/test-resources/lib_tests/babashka/run_all_libtests.clj index c331d749..f125d1df 100644 --- a/test-resources/lib_tests/babashka/run_all_libtests.clj +++ b/test-resources/lib_tests/babashka/run_all_libtests.clj @@ -176,6 +176,8 @@ (test-namespaces 'test-check.smoke-test) +(test-namespaces 'gaka.core-test) + ;;;; final exit code (let [{:keys [:test :fail :error] :as m} @status] diff --git a/test-resources/lib_tests/gaka/core_test.clj b/test-resources/lib_tests/gaka/core_test.clj new file mode 100644 index 00000000..7084eee4 --- /dev/null +++ b/test-resources/lib_tests/gaka/core_test.clj @@ -0,0 +1,196 @@ +(ns gaka.core-test + (:require [clojure.test :refer [deftest is #_are]] + [gaka.core :refer [css compile* inline-css render-rule]] + )) + +(defmacro =? [& body] + `(clojure.test/are [x# y#] (= x# y#) + ~@body)) + +(deftest test-flatten + (let [flatten-seqs #'gaka.core/flatten-seqs + flatten-maps #'gaka.core/flatten-maps + flatten-keyvals #'gaka.core/flatten-keyvals] + (=? (flatten-seqs [1 '(2 3)]) + [1 2 3]) + + (=? (flatten-seqs [1 '(2 [3 (4)])]) + [1 2 [3 '(4)]]) + + (=? (flatten-seqs [1 '(2 (3 (4)))]) + [1 2 3 4]) + + (=? (flatten-seqs [1 '(2 3 [4])]) + [1 2 3 [4]]) + + (=? (flatten-maps [1 2 {3 4}]) + [1 2 3 4]) + + #_(=? (flatten-maps [1 {2 3 4 5} 6]) + [1 2 3 4 5 6]) + + (=? (flatten-keyvals [1 '(2 {3 4} 5)]) + [1 2 3 4 5]) + + (=? (flatten-keyvals [1 [2 {3 4}]]) + [1 [2 {3 4}]]) + + (=? (flatten-keyvals [1 '([2] 3 [4] {5 6})]) + [1 [2] 3 [4] 5 6]) +)) + +(deftest test-compile* + (=? (compile* [] [:a]) + [{:selector ["a"] + :keyvals []}] + + (compile* [] [:a :color :red]) + [{:selector ["a"] + :keyvals [:color :red]}] + + (compile* [] [:a {:color :red}]) + [{:selector ["a"] + :keyvals [:color :red]}] + + (compile* [] [:a :color :blue {:color :red}]) + [{:selector ["a"] + :keyvals [:color :blue :color :red]}] + + (compile* [] [:a {:color :red} :color :blue]) + [{:selector ["a"] + :keyvals [:color :red :color :blue]}] + + (compile* [] [:a [:img :border :none]]) + [{:selector ["a"] + :keyvals []} + {:selector ["a" "img"] + :keyvals [:border :none]}] + + (compile* [] [:div [:a [:img :border :none]]]) + [{:selector ["div"] + :keyvals []} + {:selector ["div" "a"] + :keyvals []} + {:selector ["div" "a" "img"] + :keyvals [:border :none]}] + + (compile* [] [:div (list :border :none)]) + [{:selector ["div"] + :keyvals [:border :none]}] + + (compile* [] [:div ["a, img" :border :none]]) + [{:selector ["div"] + :keyvals []} + {:selector ["div" "a"] + :keyvals [:border :none]} + {:selector ["div" "img"] + :keyvals [:border :none]}])) + +(deftest test-mixins + (=? (let [mixin (list :color :red)] + (compile* [] [:a mixin])) + [{:selector ["a"] + :keyvals [:color :red]}] + + (let [a (list [:a :color :red])] + (compile* [] [:div a])) + [{:selector ["div"] + :keyvals []} + {:selector ["div" "a"] + :keyvals [:color :red]}] + + (let [mixin {:color :red}] + (compile* [] [:div mixin])) + [{:selector ["div"] + :keyvals [:color :red]}] + + (let [mixin {:color :red}] + (compile* [] [:div [:a mixin]])) + [{:selector ["div"] + :keyvals []} + {:selector ["div" "a"] + :keyvals [:color :red]}] + + (let [mixin (list :color :red) + els (list [:a mixin] [:span mixin])] + (compile* [] [:div els])) + [{:selector ["div"] + :keyvals []} + {:selector ["div" "a"] + :keyvals [:color :red]} + {:selector ["div" "span"] + :keyvals [:color :red]}] + + (let [mixin (list :color :red {:border :none}) + els (list [:a mixin] :color :blue [:span mixin])] + (compile* [] [:div els])) + [{:selector ["div"] + :keyvals [:color :blue]} + {:selector ["div" "a"] + :keyvals [:color :red :border :none]} + {:selector ["div" "span"] + :keyvals [:color :red :border :none]}])) + +(deftest test-render-rule + (=? (render-rule {:selector ["a"] :keyvals [:color :red]}) + "a {\n color: red;}\n\n" + + (render-rule {:selector ["a"] :keyvals [:color :red :border :none]}) + "a {\n color: red;\n border: none;}\n\n" + + (render-rule {:selector ["a" "img"] :keyvals [:border :none]}) + " a img {\n border: none;}\n\n")) + +(deftest test-css + (=? (css nil) + "" + + (css [:a :color :red [:img :border :none]]) + "a {\n color: red;}\n\n a img {\n border: none;}\n\n" + + (css [:a {:color :red} [:img {:border :none}]]) + "a {\n color: red;}\n\n a img {\n border: none;}\n\n" + + (css [:a :color :red [:img :border :none] :font-style :italic]) + "a {\n color: red;\n font-style: italic;}\n\n a img {\n border: none;}\n\n" + + (css [:body + :padding 0 + [:div#foo + [:a :color :red]] + :margin 0 + [:div#bar + [:a :color :blue]] + :border 0]) + "body {\n padding: 0;\n margin: 0;\n border: 0;}\n\n body div#foo a {\n color: red;}\n\n body div#bar a {\n color: blue;}\n\n")) + +(deftest test-css-no-indent + (binding [gaka.core/*print-indent* false] + (=? (css nil) + "" + + (css [:a :color :red [:img :border :none]]) + "a {\ncolor: red;}\n\na img {\nborder: none;}\n\n" + + (css [:a {:color :red} [:img {:border :none}]]) + "a {\ncolor: red;}\n\na img {\nborder: none;}\n\n" + + (css [:a :color :red [:img :border :none] :font-style :italic]) + "a {\ncolor: red;\nfont-style: italic;}\n\na img {\nborder: none;}\n\n" + + (css [:body + :padding 0 + [:div#foo + [:a :color :red]] + :margin 0 + [:div#bar + [:a :color :blue]] + :border 0]) + "body {\npadding: 0;\nmargin: 0;\nborder: 0;}\n\nbody div#foo a {\ncolor: red;}\n\nbody div#bar a {\ncolor: blue;}\n\n"))) + +(deftest test-inline-css + (=? (inline-css :color :red :border 1) + "color: red; border: 1;") + (is + (re-find #"^(color: red; border: 1;|border: 1; color: red;)$" + (inline-css {:color :red :border 1}))))