From c539c53ae2b93a318221616d400fb79ee0023fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Saunier?= Date: Tue, 1 Dec 2020 10:00:20 +0100 Subject: [PATCH 001/113] Fix broken links in documentation --- doc/advanced/different_routers.md | 2 +- doc/basics/error_messages.md | 2 +- doc/performance.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/advanced/different_routers.md b/doc/advanced/different_routers.md index aa7b78ae..49adebbd 100644 --- a/doc/advanced/different_routers.md +++ b/doc/advanced/different_routers.md @@ -1,6 +1,6 @@ # Different Routers -Reitit ships with several different implementations for the `Router` protocol, originally based on the [Pedestal](https://github.com/pedestal/pedestal/tree/master/route) implementation. `router` function selects the most suitable implementation by inspecting the expanded routes. The implementation can be set manually using `:router` option, see [configuring routers](advanced/configuring_routers.md). +Reitit ships with several different implementations for the `Router` protocol, originally based on the [Pedestal](https://github.com/pedestal/pedestal/tree/master/route) implementation. `router` function selects the most suitable implementation by inspecting the expanded routes. The implementation can be set manually using `:router` option, see [configuring routers](configuring_routers.md). | router | description | | ------------------------------|-------------| diff --git a/doc/basics/error_messages.md b/doc/basics/error_messages.md index 68a38916..1db214b6 100644 --- a/doc/basics/error_messages.md +++ b/doc/basics/error_messages.md @@ -51,4 +51,4 @@ See the [validating route data](route_data_validation.md) page. ## Runtime Exception -See [Exception Handling with Ring](exceptions.md). +See [Exception Handling with Ring](../ring/exceptions.md). diff --git a/doc/performance.md b/doc/performance.md index 38098f80..3609e05e 100644 --- a/doc/performance.md +++ b/doc/performance.md @@ -76,7 +76,7 @@ The routing sample taken from [bide](https://github.com/funcool/bide) README: (r/match-by-path routes "/workspace/1/1"))) ``` -Based on the [perf tests](https://github.com/metosin/reitit/tree/master/perf-test/clj/reitit/perf/bide_perf_test.clj), the first (static path) lookup is 300-500x faster and the second (wildcard path) lookup is 18-110x faster that the other tested routing libs (Ataraxy, Bidi, Compojure and Pedestal). +Based on the [perf tests](https://github.com/metosin/reitit/blob/master/perf-test/clj/reitit/bide_perf_test.clj), the first (static path) lookup is 300-500x faster and the second (wildcard path) lookup is 18-110x faster that the other tested routing libs (Ataraxy, Bidi, Compojure and Pedestal). But, the example is too simple for any real benchmark. Also, some of the libraries always match on the `:request-method` too and by doing so, do more work than just match by path. Compojure does most work also by invoking the handler. @@ -146,6 +146,6 @@ Few things that have an effect on performance: * Wildcard-routes are an order of magnitude slower than static routes * Conflicting routes are served with LinearRouter, which is the slowest implementation. -* It's ok to mix non-wildcard, wildcard or even conflicting routes in a same routing tree. Reitit will create an hierarchy of routers to serve all the routes with best possible implementation. +* It's ok to mix non-wildcard, wildcard or even conflicting routes in a same routing tree. Reitit will create an hierarchy of routers to serve all the routes with best possible implementation. * Move computation from request processing time into creation time, using by compiling [middleware](ring/compiling_middleware.md), [interceptors](http/interceptors.md) and [route data](advanced/configuring_routers.md). * Unmounted middleware (or interceptor) is infinitely faster than a mounted one effectively doing nothing. From a3b251449b1a6c266fd07eaeeeb7e141abe9673b Mon Sep 17 00:00:00 2001 From: Steven Deobald Date: Tue, 15 Dec 2020 15:48:00 -0600 Subject: [PATCH 002/113] Downcase hidden methods in RESTful example - this documentation is mildly confusing when combined with hiccup's `form-to` since hiccup forcibly transforms the method specified in its convenience syntax: `(form-to [:delete "/my-url"] ... )` into an upper-case string: https://github.com/weavejester/hiccup/blob/80e48352dd2bce5277ccdd06334cfb9be915afb4/src/hiccup/form.clj#L130 - it's also common to get an upper-case string from elsewhere so it seems best to wrap the hidden `_method` in `lower-case`. --- doc/ring/RESTful_form_methods.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/ring/RESTful_form_methods.md b/doc/ring/RESTful_form_methods.md index 6ab793b5..d451275c 100644 --- a/doc/ring/RESTful_form_methods.md +++ b/doc/ring/RESTful_form_methods.md @@ -8,9 +8,10 @@ We can do this with middleware in reitit like this: ```clj (defn- hidden-method [request] - (keyword - (or (get-in request [:form-params "_method"]) ;; look for "_method" field in :form-params - (get-in request [:multipart-params "_method"])))) ;; or in :multipart-params + (keyword + (clojure.string/lower-case + (or (get-in request [:form-params "_method"]) ;; look for "_method" field in :form-params + (get-in request [:multipart-params "_method"]))))) ;; or in :multipart-params (def wrap-hidden-method {:name ::wrap-hidden-method From 7fb720ef36ebb6158d5168d1c53d838a2d5b06d0 Mon Sep 17 00:00:00 2001 From: Steven Deobald Date: Tue, 15 Dec 2020 19:29:50 -0600 Subject: [PATCH 003/113] Handle nil for `lower-case` - when "_method" is actually empty, we need to avoid trying to do string manipulation on nil from params. --- doc/ring/RESTful_form_methods.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ring/RESTful_form_methods.md b/doc/ring/RESTful_form_methods.md index d451275c..5faaeb3c 100644 --- a/doc/ring/RESTful_form_methods.md +++ b/doc/ring/RESTful_form_methods.md @@ -8,10 +8,10 @@ We can do this with middleware in reitit like this: ```clj (defn- hidden-method [request] - (keyword - (clojure.string/lower-case - (or (get-in request [:form-params "_method"]) ;; look for "_method" field in :form-params - (get-in request [:multipart-params "_method"]))))) ;; or in :multipart-params + (some-> (or (get-in request [:form-params "_method"]) ;; look for "_method" field in :form-params + (get-in request [:multipart-params "_method"])) ;; or in :multipart-params + clojure.string/lower-case + keyword)) (def wrap-hidden-method {:name ::wrap-hidden-method From 12d3dcabecf2437f48b493a3d504a59730ce2ce6 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Sat, 19 Dec 2020 19:50:35 +0200 Subject: [PATCH 004/113] Fix #457, fix reflection warning in reitit.ring --- modules/reitit-ring/src/reitit/ring.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 727536b4..d33e8410 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -221,7 +221,7 @@ handler (if path (fn [request] (let [uri (:uri request)] - (if (.startsWith uri path) + (if (str/starts-with? uri path) (path-or-index-response (subs uri path-size) uri)))) (fn [request] (let [uri (:uri request) From d663342fbbf2b62db870b034de7bd6feee447a12 Mon Sep 17 00:00:00 2001 From: scott-silver Date: Sun, 27 Dec 2020 10:31:48 -0800 Subject: [PATCH 005/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f67d6eb0..bd766883 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ A Ring routing app with input & output coercion using [data-specs](https://githu :handler (fn [{{{:keys [x y]} :query} :parameters}] {:status 200 :body {:total (+ x y)}})}}]] - ;; router data effecting all routes + ;; router data affecting all routes {:data {:coercion reitit.coercion.spec/coercion :middleware [rrc/coerce-exceptions-middleware rrc/coerce-request-middleware From b4099169be210c49df1b21022383019db40e7189 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 27 Dec 2020 22:50:02 +0200 Subject: [PATCH 006/113] 0..5.11 with updated deps --- CHANGELOG.md | 11 ++++ README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 +-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 +-- examples/frontend-controllers/project.clj | 6 +-- examples/frontend-links/project.clj | 6 +-- examples/frontend-prompt/project.clj | 6 +-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 +-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +- examples/pedestal/project.clj | 4 +- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 54 ++++++++++---------- 47 files changed, 98 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b21dfd..5f6c746f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,17 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Fri, 29 Jan 2021 15:02:35 +0200 Subject: [PATCH 007/113] Allow space as separator, fixes #411 Fixes https://github.com/metosin/reitit/issues/411 --- modules/reitit-core/src/reitit/trie.cljc | 6 ++++-- test/cljc/reitit/trie_test.cljc | 9 ++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index bbd1aded..8cb8f792 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -167,7 +167,7 @@ (instance? CatchAll path) (assoc-in node [:catch-all path] (-node {:params params, :data data})) - (str/blank? path) + (empty? path) (-insert node ps fp params data) :else @@ -439,7 +439,9 @@ ["/v1/topics" 54] ["/v1/orgs" 55] ["/v1/users/:user-id/bookmarks" 56] - ["/v1/orgs/:org-id/topics" 57]] + ["/v1/orgs/:org-id/topics" 57] + ["/command1 {arg1} {arg2}" ::cmd1] + ["/command2 {arg1} {arg2} {arg3}" ::cmd2]] (insert) (compile) (pretty))) diff --git a/test/cljc/reitit/trie_test.cljc b/test/cljc/reitit/trie_test.cljc index 36ba52e4..983d52d0 100644 --- a/test/cljc/reitit/trie_test.cljc +++ b/test/cljc/reitit/trie_test.cljc @@ -121,4 +121,11 @@ (trie/compile) (trie/path-matcher)) "/a")] (is (record? (:params match))) - (is (= (trie/->Match {:a "a"} {:a 1}) (update match :params (partial into {}))))))) + (is (= (trie/->Match {:a "a"} {:a 1}) (update match :params (partial into {})))))) + + (testing "space as separator" + (is (= (trie/->Match {:arg1 "say" :arg2 "hello"} ::cmd1) + ((-> (trie/insert nil "/command1 {arg1} {arg2}" ::cmd1) + (trie/insert "/command2 {arg1} {arg2} {arg3}" ::cmd2) + (trie/compile) + (trie/path-matcher)) "/command1 say hello"))))) From 36673d4674ba2cce07a62ffa859a13e4246b8004 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 29 Jan 2021 15:08:44 +0200 Subject: [PATCH 008/113] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f6c746f..c756f011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Thu, 4 Feb 2021 08:41:33 +0200 Subject: [PATCH 009/113] Upgrade dependencies --- project.clj | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/project.clj b/project.clj index e8942853..7cb1d89b 100644 --- a/project.clj +++ b/project.clj @@ -28,16 +28,16 @@ [metosin/reitit-sieppari "0.5.11"] [metosin/reitit-pedestal "0.5.11"] [metosin/ring-swagger-ui "3.36.0"] - [metosin/spec-tools "0.10.4"] + [metosin/spec-tools "0.10.5"] [metosin/schema-tools "0.12.2"] [metosin/muuntaja "0.6.7"] - [metosin/jsonista "0.3.0"] + [metosin/jsonista "0.3.1"] [metosin/sieppari "0.0.0-alpha13"] [metosin/malli "0.2.1"] ;; https://clojureverse.org/t/depending-on-the-right-versions-of-jackson-libraries/5111 - [com.fasterxml.jackson.core/jackson-core "2.12.0"] - [com.fasterxml.jackson.core/jackson-databind "2.12.0"] + [com.fasterxml.jackson.core/jackson-core "2.12.1"] + [com.fasterxml.jackson.core/jackson-databind "2.12.1"] [meta-merge "1.0.0"] [fipp "0.6.23" :exclusions [org.clojure/core.rrb-vector]] @@ -77,15 +77,15 @@ :java-source-paths ["modules/reitit-core/java-src"] - :dependencies [[org.clojure/clojure "1.10.1"] - [org.clojure/clojurescript "1.10.597"] + :dependencies [[org.clojure/clojure "1.10.2"] + [org.clojure/clojurescript "1.10.773"] ;; modules dependencies [metosin/schema-tools "0.12.2"] - [metosin/spec-tools "0.10.4"] + [metosin/spec-tools "0.10.5"] [metosin/muuntaja "0.6.7"] [metosin/sieppari "0.0.0-alpha13"] - [metosin/jsonista "0.2.7"] + [metosin/jsonista "0.3.1"] [metosin/malli "0.2.1"] [lambdaisland/deep-diff "0.0-47"] [meta-merge "1.0.0"] @@ -93,7 +93,7 @@ [expound "0.8.7"] [fipp "0.6.23"] - [orchestra "2020.09.18-1"] + [orchestra "2021.01.01-1"] [ring "1.8.2"] [ikitommi/immutant-web "3.0.0-alpha1"] From f43a8311fc0ebf33cc02b07e06f90ab55638a8e4 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 4 Feb 2021 20:40:25 +0200 Subject: [PATCH 010/113] 0.5.12 --- CHANGELOG.md | 16 +++++++ README.md | 4 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 +-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 +-- examples/frontend-controllers/project.clj | 6 +-- examples/frontend-links/project.clj | 6 +-- examples/frontend-prompt/project.clj | 6 +-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 +-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +- examples/pedestal/project.clj | 4 +- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 48 ++++++++++---------- 47 files changed, 101 insertions(+), 85 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c756f011..eb0b4d88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,22 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Thu, 4 Feb 2021 20:48:08 +0200 Subject: [PATCH 011/113] mob rules --- CHANGELOG.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb0b4d88..2df41651 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,6 @@ We use [Break Versioning][breakver]. The version numbers follow a `.. Date: Wed, 17 Feb 2021 16:09:20 +0200 Subject: [PATCH 012/113] Start using GitHub Actions --- .github/workflows/testsuite.yml | 78 +++++++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/testsuite.yml diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml new file mode 100644 index 00000000..85e86658 --- /dev/null +++ b/.github/workflows/testsuite.yml @@ -0,0 +1,78 @@ +name: testsuite + +on: + push: + pull_request: + +jobs: + build-clj: + strategy: + matrix: + # Supported Java versions: LTS releases 8 and 11 and the latest release + jdk: [8, 11, 15] + + name: Clojure (Java ${{ matrix.jdk }}) + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-clj-${{ hashFiles('**/project.clj') }} + restore-keys: | + ${{ runner.os }}-clj- + - name: Setup Java ${{ matrix.jdk }} + uses: actions/setup-java@v1.4.3 + with: + java-version: ${{ matrix.jdk }} + - name: Setup Clojure + uses: DeLaGuardo/setup-clojure@3.1 + with: + lein: 2.9.5 + - name: Run tests + run: ./scripts/test.sh clj + + build-cljs: + name: ClojureScript + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: | + ~/.m2/repository + **/node_modules + key: ${{ runner.os }}-cljs-${{ hashFiles('**/project.clj', '**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-cljs- + - name: Setup Java 11 + uses: actions/setup-java@v1.4.3 + with: + java-version: 11 + - name: Setup Clojure + uses: DeLaGuardo/setup-clojure@3.1 + with: + lein: 2.9.5 + - name: Setup Node.js + uses: actions/setup-node@v2.1.2 + with: + node-version: 12 + - name: Install dependencies + run: | + npm ci + - name: Install modules + run: ./scripts/lein-modules install + - name: Run tests + run: ./scripts/test.sh cljs + + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Verify cljdoc.edn + run: curl -fsSL https://raw.githubusercontent.com/cljdoc/cljdoc/master/script/verify-cljdoc-edn | bash -s doc/cljdoc.edn diff --git a/README.md b/README.md index 46aaa9ef..e075bdff 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# reitit [![Build Status](https://img.shields.io/circleci/project/github/metosin/reitit.svg)](https://circleci.com/gh/metosin/reitit) [![cljdoc badge](https://cljdoc.org/badge/metosin/reitit)](https://cljdoc.org/jump/release/metosin/reitit) [![Slack](https://img.shields.io/badge/clojurians-reitit-blue.svg?logo=slack)](https://clojurians.slack.com/messages/reitit/) +# reitit [![Build Status](https://github.com/metosin/reitit/workflows/testsuite/badge.svg)](https://github.com/metosin/reitit/actions?query=workflow%3Atestsuite) [![cljdoc badge](https://cljdoc.org/badge/metosin/reitit)](https://cljdoc.org/jump/release/metosin/reitit) [![Slack](https://img.shields.io/badge/clojurians-reitit-blue.svg?logo=slack)](https://clojurians.slack.com/messages/reitit/) A fast data-driven router for Clojure(Script). From d80f1038f689bbb7d5a4e4aa9b69995fb8b1433b Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Wed, 17 Feb 2021 16:22:17 +0200 Subject: [PATCH 013/113] Stop using CircleCI --- .circleci/config.yml | 86 -------------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 00ab4f3d..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,86 +0,0 @@ -version: 2.1 - -jobs: - test-clj: - working_directory: ~/test - parameters: - image-name: - type: string - docker: - - image: << parameters.image-name >> - steps: - - checkout - - restore_cache: - keys: - - 'v1-clj-{{ checksum "project.clj" }}' - - 'v1-clj-' - - 'v1-test-' - - run: - name: Install modules - command: ./scripts/lein-modules install - - run: - name: Run tests - command: ./scripts/test.sh clj - - run: - name: Install curl if missing - command: apt update && apt install -y curl - - run: - name: Verify cljdoc.edn - command: curl -fsSL https://raw.githubusercontent.com/cljdoc/cljdoc/master/script/verify-cljdoc-edn | bash -s doc/cljdoc.edn - - store_test_results: - # path must be a directory under which there a subdirectories that - # contain the JUnit XML files. - path: ~/test/target/results -# - run: -# name: Run coverage -# command: ./scripts/submit-to-coveralls.sh clj - - save_cache: - key: 'v1-clj-{{ checksum "project.clj" }}' - paths: - - ~/.m2 - - ~/.cljs/.aot_cache - - test-cljs: - working_directory: ~/test - docker: - - image: circleci/clojure:lein-2.8.1-node-browsers - steps: - - checkout - - restore_cache: - keys: - - 'v1-cljs-{{ checksum "project.clj" }}-{{ checksum "package.json" }}' - - 'v1-cljs-' - - run: - name: Install npm dependencies - command: npm install - - run: - name: Install modules - command: ./scripts/lein-modules install - - run: - name: Run tests - command: ./scripts/test.sh cljs - - store_test_results: - path: ~/test/target/results - - save_cache: - key: 'v1-cljs-{{ checksum "project.clj" }}-{{ checksum "package.json" }}' - paths: - - ~/.m2 - - ~/test/node_modules - -workflows: - version: 2 - test-and-build-docs: - jobs: - - test-clj: - name: jdk8 - image-name: clojure:openjdk-8-lein-2.9.1 - - test-clj: - name: jdk11 - image-name: clojure:openjdk-11-lein-2.9.1 - - test-clj: - name: jdk13 - image-name: clojure:openjdk-13-lein-2.9.1 - - test-clj: - name: jdk14 - image-name: clojure:openjdk-14-lein-2.9.1 - - test-cljs From 902b33f00485f96d2252f76c1c1b19cd09c7616f Mon Sep 17 00:00:00 2001 From: Kari Marttila Date: Fri, 19 Feb 2021 15:17:26 +0200 Subject: [PATCH 014/113] Support not-found-handler with path in resource handler (#464) --- modules/reitit-ring/src/reitit/ring.cljc | 3 ++- test/cljc/reitit/ring_test.cljc | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index d33e8410..0c6460e8 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -222,7 +222,8 @@ (fn [request] (let [uri (:uri request)] (if (str/starts-with? uri path) - (path-or-index-response (subs uri path-size) uri)))) + (or (path-or-index-response (subs uri path-size) uri) + (not-found-handler request))))) (fn [request] (let [uri (:uri request) path (-> request :path-params parameter)] diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 5d3e872a..67bb4171 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -547,7 +547,7 @@ (let [app (ring/ring-handler (ring/router []) (ring/routes - (create {:path "/"}) + (create {:path "/" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) (ring/create-default-handler)))] (testing test (testing "different file-types" @@ -568,7 +568,8 @@ (testing "not found" (let [response (app (request "/not-found"))] - (is (= 404 (:status response))))) + (is (= 404 (:status response))) + (is (= "resource-handler" (:body response))))) (testing "3-arity" (let [result (atom nil) @@ -583,7 +584,7 @@ (let [app (ring/ring-handler (ring/router []) (ring/routes - (create {:path "/files"}) + (create {:path "/files" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) (ring/create-default-handler))) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] @@ -605,8 +606,12 @@ (is (= (redirect "/docs/index.html") response)))) (testing "not found" - (let [response (app (request "/not-found"))] - (is (= 404 (:status response))))) + (let [response (app {:uri "/not-found" :request-method :get})] + (is (= 404 (:status response))) + (is (= "" (:body response)))) + (let [response (app {:uri "/files/not-found" :request-method :get})] + (is (= 404 (:status response))) + (is (= "resource-handler" (:body response))))) (testing "3-arity" (let [result (atom nil) From 60fee3173367c6a11d19b756b3501cd6e14b000e Mon Sep 17 00:00:00 2001 From: Kari Marttila Date: Sat, 20 Feb 2021 21:00:59 +0200 Subject: [PATCH 015/113] Missing curly brace in documentation - I noticed this while trying the example in REPL --- doc/coercion/malli_coercion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/coercion/malli_coercion.md b/doc/coercion/malli_coercion.md index 7c041d98..ee9a37bb 100644 --- a/doc/coercion/malli_coercion.md +++ b/doc/coercion/malli_coercion.md @@ -13,7 +13,7 @@ :coercion reitit.coercion.malli/coercion :parameters {:path [:map [:company string?] - [:user-id int?]]}] + [:user-id int?]]}}] {:compile coercion/compile-request-coercers})) (defn match-by-path-and-coerce! [path] From 88897a2264b0bc8d74cf65642782eff96119f49a Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 26 Feb 2021 07:41:03 +0200 Subject: [PATCH 016/113] Remove useless testing calls --- test/cljc/reitit/ring_test.cljc | 214 ++++++++++++++++---------------- 1 file changed, 105 insertions(+), 109 deletions(-) diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 67bb4171..c1d15d06 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -474,35 +474,34 @@ (ring/router ["/*" (create nil)]) (ring/create-default-handler))] - (testing test - (testing "different file-types" - (let [response (app (request "/hello.json"))] - (is (= "application/json" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) - (let [response (app (request "/hello.xml"))] - (is (= "text/xml" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body response)))))) + (testing "different file-types" + (let [response (app (request "/hello.json"))] + (is (= "application/json" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) + (let [response (app (request "/hello.xml"))] + (is (= "text/xml" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body response)))))) - (testing "index-files" - (let [response (app (request "/docs"))] - (is (= (redirect "/docs/index.html") response))) - (let [response (app (request "/docs/"))] - (is (= (redirect "/docs/index.html") response)))) + (testing "index-files" + (let [response (app (request "/docs"))] + (is (= (redirect "/docs/index.html") response))) + (let [response (app (request "/docs/"))] + (is (= (redirect "/docs/index.html") response)))) - (testing "not found" - (let [response (app (request "/not-found"))] - (is (= 404 (:status response))))) + (testing "not found" + (let [response (app (request "/not-found"))] + (is (= 404 (:status response))))) - (testing "3-arity" - (let [result (atom nil) - respond (partial reset! result) - raise ::not-called] - (app (request "/hello.xml") respond raise) - (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) - (is (get-in @result [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body @result))))))))) + (testing "3-arity" + (let [result (atom nil) + respond (partial reset! result) + raise ::not-called] + (app (request "/hello.xml") respond raise) + (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) + (is (get-in @result [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body @result)))))))) (testing "from path" (let [app (ring/ring-handler @@ -511,35 +510,34 @@ (ring/create-default-handler)) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] - (testing test - (testing "different file-types" - (let [response (app (request "/hello.json"))] - (is (= "application/json" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) - (let [response (app (request "/hello.xml"))] - (is (= "text/xml" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body response)))))) + (testing "different file-types" + (let [response (app (request "/hello.json"))] + (is (= "application/json" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) + (let [response (app (request "/hello.xml"))] + (is (= "text/xml" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body response)))))) - (testing "index-files" - (let [response (app (request "/docs"))] - (is (= (redirect "/docs/index.html") response))) - (let [response (app (request "/docs/"))] - (is (= (redirect "/docs/index.html") response)))) + (testing "index-files" + (let [response (app (request "/docs"))] + (is (= (redirect "/docs/index.html") response))) + (let [response (app (request "/docs/"))] + (is (= (redirect "/docs/index.html") response)))) - (testing "not found" - (let [response (app (request "/not-found"))] - (is (= 404 (:status response))))) + (testing "not found" + (let [response (app (request "/not-found"))] + (is (= 404 (:status response))))) - (testing "3-arity" - (let [result (atom nil) - respond (partial reset! result) - raise ::not-called] - (app (request "/hello.xml") respond raise) - (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) - (is (get-in @result [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body @result)))))))))) + (testing "3-arity" + (let [result (atom nil) + respond (partial reset! result) + raise ::not-called] + (app (request "/hello.xml") respond raise) + (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) + (is (get-in @result [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body @result))))))))) (testing "outside a router" @@ -549,36 +547,35 @@ (ring/routes (create {:path "/" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) (ring/create-default-handler)))] - (testing test - (testing "different file-types" - (let [response (app (request "/hello.json"))] - (is (= "application/json" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) - (let [response (app (request "/hello.xml"))] - (is (= "text/xml" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body response)))))) + (testing "different file-types" + (let [response (app (request "/hello.json"))] + (is (= "application/json" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) + (let [response (app (request "/hello.xml"))] + (is (= "text/xml" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body response)))))) - (testing "index-files" - (let [response (app (request "/docs"))] - (is (= (redirect "/docs/index.html") response))) - (let [response (app (request "/docs/"))] - (is (= (redirect "/docs/index.html") response)))) + (testing "index-files" + (let [response (app (request "/docs"))] + (is (= (redirect "/docs/index.html") response))) + (let [response (app (request "/docs/"))] + (is (= (redirect "/docs/index.html") response)))) - (testing "not found" - (let [response (app (request "/not-found"))] - (is (= 404 (:status response))) - (is (= "resource-handler" (:body response))))) + (testing "not found" + (let [response (app (request "/not-found"))] + (is (= 404 (:status response))) + (is (= "resource-handler" (:body response))))) - (testing "3-arity" - (let [result (atom nil) - respond (partial reset! result) - raise ::not-called] - (app (request "/hello.xml") respond raise) - (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) - (is (get-in @result [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body @result))))))))) + (testing "3-arity" + (let [result (atom nil) + respond (partial reset! result) + raise ::not-called] + (app (request "/hello.xml") respond raise) + (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) + (is (get-in @result [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body @result)))))))) (testing "from path" (let [app (ring/ring-handler @@ -588,39 +585,38 @@ (ring/create-default-handler))) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] - (testing test - (testing "different file-types" - (let [response (app (request "/hello.json"))] - (is (= "application/json" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) - (let [response (app (request "/hello.xml"))] - (is (= "text/xml" (get-in response [:headers "Content-Type"]))) - (is (get-in response [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body response)))))) + (testing "different file-types" + (let [response (app (request "/hello.json"))] + (is (= "application/json" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "{\"hello\": \"file\"}" (slurp (:body response))))) + (let [response (app (request "/hello.xml"))] + (is (= "text/xml" (get-in response [:headers "Content-Type"]))) + (is (get-in response [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body response)))))) - (testing "index-files" - (let [response (app (request "/docs"))] - (is (= (redirect "/docs/index.html") response))) - (let [response (app (request "/docs/"))] - (is (= (redirect "/docs/index.html") response)))) + (testing "index-files" + (let [response (app (request "/docs"))] + (is (= (redirect "/docs/index.html") response))) + (let [response (app (request "/docs/"))] + (is (= (redirect "/docs/index.html") response)))) - (testing "not found" - (let [response (app {:uri "/not-found" :request-method :get})] - (is (= 404 (:status response))) - (is (= "" (:body response)))) - (let [response (app {:uri "/files/not-found" :request-method :get})] - (is (= 404 (:status response))) - (is (= "resource-handler" (:body response))))) + (testing "not found" + (let [response (app {:uri "/not-found" :request-method :get})] + (is (= 404 (:status response))) + (is (= "" (:body response)))) + (let [response (app {:uri "/files/not-found" :request-method :get})] + (is (= 404 (:status response))) + (is (= "resource-handler" (:body response))))) - (testing "3-arity" - (let [result (atom nil) - respond (partial reset! result) - raise ::not-called] - (app (request "/hello.xml") respond raise) - (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) - (is (get-in @result [:headers "Last-Modified"])) - (is (= "file\n" (slurp (:body @result))))))))))))))) + (testing "3-arity" + (let [result (atom nil) + respond (partial reset! result) + raise ::not-called] + (app (request "/hello.xml") respond raise) + (is (= "text/xml" (get-in @result [:headers "Content-Type"]))) + (is (get-in @result [:headers "Last-Modified"])) + (is (= "file\n" (slurp (:body @result)))))))))))))) (deftest router-available-in-default-branch (testing "1-arity" From 5824d9eeef63596d6dc0277c79805d29d8982428 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 26 Feb 2021 08:14:01 +0200 Subject: [PATCH 017/113] Make the not-found-handler fix backwards compatible PR #471 aimed to fix issue #464. However, the change was slightly backwards-incompatible, since it made the file and resource handlers use the default 404 handler when mounted outside of the router. The previous behavior was to return nil in that case. This patch restores the previous behavior and clarifies that `:path` option can be used only when the file/resource handler is mounted outside of a router. --- modules/reitit-ring/src/reitit/ring.cljc | 8 +++-- test/cljc/reitit/ring_test.cljc | 40 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 0c6460e8..0e513847 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -195,7 +195,9 @@ root "public" index-files ["index.html"] paths (constantly nil) - not-found-handler (constantly {:status 404, :body "", :headers {}})}}] + not-found-handler (if path + (constantly nil) + (constantly {:status 404, :body "", :headers {}}))}}] (let [options {:root root :loader loader :index-files? false @@ -239,7 +241,7 @@ | -------------------|-------------| | :parameter | optional name of the wildcard parameter, defaults to unnamed keyword `:` | :root | optional resource root, defaults to `\"public\"` - | :path | optional path to mount the handler to. Works only if mounted outside of a router. + | :path | path to mount the handler to. Required when mounted outside of a router, does not work inside a router. | :loader | optional class loader to resolve the resources | :index-files | optional vector of index-files to look in a resource directory, defaults to `[\"index.html\"]` | :not-found-handler | optional handler function to use if the requested resource is missing (404 Not Found)" @@ -256,7 +258,7 @@ | -------------------|-------------| | :parameter | optional name of the wildcard parameter, defaults to unnamed keyword `:` | :root | optional resource root, defaults to `\"public\"` - | :path | optional path to mount the handler to. Works only if mounted outside of a router. + | :path | path to mount the handler to. Required when mounted outside of a router, does not work inside a router. | :loader | optional class loader to resolve the resources | :index-files | optional vector of index-files to look in a resource directory, defaults to `[\"index.html\"]` | :not-found-handler | optional handler function to use if the requested resource is missing (404 Not Found)" diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index c1d15d06..52dd938b 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -618,6 +618,46 @@ (is (get-in @result [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body @result)))))))))))))) + +#?(:clj + (deftest file-resource-handler-not-found-test + (let [redirect (fn [uri] {:status 302, :body "", :headers {"Location" uri}}) + request (fn [uri] {:uri uri, :request-method :get}) + not-found-handler (fn [_] {:status 404, :body "not-found-handler"})] + + (doseq [[name create] [["resource-handler" ring/create-resource-handler] + ["file-handler" #(ring/create-file-handler (assoc % :root "dev-resources/public"))]]] + (testing (str "for " name) + (testing "inside a router" + (let [create-app (fn [handler] + (ring/ring-handler + (ring/router + ["/files/*" handler])))] + (testing "not-found-handler not set" + (let [app (create-app (create nil))] + (is (nil? (app (request "/not-found")))) + (is (= "" (:body (app (request "/files/not-found"))))))) + + (testing "not-found-handler set" + (let [app (create-app (create {:not-found-handler not-found-handler}))] + (is (nil? (app (request "/not-found")))) + (is (= "not-found-handler" (:body (app (request "/files/not-found"))))))))) + + (testing "outside a router" + (let [create-app (fn [handler] + (ring/ring-handler + (ring/router []) + handler))] + (testing "not-found-handler not set" + (let [app (create-app (create {:path "/files"}))] + (is (nil? (app (request "/not-found")))) + (is (nil? (app (request "/files/not-found")))))) + + (testing "not-found-handler set" + (let [app (create-app (create {:path "/files" :not-found-handler not-found-handler}))] + (is (nil? (app (request "/not-found")))) + (is (= "not-found-handler" (:body (app (request "/files/not-found")))))))))))))) + (deftest router-available-in-default-branch (testing "1-arity" ((ring/ring-handler From 39fc17c5fd78e37dd9df5963f1f6f157a9f1b315 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 26 Feb 2021 08:45:29 +0200 Subject: [PATCH 018/113] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2df41651..8be5af31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Fri, 26 Feb 2021 08:46:01 +0200 Subject: [PATCH 019/113] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8be5af31..d1f05d2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Sat, 27 Feb 2021 19:22:42 +0200 Subject: [PATCH 020/113] update deps --- CHANGELOG.md | 11 +++++++++++ project.clj | 16 ++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1f05d2b..61bd25b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,17 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 2 Mar 2021 08:28:36 +0200 Subject: [PATCH 021/113] Copy file & resource handler docstring update to docs --- doc/ring/static.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ring/static.md b/doc/ring/static.md index 10a7b03c..375d68d3 100644 --- a/doc/ring/static.md +++ b/doc/ring/static.md @@ -52,7 +52,7 @@ A better way to serve files from conflicting paths, e.g. `"/*"`, is to serve the | -----------------|-------------| | :parameter | optional name of the wildcard parameter, defaults to unnamed keyword `:` | :root | optional resource root, defaults to `\"public\"` -| :path | optional path to mount the handler to. Works only if mounted outside of a router. +| :path | path to mount the handler to. Required when mounted outside of a router, does not work inside a router. | :loader | optional class loader to resolve the resources | :index-files | optional vector of index-files to look in a resource directory, defaults to `[\"index.html\"]` | :not-found-handler | optional handler function to use if the requested resource is missing (404 Not Found) From 8567550ad98fa363c2a31b5abe4db4d72e1460f8 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Tue, 2 Mar 2021 08:39:18 +0200 Subject: [PATCH 022/113] Document serving static resources from the file system --- doc/ring/static.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/ring/static.md b/doc/ring/static.md index 375d68d3..058f3199 100644 --- a/doc/ring/static.md +++ b/doc/ring/static.md @@ -1,8 +1,12 @@ # Static Resources (Clojure Only) -Static resources can be served using `reitit.ring/create-resource-handler`. It takes optionally an options map and returns a ring handler to serve files from Classpath. +Static resources can be served by using the following two functions: -There are two options to serve the files. +* `reitit.ring/create-resource-handler`, which returns a Ring handler that serves files from classpath, and +* `reitit.ring/create-file-handler`, which returns a Ring handler that servers files from file system + +There are two ways to mount the handlers. +The examples below use `reitit.ring/create-resource-handler`, but `reitit.ring/create-file-handler` works the same way. ## Internal routes @@ -33,7 +37,9 @@ To serve static files with conflicting routes, e.g. `"/*"`, one needs to disable ## External routes -A better way to serve files from conflicting paths, e.g. `"/*"`, is to serve them from the default-handler. One can compose multiple default locations using `ring-handler`. This way, they are only served if none of the actual routes have matched. +A better way to serve files from conflicting paths, e.g. `"/*"`, is to serve them from the default-handler. +One can compose multiple default locations using `reitit.ring/ring-handler`. +This way, they are only served if none of the actual routes have matched. ```clj (ring/ring-handler @@ -46,10 +52,10 @@ A better way to serve files from conflicting paths, e.g. `"/*"`, is to serve the ## Configuration -`reitit.ring/create-resource-handler` takes optionally an options map to configure how the files are being served. +`reitit.ring/create-file-handler` and `reitit.ring/create-resource-handler` take optionally an options map to configure how the files are being served. -| key | description | -| -----------------|-------------| +| key | description | +| -------------------|-------------| | :parameter | optional name of the wildcard parameter, defaults to unnamed keyword `:` | :root | optional resource root, defaults to `\"public\"` | :path | path to mount the handler to. Required when mounted outside of a router, does not work inside a router. @@ -58,9 +64,7 @@ A better way to serve files from conflicting paths, e.g. `"/*"`, is to serve the | :not-found-handler | optional handler function to use if the requested resource is missing (404 Not Found) - ### TODO * support for things like `:cache`, `:etag`, `:last-modified?`, and `:gzip` * support for ClojureScript -* serve from file-system From 7520cd425c1d4939dd2a2b73691ac536050c9b7f Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 2 Mar 2021 21:24:04 +0200 Subject: [PATCH 023/113] malli 0.3.0 --- CHANGELOG.md | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61bd25b6..f2ffb1a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Fri, 5 Mar 2021 20:45:28 +0200 Subject: [PATCH 024/113] Update development.md --- doc/development.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/development.md b/doc/development.md index d57abae6..005bb863 100644 --- a/doc/development.md +++ b/doc/development.md @@ -18,13 +18,17 @@ The documentation lives under `doc` and it is hosted on [cljdoc](https://cljdoc.org). See their documentation for [library authors](https://github.com/cljdoc/cljdoc/blob/master/doc/userguide/for-library-authors.adoc) -## To bump up version: +## Making a release We use [Break Versioning][breakver]. Remember our promise: patch-level bumps never include breaking changes! [breakver]: https://github.com/ptaoussanis/encore/blob/master/BREAK-VERSIONING.md ```bash +# Check that you're using Java 8! Making the release with a newer Java version +# means that it is broken when used with Java 8. +java -version + # new version ./scripts/set-version "1.0.0" ./scripts/lein-modules install From c033f10e4ec455f359657a0d1933e46f6e5b96b0 Mon Sep 17 00:00:00 2001 From: Jonathon McKitrick <518057+jmckitrick@users.noreply.github.com> Date: Thu, 11 Mar 2021 08:41:31 -0500 Subject: [PATCH 025/113] Update swagger_ui.cljc Fix spelling in docstring. --- modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc index 52ee5856..4603b11c 100644 --- a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc +++ b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc @@ -12,7 +12,7 @@ | :root | optional resource root, defaults to `\"swagger-ui\"` | :url | path to swagger endpoint, defaults to `/swagger.json` | :path | optional path to mount the handler to. Works only if mounted outside of a router. - | :config | parameters passed to swaggger-ui as-is. + | :config | parameters passed to swagger-ui as-is. See https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md for all available :config options. From 8a205002a81fe3dbed13e96934f522d63e81f8bb Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Thu, 11 Mar 2021 20:55:52 +0200 Subject: [PATCH 026/113] Add examples for Swagger parameter description --- .../ring-malli-swagger/src/example/server.clj | 16 ++++++++++++++-- .../ring-spec-swagger/src/example/server.clj | 8 +++++++- examples/ring-swagger/src/example/server.clj | 13 +++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/examples/ring-malli-swagger/src/example/server.clj b/examples/ring-malli-swagger/src/example/server.clj index 1a5d7d89..bc9c3861 100644 --- a/examples/ring-malli-swagger/src/example/server.clj +++ b/examples/ring-malli-swagger/src/example/server.clj @@ -56,13 +56,25 @@ ["/plus" {:get {:summary "plus with malli query parameters" - :parameters {:query [:map [:x int?] [:y int?]]} + :parameters {:query [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} :responses {200 {:body [:map [:total int?]]}} :handler (fn [{{{:keys [x y]} :query} :parameters}] {:status 200 :body {:total (+ x y)}})} :post {:summary "plus with malli body parameters" - :parameters {:body [:map [:x int?] [:y int?]]} + :parameters {:body [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} :responses {200 {:body [:map [:total int?]]}} :handler (fn [{{{:keys [x y]} :body} :parameters}] {:status 200 diff --git a/examples/ring-spec-swagger/src/example/server.clj b/examples/ring-spec-swagger/src/example/server.clj index 69615800..2337792b 100644 --- a/examples/ring-spec-swagger/src/example/server.clj +++ b/examples/ring-spec-swagger/src/example/server.clj @@ -13,6 +13,7 @@ ; [reitit.ring.middleware.dev :as dev] ; [reitit.ring.spec :as spec] ; [spec-tools.spell :as spell] + [spec-tools.data-spec :as ds] [ring.adapter.jetty :as jetty] [muuntaja.core :as m] [clojure.spec.alpha :as s] @@ -25,7 +26,12 @@ (s/def ::size int?) (s/def ::file-response (s/keys :req-un [::name ::size])) -(s/def ::x int?) +;; Use data-specs to provide extra JSON-Schema properties: +;; https://github.com/metosin/spec-tools/blob/master/docs/04_json_schema.md#annotated-specs +(s/def ::x (ds/spec {:spec int? + :name "X parameter" + :description "Description for X parameter" + :json-schema/default 42})) (s/def ::y int?) (s/def ::total int?) (s/def ::math-request (s/keys :req-un [::x ::y])) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index 8416c2b4..bab482ca 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -11,8 +11,7 @@ [reitit.ring.middleware.parameters :as parameters] ;; Uncomment to use ; [reitit.ring.middleware.dev :as dev] - ; [reitit.ring.spec :as spec] - ; [spec-tools.spell :as spell] + [schema-tools.core :as st] [ring.adapter.jetty :as jetty] [muuntaja.core :as m] [clojure.java.io :as io])) @@ -53,13 +52,19 @@ ["/plus" {:get {:summary "plus with spec query parameters" - :parameters {:query {:x int?, :y int?}} + :parameters {:query {:x (st/schema int? {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42}) + :y int?}} :responses {200 {:body {:total int?}}} :handler (fn [{{{:keys [x y]} :query} :parameters}] {:status 200 :body {:total (+ x y)}})} :post {:summary "plus with spec body parameters" - :parameters {:body {:x int?, :y int?}} + :parameters {:body {:x int? #_(st/schema int? {:name "X parameter" + :description "Description for X parameter" + :json-schema/default 42}) + :y int?}} :responses {200 {:body {:total int?}}} :handler (fn [{{{:keys [x y]} :body} :parameters}] {:status 200 From 1992198b58ad8dba656bcce3a7398ee838e1a619 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Thu, 11 Mar 2021 21:22:33 +0200 Subject: [PATCH 027/113] Fix spec example --- examples/ring-spec-swagger/src/example/server.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ring-spec-swagger/src/example/server.clj b/examples/ring-spec-swagger/src/example/server.clj index 2337792b..31ac2bc0 100644 --- a/examples/ring-spec-swagger/src/example/server.clj +++ b/examples/ring-spec-swagger/src/example/server.clj @@ -13,7 +13,7 @@ ; [reitit.ring.middleware.dev :as dev] ; [reitit.ring.spec :as spec] ; [spec-tools.spell :as spell] - [spec-tools.data-spec :as ds] + [spec-tools.core :as st] [ring.adapter.jetty :as jetty] [muuntaja.core :as m] [clojure.spec.alpha :as s] @@ -28,7 +28,7 @@ ;; Use data-specs to provide extra JSON-Schema properties: ;; https://github.com/metosin/spec-tools/blob/master/docs/04_json_schema.md#annotated-specs -(s/def ::x (ds/spec {:spec int? +(s/def ::x (st/spec {:spec int? :name "X parameter" :description "Description for X parameter" :json-schema/default 42})) From c212a7a9fa6ef9d4ee795df04907fd984fdfd7d6 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Thu, 11 Mar 2021 21:56:22 +0200 Subject: [PATCH 028/113] Ring-swagger is not Schema example --- examples/ring-swagger/src/example/server.clj | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index bab482ca..72ba95d2 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -11,7 +11,6 @@ [reitit.ring.middleware.parameters :as parameters] ;; Uncomment to use ; [reitit.ring.middleware.dev :as dev] - [schema-tools.core :as st] [ring.adapter.jetty :as jetty] [muuntaja.core :as m] [clojure.java.io :as io])) @@ -52,18 +51,14 @@ ["/plus" {:get {:summary "plus with spec query parameters" - :parameters {:query {:x (st/schema int? {:title "X parameter" - :description "Description for X parameter" - :json-schema/default 42}) + :parameters {:query {:x int? :y int?}} :responses {200 {:body {:total int?}}} :handler (fn [{{{:keys [x y]} :query} :parameters}] {:status 200 :body {:total (+ x y)}})} :post {:summary "plus with spec body parameters" - :parameters {:body {:x int? #_(st/schema int? {:name "X parameter" - :description "Description for X parameter" - :json-schema/default 42}) + :parameters {:body {:x int? :y int?}} :responses {200 {:body {:total int?}}} :handler (fn [{{{:keys [x y]} :body} :parameters}] From a3aa5df11159449620a209ab5bebe1daac72f24d Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Thu, 11 Mar 2021 21:57:15 +0200 Subject: [PATCH 029/113] Fix exception log handler, *out* is not PrintWriter necessarily --- examples/ring-swagger/src/example/server.clj | 3 ++- .../src/reitit/http/interceptors/exception.clj | 6 +++--- .../src/reitit/ring/middleware/exception.clj | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index 72ba95d2..58d01810 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -80,7 +80,8 @@ ;; encoding response body muuntaja/format-response-middleware ;; exception handling - exception/exception-middleware + (exception/create-exception-middleware + {::exception/default (partial exception/wrap-log-to-console exception/default-handler)}) ;; decoding request body muuntaja/format-request-middleware ;; coercing response bodys diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj index f0a47a1d..89d07927 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj @@ -4,7 +4,7 @@ [clojure.spec.alpha :as s] [clojure.string :as str]) (:import (java.time Instant) - (java.io PrintWriter))) + (java.io PrintWriter Writer))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) @@ -35,7 +35,7 @@ (wrap error-handler error request) (error-handler error request)))) -(defn print! [^PrintWriter writer & more] +(defn print! [^Writer writer & more] (.write writer (str (str/join " " more) "\n"))) ;; @@ -68,7 +68,7 @@ (defn wrap-log-to-console [handler ^Throwable e {:keys [uri request-method] :as req}] (print! *out* (Instant/now) request-method (pr-str uri) "=>" (.getMessage e)) - (.printStackTrace e ^PrintWriter *out*) + (.printStackTrace e (PrintWriter. ^Writer *out*)) (handler e req)) ;; diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 92bbdec5..b14d0fca 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -4,7 +4,7 @@ [clojure.spec.alpha :as s] [clojure.string :as str]) (:import (java.time Instant) - (java.io PrintWriter))) + (java.io Writer PrintWriter))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) @@ -55,7 +55,7 @@ (catch Throwable e (on-exception handlers e request respond raise))))))) -(defn print! [^PrintWriter writer & more] +(defn print! [^Writer writer & more] (.write writer (str (str/join " " more) "\n"))) ;; @@ -88,7 +88,7 @@ (defn wrap-log-to-console [handler ^Throwable e {:keys [uri request-method] :as req}] (print! *out* (Instant/now) request-method (pr-str uri) "=>" (.getMessage e)) - (.printStackTrace e ^PrintWriter *out*) + (.printStackTrace e (PrintWriter. ^Writer *out*)) (handler e req)) ;; From ddbbe1a0da28c494f0f29ac04b22e0a07c87dac0 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Thu, 11 Mar 2021 22:08:07 +0200 Subject: [PATCH 030/113] List different examples --- examples/README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..27134eb3 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,50 @@ +# Examples + +## buddy-auth +## frontend-auth +## frontend-controllers +## frontend-links +## frontend-prompt +## frontend-re-frame +## frontend +## http-swagger + +Coercion with Spec and Swagger generation. + +Same as ring-spec-swagger? + +Async examples as extra. + +## http + +Async example. + +## just-coercion-with-ring + +Bad name. + +Coercion example for spec, data-spec, Schema. +No Swagger generation or Malli! + +Same as ring-example? + +## pedestal-swagger +## pedestal +## ring-example + +Coercion example for spec, data-spec, Schema. +No Swagger generation or Malli! + +## ring-integrant + +## ring-malli-swagger + +Coercion with Malli and Swagger generation. + +## ring-spec-swagger + +Coercion with Spec and Swagger generation. + +## ring-swagger + +Coercion with Spec and Swagger generation. Same as previous! From 5831f2f4f6b90a19c646c22c49344453f0abbd41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natxo=20Cabr=C3=A9?= Date: Fri, 12 Mar 2021 12:45:55 +0100 Subject: [PATCH 031/113] fixed typo in explicitely --- doc/basics/route_syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/basics/route_syntax.md b/doc/basics/route_syntax.md index f7481b50..a91ec097 100644 --- a/doc/basics/route_syntax.md +++ b/doc/basics/route_syntax.md @@ -132,7 +132,7 @@ Routes are just data, so it's easy to create them programmatically: ### Explicit path-parameter syntax -Router options `:syntax` allows the path-parameter syntax to be explicitely defined. It takes a keyword or set of keywords as a value. Valid values are `:colon` and `:bracket`. Default value is `#{:colon :bracket}`. +Router options `:syntax` allows the path-parameter syntax to be explicitly defined. It takes a keyword or set of keywords as a value. Valid values are `:colon` and `:bracket`. Default value is `#{:colon :bracket}`. With defaults: From c5bb467402957394b0eadac8bd0741c413737a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natxo=20Cabr=C3=A9?= Date: Fri, 12 Mar 2021 12:50:51 +0100 Subject: [PATCH 032/113] fix route_conflicts link --- doc/basics/router.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/basics/router.md b/doc/basics/router.md index 00348ac7..de10ff6f 100644 --- a/doc/basics/router.md +++ b/doc/basics/router.md @@ -109,6 +109,6 @@ When router is created, the following steps are done: * route arguments are expanded (via `:expand` option) * routes are coerced (via `:coerce` options) * route tree is compiled (via `:compile` options) -* [route conflicts](advanced/route_conflicts.md) are resolved (via `:conflicts` options) +* [route conflicts](route_conflicts.md) are resolved (via `:conflicts` options) * optionally, route data is validated (via `:validate` options) * [router implementation](../advanced/different_routers.md) is automatically selected (or forced via `:router` options) and created From 26c4ebc64568eec1f771ba7e58776baa3313b900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natxo=20Cabr=C3=A9?= Date: Fri, 12 Mar 2021 12:57:13 +0100 Subject: [PATCH 033/113] defined router var so the merged route tree example returns the commented data structure --- doc/basics/router.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/basics/router.md b/doc/basics/router.md index de10ff6f..fc0b28eb 100644 --- a/doc/basics/router.md +++ b/doc/basics/router.md @@ -85,9 +85,10 @@ As routes are defined as plain data, it's easy to merge multiple route trees int ["/ping" ::ping] ["/db" ::db]]) -(r/router - [admin-routes - user-routes]) +(def router + (r/router + [admin-routes + user-routes])) ``` Merged route tree: From 1e76ea81147667a2ea82c82c2deead53bfbbef5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natxo=20Cabr=C3=A9?= Date: Fri, 12 Mar 2021 13:24:28 +0100 Subject: [PATCH 034/113] fixed malli create example --- doc/coercion/malli_coercion.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/coercion/malli_coercion.md b/doc/coercion/malli_coercion.md index ee9a37bb..f1ed35e9 100644 --- a/doc/coercion/malli_coercion.md +++ b/doc/coercion/malli_coercion.md @@ -49,11 +49,14 @@ Failing coercion: Using `create` with options to create the coercion instead of `coercion`: ```clj + +(require '[malli.util :as mu]) + (reitit.coercion.malli/create - {:transformers {:body {:default default-transformer-provider - :formats {"application/json" json-transformer-provider}} - :string {:default string-transformer-provider} - :response {:default default-transformer-provider}} + {:transformers {:body {:default reitit.coercion.malli/default-transformer-provider + :formats {"application/json" reitit.coercion.malli/json-transformer-provider}} + :string {:default reitit.coercion.malli/string-transformer-provider} + :response {:default reitit.coercion.malli/default-transformer-provider}} ;; set of keys to include in error messages :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} ;; schema identity function (default: close all map schemas) From 722bd8950faa21e2d21f5182d334d2e6068e1491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natxo=20Cabr=C3=A9?= Date: Fri, 12 Mar 2021 13:33:47 +0100 Subject: [PATCH 035/113] removed blank line --- doc/coercion/malli_coercion.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/coercion/malli_coercion.md b/doc/coercion/malli_coercion.md index f1ed35e9..0c6a7fb9 100644 --- a/doc/coercion/malli_coercion.md +++ b/doc/coercion/malli_coercion.md @@ -49,7 +49,6 @@ Failing coercion: Using `create` with options to create the coercion instead of `coercion`: ```clj - (require '[malli.util :as mu]) (reitit.coercion.malli/create From 388f825d4d1b7a5f0fdda08ca69b058b02c9394a Mon Sep 17 00:00:00 2001 From: Zaymon <12402727+ZaymonFC@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:39:15 +1000 Subject: [PATCH 036/113] Update README.md --- doc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README.md b/doc/README.md index cbbac47a..ebffde5a 100644 --- a/doc/README.md +++ b/doc/README.md @@ -6,7 +6,7 @@ * Route [conflict resolution](./basics/route_conflicts.md) * First-class [route data](./basics/route_data.md) * Bi-directional routing -* [Pluggable coercion](./coercion/coercion.md) ([schema](https://github.com/plumatic/schema) & [clojure.spec](https://clojure.org/about/spec)) +* [Pluggable coercion](./coercion/coercion.md) ([schema](https://github.com/plumatic/schema), [clojure.spec](https://clojure.org/about/spec), [malli](https://github.com/metosin/malli)) * Helpers for [ring](./ring/ring.md), [http](./http/interceptors.md), [pedestal](./http/pedestal.md) & [frontend](./frontend/basics.md) * Friendly [Error Messages](./basics/error_messages.md) * Extendable From 02004cac8dad638478c211ee97ba9bbf5bf0ecaa Mon Sep 17 00:00:00 2001 From: Audrius <41568862+audriu@users.noreply.github.com> Date: Thu, 22 Apr 2021 09:27:07 +0300 Subject: [PATCH 037/113] Fix Ring example Maybe it is not perfect solution but at least it works. It was somewhat weird that the front page of the lib contains non working examples. --- README.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e075bdff..1c5567e4 100644 --- a/README.md +++ b/README.md @@ -85,24 +85,28 @@ Optionally, the parts can be required separately. A Ring routing app with input & output coercion using [data-specs](https://github.com/metosin/spec-tools/blob/master/README.md#data-specs). ```clj +(require '[muuntaja.core :as m]) (require '[reitit.ring :as ring]) (require '[reitit.coercion.spec]) (require '[reitit.ring.coercion :as rrc]) +(require '[reitit.ring.middleware.muuntaja :as muuntaja]) +(require '[reitit.ring.middleware.parameters :as parameters]) (def app (ring/ring-handler (ring/router ["/api" ["/math" {:get {:parameters {:query {:x int?, :y int?}} - :responses {200 {:body {:total pos-int?}}} - :handler (fn [{{{:keys [x y]} :query} :parameters}] - {:status 200 - :body {:total (+ x y)}})}}]] + :responses {200 {:body {:total int?}}} + :handler (fn [{{{:keys [x y]} :query} :parameters}] + {:status 200 + :body {:total (+ x y)}})}}]] ;; router data affecting all routes - {:data {:coercion reitit.coercion.spec/coercion - :middleware [rrc/coerce-exceptions-middleware + {:data {:coercion reitit.coercion.spec/coercion + :muuntaja m/instance + :middleware [parameters/parameters-middleware rrc/coerce-request-middleware - rrc/coerce-response-middleware]}}))) + muuntaja/format-response-middleware]}}))) ``` Valid request: From 522356ba710d0450f9162be721b46c43168c8596 Mon Sep 17 00:00:00 2001 From: Audrius <41568862+audriu@users.noreply.github.com> Date: Thu, 22 Apr 2021 10:05:02 +0300 Subject: [PATCH 038/113] Fix for the PR comments --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1c5567e4..378caa04 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ A Ring routing app with input & output coercion using [data-specs](https://githu :muuntaja m/instance :middleware [parameters/parameters-middleware rrc/coerce-request-middleware + rrc/coerce-response-middleware muuntaja/format-response-middleware]}}))) ``` From 51a26ed05226e689b26c503c0140e37ec1fabe2b Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 23 Apr 2021 17:41:40 +0300 Subject: [PATCH 039/113] Release 0.5.13 --- CHANGELOG.md | 2 +- README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 47 files changed, 77 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2ffb1a5..9e3bca0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Fri, 23 Apr 2021 17:53:53 +0300 Subject: [PATCH 040/113] Update development.md --- doc/development.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/development.md b/doc/development.md index 005bb863..c3fcbbfb 100644 --- a/doc/development.md +++ b/doc/development.md @@ -31,11 +31,22 @@ java -version # new version ./scripts/set-version "1.0.0" -./scripts/lein-modules install + +# create a release commit and a tag +git add -u +git commit -m "Release 1.0.0" +git tag 1.0.0 # works +./scripts/lein-modules install lein test # deploy to clojars ./scripts/lein-modules do clean, deploy clojars + +# push the commit and the tag +git push +git push --tags ``` + +Remember to update the changelog as well! From caa571cd6601faa780729bb8fbf86512ca2b4abe Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 23 Apr 2021 17:55:47 +0300 Subject: [PATCH 041/113] Update development.md --- doc/development.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/development.md b/doc/development.md index c3fcbbfb..46109017 100644 --- a/doc/development.md +++ b/doc/development.md @@ -49,4 +49,5 @@ git push git push --tags ``` -Remember to update the changelog as well! +* Remembor to update the changelog! +* Announce the release at least on #reitit in Clojurians. From 1494641ab8b199215fc8319b7ea2f7df2638aa7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ronny=20L=C3=B8vtangen?= Date: Sat, 24 Apr 2021 22:20:16 +0200 Subject: [PATCH 042/113] Update content_negotiation.md Not 100% sure, but looks like it should be :date-format, not :data-format here, based on the example in the section above. --- doc/ring/content_negotiation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ring/content_negotiation.md b/doc/ring/content_negotiation.md index 90605ad7..3c73202d 100644 --- a/doc/ring/content_negotiation.md +++ b/doc/ring/content_negotiation.md @@ -134,5 +134,5 @@ If you inspect `m/default-options` it's only a map, therefore you can compose yo (m/create (-> m/default-options (assoc-in [:formats "application/json" :decoder-opts :bigdecimals] true) - (assoc-in [:formats "application/json" :encoder-opts :data-format] "yyyy-MM-dd")))) + (assoc-in [:formats "application/json" :encoder-opts :date-format] "yyyy-MM-dd")))) ``` From 1297cfd902f64001b03773839f6ae8812e3aa12b Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 30 Apr 2021 14:28:12 +0300 Subject: [PATCH 043/113] Handle URL-encoded paths in file and resource handlers --- dev-resources/public/with space.txt | 1 + modules/reitit-ring/src/reitit/ring.cljc | 4 ++-- test/cljc/reitit/ring_test.cljc | 26 +++++++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 dev-resources/public/with space.txt diff --git a/dev-resources/public/with space.txt b/dev-resources/public/with space.txt new file mode 100644 index 00000000..ce013625 --- /dev/null +++ b/dev-resources/public/with space.txt @@ -0,0 +1 @@ +hello diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 0e513847..ab897c11 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -222,12 +222,12 @@ (recur files)))))) handler (if path (fn [request] - (let [uri (:uri request)] + (let [uri (impl/url-decode (:uri request))] (if (str/starts-with? uri path) (or (path-or-index-response (subs uri path-size) uri) (not-found-handler request))))) (fn [request] - (let [uri (:uri request) + (let [uri (impl/url-decode (:uri request)) path (-> request :path-params parameter)] (or (path-or-index-response path uri) (not-found-handler request)))))] diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 52dd938b..b057b401 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -471,9 +471,9 @@ (testing "from root" (let [app (ring/ring-handler - (ring/router - ["/*" (create nil)]) - (ring/create-default-handler))] + (ring/router + ["/*" (create nil)]) + (ring/create-default-handler))] (testing "different file-types" (let [response (app (request "/hello.json"))] (is (= "application/json" (get-in response [:headers "Content-Type"]))) @@ -484,6 +484,11 @@ (is (get-in response [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body response)))))) + (testing "with url decoding" + (let [response (app (request "/with%20space.txt"))] + (is (= 200 (:status response))) + (is (= "hello\n" (slurp (:body response)))))) + (testing "index-files" (let [response (app (request "/docs"))] (is (= (redirect "/docs/index.html") response))) @@ -520,6 +525,11 @@ (is (get-in response [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body response)))))) + (testing "with url decoding" + (let [response (app (request "/with%20space.txt"))] + (is (= 200 (:status response))) + (is (= "hello\n" (slurp (:body response)))))) + (testing "index-files" (let [response (app (request "/docs"))] (is (= (redirect "/docs/index.html") response))) @@ -557,6 +567,11 @@ (is (get-in response [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body response)))))) + (testing "with url decoding" + (let [response (app (request "/with%20space.txt"))] + (is (= 200 (:status response))) + (is (= "hello\n" (slurp (:body response)))))) + (testing "index-files" (let [response (app (request "/docs"))] (is (= (redirect "/docs/index.html") response))) @@ -595,6 +610,11 @@ (is (get-in response [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body response)))))) + (testing "with url decoding" + (let [response (app (request "/with%20space.txt"))] + (is (= 200 (:status response))) + (is (= "hello\n" (slurp (:body response)))))) + (testing "index-files" (let [response (app (request "/docs"))] (is (= (redirect "/docs/index.html") response))) From 6202e802c9afdf3d129685382d38b1ee97285479 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 30 Apr 2021 14:51:10 +0300 Subject: [PATCH 044/113] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e3bca0c..5c4e75db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 25 May 2021 23:12:15 +0200 Subject: [PATCH 045/113] Add new SAP application example link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9c3ed9e8..afe232c3 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ All examples are in https://github.com/metosin/reitit/tree/master/examples * https://www.learnreitit.com/ * Lipas, liikuntapalvelut: https://github.com/lipas-liikuntapaikat/lipas * Implementation of the Todo-Backend API spec, using Clojure, Ring/Reitit and next-jdbc: https://github.com/PrestanceDesign/todo-backend-clojure-reitit +* Ping CRM, a single page app written in Clojure Ring, Reitit, Integrant and next.jdbc: https://github.com/prestancedesign/clojure-inertia-pingcrm-demo ## More info From 9ba73524f33d40ad0967555823488fe41ed2efc6 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Mon, 21 Jun 2021 09:15:06 +0300 Subject: [PATCH 046/113] Update CHANGELOG.md Co-authored-by: Ilmo Raunio --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c4e75db..e7a7d109 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Thu, 24 Jun 2021 14:07:23 +0200 Subject: [PATCH 047/113] Enrich request for pedestal/routing-interceptor default-queue This ensures requests handled by the default queue also have access to the router per the injected :reitit.core/router key on the request. --- modules/reitit-http/src/reitit/http.cljc | 7 +++++-- test/clj/reitit/pedestal_test.clj | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index fa4c26fc..be2d49e3 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -89,7 +89,8 @@ default-interceptors (->> interceptors (map #(interceptor/into-interceptor % nil (r/options router)))) default-queue (interceptor/queue executor default-interceptors) - enrich-request (ring/create-enrich-request inject-match? inject-router?)] + enrich-request (ring/create-enrich-request inject-match? inject-router?) + enrich-default-request (ring/create-enrich-default-request inject-router?)] {:name ::router :enter (fn [{:keys [request] :as context}] (if-let [match (r/match-by-path router (:uri request))] @@ -101,7 +102,9 @@ context (assoc context :request request) queue (interceptor/queue executor (concat default-interceptors interceptors))] (interceptor/enqueue executor context queue)) - (interceptor/enqueue executor context default-queue))) + (let [request (enrich-default-request request router) + context (assoc context :request request)] + (interceptor/enqueue executor context default-queue)))) :leave (fn [context] (if-not (:response context) (assoc context :response (default-handler (:request context))) diff --git a/test/clj/reitit/pedestal_test.clj b/test/clj/reitit/pedestal_test.clj index 86211927..8a0ea30b 100644 --- a/test/clj/reitit/pedestal_test.clj +++ b/test/clj/reitit/pedestal_test.clj @@ -41,3 +41,25 @@ (:io.pedestal.http/service-fn))] (is (= "ok" (:body (io.pedestal.test/response-for service :get "/ok")))) (is (= 500 (:status (io.pedestal.test/response-for service :get "/fail")))))) + +(deftest pedestal-inject-router-test + (let [check-router (fn [r] (when-not (:reitit.core/router r) + (throw (ex-info "Missing :reitit.core/router!" {})))) + interceptor {:name ::needs-router + :enter (fn [{:as context :keys [request]}] + (check-router request) + context)} + router (pedestal/routing-interceptor + (http/router + ["" + ["/ok" (fn [r] (check-router r) {:status 200, :body "ok"})]]) + nil + {:interceptors [interceptor]}) + service (-> {:io.pedestal.http/request-logger nil + :io.pedestal.http/routes []} + (io.pedestal.http/default-interceptors) + (pedestal/replace-last-interceptor router) + (io.pedestal.http/create-servlet) + (:io.pedestal.http/service-fn))] + (is (= "ok" (:body (io.pedestal.test/response-for service :get "/ok")))) + (is (= "Not Found" (:body (io.pedestal.test/response-for service :get "/not-existing")))))) From 478ee18a32e99ee6ff5b16a8cc784c9c87ebb2cb Mon Sep 17 00:00:00 2001 From: Phil Hofmann Date: Tue, 27 Jul 2021 18:33:17 +0200 Subject: [PATCH 048/113] improve some docs --- doc/ring/RESTful_form_methods.md | 12 ++++++------ doc/ring/coercion.md | 8 ++++---- doc/ring/compiling_middleware.md | 6 +++--- doc/ring/content_negotiation.md | 12 ++++++------ doc/ring/data_driven_middleware.md | 22 +++++++++++----------- doc/ring/default_handler.md | 2 +- doc/ring/default_middleware.md | 4 ++-- doc/ring/dynamic_extensions.md | 4 ++-- doc/ring/exceptions.md | 10 +++++----- doc/ring/ring.md | 10 +++++----- 10 files changed, 45 insertions(+), 45 deletions(-) diff --git a/doc/ring/RESTful_form_methods.md b/doc/ring/RESTful_form_methods.md index 5faaeb3c..61f6bfd7 100644 --- a/doc/ring/RESTful_form_methods.md +++ b/doc/ring/RESTful_form_methods.md @@ -1,10 +1,10 @@ # RESTful form methods -When designing RESTful applications you will be doing a lot of "PATCH" and "DELETE" request, but most browsers don't support methods other than "GET" and "POST" when it comes to submitting forms. +When designing RESTful applications you will be doing a lot of "PATCH" and "DELETE" request, but most browsers don't support methods other than "GET" and "POST" when it comes to submitting forms. There is a pattern to solve this (pioneered by Rails) using a hidden "_method" field in the form and swapping out the "POST" method for whatever is in that field. -We can do this with middleware in reitit like this: +We can do this with middleware in reitit like this: ```clj (defn- hidden-method [request] @@ -18,20 +18,20 @@ We can do this with middleware in reitit like this: :wrap (fn [handler] (fn [request] (if-let [fm (and (= :post (:request-method request)) ;; if this is a :post request - (hidden-method request))] ;; and there is a "_method" field + (hidden-method request))] ;; and there is a "_method" field (handler (assoc request :request-method fm)) ;; replace :request-method (handler request))))}) ``` -And apply the middleware like this: +And apply the middleware like this: ```clj (reitit.ring/ring-handler (reitit.ring/router ...) (reitit.ring/create-default-handler) - {:middleware + {:middleware [reitit.ring.middleware.parameters/parameters-middleware ;; needed to have :form-params in the request map reitit.ring.middleware.multipart/multipart-middleware ;; needed to have :multipart-params in the request map wrap-hidden-method]}) ;; our hidden method wrapper ``` -(NOTE: This middleware must be placed here and not inside the route data given to `reitit.ring/handler`. +(NOTE: This middleware must be placed here and not inside the route data given to `reitit.ring/handler`. This is so that our middleware is applied before reitit matches the request with a specific handler using the wrong method.) diff --git a/doc/ring/coercion.md b/doc/ring/coercion.md index a8ddae6f..faed3a8b 100644 --- a/doc/ring/coercion.md +++ b/doc/ring/coercion.md @@ -39,7 +39,7 @@ Responses are defined in route data under `:responses` key. It's value should be Below is an example with [Plumatic Schema](https://github.com/plumatic/schema). It defines schemas for `:query`, `:body` and `:path` parameters and for http 200 response `:body`. -Handler can access the coerced parameters can be read under `:parameters` key in the request. +Handlers can access the coerced parameters via the `:parameters` key in the request. ```clj (require '[reitit.coercion.schema]) @@ -71,7 +71,7 @@ Defining a coercion for a route data doesn't do anything, as it's just data. We ### Full example -Here's an full example for applying coercion with Reitit, Ring and Schema: +Here is a full example for applying coercion with Reitit, Ring and Schema: ```clj (require '[reitit.ring.coercion :as rrc]) @@ -150,7 +150,7 @@ Invalid response: ## Pretty printing spec errors -Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like [expound](https://github.com/bhb/expound) to be used: +Spec problems are exposed as is in request & response coercion errors. Pretty-printers like [expound](https://github.com/bhb/expound) can be enabled like this: ```clj (require '[reitit.ring :as ring]) @@ -216,7 +216,7 @@ Spec problems are exposed as-is into request & response coercion errors, enablin ### Optimizations -The coercion middleware are [compiled against a route](compiling_middleware.md). In the middleware compilation step the actual coercer implementations are constructed for the defined models. Also, the middleware doesn't mount itself if a route doesn't have `:coercion` and `:parameters` or `:responses` defined. +The coercion middlewares are [compiled against a route](compiling_middleware.md). In the middleware compilation step the actual coercer implementations are constructed for the defined models. Also, the middleware doesn't mount itself if a route doesn't have `:coercion` and `:parameters` or `:responses` defined. We can query the compiled middleware chain for the routes: diff --git a/doc/ring/compiling_middleware.md b/doc/ring/compiling_middleware.md index 1e100f3b..f9404cc9 100644 --- a/doc/ring/compiling_middleware.md +++ b/doc/ring/compiling_middleware.md @@ -1,12 +1,12 @@ # Compiling Middleware -The [dynamic extensions](dynamic_extensions.md) is a easy way to extend the system. To enable fast lookups into route data, we can compile them into any shape (records, functions etc.) we want, enabling fast access at request-time. +The [dynamic extensions](dynamic_extensions.md) are an easy way to extend the system. To enable fast lookup of route data, we can compile them into any shape (records, functions etc.), enabling fast access at request-time. -But, we can do much better. As we know the exact route that middleware/interceptor is linked to, we can pass the (compiled) route information into the middleware at creation-time. It can do local reasoning: extract and transform relevant data just for it and pass the optimized data into the actual request-handler via a closure - yielding much faster runtime processing. Middleware can also decide not to mount itself by returning `nil`. Why mount a `wrap-enforce-roles` middleware for a route if there are no roles required for it? +But, we can do much better. As we know the exact route that a middleware/interceptor is linked to, we can pass the (compiled) route information into the middleware at creation-time. It can do local reasoning: Extract and transform relevant data just for it and pass the optimized data into the actual request-handler via a closure - yielding much faster runtime processing. A middleware can also decide not to mount itself by returning `nil`. (E.g. Why mount a `wrap-enforce-roles` middleware for a route if there are no roles required for it?) To enable this we use [middleware records](data_driven_middleware.md) `:compile` key instead of the normal `:wrap`. `:compile` expects a function of `route-data router-opts => ?IntoMiddleware`. -To demonstrate the two approaches, below are response coercion middleware written as normal ring middleware function and as middleware record with `:compile`. +To demonstrate the two approaches, below is the response coercion middleware written as normal ring middleware function and as middleware record with `:compile`. ## Normal Middleware diff --git a/doc/ring/content_negotiation.md b/doc/ring/content_negotiation.md index 3c73202d..fb696c10 100644 --- a/doc/ring/content_negotiation.md +++ b/doc/ring/content_negotiation.md @@ -1,8 +1,8 @@ # Content Negotiation -Wrapper for [Muuntaja](https://github.com/metosin/muuntaja) middleware for content-negotiation, request decoding and response encoding. Takes explicit configuration via `:muuntaja` key in route data. Emit's [swagger](swagger.md) `:produces` and `:consumes` definitions automatically based on the Muuntaja configuration. +Wrapper for [Muuntaja](https://github.com/metosin/muuntaja) middleware for content negotiation, request decoding and response encoding. Takes explicit configuration via `:muuntaja` key in route data. Emits [swagger](swagger.md) `:produces` and `:consumes` definitions automatically based on the Muuntaja configuration. -Negotiates a request body based on `Content-Type` header and response body based on `Accept`, `Accept-Charset` headers. Publishes the negotiation results as `:muuntaja/request` and `:muuntaja/response` keys into the request. +Negotiates a request body based on `Content-Type` header and response body based on `Accept` and `Accept-Charset` headers. Publishes the negotiation results as `:muuntaja/request` and `:muuntaja/response` keys into the request. Decodes the request body into `:body-params` using the `:muuntaja/request` key in request if the `:body-params` doesn't already exist. @@ -87,7 +87,7 @@ Server: Jetty(9.2.21.v20170120) ## Changing default parameters -The current JSON formatter used by `reitit` already have the option to parse keys as `keyword` which is a sane default in Clojure. However, if you would like to parse all the `double` as `bigdecimal` you'd need to change an option of the [JSON formatter](https://github.com/metosin/jsonista) +The current JSON formatter used by `reitit` already has the option to parse keys as `keyword` which is a sane default in Clojure. However, if you would like to parse all the `double` as `bigdecimal` you'd need to change an option of the [JSON formatter](https://github.com/metosin/jsonista) ```clj @@ -102,7 +102,7 @@ The current JSON formatter used by `reitit` already have the option to parse key Now you should change the `m/instance` installed in the router with the `new-muuntaja-instance`. -You can find more options for [JSON](https://cljdoc.org/d/metosin/jsonista/0.2.5/api/jsonista.core#object-mapper) and [EDN]. +Here you can find more options for [JSON](https://cljdoc.org/d/metosin/jsonista/0.2.5/api/jsonista.core#object-mapper) and EDN. ## Adding custom encoder @@ -125,9 +125,9 @@ The example below is from `muuntaja` explaining how to add a custom encoder to p ``` -## Adding all together +## Putting it all together -If you inspect `m/default-options` it's only a map, therefore you can compose your new muuntaja instance with as many options as you need it. +If you inspect `m/default-options` you'll find it's only a map. This means you can compose your new muuntaja instance with as many options as you need. ```clj (def new-muuntaja diff --git a/doc/ring/data_driven_middleware.md b/doc/ring/data_driven_middleware.md index e11be838..2d310ff4 100644 --- a/doc/ring/data_driven_middleware.md +++ b/doc/ring/data_driven_middleware.md @@ -1,19 +1,19 @@ # Data-driven Middleware -Ring [defines middleware](https://github.com/ring-clojure/ring/wiki/Concepts#middleware) as a function of type `handler & args => request => response`. It's relatively easy to understand and enables good performance. Downside is that the middleware-chain is just a opaque function, making things like debugging and composition hard. It's too easy to apply the middleware in wrong order. +Ring [defines middleware](https://github.com/ring-clojure/ring/wiki/Concepts#middleware) as a function of type `handler & args => request => response`. It is relatively easy to understand and allows for good performance. A downside is that the middleware chain is just a opaque function, making things like debugging and composition hard. It is too easy to apply the middlewares in wrong order. Reitit defines middleware as data: -1. Middleware can be defined as first-class data entries -2. Middleware can be mounted as a [duct-style](https://github.com/duct-framework/duct/wiki/Configuration) vector (of middleware) -4. Middleware can be optimized & [compiled](compiling_middleware.md) against an endpoint -3. Middleware chain can be transformed by the router +1. A middleware can be defined as first-class data entries +2. A middleware can be mounted as a [duct-style](https://github.com/duct-framework/duct/wiki/Configuration) vector (of middlewares) +4. A middleware can be optimized & [compiled](compiling_middleware.md) against an endpoint +3. A middleware chain can be transformed by the router ## Middleware as data -All values in the `:middleware` vector in the route data are expanded into `reitit.middleware/Middleware` Records with using the `reitit.middleware/IntoMiddleware` Protocol. By default, functions, maps and `Middleware` records are allowed. +All values in the `:middleware` vector of route data are expanded into `reitit.middleware/Middleware` Records by using the `reitit.middleware/IntoMiddleware` Protocol. By default, functions, maps and `Middleware` records are allowed. -Records can have arbitrary keys, but the following keys have a special purpose: +Records can have arbitrary keys, but the following keys have special purpose: | key | description | | ---------------|-------------| @@ -22,13 +22,13 @@ Records can have arbitrary keys, but the following keys have a special purpose: | `:wrap` | The actual middleware function of `handler & args => request => response` | `:compile` | Middleware compilation function, see [compiling middleware](compiling_middleware.md). -Middleware Records are accessible in their raw form in the compiled route results, thus available for inventories, creating api-docs etc. +Middleware Records are accessible in their raw form in the compiled route results, and thus are available for inventories, creating api-docs, etc. For the actual request processing, the Records are unwrapped into normal functions and composed into a middleware function chain, yielding zero runtime penalty. ### Creating Middleware -The following produce identical middleware runtime function. +The following examples produce identical middleware runtime functions. ### Function @@ -77,7 +77,7 @@ The following produce identical middleware runtime function. :handler handler}}]]))) ``` -All the middleware are applied correctly: +All the middlewares are applied correctly: ```clj (app {:request-method :get, :uri "/api/ping"}) @@ -86,7 +86,7 @@ All the middleware are applied correctly: ## Compiling middleware -Middleware can be optimized against an endpoint using [middleware compilation](compiling_middleware.md). +Middlewares can be optimized against an endpoint using [middleware compilation](compiling_middleware.md). ## Ideas for the future diff --git a/doc/ring/default_handler.md b/doc/ring/default_handler.md index 40fda56b..890dcb9c 100644 --- a/doc/ring/default_handler.md +++ b/doc/ring/default_handler.md @@ -1,6 +1,6 @@ # Default handler -By default, if no routes match, `nil` is returned, which is not valid response in Ring: +By default, if no routes match, `nil` is returned, which is not a valid response in Ring: ```clj (require '[reitit.ring :as ring]) diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md index 18f29d9d..eba975ae 100644 --- a/doc/ring/default_middleware.md +++ b/doc/ring/default_middleware.md @@ -4,7 +4,7 @@ [metosin/reitit-middleware "0.5.13"] ``` -Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. +Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. * [Parameter Handling](#parameters-handling) * [Exception Handling](#exception-handling) @@ -32,7 +32,7 @@ See [Content Negotiation](content_negotiation.md). Wrapper for [Ring Multipart Middleware](https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj). Emits swagger `:consumes` definitions automatically. Expected route data: - + | key | description | | -------------|-------------| | `[:parameters :multipart]` | mounts only if defined for a route. diff --git a/doc/ring/dynamic_extensions.md b/doc/ring/dynamic_extensions.md index 3f922317..1308dde1 100644 --- a/doc/ring/dynamic_extensions.md +++ b/doc/ring/dynamic_extensions.md @@ -1,8 +1,8 @@ # Dynamic Extensions -`ring-handler` injects the `Match` into a request and it can be extracted at runtime with `reitit.ring/get-match`. This can be used to build ad-hoc extensions to the system. +`ring-handler` injects the `Match` into a request and it can be extracted at runtime with `reitit.ring/get-match`. This can be used to build ad hoc extensions to the system. -Example middleware to guard routes based on user roles: +This example shows a middleware to guard routes based on user roles: ```clj (require '[reitit.ring :as ring]) diff --git a/doc/ring/exceptions.md b/doc/ring/exceptions.md index d3a45fa2..4fea7d17 100644 --- a/doc/ring/exceptions.md +++ b/doc/ring/exceptions.md @@ -4,7 +4,7 @@ [metosin/reitit-middleware "0.5.13"] ``` -Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practise is a have an top-level exception handler to log and format the errors for clients. +Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practice is to have a top-level exception handler to log and format errors for clients. ```clj (require '[reitit.ring.middleware.exception :as exception]) @@ -36,7 +36,7 @@ A preconfigured middleware using `exception/default-handlers`. Catches: ### `exception/create-exception-middleware` -Creates the exception-middleware with custom options. Takes a map of `identifier => exception request => response` that is used to select the exception handler for the thrown/raised exception identifier. Exception identifier is either a `Keyword` or a Exception Class. +Creates the exception-middleware with custom options. Takes a map of `identifier => exception request => response` that is used to select the exception handler for the thrown/raised exception identifier. Exception identifier is either a `Keyword` or an Exception Class. The following handlers are available by default: @@ -55,7 +55,7 @@ The handler is selected from the options map by exception identifier in the foll 2) Class of exception 3) `:type` ancestors of exception ex-data 4) Super Classes of exception -5) The ::default handler +5) The `::default` handler ```clj ;; type hierarchy @@ -94,7 +94,7 @@ The handler is selected from the options map by exception identifier in the foll (def app (ring/ring-handler (ring/router - ["/fail" (fn [_] (throw (ex-info "fail" {:type ::failue})))] + ["/fail" (fn [_] (throw (ex-info "fail" {:type ::failure})))] {:data {:middleware [exception-middleware]}}))) (app {:request-method :get, :uri "/fail"}) @@ -102,6 +102,6 @@ The handler is selected from the options map by exception identifier in the foll ; => {:status 500, ; :body {:message "default" ; :exception clojure.lang.ExceptionInfo -; :data {:type :user/failue} +; :data {:type :user/failure} ; :uri "/fail"}} ``` diff --git a/doc/ring/ring.md b/doc/ring/ring.md index 3f282f0a..b80c51eb 100644 --- a/doc/ring/ring.md +++ b/doc/ring/ring.md @@ -11,8 +11,8 @@ Read more about the [Ring Concepts](https://github.com/ring-clojure/ring/wiki/Co ## `reitit.ring/ring-router` `ring-router` is a higher order router, which adds support for `:request-method` based routing, [handlers](https://github.com/ring-clojure/ring/wiki/Concepts#handlers) and [middleware](https://github.com/ring-clojure/ring/wiki/Concepts#middleware). - - It accepts the following options: + +It accepts the following options: | key | description | | ----------------------------------------|-------------| @@ -53,7 +53,7 @@ Given a `ring-router`, optional default-handler & options, `ring-handler` functi | key | description | | ------------------|-------------| -| `:middleware` | Optional sequence of middleware that wrap the ring-handler" +| `:middleware` | Optional sequence of middlewares that wrap the ring-handler | `:inject-match?` | Boolean to inject `match` into request under `:reitit.core/match` key (default true) | `:inject-router?` | Boolean to inject `router` into request under `:reitit.core/router` key (default true) @@ -91,7 +91,7 @@ The router can be accessed via `get-router`: # Request-method based routing -Handlers can be placed either to the top-level (all methods) or under a specific method (`:get`, `:head`, `:patch`, `:delete`, `:options`, `:post`, `:put` or `:trace`). Top-level handler is used if request-method based handler is not found. +Handlers can be placed either to the top-level (all methods) or under a specific method (`:get`, `:head`, `:patch`, `:delete`, `:options`, `:post`, `:put` or `:trace`). Top-level handler is used if request-method based handler is not found. By default, the `:options` route is generated for all paths - to enable thing like [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing). @@ -196,7 +196,7 @@ Top-level middleware, applied before any routing is done: (ring/router ["/api" {:middleware [[mw :api]]} ["/get" {:get handler}]]) - nil + nil {:middleware [[mw :top]]})) (app {:request-method :get, :uri "/api/get"}) From 20b7cabed744c423d950f27746b5d87f5c6fbb3e Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 3 Aug 2021 08:46:51 +0300 Subject: [PATCH 049/113] Fix Malli encoding,, #498 --- .../src/reitit/coercion/malli.cljc | 23 ++++----- test/cljc/reitit/ring_coercion_test.cljc | 50 ++++++++++++++++++- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 23ec65b9..ee4a4bdc 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -34,7 +34,7 @@ (def json-transformer-provider (-provider (mt/json-transformer))) (def default-transformer-provider (-provider nil)) -(defn- -coercer [schema type transformers f encoder {:keys [validate enabled options]}] +(defn- -coercer [schema type transformers f {:keys [validate enabled options]}] (if schema (let [->coercer (fn [t] (let [decoder (if t (m/decoder schema options t) identity) @@ -48,7 +48,6 @@ (-explain [_ value] (explainer value))))) {:keys [formats default]} (transformers type) default-coercer (->coercer default) - encode (or encoder (fn [value _format] value)) format-coercers (some->> (for [[f t] formats] [f (->coercer t)]) (filter second) (seq) (into {})) get-coercer (cond format-coercers (fn [format] (or (get format-coercers format) default-coercer)) default-coercer (constantly default-coercer))] @@ -66,14 +65,14 @@ value)) ;; encode: decode -> validate -> encode (fn [value format] - (if-let [coercer (get-coercer format)] - (let [transformed (-decode coercer value)] + (let [transformed (-decode default-coercer value)] + (if-let [coercer (get-coercer format)] (if (-validate coercer transformed) - (encode transformed format) + (-encode coercer transformed) (let [error (-explain coercer transformed)] (coercion/map->CoercionError - (assoc error :transformed transformed))))) - value))))))) + (assoc error :transformed transformed)))) + value)))))))) ;; ;; swagger @@ -106,11 +105,13 @@ ;; public api ;; +;; TODO: this is much too compöex (def default-options {:transformers {:body {:default default-transformer-provider :formats {"application/json" json-transformer-provider}} :string {:default string-transformer-provider} - :response {:default default-transformer-provider}} + :response {:default default-transformer-provider + :formats {"application/json" json-transformer-provider}}} ;; set of keys to include in error messages :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} ;; schema identity function (default: close all map schemas) @@ -176,10 +177,8 @@ (seq error-keys) (select-keys error-keys) encode-error (encode-error))) (-request-coercer [_ type schema] - (-coercer (compile schema options) type transformers :decode nil opts)) + (-coercer (compile schema options) type transformers :decode opts)) (-response-coercer [_ schema] - (let [schema (compile schema options) - encoder (-coercer schema :body transformers :encode nil opts)] - (-coercer schema :response transformers :encode encoder opts))))))) + (-coercer (compile schema options) :response transformers :encode opts)))))) (def coercion (create default-options)) diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index 3e38029e..fd5448f7 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -207,6 +207,24 @@ (let [{:keys [status]} (app invalid-request2)] (is (= 500 status)))))))) +(let [app (ring/ring-handler + (ring/router + ["/plus" {:get {:parameters {:query [:map [:x :int]]} + :responses {200 {:body [:map + [:total [:int {:encode/json str + :min 0}]]]}} + :handler (fn [{{{:keys [x]} :query} :parameters}] + {:status 200 + :body {:total (* x x)}})}}] + {:data {:middleware [rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion malli/coercion}}))] + (app {:uri "/plus" + :request-method :get + :muuntaja/request {:format "application/json"} + :muuntaja/response {:format "application/json"} + :query-params {"x" "2"}})) + (deftest malli-coercion-test (let [create (fn [middleware] (ring/ring-handler @@ -397,7 +415,7 @@ (testing "encoding errors" (let [app (->app {:encode-error (fn [error] {:errors (:humanized error)})})] (is (= {:status 400, :body {:errors {:x ["missing required key"]}}} - (app (assoc (->request "closed") :body-params {})))))) + (app (assoc (->request "closed") :body-params {})))))) (testing "when schemas are not closed and extra keys are not stripped" (let [app (->app {:compile (fn [v _] v) :strip-extra-keys false})] @@ -449,7 +467,35 @@ (testing "failed response" (let [{:keys [status body]} (app (->request [{:message "kosh"}]))] (is (= 500 status)) - (is (= :reitit.coercion/response-coercion (:type body)))))))))) + (is (= :reitit.coercion/response-coercion (:type body)))))))) + + (testing "encoding responses" + (let [->app (fn [total-schema] + (ring/ring-handler + (ring/router + ["/total" {:get {:parameters {:query [:map [:x :int]]} + :responses {200 {:body [:map [:total total-schema]]}} + :handler (fn [{{{:keys [x]} :query} :parameters}] + {:status 200 + :body {:total (* x x)}})}}] + {:data {:middleware [rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion malli/coercion}}))) + call (fn [accept total-schema] + ((->app total-schema) {:uri "/total" + :request-method :get + :muuntaja/request {:format "application/json"} + :muuntaja/response {:format accept} + :query-params {"x" "2"}}))] + + (testing "no encoding" + (is (= {:status 200, :body {:total +4}} (call "application/json" :int)))) + + (testing "json encoding" + (is (= {:status 200, :body {:total -4}} (call "application/json" [:int {:encode/json -}])))) + + (testing "edn encoding (nada)" + (is (= {:status 200, :body {:total +4}} (call "application/edn" [:int {:encode/json -}])))))))) #?(:clj (deftest muuntaja-test From 020c424b4e5577ffb01f6dcf6635e0c298f17745 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 3 Aug 2021 13:24:29 +0300 Subject: [PATCH 050/113] dead code, CHANGELOG --- CHANGELOG.md | 4 ++++ test/cljc/reitit/ring_coercion_test.cljc | 18 ------------------ 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95a96aae..d49cbb30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 3 Aug 2021 13:35:46 +0300 Subject: [PATCH 051/113] CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d49cbb30..5f344f4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 3 Aug 2021 13:37:01 +0300 Subject: [PATCH 052/113] Fix CHANGELOG --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fc254f6..77eaa5ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `.. Date: Tue, 3 Aug 2021 13:41:27 +0300 Subject: [PATCH 053/113] 0.5.14 --- CHANGELOG.md | 2 +- README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 47 files changed, 77 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77eaa5ec..6ce51fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Thu, 5 Aug 2021 18:46:29 +0300 Subject: [PATCH 054/113] 0.5.15 --- CHANGELOG.md | 4 +++ README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 47 files changed, 80 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ce51fed..8a7d76d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 7 Sep 2021 14:38:42 +0300 Subject: [PATCH 055/113] Improve parameter names and docstrings on reitit frontend functions --- .../src/reitit/frontend/easy.cljs | 78 +++++++++++++------ .../src/reitit/frontend/history.cljs | 77 ++++++++++++------ 2 files changed, 106 insertions(+), 49 deletions(-) diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index 94a1789a..b3befcbd 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -10,7 +10,8 @@ ;; Differences: ;; This one automatically removes previous event listeners. -(defn start! +(defn ^{:see-also ["reitit.frontend.history/start!"]} + start! "This registers event listeners on HTML5 history and hashchange events. Automatically removes previous event listeners so it is safe to call this repeatedly, for example when using @@ -39,28 +40,57 @@ (on-navigate m this)) opts)) -(defn href - ([k] - (rfh/href @history k nil nil)) - ([k params] - (rfh/href @history k params nil)) - ([k params query] - (rfh/href @history k params query))) +(defn + ^{:see-also ["reitit.frontend.history/href"]} + href + "Generate link href for the given route and parameters -(defn push-state - "Sets the new route, leaving previous route in history." - ([k] - (rfh/push-state @history k nil nil)) - ([k params] - (rfh/push-state @history k params nil)) - ([k params query] - (rfh/push-state @history k params query))) + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first." + ([name] + (rfh/href @history name nil nil)) + ([name path-params] + (rfh/href @history name path-params nil)) + ([name path-params query-params] + (rfh/href @history name path-params query-params))) -(defn replace-state - "Replaces current route. I.e. current route is not left on history." - ([k] - (rfh/replace-state @history k nil nil)) - ([k params] - (rfh/replace-state @history k params nil)) - ([k params query] - (rfh/replace-state @history k params query))) +(defn + ^{:see-also ["reitit.frontend.history/push-state"]} + push-state + "Creates url using the given route and parameters, pushes those to + history stack with pushState and triggers on-navigate callback on the + history handler. + + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first. + + See also: + https://developer.mozilla.org/en-US/docs/Web/API/History/pushState" + ([name] + (rfh/push-state @history name nil nil)) + ([name path-params] + (rfh/push-state @history name path-params nil)) + ([name path-params query-params] + (rfh/push-state @history name path-params query-params))) + +(defn + ^{:see-also ["reitit.frontend.history/replace-state"]} + replace-state + "Creates url using the given route and parameters, replaces latest entry on + history stack with replaceState and triggers on-navigate callback on the + history handler. + + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first. + + See also: + https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState" + ([name] + (rfh/replace-state @history name nil nil)) + ([name path-params] + (rfh/replace-state @history name path-params nil)) + ([name path-params query-params] + (rfh/replace-state @history name path-params query-params))) diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 84ec5141..53967af4 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -171,40 +171,67 @@ (map->FragmentHistory opts) (map->Html5History opts)))))) -(defn stop! [history] +(defn stop! + "Stops the given history handler, removing the event handlers." + [history] (if history (-stop history))) (defn href - ([history k] - (href history k nil)) - ([history k params] - (href history k params nil)) - ([history k params query] - (let [match (rf/match-by-name! (:router history) k params)] - (-href history (reitit/match->path match query))))) + "Generate link href for the given route and parameters -(defn push-state - "Sets the new route, leaving previous route in history." - ([history k] - (push-state history k nil nil)) - ([history k params] - (push-state history k params nil)) - ([history k params query] - (let [match (rf/match-by-name! (:router history) k params) - path (reitit/match->path match query)] + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first." + ([history name] + (href history name nil)) + ([history name path-params] + (href history name path-params nil)) + ([history name path-params query-params] + (let [match (rf/match-by-name! (:router history) name path-params)] + (-href history (reitit/match->path match query-params))))) + +(defn + ^{:see-also ["reitit.core/match->path"]} + push-state + "Creates url using the given route and parameters, pushes those to + history stack with pushState and triggers on-navigate callback on the + history handler. + + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first. + + See also: + https://developer.mozilla.org/en-US/docs/Web/API/History/pushState" + ([history name] + (push-state history name nil nil)) + ([history name path-params] + (push-state history name path-params nil)) + ([history name path-params query-params] + (let [match (rf/match-by-name! (:router history) name path-params) + path (reitit/match->path match query-params)] ;; pushState and replaceState don't trigger popstate event so call on-navigate manually (.pushState js/window.history nil "" (-href history path)) (-on-navigate history path)))) (defn replace-state - "Replaces current route. I.e. current route is not left on history." - ([history k] - (replace-state history k nil nil)) - ([history k params] - (replace-state history k params nil)) - ([history k params query] - (let [match (rf/match-by-name! (:router history) k params) - path (reitit/match->path match query)] + "Creates url using the given route and parameters, replaces latest entry on + history stack with replaceState and triggers on-navigate callback on the + history handler. + + Note: currently collections in query-parameters are encoded as field-value + pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them + differently, convert the collections to strings first. + + See also: + https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState" + ([history name] + (replace-state history name nil nil)) + ([history name path-params] + (replace-state history name path-params nil)) + ([history name path-params query-params] + (let [match (rf/match-by-name! (:router history) name path-params) + path (reitit/match->path match query-params)] (.replaceState js/window.history nil "" (-href history path)) (-on-navigate history path)))) From ef0aeaa7c49b8a3794ca49b294cdac3541587cd8 Mon Sep 17 00:00:00 2001 From: Dennis Schridde Date: Fri, 1 Oct 2021 01:44:36 +0200 Subject: [PATCH 056/113] Link to #134 from parameters-middleware refactoring note --- doc/ring/default_middleware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md index cc8fb5f6..007828d8 100644 --- a/doc/ring/default_middleware.md +++ b/doc/ring/default_middleware.md @@ -17,7 +17,7 @@ Any Ring middleware can be used with `reitit-ring`, but using data-driven middle `reitit.ring.middleware.parameters/parameters-middleware` to capture query- and form-params. Wraps `ring.middleware.params/wrap-params`. -**NOTE**: will be factored into two parts: a query-parameters middleware and a Muuntaja format responsible for the the `application/x-www-form-urlencoded` body format. +**NOTE**: This middleware will be factored into two parts: a query-parameters middleware and a Muuntaja format responsible for the the `application/x-www-form-urlencoded` body format. cf. https://github.com/metosin/reitit/issues/134 ## Exception Handling From a83285f39db737076812198685170d675b09dea7 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Fri, 1 Oct 2021 11:03:48 +0300 Subject: [PATCH 057/113] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 912ffe9b..78d89e1b 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Presentations: * [Data-Driven Ring with Reitit](https://www.metosin.fi/blog/reitit-ring/) * [Reitit, Data-Driven Routing with Clojure(Script)](https://www.metosin.fi/blog/reitit/) +**Status:** [stable](https://github.com/metosin/open-source#project-lifecycle-model) + ## [Full Documentation](https://cljdoc.org/d/metosin/reitit/CURRENT) There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians Slack](http://clojurians.net/) for discussion & help. From 1737e192148dc9ce286fe29457caf91068d35e0c Mon Sep 17 00:00:00 2001 From: mike Date: Tue, 5 Oct 2021 12:51:21 -0500 Subject: [PATCH 058/113] Fix typo in Swagger doc --- doc/ring/swagger.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ring/swagger.md b/doc/ring/swagger.md index 7de88431..1f8460de 100644 --- a/doc/ring/swagger.md +++ b/doc/ring/swagger.md @@ -47,7 +47,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus [metosin/reitit-swagger-ui "0.5.15"] ``` -`reitit.swagger-ui/create-swagger-ui-hander` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options: +`reitit.swagger-ui/create-swagger-ui-handler` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options: | key | description | | -----------------|-------------| From 9160aa0f2bcb629b949e098703e31571f8072f90 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Wed, 6 Oct 2021 20:42:09 +0300 Subject: [PATCH 059/113] Add a test for `/{foo}.html` style routes Just like path `///` would not match `/{foo}/`, `/..html` does not match `/{foo}.html`. --- test/cljc/reitit/core_test.cljc | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index c1161931..290e46ab 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -121,6 +121,7 @@ :foo/bar "ei/toista/kertaa"}] (by-path "/olipa/kerran/avaruus/vaan/ei/toista/kertaa"))) (is (= [::html {:name "10"}] (by-path "/files/file-10.html"))) + (is (= [nil nil] (by-path "/files/file-..html"))) (is (= [::loru {:eskon "viitan", :saum "aa"}] (by-path "/viitan/aa/pium\u2215paum"))) (is (= [nil nil] (by-path "/ei/osu/pium/paum"))) (is (= [::emoji {:🌈 "brackets"}] (by-path "/brackets🤔/🎈"))) From 04225b0eff2a561565e34c886bbf51b98cc509ad Mon Sep 17 00:00:00 2001 From: zengxinhui Date: Wed, 13 Oct 2021 02:41:07 -0400 Subject: [PATCH 060/113] update r/routes output The `nil`s are not there and need to be removed. --- doc/basics/router.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/basics/router.md b/doc/basics/router.md index fc0b28eb..826a420d 100644 --- a/doc/basics/router.md +++ b/doc/basics/router.md @@ -67,8 +67,8 @@ The compiled route tree: ```clj (r/routes router) -; [["/api/ping" {:name :user/ping} nil] -; ["/api/user/:id" {:name :user/user} nil]] +; [["/api/ping" {:name :user/ping}] +; ["/api/user/:id" {:name :user/user}]] ``` ### Composing From f3a686026f0c4d94836a74967f74da997668d1a5 Mon Sep 17 00:00:00 2001 From: zengxinhui Date: Wed, 13 Oct 2021 02:54:40 -0400 Subject: [PATCH 061/113] update r/routes output `nil` should not be there. --- doc/basics/route_data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/basics/route_data.md b/doc/basics/route_data.md index 2ea2f50e..c5df80dd 100644 --- a/doc/basics/route_data.md +++ b/doc/basics/route_data.md @@ -79,7 +79,7 @@ Resolved route tree: ; :name :user/ping}] ; ["/api/admin/users" {:interceptors [::api] ; :roles #{:admin} -; :name ::users} nil] +; :name ::users}] ; ["/api/admin/db" {:interceptors [::api ::db] ; :roles #{:db-admin}}]] ``` From 6c835e6e09284382c5b921ebc258ae598113f779 Mon Sep 17 00:00:00 2001 From: Michael Salihi Date: Wed, 13 Oct 2021 18:50:20 +0200 Subject: [PATCH 062/113] Replace if-let by when-let since no else branches for the recursive match by path example. --- doc/advanced/composing_routers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 46be98f7..d6db2426 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -143,10 +143,10 @@ As the `Match` contains all the route data, we can create a new matching functio (require '[clojure.string :as str]) (defn recursive-match-by-path [router path] - (if-let [match (r/match-by-path router path)] + (when-let [match (r/match-by-path router path)] (if-let [subrouter (-> match :data :router)] (let [subpath (subs path (str/last-index-of (:template match) "/"))] - (if-let [submatch (recursive-match-by-path subrouter subpath)] + (when-let [submatch (recursive-match-by-path subrouter subpath)] (cons match submatch))) (list match)))) ``` From 9f798c63c9482cb4342c926eb66b9ecb3a09830b Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Wed, 3 Nov 2021 12:16:42 +0200 Subject: [PATCH 063/113] Reorder some example code --- .../src/cljs/frontend_re_frame/core.cljs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/frontend-re-frame/src/cljs/frontend_re_frame/core.cljs b/examples/frontend-re-frame/src/cljs/frontend_re_frame/core.cljs index 49d2c12e..dcd3774a 100644 --- a/examples/frontend-re-frame/src/cljs/frontend_re_frame/core.cljs +++ b/examples/frontend-re-frame/src/cljs/frontend_re_frame/core.cljs @@ -7,6 +7,14 @@ [reitit.frontend.controllers :as rfc] [reitit.frontend.easy :as rfe])) +;;; Effects ;;; + +;; Triggering navigation from events. + +(re-frame/reg-fx :push-state + (fn [route] + (apply rfe/push-state route))) + ;;; Events ;;; (re-frame/reg-event-db ::initialize-db @@ -16,7 +24,7 @@ {:current-route nil}))) (re-frame/reg-event-fx ::push-state - (fn [db [_ & route]] + (fn [_ [_ & route]] {:push-state route})) (re-frame/reg-event-db ::navigated @@ -49,14 +57,6 @@ [:div [:h1 "This is sub-page 2"]]) -;;; Effects ;;; - -;; Triggering navigation from events. - -(re-frame/reg-fx :push-state - (fn [route] - (apply rfe/push-state route))) - ;;; Routes ;;; (defn href From 59f4bf285a81b3d25698be5a690c0902c5292032 Mon Sep 17 00:00:00 2001 From: zengxinhui Date: Wed, 13 Oct 2021 02:42:52 -0400 Subject: [PATCH 064/113] duplicate r/routes output Perhaps this is not needed as the same output is shown above close. Or the `nil`s need to be removed to match actual output. See PR513 https://github.com/metosin/reitit/pull/513 --- doc/basics/router.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/doc/basics/router.md b/doc/basics/router.md index 826a420d..dba18dd6 100644 --- a/doc/basics/router.md +++ b/doc/basics/router.md @@ -63,14 +63,6 @@ Route names: ; [:user/ping :user/user] ``` -The compiled route tree: - -```clj -(r/routes router) -; [["/api/ping" {:name :user/ping}] -; ["/api/user/:id" {:name :user/user}]] -``` - ### Composing As routes are defined as plain data, it's easy to merge multiple route trees into a single router From 9eded42ba1f951e9965e873b42f97cb6458c965a Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Wed, 3 Nov 2021 12:52:45 +0200 Subject: [PATCH 065/113] Improve frontend docstrings --- .../src/reitit/frontend/easy.cljs | 23 ++++++++++++------- .../src/reitit/frontend/history.cljs | 22 +++++++++++------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index b3befcbd..5e329e38 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -43,7 +43,10 @@ (defn ^{:see-also ["reitit.frontend.history/href"]} href - "Generate link href for the given route and parameters + "Generate a URL for a route defined by name, with given path-params and query-params. + + The URL is formatted using Reitit frontend history handler, so using it with + anchor element href will correctly trigger route change event. Note: currently collections in query-parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them @@ -58,11 +61,13 @@ (defn ^{:see-also ["reitit.frontend.history/push-state"]} push-state - "Creates url using the given route and parameters, pushes those to - history stack with pushState and triggers on-navigate callback on the - history handler. + "Updates the browser location and pushes new entry to the history stack using + URL built from a route defined by name, with given path-params and + query-params. - Note: currently collections in query-parameters are encoded as field-value + Will also trigger on-navigate callback on Reitit frontend History handler. + + Note: currently collections in query parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them differently, convert the collections to strings first. @@ -78,9 +83,11 @@ (defn ^{:see-also ["reitit.frontend.history/replace-state"]} replace-state - "Creates url using the given route and parameters, replaces latest entry on - history stack with replaceState and triggers on-navigate callback on the - history handler. + "Updates the browser location and replaces latest entry in the history stack + using URL built from a route defined by name, with given path-params and + query-params. + + Will also trigger on-navigate callback on Reitit frontend History handler. Note: currently collections in query-parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 53967af4..f135d7bc 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -178,9 +178,12 @@ (-stop history))) (defn href - "Generate link href for the given route and parameters + "Generate a URL for a route defined by name, with given path-params and query-params. - Note: currently collections in query-parameters are encoded as field-value + The URL is formatted using Reitit frontend history handler, so using it with + anchor element href will correctly trigger route change event. + + Note: currently collections in query parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them differently, convert the collections to strings first." ([history name] @@ -194,9 +197,10 @@ (defn ^{:see-also ["reitit.core/match->path"]} push-state - "Creates url using the given route and parameters, pushes those to - history stack with pushState and triggers on-navigate callback on the - history handler. + "Updates the browser URL and pushes new entry to the history stack using + a route defined by name, with given path-params and query-params. + + Will also trigger on-navigate callback on Reitit frontend History handler. Note: currently collections in query-parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them @@ -216,9 +220,11 @@ (-on-navigate history path)))) (defn replace-state - "Creates url using the given route and parameters, replaces latest entry on - history stack with replaceState and triggers on-navigate callback on the - history handler. + "Updates the browser location and replaces latest entry in the history stack + using URL built from a route defined by name, with given path-params and + query-params. + + Will also trigger on-navigate callback on Reitit frontend History handler. Note: currently collections in query-parameters are encoded as field-value pairs separated by &, i.e. \"?a=1&a=2\", if you want to encode them From 5bd4aec77535c00204f14f75ac2a6cf1a47c7321 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Wed, 3 Nov 2021 13:01:22 +0200 Subject: [PATCH 066/113] Update changelog --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a7d76d5..814bf152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,22 @@ We use [Break Versioning][breakver]. The version numbers follow a `...... Date: Mon, 8 Nov 2021 17:27:01 -0600 Subject: [PATCH 067/113] Fix middleware ordering in ring example --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 78d89e1b..1cfbfcd6 100644 --- a/README.md +++ b/README.md @@ -108,8 +108,8 @@ A Ring routing app with input & output coercion using [data-specs](https://githu :muuntaja m/instance :middleware [parameters/parameters-middleware rrc/coerce-request-middleware - rrc/coerce-response-middleware - muuntaja/format-response-middleware]}}))) + muuntaja/format-response-middleware + rrc/coerce-response-middleware]}}))) ``` Valid request: From fce79e903b891e4db011bd4247a2bf125b772f39 Mon Sep 17 00:00:00 2001 From: Mathieu Lirzin Date: Sat, 4 Dec 2021 18:06:51 +0100 Subject: [PATCH 068/113] =?UTF-8?q?Remove=20unused=20internal=20=E2=80=98g?= =?UTF-8?q?oog-extend=E2=80=99=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/reitit-core/src/reitit/impl.cljc | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index cc902295..34bd12b4 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -252,15 +252,3 @@ (str/join "&" (map query-parameter (repeat k) v)) (query-parameter k v)))) (str/join "&"))) - -(defmacro goog-extend [type base-type ctor & methods] - `(do - (def ~type (fn ~@ctor)) - - (goog/inherits ~type ~base-type) - - ~@(map - (fn [method] - `(set! (.. ~type -prototype ~(symbol (str "-" (first method)))) - (fn ~@(rest method)))) - methods))) From 673f6dec72a883aa60b3115b5008274d331cc925 Mon Sep 17 00:00:00 2001 From: Michael Salihi Date: Thu, 9 Dec 2021 10:48:59 +0100 Subject: [PATCH 069/113] Replace with when-let since no else branches --- doc/advanced/composing_routers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index d6db2426..4a0f37c9 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -206,10 +206,10 @@ First, we need to modify our matching function to support router references: (deref x) x)) (defn recursive-match-by-path [router path] - (if-let [match (r/match-by-path (<< router) path)] + (when-let [match (r/match-by-path (<< router) path)] (if-let [subrouter (-> match :data :router <<)] (let [subpath (subs path (str/last-index-of (:template match) "/"))] - (if-let [submatch (recursive-match-by-path subrouter subpath)] + (when-let [submatch (recursive-match-by-path subrouter subpath)] (cons match submatch))) (list match)))) ``` From ad90a2788ec8b8440c6327a272db1214bbab1477 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Wed, 22 Dec 2021 21:49:02 +0200 Subject: [PATCH 070/113] The goog-extend macro isn't used Reitit.frontend.history was rewritten in 08156f6a6dfcb409c1a20224e750d5459f1d4d74 --- modules/reitit-core/src/reitit/impl.cljc | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index cc902295..34bd12b4 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -252,15 +252,3 @@ (str/join "&" (map query-parameter (repeat k) v)) (query-parameter k v)))) (str/join "&"))) - -(defmacro goog-extend [type base-type ctor & methods] - `(do - (def ~type (fn ~@ctor)) - - (goog/inherits ~type ~base-type) - - ~@(map - (fn [method] - `(set! (.. ~type -prototype ~(symbol (str "-" (first method)))) - (fn ~@(rest method)))) - methods))) From 07c39fc2dfd7afa7fc03281fffc637126563a496 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Mon, 24 Jan 2022 12:39:42 +0200 Subject: [PATCH 071/113] Setup clj-kondo files for each module Clojure-lsp will run clj-kondo on the module folders, so those modules should refer back to root configuration. Clj-kondo itself works the same, if running from a module directory. Some editor plugins might run clj-kondo on the working directory always (reitit root folder usually), and in those cases this isn't needed. --- .clj-kondo/config.edn | 2 +- .clj-kondo/module_config.edn | 1 + .gitignore | 2 +- modules/reitit-core/.clj-kondo/config.edn | 1 + modules/reitit-dev/.clj-kondo/config.edn | 1 + modules/reitit-frontend/.clj-kondo/config.edn | 1 + modules/reitit-http/.clj-kondo/config.edn | 1 + modules/reitit-interceptors/.clj-kondo/config.edn | 1 + modules/reitit-malli/.clj-kondo/config.edn | 1 + modules/reitit-middleware/.clj-kondo/config.edn | 1 + modules/reitit-pedestal/.clj-kondo/config.edn | 1 + modules/reitit-ring/.clj-kondo/config.edn | 1 + modules/reitit-schema/.clj-kondo/config.edn | 1 + modules/reitit-sieppari/.clj-kondo/config.edn | 1 + modules/reitit-spec/.clj-kondo/config.edn | 1 + modules/reitit-swagger-ui/.clj-kondo/config.edn | 1 + modules/reitit-swagger/.clj-kondo/config.edn | 1 + modules/reitit/.clj-kondo/config.edn | 1 + 18 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 .clj-kondo/module_config.edn create mode 120000 modules/reitit-core/.clj-kondo/config.edn create mode 120000 modules/reitit-dev/.clj-kondo/config.edn create mode 120000 modules/reitit-frontend/.clj-kondo/config.edn create mode 120000 modules/reitit-http/.clj-kondo/config.edn create mode 120000 modules/reitit-interceptors/.clj-kondo/config.edn create mode 120000 modules/reitit-malli/.clj-kondo/config.edn create mode 120000 modules/reitit-middleware/.clj-kondo/config.edn create mode 120000 modules/reitit-pedestal/.clj-kondo/config.edn create mode 120000 modules/reitit-ring/.clj-kondo/config.edn create mode 120000 modules/reitit-schema/.clj-kondo/config.edn create mode 120000 modules/reitit-sieppari/.clj-kondo/config.edn create mode 120000 modules/reitit-spec/.clj-kondo/config.edn create mode 120000 modules/reitit-swagger-ui/.clj-kondo/config.edn create mode 120000 modules/reitit-swagger/.clj-kondo/config.edn create mode 120000 modules/reitit/.clj-kondo/config.edn diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index f1384b24..9c08ee56 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -1,6 +1,6 @@ {;;:skip-comments true :lint-as {potemkin/def-derived-map clojure.core/defrecord} - :linters {:if {:level :off} + :linters {:missing-else-branch {:level :off} :unused-binding {:level :off} :unused-referred-var {:exclude {clojure.test [deftest testing is are] cljs.test [deftest testing is are]}}}} diff --git a/.clj-kondo/module_config.edn b/.clj-kondo/module_config.edn new file mode 100644 index 00000000..e01b2bf1 --- /dev/null +++ b/.clj-kondo/module_config.edn @@ -0,0 +1 @@ +{:config-paths ["../../../.clj-kondo"]} diff --git a/.gitignore b/.gitignore index e0b0772e..17f8f201 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,4 @@ pom.xml.asc /_book figwheel_server.log /.idea -.clj-kondo \ No newline at end of file +.clj-kondo/cache diff --git a/modules/reitit-core/.clj-kondo/config.edn b/modules/reitit-core/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-core/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-dev/.clj-kondo/config.edn b/modules/reitit-dev/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-dev/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-frontend/.clj-kondo/config.edn b/modules/reitit-frontend/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-frontend/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-http/.clj-kondo/config.edn b/modules/reitit-http/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-http/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-interceptors/.clj-kondo/config.edn b/modules/reitit-interceptors/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-interceptors/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-malli/.clj-kondo/config.edn b/modules/reitit-malli/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-malli/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-middleware/.clj-kondo/config.edn b/modules/reitit-middleware/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-middleware/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-pedestal/.clj-kondo/config.edn b/modules/reitit-pedestal/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-pedestal/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-ring/.clj-kondo/config.edn b/modules/reitit-ring/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-ring/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-schema/.clj-kondo/config.edn b/modules/reitit-schema/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-schema/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-sieppari/.clj-kondo/config.edn b/modules/reitit-sieppari/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-sieppari/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-spec/.clj-kondo/config.edn b/modules/reitit-spec/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-spec/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-swagger-ui/.clj-kondo/config.edn b/modules/reitit-swagger-ui/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-swagger-ui/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit-swagger/.clj-kondo/config.edn b/modules/reitit-swagger/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit-swagger/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file diff --git a/modules/reitit/.clj-kondo/config.edn b/modules/reitit/.clj-kondo/config.edn new file mode 120000 index 00000000..31dc332a --- /dev/null +++ b/modules/reitit/.clj-kondo/config.edn @@ -0,0 +1 @@ +../../../.clj-kondo/module_config.edn \ No newline at end of file From b7cc420fde8f91fdf084241a268984f8667dd05e Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 12 Feb 2022 22:30:42 +0200 Subject: [PATCH 072/113] update deps --- .gitignore | 2 +- CHANGELOG.md | 13 ++++++++++++ project.clj | 60 ++++++++++++++++++++++++++-------------------------- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index 17f8f201..84175044 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,4 @@ pom.xml.asc /_book figwheel_server.log /.idea -.clj-kondo/cache +.clj-kondo diff --git a/CHANGELOG.md b/CHANGELOG.md index 814bf152..8d4aeca3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,19 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Sat, 12 Feb 2022 22:34:26 +0200 Subject: [PATCH 073/113] format --- modules/reitit-core/src/reitit/coercion.cljc | 58 ++-- modules/reitit-core/src/reitit/core.cljc | 62 ++-- .../reitit-core/src/reitit/dependency.cljc | 8 +- modules/reitit-core/src/reitit/exception.cljc | 20 +- modules/reitit-core/src/reitit/impl.cljc | 92 +++--- .../reitit-core/src/reitit/interceptor.cljc | 56 ++-- .../reitit-core/src/reitit/middleware.cljc | 48 ++-- modules/reitit-core/src/reitit/spec.cljc | 44 +-- modules/reitit-core/src/reitit/trie.cljc | 200 ++++++------- modules/reitit-dev/src/reitit/dev/pretty.cljc | 126 ++++----- .../reitit-frontend/src/reitit/frontend.cljs | 10 +- .../src/reitit/frontend/easy.cljs | 2 +- modules/reitit-http/src/reitit/http.cljc | 34 +-- modules/reitit-http/src/reitit/http/spec.cljc | 4 +- .../src/reitit/http/interceptors/dev.clj | 16 +- .../reitit/http/interceptors/exception.clj | 8 +- .../reitit/http/interceptors/multipart.clj | 10 +- .../src/reitit/http/interceptors/muuntaja.clj | 20 +- .../src/reitit/coercion/malli.cljc | 84 +++--- .../src/reitit/ring/middleware/dev.clj | 6 +- .../src/reitit/ring/middleware/exception.clj | 8 +- .../src/reitit/ring/middleware/multipart.clj | 10 +- .../src/reitit/ring/middleware/muuntaja.clj | 20 +- .../reitit-pedestal/src/reitit/pedestal.clj | 16 +- modules/reitit-ring/src/reitit/ring.cljc | 80 +++--- .../reitit-ring/src/reitit/ring/coercion.cljc | 4 +- modules/reitit-ring/src/reitit/ring/spec.cljc | 11 +- .../src/reitit/coercion/schema.cljc | 64 ++--- .../src/reitit/interceptor/sieppari.clj | 8 +- .../reitit-spec/src/reitit/coercion/spec.cljc | 52 ++-- .../src/reitit/swagger_ui.cljc | 12 +- .../reitit-swagger/src/reitit/swagger.cljc | 14 +- test/clj/cljdoc/reaper.clj | 9 +- .../http/interceptors/exception_test.clj | 34 +-- .../http/interceptors/muuntaja_test.clj | 114 ++++---- .../http/interceptors/parameters_test.clj | 26 +- test/clj/reitit/http_coercion_test.clj | 256 ++++++++--------- test/clj/reitit/http_test.clj | 208 +++++++------- test/clj/reitit/pedestal_test.clj | 10 +- .../reitit/ring/middleware/exception_test.clj | 69 +++-- .../reitit/ring/middleware/muuntaja_test.clj | 116 ++++---- .../ring/middleware/parameters_test.clj | 22 +- test/cljc/reitit/coercion_test.cljc | 44 +-- test/cljc/reitit/core_test.cljc | 196 ++++++------- test/cljc/reitit/exception_test.cljc | 12 +- test/cljc/reitit/interceptor_test.cljc | 48 ++-- test/cljc/reitit/middleware_test.cljc | 54 ++-- test/cljc/reitit/ring_coercion_test.cljc | 264 +++++++++--------- test/cljc/reitit/ring_spec_test.cljc | 170 +++++------ test/cljc/reitit/ring_test.cljc | 195 +++++++------ test/cljc/reitit/spec_test.cljc | 78 +++--- test/cljc/reitit/swagger_test.clj | 244 ++++++++-------- 52 files changed, 1686 insertions(+), 1690 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 57d55628..0fd5d234 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -43,28 +43,28 @@ (defn ^:no-doc request-coercion-failed! [result coercion value in request] (throw - (ex-info - (str "Request coercion failed: " (pr-str result)) - (merge - (into {} result) - {:type ::request-coercion - :coercion coercion - :value value - :in [:request in] - :request request})))) + (ex-info + (str "Request coercion failed: " (pr-str result)) + (merge + (into {} result) + {:type ::request-coercion + :coercion coercion + :value value + :in [:request in] + :request request})))) (defn ^:no-doc response-coercion-failed! [result coercion value request response] (throw - (ex-info - (str "Response coercion failed: " (pr-str result)) - (merge - (into {} result) - {:type ::response-coercion - :coercion coercion - :value value - :in [:response :body] - :request request - :response response})))) + (ex-info + (str "Response coercion failed: " (pr-str result)) + (merge + (into {} result) + {:type ::response-coercion + :coercion coercion + :value value + :in [:response :body] + :request request + :response response})))) (defn extract-request-format-default [request] (-> request :muuntaja/request :format)) @@ -109,9 +109,9 @@ (defn coerce-request [coercers request] (reduce-kv - (fn [acc k coercer] - (impl/fast-assoc acc k (coercer request))) - {} coercers)) + (fn [acc k coercer] + (impl/fast-assoc acc k (coercer request))) + {} coercers)) (defn coerce-response [coercers request response] (if response @@ -147,13 +147,13 @@ :multipart :formData}] (case specification :swagger (->> (update - data - :parameters - (fn [parameters] - (->> parameters - (map (fn [[k v]] [(swagger-parameter k) v])) - (filter first) - (into {})))) + data + :parameters + (fn [parameters] + (->> parameters + (map (fn [[k v]] [(swagger-parameter k) v])) + (filter first) + (into {})))) (-get-apidocs coercion specification))))) ;; diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index bcd54ac4..ca605189 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -61,7 +61,7 @@ (if-not (partial-match? match) match (impl/throw-on-missing-path-params - (:template match) (:required match) path-params))))) + (:template match) (:required match) path-params))))) (defn match->path ([match] @@ -87,15 +87,15 @@ (let [compiler (::trie/trie-compiler opts (trie/compiler)) names (impl/find-names compiled-routes opts) [pl nl] (reduce - (fn [[pl nl] [p {:keys [name] :as data} result]] - (let [{:keys [path-params] :as route} (impl/parse p opts) - f #(if-let [path (impl/path-for route %)] - (->Match p data result (impl/url-decode-coll %) path) - (->PartialMatch p data result (impl/url-decode-coll %) path-params))] - [(conj pl (-> (trie/insert nil p (->Match p data result nil nil) opts) (trie/compile))) - (if name (assoc nl name f) nl)])) - [[] {}] - compiled-routes) + (fn [[pl nl] [p {:keys [name] :as data} result]] + (let [{:keys [path-params] :as route} (impl/parse p opts) + f #(if-let [path (impl/path-for route %)] + (->Match p data result (impl/url-decode-coll %) path) + (->PartialMatch p data result (impl/url-decode-coll %) path-params))] + [(conj pl (-> (trie/insert nil p (->Match p data result nil nil) opts) (trie/compile))) + (if name (assoc nl name f) nl)])) + [[] {}] + compiled-routes) lookup (impl/fast-map nl) matcher (trie/linear-matcher compiler pl true) match-by-path (trie/path-matcher matcher compiler) @@ -133,18 +133,18 @@ ([compiled-routes opts] (when-let [wilds (seq (filter (impl/->wild-route? opts) compiled-routes))] (exception/fail! - (str "can't create :lookup-router with wildcard routes: " wilds) - {:wilds wilds - :routes compiled-routes})) + (str "can't create :lookup-router with wildcard routes: " wilds) + {:wilds wilds + :routes compiled-routes})) (let [names (impl/find-names compiled-routes opts) [pl nl] (reduce - (fn [[pl nl] [p {:keys [name] :as data} result]] - [(assoc pl p (->Match p data result {} p)) - (if name - (assoc nl name #(->Match p data result % p)) - nl)]) - [{} {}] - compiled-routes) + (fn [[pl nl] [p {:keys [name] :as data} result]] + [(assoc pl p (->Match p data result {} p)) + (if name + (assoc nl name #(->Match p data result % p)) + nl)]) + [{} {}] + compiled-routes) data (impl/fast-map pl) lookup (impl/fast-map nl) routes (impl/uncompile-routes compiled-routes)] @@ -183,15 +183,15 @@ (let [compiler (::trie/trie-compiler opts (trie/compiler)) names (impl/find-names compiled-routes opts) [pl nl] (reduce - (fn [[pl nl] [p {:keys [name] :as data} result]] - (let [{:keys [path-params] :as route} (impl/parse p opts) - f #(if-let [path (impl/path-for route %)] - (->Match p data result (impl/url-decode-coll %) path) - (->PartialMatch p data result (impl/url-decode-coll %) path-params))] - [(trie/insert pl p (->Match p data result nil nil) opts) - (if name (assoc nl name f) nl)])) - [nil {}] - compiled-routes) + (fn [[pl nl] [p {:keys [name] :as data} result]] + (let [{:keys [path-params] :as route} (impl/parse p opts) + f #(if-let [path (impl/path-for route %)] + (->Match p data result (impl/url-decode-coll %) path) + (->PartialMatch p data result (impl/url-decode-coll %) path-params))] + [(trie/insert pl p (->Match p data result nil nil) opts) + (if name (assoc nl name f) nl)])) + [nil {}] + compiled-routes) matcher (trie/compile pl compiler) match-by-path (trie/path-matcher matcher compiler) lookup (impl/fast-map nl) @@ -229,8 +229,8 @@ ([compiled-routes opts] (when (or (not= (count compiled-routes) 1) (some (impl/->wild-route? opts) compiled-routes)) (exception/fail! - (str ":single-static-path-router requires exactly 1 static route: " compiled-routes) - {:routes compiled-routes})) + (str ":single-static-path-router requires exactly 1 static route: " compiled-routes) + {:routes compiled-routes})) (let [[n :as names] (impl/find-names compiled-routes opts) [[p data result]] compiled-routes p #?(:clj (.intern ^String p) :cljs p) diff --git a/modules/reitit-core/src/reitit/dependency.cljc b/modules/reitit-core/src/reitit/dependency.cljc index 4dcc6e97..6f1209eb 100644 --- a/modules/reitit-core/src/reitit/dependency.cljc +++ b/modules/reitit-core/src/reitit/dependency.cljc @@ -10,8 +10,8 @@ (map (fn [provide] (when (contains? acc provide) (exception/fail! - (str "multiple providers for: " provide) - {::multiple-providers provide})) + (str "multiple providers for: " provide) + {::multiple-providers provide})) [provide dependent])) (get-provides dependent))) {} nodes)) @@ -22,8 +22,8 @@ (if (contains? providers k) (get providers k) (exception/fail! - (str "provider missing for dependency: " k) - {::missing-provider k}))) + (str "provider missing for dependency: " k) + {::missing-provider k}))) (defn post-order "Put `nodes` in post-order. Can also be described as a reverse topological sort. diff --git a/modules/reitit-core/src/reitit/exception.cljc b/modules/reitit-core/src/reitit/exception.cljc index ff848910..df61b66a 100644 --- a/modules/reitit-core/src/reitit/exception.cljc +++ b/modules/reitit-core/src/reitit/exception.cljc @@ -31,20 +31,20 @@ path " " (not-empty (select-keys route-data [:conflicting]))))] (apply str "Router contains conflicting route paths:\n\n" (mapv - (fn [[[path route-data] vals]] - (str (resolve-str path route-data) - "\n" - (str/join "\n" (mapv (fn [[path route-data]] - (resolve-str path route-data)) vals)) - "\n\n")) - conflicts)))) + (fn [[[path route-data] vals]] + (str (resolve-str path route-data) + "\n" + (str/join "\n" (mapv (fn [[path route-data]] + (resolve-str path route-data)) vals)) + "\n\n")) + conflicts)))) (defmethod format-exception :name-conflicts [_ _ conflicts] (apply str "Router contains conflicting route names:\n\n" (mapv - (fn [[name vals]] - (str name "\n-> " (str/join "\n-> " (mapv first vals)) "\n")) - conflicts))) + (fn [[name vals]] + (str name "\n-> " (str/join "\n-> " (mapv first vals)) "\n")) + conflicts))) (defmethod format-exception :reitit.impl/merge-data [_ _ data] (str "Error merging route-data\n\n" (pr-str data))) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 34bd12b4..a77bf146 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -28,33 +28,33 @@ Also works on vectors. Maintains key for maps, order for vectors." [f coll] (reduce-kv - (fn [coll k v] - (if-some [v' (f v)] - (assoc coll k v') - coll)) - coll - coll)) + (fn [coll k v] + (if-some [v' (f v)] + (assoc coll k v') + coll)) + coll + coll)) (defn walk [raw-routes {:keys [path data routes expand] :or {data [], routes []} :as opts}] (letfn - [(walk-many [p m r] - (reduce #(into %1 (walk-one p m %2)) [] r)) - (walk-one [pacc macc routes] - (if (vector? (first routes)) - (walk-many pacc macc routes) - (when (string? (first routes)) - (let [[path & [maybe-arg :as args]] routes - [data childs] (if (or (vector? maybe-arg) - (and (sequential? maybe-arg) - (sequential? (first maybe-arg))) - (nil? maybe-arg)) - [{} args] - [maybe-arg (rest args)]) - macc (into macc (expand data opts)) - child-routes (walk-many (str pacc path) macc (keep identity childs))] - (if (seq childs) (seq child-routes) [[(str pacc path) macc]])))))] + [(walk-many [p m r] + (reduce #(into %1 (walk-one p m %2)) [] r)) + (walk-one [pacc macc routes] + (if (vector? (first routes)) + (walk-many pacc macc routes) + (when (string? (first routes)) + (let [[path & [maybe-arg :as args]] routes + [data childs] (if (or (vector? maybe-arg) + (and (sequential? maybe-arg) + (sequential? (first maybe-arg))) + (nil? maybe-arg)) + [{} args] + [maybe-arg (rest args)]) + macc (into macc (expand data opts)) + child-routes (walk-many (str pacc path) macc (keep identity childs))] + (if (seq childs) (seq child-routes) [[(str pacc path) macc]])))))] (walk-one path (mapv identity data) raw-routes))) (defn map-data [f routes] @@ -62,25 +62,25 @@ (defn merge-data [p x] (reduce - (fn [acc [k v]] - (try - (mm/meta-merge acc {k v}) - (catch #?(:clj Exception, :cljs js/Error) e - (ex/fail! ::merge-data {:path p, :left acc, :right {k v}, :exception e})))) - {} x)) + (fn [acc [k v]] + (try + (mm/meta-merge acc {k v}) + (catch #?(:clj Exception, :cljs js/Error) e + (ex/fail! ::merge-data {:path p, :left acc, :right {k v}, :exception e})))) + {} x)) (defn resolve-routes [raw-routes {:keys [coerce] :as opts}] (cond->> (->> (walk raw-routes opts) (map-data merge-data)) - coerce (into [] (keep #(coerce % opts))))) + coerce (into [] (keep #(coerce % opts))))) (defn path-conflicting-routes [routes opts] (let [parts-and-routes (mapv (fn [[s :as r]] [(trie/split-path s opts) r]) routes)] (-> (into {} (comp (map-indexed (fn [index [p r]] [r (reduce - (fn [acc [p' r']] - (if (trie/conflicting-parts? p p') - (conj acc r') acc)) - #{} (subvec parts-and-routes (inc index)))])) + (fn [acc [p' r']] + (if (trie/conflicting-parts? p p') + (conj acc r') acc)) + #{} (subvec parts-and-routes (inc index)))])) (filter (comp seq second))) parts-and-routes) (not-empty)))) @@ -123,13 +123,13 @@ (defn path-for [route path-params] (if (:path-params route) (if-let [parts (reduce - (fn [acc part] - (if (string? part) - (conj acc part) - (if-let [p (get path-params (:value part))] - (conj acc p) - (reduced nil)))) - [] (:path-parts route))] + (fn [acc part] + (if (string? part) + (conj acc part) + (if-let [p (get path-params (:value part))] + (conj acc p) + (reduced nil)))) + [] (:path-parts route))] (apply str parts)) (:path route))) @@ -138,8 +138,8 @@ (let [defined (-> path-params keys set) missing (set/difference required defined)] (ex/fail! - (str "missing path-params for route " template " -> " missing) - {:path-params path-params, :required required})))) + (str "missing path-params for route " template " -> " missing) + {:path-params path-params, :required required})))) (defn fast-assoc #?@(:clj [[^clojure.lang.Associative a k v] (.assoc a k v)] @@ -178,10 +178,10 @@ (if s #?(:clj (if (.contains ^String s "%") (URLDecoder/decode - (if (.contains ^String s "+") - (.replace ^String s "+" "%2B") - ^String s) - "UTF-8")) + (if (.contains ^String s "+") + (.replace ^String s "+" "%2B") + ^String s) + "UTF-8")) :cljs (js/decodeURIComponent s)))) (defn url-decode [s] diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index b6bfade9..f60f1a50 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -37,36 +37,36 @@ (if-let [interceptor (if registry (registry this))] (into-interceptor interceptor data opts) (throw - (ex-info - (str - "Interceptor " this " not found in registry.\n\n" - (if (seq registry) - (str - "Available interceptors in registry:\n" - (with-out-str - (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) - "see [reitit.interceptor/router] on how to add interceptor to the registry.\n") "\n") - {:id this - :registry registry})))) + (ex-info + (str + "Interceptor " this " not found in registry.\n\n" + (if (seq registry) + (str + "Available interceptors in registry:\n" + (with-out-str + (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) + "see [reitit.interceptor/router] on how to add interceptor to the registry.\n") "\n") + {:id this + :registry registry})))) #?(:clj clojure.lang.APersistentVector :cljs cljs.core.PersistentVector) (into-interceptor [[f & args :as form] data opts] (when (and (seq args) (not (fn? f))) (exception/fail! - (str "Invalid Interceptor form: " form "") - {:form form})) + (str "Invalid Interceptor form: " form "") + {:form form})) (into-interceptor (apply f args) data opts)) #?(:clj clojure.lang.Fn :cljs function) (into-interceptor [this data opts] (into-interceptor - {:name ::handler - ::handler this - :enter (fn [ctx] - (assoc ctx :response (this (:request ctx))))} - data opts)) + {:name ::handler + ::handler this + :enter (fn [ctx] + (assoc ctx :response (this (:request ctx))))} + data opts)) #?(:clj clojure.lang.PersistentArrayMap :cljs cljs.core.PersistentArrayMap) @@ -86,13 +86,13 @@ opts (assoc opts ::compiled (inc ^long compiled))] (when (>= ^long compiled ^long *max-compile-depth*) (exception/fail! - (str "Too deep Interceptor compilation - " compiled) - {:this this, :data data, :opts opts})) + (str "Too deep Interceptor compilation - " compiled) + {:this this, :data data, :opts opts})) (if-let [interceptor (into-interceptor (compile data opts) data opts)] (map->Interceptor - (merge - (dissoc this :compile) - (impl/strip-nils interceptor))))))) + (merge + (dissoc this :compile) + (impl/strip-nils interceptor))))))) nil (into-interceptor [_ _ _])) @@ -122,9 +122,9 @@ ([[_ {:keys [interceptors handler] :as data}] {::keys [queue] :as opts} _] (let [chain (chain (into (vec interceptors) [handler]) data opts)] (map->Endpoint - {:interceptors chain - :queue ((or queue identity) chain) - :data data})))) + {:interceptors chain + :queue ((or queue identity) chain) + :data data})))) (defn transform-butlast "Returns a function to that takes a interceptor transformation function and @@ -132,8 +132,8 @@ [f] (fn [interceptors] (concat - (f (butlast interceptors)) - [(last interceptors)]))) + (f (butlast interceptors)) + [(last interceptors)]))) (defn router "Creates a [[reitit.core/Router]] from raw route data and optionally an options map with diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index b27e1d0c..686d1e88 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -21,17 +21,17 @@ (if-let [middleware (if registry (registry this))] (into-middleware middleware data opts) (throw - (ex-info - (str - "Middleware " this " not found in registry.\n\n" - (if (seq registry) - (str - "Available middleware in registry:\n" - (with-out-str - (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) - "see [reitit.middleware/router] on how to add middleware to the registry.\n") "\n") - {:id this - :registry registry})))) + (ex-info + (str + "Middleware " this " not found in registry.\n\n" + (if (seq registry) + (str + "Available middleware in registry:\n" + (with-out-str + (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) + "see [reitit.middleware/router] on how to add middleware to the registry.\n") "\n") + {:id this + :registry registry})))) #?(:clj clojure.lang.APersistentVector :cljs cljs.core.PersistentVector) @@ -43,7 +43,7 @@ :cljs function) (into-middleware [this _ _] (map->Middleware - {:wrap this})) + {:wrap this})) #?(:clj clojure.lang.PersistentArrayMap :cljs cljs.core.PersistentArrayMap) @@ -63,13 +63,13 @@ opts (assoc opts ::compiled (inc ^long compiled))] (when (>= ^long compiled ^long *max-compile-depth*) (exception/fail! - (str "Too deep Middleware compilation - " compiled) - {:this this, :data data, :opts opts})) + (str "Too deep Middleware compilation - " compiled) + {:this this, :data data, :opts opts})) (if-let [middeware (into-middleware (compile data opts) data opts)] (map->Middleware - (merge - (dissoc this :compile) - (impl/strip-nils middeware))))))) + (merge + (dissoc this :compile) + (impl/strip-nils middeware))))))) nil (into-middleware [_ _ _])) @@ -77,10 +77,10 @@ (defn- ensure-handler! [path data scope] (when-not (:handler data) (exception/fail! - (str "path \"" path "\" doesn't have a :handler defined" - (if scope (str " for " scope))) - (merge {:path path, :data data} - (if scope {:scope scope}))))) + (str "path \"" path "\" doesn't have a :handler defined" + (if scope (str " for " scope))) + (merge {:path path, :data data} + (if scope {:scope scope}))))) (defn- expand-and-transform [middleware data {::keys [transform] :or {transform identity} :as opts}] @@ -116,9 +116,9 @@ (ensure-handler! path data scope) (let [middleware (expand-and-transform middleware data opts)] (map->Endpoint - {:handler (compile-handler middleware handler) - :middleware middleware - :data data})))) + {:handler (compile-handler middleware handler) + :middleware middleware + :data data})))) (defn router "Creates a [[reitit.core/Router]] from raw route data and optionally an options map with diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index f538a3f8..d2e4fa54 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -16,9 +16,9 @@ (s/def ::raw-route (s/nilable - (s/cat :path ::path - :arg (s/? ::arg) - :childs (s/* (s/and (s/nilable ::raw-routes)))))) + (s/cat :path ::path + :arg (s/? ::arg) + :childs (s/* (s/and (s/nilable ::raw-routes)))))) (s/def ::raw-routes (s/or :route ::raw-route @@ -60,19 +60,19 @@ (s/def ::opts (s/nilable - (s/keys :opt-un [:reitit.router/path - :reitit.router/routes - :reitit.router/data - :reitit.router/expand - :reitit.router/coerce - :reitit.router/compile - :reitit.router/conflicts - :reitit.router/router]))) + (s/keys :opt-un [:reitit.router/path + :reitit.router/routes + :reitit.router/data + :reitit.router/expand + :reitit.router/coerce + :reitit.router/compile + :reitit.router/conflicts + :reitit.router/router]))) (s/fdef r/router - :args (s/or :1arity (s/cat :data (s/spec ::raw-routes)) - :2arity (s/cat :data (s/spec ::raw-routes), :opts ::opts)) - :ret ::router) + :args (s/or :1arity (s/cat :data (s/spec ::raw-routes)) + :2arity (s/cat :data (s/spec ::raw-routes), :opts ::opts)) + :ret ::router) ;; ;; coercion @@ -128,15 +128,15 @@ (defn validate [routes {:keys [spec] ::keys [wrap] :or {spec ::default-data, wrap identity}}] (when-let [problems (validate-route-data routes wrap spec)] (exception/fail! - ::invalid-route-data - {:problems problems}))) + ::invalid-route-data + {:problems problems}))) (defmethod exception/format-exception :reitit.spec/invalid-route-data [_ _ {:keys [problems]}] (apply str "Invalid route data:\n\n" (mapv - (fn [{:keys [path scope data spec]}] - (str "-- On route -----------------------\n\n" - (pr-str path) (if scope (str " " (pr-str scope))) "\n\n" - (pr-str data) "\n\n" - (s/explain-str spec data) "\n")) - problems))) + (fn [{:keys [path scope data spec]}] + (str "-- On route -----------------------\n\n" + (pr-str path) (if scope (str " " (pr-str scope))) "\n\n" + (pr-str data) "\n\n" + (s/explain-str spec data) "\n")) + problems))) diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 8cb8f792..1c6be0e3 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -90,12 +90,12 @@ (defn join-path [xs] (reduce - (fn [s x] - (str s (cond - (string? x) x - (instance? Wild x) (str "{" (-> x :value str (subs 1)) "}") - (instance? CatchAll x) (str "{*" (-> x :value str (subs 1)) "}")))) - "" xs)) + (fn [s x] + (str s (cond + (string? x) x + (instance? Wild x) (str "{" (-> x :value str (subs 1)) "}") + (instance? CatchAll x) (str "{*" (-> x :value str (subs 1)) "}")))) + "" xs)) (defn normalize [s opts] (-> s (split-path opts) (join-path))) @@ -172,25 +172,25 @@ :else (or - (reduce - (fn [_ [p n]] - (if-let [cp (common-prefix p path)] - (if (= cp p) + (reduce + (fn [_ [p n]] + (if-let [cp (common-prefix p path)] + (if (= cp p) ;; insert into child node - (let [n' (-insert n (conj ps (subs path (count p))) fp params data)] - (reduced (assoc-in node [:children p] n'))) + (let [n' (-insert n (conj ps (subs path (count p))) fp params data)] + (reduced (assoc-in node [:children p] n'))) ;; split child node - (let [rp (subs p (count cp)) - rp' (subs path (count cp)) - n' (-insert (-node {}) ps fp params data) - n'' (-insert (-node {:children {rp n, rp' n'}}) nil nil nil nil)] - (reduced (update node :children (fn [children] - (-> children - (dissoc p) - (assoc cp n''))))))))) - nil (:children node)) + (let [rp (subs p (count cp)) + rp' (subs path (count cp)) + n' (-insert (-node {}) ps fp params data) + n'' (-insert (-node {:children {rp n, rp' n'}}) nil nil nil nil)] + (reduced (update node :children (fn [children] + (-> children + (dissoc p) + (assoc cp n''))))))))) + nil (:children node)) ;; new child node - (assoc-in node [:children path] (-insert (-node {}) ps fp params data))))] + (assoc-in node [:children path] (-insert (-node {}) ps fp params data))))] (if-let [child (get-in node' [:children ""])] ;; optimize by removing empty paths (-> (merge-with merge (dissoc node' :data) child) @@ -202,10 +202,10 @@ (if percent? #?(:cljs (js/decodeURIComponent param) :clj (URLDecoder/decode - (if (.contains ^String param "+") - (.replace ^String param "+" "%2B") - param) - "UTF-8")) + (if (.contains ^String param "+") + (.replace ^String param "+" "%2B") + param) + "UTF-8")) param))) ;; @@ -313,13 +313,13 @@ (def record-parameters "Memoized function to transform parameters into runtime generated Record." (memoize - (fn [keys] - (if (some qualified-keyword? keys) - (map-parameters keys) - (let [sym (gensym "PathParams") - ctor (symbol (str "map->" sym))] - (binding [*ns* (find-ns 'user)] - (eval `(do (defrecord ~sym ~(mapv (comp symbol name) keys)) (~ctor {})))))))))) + (fn [keys] + (if (some qualified-keyword? keys) + (map-parameters keys) + (let [sym (gensym "PathParams") + ctor (symbol (str "map->" sym))] + (binding [*ns* (find-ns 'user)] + (eval `(do (defrecord ~sym ~(mapv (comp symbol name) keys)) (~ctor {})))))))))) (defn insert "Returns a trie with routes added to it." @@ -327,9 +327,9 @@ (insert nil routes)) ([node routes] (reduce - (fn [acc [p d]] - (insert acc p d)) - node routes)) + (fn [acc [p d]] + (insert acc p d)) + node routes)) ([node path data] (insert node path data nil)) ([node path data {::keys [parameters] :or {parameters map-parameters} :as opts}] @@ -355,12 +355,12 @@ (cond-> data (conj (data-matcher compiler params data))) (into (for [[p c] children] (static-matcher compiler p (compile c compiler (conj cp p))))) (into - (for [[p c] wilds] - (let [pv (:value p) - ends (ends c)] - (if (next ends) - (ex/fail! ::multiple-terminators {:terminators ends, :path (join-path (conj cp p))}) - (wild-matcher compiler pv (ffirst ends) (compile c compiler (conj cp pv))))))) + (for [[p c] wilds] + (let [pv (:value p) + ends (ends c)] + (if (next ends) + (ex/fail! ::multiple-terminators {:terminators ends, :path (join-path (conj cp p))}) + (wild-matcher compiler pv (ffirst ends) (compile c compiler (conj cp pv))))))) (into (for [[p c] catch-all] (catch-all-matcher compiler (:value p) params (:data c)))))] (cond (> (count matchers) 1) (linear-matcher compiler matchers false) @@ -387,61 +387,61 @@ (comment (-> - [["/v2/whoami" 1] - ["/v2/users/:user-id/datasets" 2] - ["/v2/public/projects/:project-id/datasets" 3] - ["/v1/public/topics/:topic" 4] - ["/v1/users/:user-id/orgs/:org-id" 5] - ["/v1/search/topics/:term" 6] - ["/v1/users/:user-id/invitations" 7] - ["/v1/users/:user-id/topics" 9] - ["/v1/users/:user-id/bookmarks/followers" 10] - ["/v2/datasets/:dataset-id" 11] - ["/v1/orgs/:org-id/usage-stats" 12] - ["/v1/orgs/:org-id/devices/:client-id" 13] - ["/v1/messages/user/:user-id" 14] - ["/v1/users/:user-id/devices" 15] - ["/v1/public/users/:user-id" 16] - ["/v1/orgs/:org-id/errors" 17] - ["/v1/public/orgs/:org-id" 18] - ["/v1/orgs/:org-id/invitations" 19] - ["/v1/users/:user-id/device-errors" 22] - ["/v2/login" 23] - ["/v1/users/:user-id/usage-stats" 24] - ["/v2/users/:user-id/devices" 25] - ["/v1/users/:user-id/claim-device/:client-id" 26] - ["/v2/public/projects/:project-id" 27] - ["/v2/public/datasets/:dataset-id" 28] - ["/v2/users/:user-id/topics/bulk" 29] - ["/v1/messages/device/:client-id" 30] - ["/v1/users/:user-id/owned-orgs" 31] - ["/v1/topics/:topic" 32] - ["/v1/users/:user-id/bookmark/:topic" 33] - ["/v1/orgs/:org-id/members/:user-id" 34] - ["/v1/users/:user-id/devices/:client-id" 35] - ["/v1/users/:user-id" 36] - ["/v1/orgs/:org-id/devices" 37] - ["/v1/orgs/:org-id/members" 38] - ["/v2/orgs/:org-id/topics" 40] - ["/v1/whoami" 41] - ["/v1/orgs/:org-id" 42] - ["/v1/users/:user-id/api-key" 43] - ["/v2/schemas" 44] - ["/v2/users/:user-id/topics" 45] - ["/v1/orgs/:org-id/confirm-membership/:token" 46] - ["/v2/topics/:topic" 47] - ["/v1/messages/topic/:topic" 48] - ["/v1/users/:user-id/devices/:client-id/reset-password" 49] - ["/v2/topics" 50] - ["/v1/login" 51] - ["/v1/users/:user-id/orgs" 52] - ["/v2/public/messages/dataset/:dataset-id" 53] - ["/v1/topics" 54] - ["/v1/orgs" 55] - ["/v1/users/:user-id/bookmarks" 56] - ["/v1/orgs/:org-id/topics" 57] - ["/command1 {arg1} {arg2}" ::cmd1] - ["/command2 {arg1} {arg2} {arg3}" ::cmd2]] - (insert) - (compile) - (pretty))) + [["/v2/whoami" 1] + ["/v2/users/:user-id/datasets" 2] + ["/v2/public/projects/:project-id/datasets" 3] + ["/v1/public/topics/:topic" 4] + ["/v1/users/:user-id/orgs/:org-id" 5] + ["/v1/search/topics/:term" 6] + ["/v1/users/:user-id/invitations" 7] + ["/v1/users/:user-id/topics" 9] + ["/v1/users/:user-id/bookmarks/followers" 10] + ["/v2/datasets/:dataset-id" 11] + ["/v1/orgs/:org-id/usage-stats" 12] + ["/v1/orgs/:org-id/devices/:client-id" 13] + ["/v1/messages/user/:user-id" 14] + ["/v1/users/:user-id/devices" 15] + ["/v1/public/users/:user-id" 16] + ["/v1/orgs/:org-id/errors" 17] + ["/v1/public/orgs/:org-id" 18] + ["/v1/orgs/:org-id/invitations" 19] + ["/v1/users/:user-id/device-errors" 22] + ["/v2/login" 23] + ["/v1/users/:user-id/usage-stats" 24] + ["/v2/users/:user-id/devices" 25] + ["/v1/users/:user-id/claim-device/:client-id" 26] + ["/v2/public/projects/:project-id" 27] + ["/v2/public/datasets/:dataset-id" 28] + ["/v2/users/:user-id/topics/bulk" 29] + ["/v1/messages/device/:client-id" 30] + ["/v1/users/:user-id/owned-orgs" 31] + ["/v1/topics/:topic" 32] + ["/v1/users/:user-id/bookmark/:topic" 33] + ["/v1/orgs/:org-id/members/:user-id" 34] + ["/v1/users/:user-id/devices/:client-id" 35] + ["/v1/users/:user-id" 36] + ["/v1/orgs/:org-id/devices" 37] + ["/v1/orgs/:org-id/members" 38] + ["/v2/orgs/:org-id/topics" 40] + ["/v1/whoami" 41] + ["/v1/orgs/:org-id" 42] + ["/v1/users/:user-id/api-key" 43] + ["/v2/schemas" 44] + ["/v2/users/:user-id/topics" 45] + ["/v1/orgs/:org-id/confirm-membership/:token" 46] + ["/v2/topics/:topic" 47] + ["/v1/messages/topic/:topic" 48] + ["/v1/users/:user-id/devices/:client-id/reset-password" 49] + ["/v2/topics" 50] + ["/v1/login" 51] + ["/v1/users/:user-id/orgs" 52] + ["/v2/public/messages/dataset/:dataset-id" 53] + ["/v1/topics" 54] + ["/v1/orgs" 55] + ["/v1/users/:user-id/bookmarks" 56] + ["/v1/orgs/:org-id/topics" 57] + ["/command1 {arg1} {arg2}" ::cmd1] + ["/command2 {arg1} {arg2} {arg3}" ::cmd2]] + (insert) + (compile) + (pretty))) diff --git a/modules/reitit-dev/src/reitit/dev/pretty.cljc b/modules/reitit-dev/src/reitit/dev/pretty.cljc index 5379a442..8226aa67 100644 --- a/modules/reitit-dev/src/reitit/dev/pretty.cljc +++ b/modules/reitit-dev/src/reitit/dev/pretty.cljc @@ -152,13 +152,13 @@ (printer nil)) ([options] (map->EdnPrinter - (merge - {:width 80 - :symbols {} - :print-length *print-length* - :print-level *print-level* - :print-meta *print-meta*} - options)))) + (merge + {:width 80 + :symbols {} + :print-length *print-length* + :print-level *print-level* + :print-meta *print-meta*} + options)))) (defn pprint ([x] (pprint x {})) @@ -209,13 +209,13 @@ (defn exception-str [message source printer] (with-out-str (print-doc - [:group - (title "Router creation failed" source printer) - [:break] [:break] - message - [:break] - (footer printer)] - printer))) + [:group + (title "Router creation failed" source printer) + [:break] [:break] + message + [:break] + (footer printer)] + printer))) (defmulti format-exception (fn [type _ _] type)) @@ -231,11 +231,11 @@ (defn de-expound-colors [^String s mappings] (let [s' (reduce - (fn [s [from to]] - (.replace ^String s - ^String (expound.ansi/esc [from]) - ^String (-start (colors to)))) - s mappings)] + (fn [s [from to]] + (.replace ^String s + ^String (expound.ansi/esc [from]) + ^String (-start (colors to)))) + s mappings)] (.replace ^String s' ^String (expound.ansi/esc [:none]) (str (expound.ansi/esc [:none]) (-start (colors :text)))))) @@ -254,9 +254,9 @@ (def expound-printer (expound.alpha/custom-printer - {:theme :figwheel-theme - :show-valid-values? false - :print-specs? false})) + {:theme :figwheel-theme + :show-valid-values? false + :print-specs? false})) ;; ;; Formatters @@ -276,18 +276,18 @@ " ") (edn (not-empty (select-keys route-data [:conflicting])))])] (into - [:group] - (mapv - (fn [[[path route-data] vals]] - [:group - (path-report path route-data) - (into - [:group] - (map - (fn [[path route-data]] (path-report path route-data)) - vals)) - [:break]]) - conflicts))) + [:group] + (mapv + (fn [[[path route-data] vals]] + [:group + (path-report path route-data) + (into + [:group] + (map + (fn [[path route-data]] (path-report path route-data)) + vals)) + [:break]]) + conflicts))) [:span (text "Either fix the conflicting paths or disable the conflict resolution") [:break] (text "by setting route data for conflicting route: ") [:break] [:break] (edn {:conflicting true} {:margin 3}) @@ -302,19 +302,19 @@ (text "Router contains conflicting route names:") [:break] [:break] (into - [:group] - (mapv - (fn [[name vals]] - [:group - [:span (text name)] - [:break] - (into - [:group] - (map - (fn [p] [:span (color :grey "-> " p) [:break]]) - (mapv first vals))) - [:break]]) - conflicts)) + [:group] + (mapv + (fn [[name vals]] + [:group + [:span (text name)] + [:break] + (into + [:group] + (map + (fn [p] [:span (color :grey "-> " p) [:break]]) + (mapv first vals))) + [:break]]) + conflicts)) (color :white "https://cljdoc.org/d/metosin/reitit/CURRENT/doc/basics/route-conflicts") [:break]]) @@ -323,22 +323,22 @@ (text "Invalid route data:") [:break] [:break] (into - [:group] - (map - (fn [{:keys [data path spec scope]}] - [:group - [:span (color :grey "-- On route -----------------------")] - [:break] - [:break] - (text path) (if scope [:span " " (text scope)]) - [:break] - [:break] - (-> (s/explain-data spec data) - (expound-printer) - (with-out-str) - (fippify)) - [:break]]) - problems)) + [:group] + (map + (fn [{:keys [data path spec scope]}] + [:group + [:span (color :grey "-- On route -----------------------")] + [:break] + [:break] + (text path) (if scope [:span " " (text scope)]) + [:break] + [:break] + (-> (s/explain-data spec data) + (expound-printer) + (with-out-str) + (fippify)) + [:break]]) + problems)) (color :white "https://cljdoc.org/d/metosin/reitit/CURRENT/doc/basics/route-data-validation") [:break]]) diff --git a/modules/reitit-frontend/src/reitit/frontend.cljs b/modules/reitit-frontend/src/reitit/frontend.cljs index 6913a438..60273f79 100644 --- a/modules/reitit-frontend/src/reitit/frontend.cljs +++ b/modules/reitit-frontend/src/reitit/frontend.cljs @@ -64,11 +64,11 @@ (let [defined (-> path-params keys set) missing (set/difference (:required match) defined)] (js/console.warn - "missing path-params for route" name - {:template (:template match) - :missing missing - :path-params path-params - :required (:required match)}) + "missing path-params for route" name + {:template (:template match) + :missing missing + :path-params path-params + :required (:required match)}) nil)) match) (do (js/console.warn "missing route" name) diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index 5e329e38..8a76b900 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -38,7 +38,7 @@ (when (nil? @history) (reset! history this)) (on-navigate m this)) - opts)) + opts)) (defn ^{:see-also ["reitit.frontend.history/href"]} diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index be2d49e3..4551a86e 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -9,16 +9,16 @@ (defn coerce-handler [[path data] {:keys [expand] :as opts}] [path (reduce - (fn [acc method] - (if (contains? acc method) - (update acc method expand opts) - acc)) data ring/http-methods)]) + (fn [acc method] + (if (contains? acc method) + (update acc method expand opts) + acc)) data ring/http-methods)]) (defn compile-result [[path data] {:keys [::default-options-endpoint expand] :as opts}] (let [[top childs] (ring/group-keys data) childs (cond-> childs - (and (not (:options childs)) (not (:handler top)) default-options-endpoint) - (assoc :options (expand default-options-endpoint opts))) + (and (not (:options childs)) (not (:handler top)) default-options-endpoint) + (assoc :options (expand default-options-endpoint opts))) compile (fn [[path data] opts scope] (interceptor/compile-result [path data] opts scope)) ->endpoint (fn [p d m s] @@ -29,19 +29,19 @@ (assoc :method m)))) ->methods (fn [any? data] (reduce - (fn [acc method] - (cond-> acc - any? (assoc method (->endpoint path data method nil)))) - (ring/map->Methods {}) - ring/http-methods))] + (fn [acc method] + (cond-> acc + any? (assoc method (->endpoint path data method nil)))) + (ring/map->Methods {}) + ring/http-methods))] (if-not (seq childs) (->methods true top) (reduce-kv - (fn [acc method data] - (let [data (meta-merge top data)] - (assoc acc method (->endpoint path data method method)))) - (->methods (:handler top) data) - childs)))) + (fn [acc method data] + (let [data (meta-merge top data)] + (assoc acc method (->endpoint path data method method)))) + (->methods (:handler top) data) + childs)))) (defn router "Creates a [[reitit.core/Router]] from raw route data and optionally an options map with @@ -133,7 +133,7 @@ (assoc ::interceptor/queue (partial interceptor/queue executor)) (dissoc :data) ; data is already merged into routes (cond-> (seq interceptors) - (update-in [:data :interceptors] (partial into (vec interceptors))))) + (update-in [:data :interceptors] (partial into (vec interceptors))))) router (reitit.http/router (r/routes router) router-opts) ;; will re-compile the interceptors enrich-request (ring/create-enrich-request inject-match? inject-router?) enrich-default-request (ring/create-enrich-default-request inject-router?)] diff --git a/modules/reitit-http/src/reitit/http/spec.cljc b/modules/reitit-http/src/reitit/http/spec.cljc index f665c250..e4913abb 100644 --- a/modules/reitit-http/src/reitit/http/spec.cljc +++ b/modules/reitit-http/src/reitit/http/spec.cljc @@ -22,5 +22,5 @@ [routes {:keys [spec ::rs/wrap] :or {spec ::data, wrap identity}}] (when-let [problems (rrs/validate-route-data routes :interceptors wrap spec)] (exception/fail! - ::rs/invalid-route-data - {:problems problems}))) + ::rs/invalid-route-data + {:problems problems}))) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj index 285434f4..896f99fc 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj @@ -36,16 +36,16 @@ [stages {:keys [enter leave error name] :as interceptor}] (if (->> (select-keys interceptor stages) (vals) (keep identity) (seq)) (cond-> {:name ::diff} - (and enter (stages :enter)) (assoc :enter (handle name :enter)) - (and leave (stages :leave)) (assoc :leave (handle name :leave)) - (and error (stages :error)) (assoc :error (handle name :error))))) + (and enter (stages :enter)) (assoc :enter (handle name :enter)) + (and leave (stages :leave)) (assoc :leave (handle name :leave)) + (and error (stages :error)) (assoc :error (handle name :error))))) (defn print-context-diffs "A interceptor chain transformer that adds a context diff printer between all interceptors" [interceptors] (reduce - (fn [chain interceptor] - (into chain (keep identity [(diff-interceptor #{:leave :error} interceptor) - interceptor - (diff-interceptor #{:enter} interceptor)]))) - [(diff-interceptor #{:enter :leave :error} {:enter identity})] interceptors)) + (fn [chain interceptor] + (into chain (keep identity [(diff-interceptor #{:leave :error} interceptor) + interceptor + (diff-interceptor #{:enter} interceptor)]))) + [(diff-interceptor #{:enter :leave :error} {:enter identity})] interceptors)) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj index 89d07927..9bb81029 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj @@ -25,11 +25,11 @@ error-handler (or (get handlers type) (get handlers ex-class) (some - (partial get handlers) - (descendants type)) + (partial get handlers) + (descendants type)) (some - (partial get handlers) - (super-classes ex-class)) + (partial get handlers) + (super-classes ex-class)) (get handlers ::default))] (if-let [wrap (get handlers ::wrap)] (wrap error-handler error request) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj index ae5e4af0..8719181f 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj @@ -18,14 +18,14 @@ (def temp-file-part "Spec for file param created by ring.middleware.multipart-params.temp-file store." (st/spec - {:spec (s/keys :req-un [::filename ::content-type ::tempfile ::size]) - :swagger/type "file"})) + {:spec (s/keys :req-un [::filename ::content-type ::tempfile ::size]) + :swagger/type "file"})) (def bytes-part "Spec for file param created by ring.middleware.multipart-params.byte-array store." (st/spec - {:spec (s/keys :req-un [::filename ::content-type ::bytes]) - :swagger/type "file"})) + {:spec (s/keys :req-un [::filename ::content-type ::bytes]) + :swagger/type "file"})) (defn- coerced-request [request coercers] (if-let [coerced (if coercers (coercion/coerce-request coercers request))] @@ -49,7 +49,7 @@ :compile (fn [{:keys [parameters coercion]} opts] (if-let [multipart (:multipart parameters)] (let [parameter-coercion {:multipart (coercion/->ParameterCoercion - :multipart-params :string true true)} + :multipart-params :string true true)} opts (assoc opts ::coercion/parameter-coercion parameter-coercion) coercers (if multipart (coercion/request-coercers coercion parameters opts))] {:data {:swagger {:consumes ^:replace #{"multipart/form-data"}}} diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj index 8b9fac7a..1521b3b9 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj @@ -40,10 +40,10 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if-let [muuntaja (or muuntaja default-muuntaja)] (merge - (stripped (muuntaja.interceptor/format-interceptor muuntaja)) - (if (publish-swagger-data? parameters) - {:data {:swagger {:produces (displace (m/encodes muuntaja)) - :consumes (displace (m/decodes muuntaja))}}}))))})) + (stripped (muuntaja.interceptor/format-interceptor muuntaja)) + (if (publish-swagger-data? parameters) + {:data {:swagger {:produces (displace (m/encodes muuntaja)) + :consumes (displace (m/decodes muuntaja))}}}))))})) (defn format-negotiate-interceptor "Interceptor for content-negotiation. @@ -87,9 +87,9 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if-let [muuntaja (or muuntaja default-muuntaja)] (merge - (stripped (muuntaja.interceptor/format-request-interceptor muuntaja)) - (when (publish-swagger-data? parameters) - {:data {:swagger {:consumes (displace (m/decodes muuntaja))}}}))))})) + (stripped (muuntaja.interceptor/format-request-interceptor muuntaja)) + (when (publish-swagger-data? parameters) + {:data {:swagger {:consumes (displace (m/decodes muuntaja))}}}))))})) (defn format-response-interceptor "Interceptor for response formatting. @@ -112,6 +112,6 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if-let [muuntaja (or muuntaja default-muuntaja)] (merge - (stripped (muuntaja.interceptor/format-response-interceptor muuntaja)) - (when (publish-swagger-data? parameters) - {:data {:swagger {:produces (displace (m/encodes muuntaja))}}}))))})) + (stripped (muuntaja.interceptor/format-response-interceptor muuntaja)) + (when (publish-swagger-data? parameters) + {:data {:swagger {:produces (displace (m/encodes muuntaja))}}}))))})) diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index ee4a4bdc..2f87a610 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -26,9 +26,9 @@ (reify TransformationProvider (-transformer [_ {:keys [strip-extra-keys default-values]}] (mt/transformer - (if strip-extra-keys (mt/strip-extra-keys-transformer)) - transformer - (if default-values (mt/default-value-transformer)))))) + (if strip-extra-keys (mt/strip-extra-keys-transformer)) + transformer + (if default-values (mt/default-value-transformer)))))) (def string-transformer-provider (-provider (mt/string-transformer))) (def json-transformer-provider (-provider (mt/json-transformer))) @@ -61,7 +61,7 @@ transformed (let [error (-explain coercer transformed)] (coercion/map->CoercionError - (assoc error :transformed transformed))))) + (assoc error :transformed transformed))))) value)) ;; encode: decode -> validate -> encode (fn [value format] @@ -71,7 +71,7 @@ (-encode coercer transformed) (let [error (-explain coercer transformed)] (coercion/map->CoercionError - (assoc error :transformed transformed)))) + (assoc error :transformed transformed)))) value)))))))) ;; @@ -91,15 +91,15 @@ (defmethod extract-parameter :default [in schema options] (let [{:keys [properties required]} (swagger/transform schema (merge options {:in in, :type :parameter}))] (mapv - (fn [[k {:keys [type] :as schema}]] - (merge - {:in (name in) - :name k - :description (:description schema "") - :type type - :required (contains? (set required) k)} - schema)) - properties))) + (fn [[k {:keys [type] :as schema}]] + (merge + {:in (name in) + :name k + :description (:description schema "") + :type type + :required (contains? (set required) k)} + schema)) + properties))) ;; ;; public api @@ -143,39 +143,39 @@ (-get-apidocs [_ specification {:keys [parameters responses]}] (case specification :swagger (merge - (if parameters - {:parameters - (->> (for [[in schema] parameters - parameter (extract-parameter in (compile schema options) options)] - parameter) - (into []))}) - (if responses - {:responses - (into - (empty responses) - (for [[status response] responses] - [status (as-> response $ - (set/rename-keys $ {:body :schema}) - (update $ :description (fnil identity "")) - (if (:schema $) - (-> $ - (update :schema compile options) - (update :schema swagger/transform {:type :schema})) - $))]))})) + (if parameters + {:parameters + (->> (for [[in schema] parameters + parameter (extract-parameter in (compile schema options) options)] + parameter) + (into []))}) + (if responses + {:responses + (into + (empty responses) + (for [[status response] responses] + [status (as-> response $ + (set/rename-keys $ {:body :schema}) + (update $ :description (fnil identity "")) + (if (:schema $) + (-> $ + (update :schema compile options) + (update :schema swagger/transform {:type :schema})) + $))]))})) (throw - (ex-info - (str "Can't produce Schema apidocs for " specification) - {:type specification, :coercion :schema})))) + (ex-info + (str "Can't produce Schema apidocs for " specification) + {:type specification, :coercion :schema})))) (-compile-model [_ model _] (compile model options)) (-open-model [_ schema] schema) (-encode-error [_ error] (cond-> error - (show? :humanized) (assoc :humanized (me/humanize error {:wrap :message})) - (show? :schema) (update :schema edn/write-string opts) - (show? :errors) (-> (me/with-error-messages opts) - (update :errors (partial map #(update % :schema edn/write-string opts)))) - (seq error-keys) (select-keys error-keys) - encode-error (encode-error))) + (show? :humanized) (assoc :humanized (me/humanize error {:wrap :message})) + (show? :schema) (update :schema edn/write-string opts) + (show? :errors) (-> (me/with-error-messages opts) + (update :errors (partial map #(update % :schema edn/write-string opts)))) + (seq error-keys) (select-keys error-keys) + encode-error (encode-error))) (-request-coercer [_ type schema] (-coercer (compile schema options) type transformers :decode opts)) (-response-coercer [_ schema] diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj index de89996e..587416ff 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj @@ -48,6 +48,6 @@ printer between all middleware." [chain] (reduce - (fn [chain mw] - (into chain [mw (print-diff-middleware (select-keys mw [:name]))])) - [(print-diff-middleware)] chain)) + (fn [chain mw] + (into chain [mw (print-diff-middleware (select-keys mw [:name]))])) + [(print-diff-middleware)] chain)) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index b14d0fca..46f6628f 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -25,11 +25,11 @@ error-handler (or (get handlers type) (get handlers ex-class) (some - (partial get handlers) - (descendants type)) + (partial get handlers) + (descendants type)) (some - (partial get handlers) - (super-classes ex-class)) + (partial get handlers) + (super-classes ex-class)) (get handlers ::default))] (if-let [wrap (get handlers ::wrap)] (wrap error-handler error request) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index 07a1d8c2..829ae0e9 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -15,14 +15,14 @@ (def temp-file-part "Spec for file param created by ring.middleware.multipart-params.temp-file store." (st/spec - {:spec (s/keys :req-un [::filename ::content-type ::tempfile ::size]) - :swagger/type "file"})) + {:spec (s/keys :req-un [::filename ::content-type ::tempfile ::size]) + :swagger/type "file"})) (def bytes-part "Spec for file param created by ring.middleware.multipart-params.byte-array store." (st/spec - {:spec (s/keys :req-un [::filename ::content-type ::bytes]) - :swagger/type "file"})) + {:spec (s/keys :req-un [::filename ::content-type ::bytes]) + :swagger/type "file"})) (defn- coerced-request [request coercers] (if-let [coerced (if coercers (coercion/coerce-request coercers request))] @@ -33,7 +33,7 @@ (fn [{:keys [parameters coercion]} opts] (if-let [multipart (:multipart parameters)] (let [parameter-coercion {:multipart (coercion/->ParameterCoercion - :multipart-params :string true true)} + :multipart-params :string true true)} opts (assoc opts ::coercion/parameter-coercion parameter-coercion) coercers (if multipart (coercion/request-coercers coercion parameters opts))] {:data {:swagger {:consumes ^:replace #{"multipart/form-data"}}} diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 351eaeca..5cc9e0bf 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -34,10 +34,10 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if muuntaja (merge - (if (publish-swagger-data? parameters) - {:data {:swagger {:produces (displace (m/encodes muuntaja)) - :consumes (displace (m/decodes muuntaja))}}}) - {:wrap #(muuntaja.middleware/wrap-format % muuntaja)})))}) + (if (publish-swagger-data? parameters) + {:data {:swagger {:produces (displace (m/encodes muuntaja)) + :consumes (displace (m/decodes muuntaja))}}}) + {:wrap #(muuntaja.middleware/wrap-format % muuntaja)})))}) (def format-negotiate-middleware "Middleware for content-negotiation. @@ -71,9 +71,9 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if muuntaja (merge - (when (publish-swagger-data? parameters) - {:data {:swagger {:consumes (displace (m/decodes muuntaja))}}}) - {:wrap #(muuntaja.middleware/wrap-format-request % muuntaja)})))}) + (when (publish-swagger-data? parameters) + {:data {:swagger {:consumes (displace (m/decodes muuntaja))}}}) + {:wrap #(muuntaja.middleware/wrap-format-request % muuntaja)})))}) (def format-response-middleware "Middleware for response formatting. @@ -91,6 +91,6 @@ :compile (fn [{:keys [muuntaja parameters]} _] (if muuntaja (merge - (when (publish-swagger-data? parameters) - {:data {:swagger {:produces (displace (m/encodes muuntaja))}}}) - {:wrap #(muuntaja.middleware/wrap-format-response % muuntaja)})))}) + (when (publish-swagger-data? parameters) + {:data {:swagger {:produces (displace (m/encodes muuntaja))}}}) + {:wrap #(muuntaja.middleware/wrap-format-response % muuntaja)})))}) diff --git a/modules/reitit-pedestal/src/reitit/pedestal.clj b/modules/reitit-pedestal/src/reitit/pedestal.clj index 7d53cd06..98da41b5 100644 --- a/modules/reitit-pedestal/src/reitit/pedestal.clj +++ b/modules/reitit-pedestal/src/reitit/pedestal.clj @@ -36,9 +36,9 @@ interceptor (->> (select-keys interceptor [:enter :leave :error]) (vals) (keep identity) (seq)) (interceptor/interceptor - (if (error-without-arity-2? interceptor) - (wrap-error-arity-2->1 interceptor) - interceptor)))) + (if (error-without-arity-2? interceptor) + (wrap-error-arity-2->1 interceptor) + interceptor)))) ;; ;; Public API @@ -62,11 +62,11 @@ (routing-interceptor router default-handler nil)) ([router default-handler {:keys [interceptors]}] (interceptor/interceptor - (reitit.http/routing-interceptor - router - default-handler - {:executor pedestal-executor - :interceptors interceptors})))) + (reitit.http/routing-interceptor + router + default-handler + {:executor pedestal-executor + :interceptors interceptors})))) (defn replace-last-interceptor [service-map interceptor] (-> service-map diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index ab897c11..7ed01db3 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -17,23 +17,23 @@ (defn ^:no-wiki group-keys [data] (reduce-kv - (fn [[top childs] k v] - (if (http-methods k) - [top (assoc childs k v)] - [(assoc top k v) childs])) [{} {}] data)) + (fn [[top childs] k v] + (if (http-methods k) + [top (assoc childs k v)] + [(assoc top k v) childs])) [{} {}] data)) (defn coerce-handler [[path data] {:keys [expand] :as opts}] [path (reduce - (fn [acc method] - (if (contains? acc method) - (update acc method expand opts) - acc)) data http-methods)]) + (fn [acc method] + (if (contains? acc method) + (update acc method expand opts) + acc)) data http-methods)]) (defn compile-result [[path data] {:keys [::default-options-endpoint expand] :as opts}] (let [[top childs] (group-keys data) childs (cond-> childs - (and (not (:options childs)) (not (:handler top)) default-options-endpoint) - (assoc :options (expand default-options-endpoint opts))) + (and (not (:options childs)) (not (:handler top)) default-options-endpoint) + (assoc :options (expand default-options-endpoint opts))) ->endpoint (fn [p d m s] (-> (middleware/compile-result [p d] opts s) (map->Endpoint) @@ -41,19 +41,19 @@ (assoc :method m))) ->methods (fn [any? data] (reduce - (fn [acc method] - (cond-> acc - any? (assoc method (->endpoint path data method nil)))) - (map->Methods {}) - http-methods))] + (fn [acc method] + (cond-> acc + any? (assoc method (->endpoint path data method nil)))) + (map->Methods {}) + http-methods))] (if-not (seq childs) (->methods true top) (reduce-kv - (fn [acc method data] - (let [data (meta-merge top data)] - (assoc acc method (->endpoint path data method method)))) - (->methods (:handler top) data) - childs)))) + (fn [acc method data] + (let [data (meta-merge top data)] + (assoc acc method (->endpoint path data method method)))) + (->methods (:handler top) data) + childs)))) (def default-options-handler (let [handle (fn [request] @@ -318,26 +318,26 @@ enrich-default-request (create-enrich-default-request inject-router?)] (with-meta (wrap - (fn - ([request] - (if-let [match (r/match-by-path router (:uri request))] - (let [method (:request-method request) - path-params (:path-params match) - result (:result match) - handler (-> result method :handler (or default-handler)) - request (enrich-request request path-params match router)] - (or (handler request) (default-handler request))) - (default-handler (enrich-default-request request router)))) - ([request respond raise] - (if-let [match (r/match-by-path router (:uri request))] - (let [method (:request-method request) - path-params (:path-params match) - result (:result match) - handler (-> result method :handler (or default-handler)) - request (enrich-request request path-params match router)] - ((routes handler default-handler) request respond raise)) - (default-handler (enrich-default-request request router) respond raise)) - nil))) + (fn + ([request] + (if-let [match (r/match-by-path router (:uri request))] + (let [method (:request-method request) + path-params (:path-params match) + result (:result match) + handler (-> result method :handler (or default-handler)) + request (enrich-request request path-params match router)] + (or (handler request) (default-handler request))) + (default-handler (enrich-default-request request router)))) + ([request respond raise] + (if-let [match (r/match-by-path router (:uri request))] + (let [method (:request-method request) + path-params (:path-params match) + result (:result match) + handler (-> result method :handler (or default-handler)) + request (enrich-request request path-params match router)] + ((routes handler default-handler) request respond raise)) + (default-handler (enrich-default-request request router) respond raise)) + nil))) {::r/router router})))) (defn get-router [handler] diff --git a/modules/reitit-ring/src/reitit/ring/coercion.cljc b/modules/reitit-ring/src/reitit/ring/coercion.cljc index 3f1c280d..6b282054 100644 --- a/modules/reitit-ring/src/reitit/ring/coercion.cljc +++ b/modules/reitit-ring/src/reitit/ring/coercion.cljc @@ -10,8 +10,8 @@ ::coercion/response-coercion 500 nil)] (respond - {:status status - :body (coercion/encode-error data)}) + {:status status + :body (coercion/encode-error data)}) (raise e)))) ;; diff --git a/modules/reitit-ring/src/reitit/ring/spec.cljc b/modules/reitit-ring/src/reitit/ring/spec.cljc index ec047d5a..3e1e0cdb 100644 --- a/modules/reitit-ring/src/reitit/ring/spec.cljc +++ b/modules/reitit-ring/src/reitit/ring/spec.cljc @@ -19,7 +19,6 @@ (s/def ::trace map?) (s/def ::patch map?) - (s/def ::data (s/keys :opt-un [::rs/handler ::rs/name ::rs/no-doc ::middleware])) @@ -30,9 +29,9 @@ (defn merge-specs [specs] (when-let [non-specs (seq (remove #(or (s/spec? %) (s/get-spec %)) specs))] (exception/fail! - ::invalid-specs - {:specs specs - :invalid non-specs})) + ::invalid-specs + {:specs specs + :invalid non-specs})) (s/merge-spec-impl (vec specs) (vec specs) nil)) (defn validate-route-data [routes key wrap spec] @@ -51,5 +50,5 @@ [routes {:keys [spec ::rs/wrap] :or {spec ::data, wrap identity}}] (when-let [problems (validate-route-data routes :middleware wrap spec)] (exception/fail! - ::rs/invalid-route-data - {:problems problems}))) + ::rs/invalid-route-data + {:problems problems}))) diff --git a/modules/reitit-schema/src/reitit/coercion/schema.cljc b/modules/reitit-schema/src/reitit/coercion/schema.cljc index 1985ba72..1288a2c7 100644 --- a/modules/reitit-schema/src/reitit/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/coercion/schema.cljc @@ -23,16 +23,16 @@ (defn stringify [schema] (walk/prewalk - (fn [x] - (cond - #?@(:clj [(class? x) (.getName ^Class x)]) - (instance? schema.core.OptionalKey x) (pr-str (list 'opt (:k x))) - (instance? schema.core.RequiredKey x) (pr-str (list 'req (:k x))) - (and (satisfies? s/Schema x) (record? x)) (try (pr-str (s/explain x)) (catch #?(:clj Exception :cljs js/Error) _ x)) - (instance? schema.utils.ValidationError x) (str (su/validation-error-explain x)) - (instance? schema.utils.NamedError x) (str (su/named-error-explain x)) - :else x)) - schema)) + (fn [x] + (cond + #?@(:clj [(class? x) (.getName ^Class x)]) + (instance? schema.core.OptionalKey x) (pr-str (list 'opt (:k x))) + (instance? schema.core.RequiredKey x) (pr-str (list 'req (:k x))) + (and (satisfies? s/Schema x) (record? x)) (try (pr-str (s/explain x)) (catch #?(:clj Exception :cljs js/Error) _ x)) + (instance? schema.utils.ValidationError x) (str (su/validation-error-explain x)) + (instance? schema.utils.NamedError x) (str (su/named-error-explain x)) + :else x)) + schema)) (def default-options {:coerce-response? coerce-response? @@ -50,27 +50,27 @@ ;; TODO: this looks identical to spec, refactor when schema is done. (case specification :swagger (swagger/swagger-spec - (merge - (if parameters - {::swagger/parameters - (into - (empty parameters) - (for [[k v] parameters] - [k (coercion/-compile-model this v nil)]))}) - (if responses - {::swagger/responses - (into - (empty responses) - (for [[k response] responses] - [k (as-> response $ - (set/rename-keys $ {:body :schema}) - (if (:schema $) - (update $ :schema #(coercion/-compile-model this % nil)) - $))]))}))) + (merge + (if parameters + {::swagger/parameters + (into + (empty parameters) + (for [[k v] parameters] + [k (coercion/-compile-model this v nil)]))}) + (if responses + {::swagger/responses + (into + (empty responses) + (for [[k response] responses] + [k (as-> response $ + (set/rename-keys $ {:body :schema}) + (if (:schema $) + (update $ :schema #(coercion/-compile-model this % nil)) + $))]))}))) (throw - (ex-info - (str "Can't produce Schema apidocs for " specification) - {:type specification, :coercion :schema})))) + (ex-info + (str "Can't produce Schema apidocs for " specification) + {:type specification, :coercion :schema})))) (-compile-model [_ model _] model) (-open-model [_ schema] (st/open-schema schema)) (-encode-error [_ error] @@ -88,8 +88,8 @@ coerced (coercer value)] (if-let [error (su/error-val coerced)] (coercion/map->CoercionError - {:schema schema - :errors error}) + {:schema schema + :errors error}) coerced)) value)))) (-response-coercer [this schema] diff --git a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj index 1198dff4..6ef8fdc3 100644 --- a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj +++ b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj @@ -8,10 +8,10 @@ interceptor/Executor (queue [_ interceptors] (queue/into-queue - (map - (fn [{::interceptor/keys [handler] :as interceptor}] - (or handler interceptor)) - interceptors))) + (map + (fn [{::interceptor/keys [handler] :as interceptor}] + (or handler interceptor)) + interceptors))) (execute [_ interceptors request] (sieppari/execute interceptors request)) (execute [_ interceptors request respond raise] diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index bac09a25..a1d7070f 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -11,13 +11,13 @@ (def string-transformer (st/type-transformer - st/strip-extra-keys-transformer - st/string-transformer)) + st/strip-extra-keys-transformer + st/string-transformer)) (def json-transformer (st/type-transformer - st/strip-extra-keys-transformer - st/json-transformer)) + st/strip-extra-keys-transformer + st/json-transformer)) (def strip-extra-keys-transformer st/strip-extra-keys-transformer) @@ -88,27 +88,27 @@ (-get-apidocs [this specification {:keys [parameters responses]}] (case specification :swagger (swagger/swagger-spec - (merge - (if parameters - {::swagger/parameters - (into - (empty parameters) - (for [[k v] parameters] - [k (coercion/-compile-model this v nil)]))}) - (if responses - {::swagger/responses - (into - (empty responses) - (for [[k response] responses] - [k (as-> response $ - (set/rename-keys $ {:body :schema}) - (if (:schema $) - (update $ :schema #(coercion/-compile-model this % nil)) - $))]))}))) + (merge + (if parameters + {::swagger/parameters + (into + (empty parameters) + (for [[k v] parameters] + [k (coercion/-compile-model this v nil)]))}) + (if responses + {::swagger/responses + (into + (empty responses) + (for [[k response] responses] + [k (as-> response $ + (set/rename-keys $ {:body :schema}) + (if (:schema $) + (update $ :schema #(coercion/-compile-model this % nil)) + $))]))}))) (throw - (ex-info - (str "Can't produce Spec apidocs for " specification) - {:specification specification, :coercion :spec})))) + (ex-info + (str "Can't produce Spec apidocs for " specification) + {:specification specification, :coercion :spec})))) (-compile-model [_ model name] (into-spec model name)) (-open-model [_ spec] spec) @@ -129,8 +129,8 @@ (if (s/invalid? transformed) (let [problems (st/explain-data spec coerced transformer)] (coercion/map->CoercionError - {:spec spec - :problems problems})) + {:spec spec + :problems problems})) (s/unform spec transformed))))) value)))) (-response-coercer [this spec] diff --git a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc index 4603b11c..cdd66b37 100644 --- a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc +++ b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc @@ -31,10 +31,10 @@ ([options] (let [config-json (fn [{:keys [url config]}] (j/write-value-as-string (merge config {:url url}))) options (as-> options $ - (update $ :root (fnil identity "swagger-ui")) - (update $ :url (fnil identity "/swagger.json")) - (assoc $ :paths {"/config.json" {:headers {"Content-Type" "application/json"} - :status 200 - :body (config-json $)}}))] + (update $ :root (fnil identity "swagger-ui")) + (update $ :url (fnil identity "/swagger.json")) + (assoc $ :paths {"/config.json" {:headers {"Content-Type" "application/json"} + :status 200 + :body (config-json $)}}))] (ring/routes - (ring/create-resource-handler options)))))) + (ring/create-resource-handler options)))))) diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index 998457ac..300f0a20 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -88,13 +88,13 @@ (if (and data (not no-doc)) [method (meta-merge - base-swagger-spec - (apply meta-merge (keep (comp :swagger :data) middleware)) - (apply meta-merge (keep (comp :swagger :data) interceptors)) - (if coercion - (coercion/get-apidocs coercion :swagger data)) - (select-keys data [:tags :summary :description]) - (strip-top-level-keys swagger))])) + base-swagger-spec + (apply meta-merge (keep (comp :swagger :data) middleware)) + (apply meta-merge (keep (comp :swagger :data) interceptors)) + (if coercion + (coercion/get-apidocs coercion :swagger data)) + (select-keys data [:tags :summary :description]) + (strip-top-level-keys swagger))])) transform-path (fn [[p _ c]] (if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))] [(swagger-path p (r/options router)) endpoint])) diff --git a/test/clj/cljdoc/reaper.clj b/test/clj/cljdoc/reaper.clj index c760ed8f..bce3e68c 100644 --- a/test/clj/cljdoc/reaper.clj +++ b/test/clj/cljdoc/reaper.clj @@ -11,11 +11,10 @@ wrap (if (pos? (count indent)) vector identity)] (wrap [name {:file (str "doc/" file)}]))) (reduce - (fn [acc data] - (if (vector? (first data)) - (update-in acc [(dec (count acc)) 2] (fnil into []) data) - (conj acc data)) - ) []) + (fn [acc data] + (if (vector? (first data)) + (update-in acc [(dec (count acc)) 2] (fnil into []) data) + (conj acc data))) []) ;; third sweep to flatten chids... (mapv (fn [[n o c]] (if c (into [n o] c) [n o])))) data {:cljdoc/include-namespaces-from-dependencies ['metosin/reitit diff --git a/test/clj/reitit/http/interceptors/exception_test.clj b/test/clj/reitit/http/interceptors/exception_test.clj index c50ce106..c0849022 100644 --- a/test/clj/reitit/http/interceptors/exception_test.clj +++ b/test/clj/reitit/http/interceptors/exception_test.clj @@ -17,23 +17,23 @@ (create f nil)) ([f wrap] (http/ring-handler - (http/router - [["/defaults" - {:handler f}] - ["/coercion" - {:interceptors [(reitit.http.coercion/coerce-request-interceptor) - (reitit.http.coercion/coerce-response-interceptor)] - :coercion reitit.coercion.spec/coercion - :parameters {:query {:x int?, :y int?}} - :responses {200 {:body {:total pos-int?}}} - :handler f}]] - {:data {:interceptors [(exception/exception-interceptor - (merge - exception/default-handlers - {::kikka (constantly {:status 400, :body "kikka"}) - SQLException (constantly {:status 400, :body "sql"}) - ::exception/wrap wrap}))]}}) - {:executor sieppari/executor})))] + (http/router + [["/defaults" + {:handler f}] + ["/coercion" + {:interceptors [(reitit.http.coercion/coerce-request-interceptor) + (reitit.http.coercion/coerce-response-interceptor)] + :coercion reitit.coercion.spec/coercion + :parameters {:query {:x int?, :y int?}} + :responses {200 {:body {:total pos-int?}}} + :handler f}]] + {:data {:interceptors [(exception/exception-interceptor + (merge + exception/default-handlers + {::kikka (constantly {:status 400, :body "kikka"}) + SQLException (constantly {:status 400, :body "sql"}) + ::exception/wrap wrap}))]}}) + {:executor sieppari/executor})))] (testing "normal calls work ok" (let [response {:status 200, :body "ok"} diff --git a/test/clj/reitit/http/interceptors/muuntaja_test.clj b/test/clj/reitit/http/interceptors/muuntaja_test.clj index b7c086de..fbc94058 100644 --- a/test/clj/reitit/http/interceptors/muuntaja_test.clj +++ b/test/clj/reitit/http/interceptors/muuntaja_test.clj @@ -9,11 +9,11 @@ (deftest muuntaja-test (let [data {:kikka "kukka"} app (http/ring-handler - (http/router - ["/ping" {:get (constantly {:status 200, :body data})}] - {:data {:muuntaja m/instance - :interceptors [(muuntaja/format-interceptor)]}}) - {:executor sieppari/executor})] + (http/router + ["/ping" {:get (constantly {:status 200, :body data})}] + {:data {:muuntaja m/instance + :interceptors [(muuntaja/format-interceptor)]}}) + {:executor sieppari/executor})] (is (= data (->> {:request-method :get, :uri "/ping"} (app) :body @@ -24,27 +24,27 @@ no-edn-decode (m/create (-> m/default-options (update-in [:formats "application/edn"] dissoc :decoder))) just-edn (m/create (-> m/default-options (m/select-formats ["application/edn"]))) app (http/ring-handler - (http/router - [["/defaults" - {:get identity}] - ["/explicit-defaults" - {:muuntaja with-defaults - :get identity}] - ["/no-edn-decode" - {:muuntaja no-edn-decode - :get identity}] - ["/just-edn" - {:muuntaja just-edn - :get identity}] - ["/form-params" - {:post {:parameters {:form {:x string?}} - :handler identity}}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:muuntaja m/instance - :interceptors [(muuntaja/format-interceptor)]}}) - {:executor sieppari/executor}) + (http/router + [["/defaults" + {:get identity}] + ["/explicit-defaults" + {:muuntaja with-defaults + :get identity}] + ["/no-edn-decode" + {:muuntaja no-edn-decode + :get identity}] + ["/just-edn" + {:muuntaja just-edn + :get identity}] + ["/form-params" + {:post {:parameters {:form {:x string?}} + :handler identity}}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:muuntaja m/instance + :interceptors [(muuntaja/format-interceptor)]}}) + {:executor sieppari/executor}) spec (fn [method path] (let [path (keyword path)] (-> {:request-method :get :uri "/swagger.json"} @@ -99,42 +99,42 @@ (deftest muuntaja-swagger-parts-test (let [app (http/ring-handler - (http/router - [["/request" - {:interceptors [(muuntaja/format-negotiate-interceptor) - (muuntaja/format-request-interceptor)] - :get identity}] - ["/response" - {:interceptors [(muuntaja/format-negotiate-interceptor) - (muuntaja/format-response-interceptor)] - :get identity}] - ["/both" - {:interceptors [(muuntaja/format-negotiate-interceptor) - (muuntaja/format-response-interceptor) - (muuntaja/format-request-interceptor)] - :get identity}] - ["/form-request" - {:interceptors [(muuntaja/format-negotiate-interceptor) + (http/router + [["/request" + {:interceptors [(muuntaja/format-negotiate-interceptor) (muuntaja/format-request-interceptor)] - :post {:parameters {:form {:x string?}} - :handler identity}}] - ["/form-response" - {:interceptors [(muuntaja/format-negotiate-interceptor) + :get identity}] + ["/response" + {:interceptors [(muuntaja/format-negotiate-interceptor) (muuntaja/format-response-interceptor)] - :post {:parameters {:form {:x string?}} - :handler identity}}] - ["/form-with-both" - {:interceptors [(muuntaja/format-negotiate-interceptor) + :get identity}] + ["/both" + {:interceptors [(muuntaja/format-negotiate-interceptor) (muuntaja/format-response-interceptor) (muuntaja/format-request-interceptor)] - :post {:parameters {:form {:x string?}} - :handler identity}}] + :get identity}] + ["/form-request" + {:interceptors [(muuntaja/format-negotiate-interceptor) + (muuntaja/format-request-interceptor)] + :post {:parameters {:form {:x string?}} + :handler identity}}] + ["/form-response" + {:interceptors [(muuntaja/format-negotiate-interceptor) + (muuntaja/format-response-interceptor)] + :post {:parameters {:form {:x string?}} + :handler identity}}] + ["/form-with-both" + {:interceptors [(muuntaja/format-negotiate-interceptor) + (muuntaja/format-response-interceptor) + (muuntaja/format-request-interceptor)] + :post {:parameters {:form {:x string?}} + :handler identity}}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:muuntaja m/instance}}) - {:executor sieppari/executor}) + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:muuntaja m/instance}}) + {:executor sieppari/executor}) spec (fn [method path] (-> {:request-method :get :uri "/swagger.json"} (app) :body :paths (get path) method)) diff --git a/test/clj/reitit/http/interceptors/parameters_test.clj b/test/clj/reitit/http/interceptors/parameters_test.clj index bb326782..d09951bc 100644 --- a/test/clj/reitit/http/interceptors/parameters_test.clj +++ b/test/clj/reitit/http/interceptors/parameters_test.clj @@ -7,10 +7,10 @@ (deftest parameters-test (let [app (http/ring-handler - (http/router - ["/ping" {:get #(select-keys % [:params :query-params])}] - {:data {:interceptors [(parameters/parameters-interceptor)]}}) - {:executor sieppari/executor})] + (http/router + ["/ping" {:get #(select-keys % [:params :query-params])}] + {:data {:interceptors [(parameters/parameters-interceptor)]}}) + {:executor sieppari/executor})] (is (= {:query-params {"kikka" "kukka"} :params {"kikka" "kukka"}} (app {:request-method :get @@ -19,15 +19,15 @@ (deftest parameters-swagger-test (let [app (http/ring-handler - (http/router - [["/form-params" {:post {:parameters {:form {:x string?}} - :handler identity}}] - ["/body-params" {:post {:parameters {:body {:x string?}} - :handler identity}}] - ["/swagger.json" {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:interceptors [(parameters/parameters-interceptor)]}}) -  {:executor sieppari/executor}) + (http/router + [["/form-params" {:post {:parameters {:form {:x string?}} + :handler identity}}] + ["/body-params" {:post {:parameters {:body {:x string?}} + :handler identity}}] + ["/swagger.json" {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:interceptors [(parameters/parameters-interceptor)]}}) + {:executor sieppari/executor}) spec (fn [path] (-> {:request-method :get :uri "/swagger.json"} app diff --git a/test/clj/reitit/http_coercion_test.clj b/test/clj/reitit/http_coercion_test.clj index 5c5c8352..4f4bc0d1 100644 --- a/test/clj/reitit/http_coercion_test.clj +++ b/test/clj/reitit/http_coercion_test.clj @@ -74,20 +74,20 @@ (deftest spec-coercion-test (let [create (fn [interceptors] (http/ring-handler - (http/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query {:a int?} - :body {:b int?} - :form {:c int?} - :header {:d int?} - :path {:e int?}} - :responses {200 {:body {:total pos-int?}} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:interceptors interceptors - :coercion spec/coercion}}) - {:executor sieppari/executor}))] + (http/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query {:a int?} + :body {:b int?} + :form {:c int?} + :header {:d int?} + :path {:e int?}} + :responses {200 {:body {:total pos-int?}} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:interceptors interceptors + :coercion spec/coercion}}) + {:executor sieppari/executor}))] (testing "without exception handling" (let [app (create [(rrc/coerce-request-interceptor) @@ -103,15 +103,15 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) (testing "with exception handling" (let [app (create [(rrc/coerce-exceptions-interceptor) @@ -134,20 +134,20 @@ (deftest schema-coercion-test (let [create (fn [middleware] (http/ring-handler - (http/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query {:a s/Int} - :body {:b s/Int} - :form {:c s/Int} - :header {:d s/Int} - :path {:e s/Int}} - :responses {200 {:body {:total (s/constrained s/Int pos? 'positive)}} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:interceptors middleware - :coercion schema/coercion}}) - {:executor sieppari/executor}))] + (http/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query {:a s/Int} + :body {:b s/Int} + :form {:c s/Int} + :header {:d s/Int} + :path {:e s/Int}} + :responses {200 {:body {:total (s/constrained s/Int pos? 'positive)}} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:interceptors middleware + :coercion schema/coercion}}) + {:executor sieppari/executor}))] (testing "without exception handling" (let [app (create [(rrc/coerce-request-interceptor) @@ -163,15 +163,15 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))) (testing "with exception handling" (let [app (create [(rrc/coerce-exceptions-interceptor) @@ -194,51 +194,51 @@ (deftest malli-coercion-test (let [create (fn [interceptors] (http/ring-handler - (http/router - ["/api" + (http/router + ["/api" - ["/validate" {:summary "just validation" - :coercion (reitit.coercion.malli/create {:transformers {}}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] + ["/validate" {:summary "just validation" + :coercion (reitit.coercion.malli/create {:transformers {}}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - ["/no-op" {:summary "no-operation" - :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] + ["/no-op" {:summary "no-operation" + :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - ["/skip" {:summary "skip" - :coercion (reitit.coercion.malli/create {:enabled false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] - - ["/or" {:post {:summary "accepts either of two map schemas" - :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} - :responses {200 {:body [:map [:msg string?]]}} - :handler (fn [{{{:keys [x]} :body} :parameters}] + ["/skip" {:summary "skip" + :coercion (reitit.coercion.malli/create {:enabled false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] {:status 200 - :body {:msg (if x "you sent x" "you sent y")}})}}] + :body (-> req :parameters :body)})}}] - ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] - :body [:map [:b int?]] - :form [:map [:c [int? {:default 3}]]] - :header [:map [:d int?]] - :path [:map [:e int?]]} - :responses {200 {:body [:map [:total pos-int?]]} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:interceptors interceptors - :coercion malli/coercion}}) - {:executor sieppari/executor}))] + ["/or" {:post {:summary "accepts either of two map schemas" + :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} + :responses {200 {:body [:map [:msg string?]]}} + :handler (fn [{{{:keys [x]} :body} :parameters}] + {:status 200 + :body {:msg (if x "you sent x" "you sent y")}})}}] + + ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] + :body [:map [:b int?]] + :form [:map [:c [int? {:default 3}]]] + :header [:map [:d int?]] + :path [:map [:e int?]]} + :responses {200 {:body [:map [:total pos-int?]]} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:interceptors interceptors + :coercion malli/coercion}}) + {:executor sieppari/executor}))] (testing "withut exception handling" (let [app (create [(rrc/coerce-request-interceptor) @@ -249,8 +249,8 @@ :body {:total 15}} (app valid-request1))) #_(is (= {:status 200 - :body {:total 115}} - (app valid-request2))) + :body {:total 115}} + (app valid-request2))) (is (= {:status 200 :body {:total 15}} (app valid-request3))) @@ -264,15 +264,15 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) (testing "with exception handling" (let [app (create [(rrc/coerce-exceptions-interceptor) @@ -339,16 +339,16 @@ {:status 200, :body (assoc body :response true)})}}) ->app (fn [options] (http/ring-handler - (http/router - ["/api" - ["/default" (endpoint [:map [:x int?]])] - ["/closed" (endpoint [:map {:closed true} [:x int?]])] - ["/open" (endpoint [:map {:closed false} [:x int?]])]] - {:data {:interceptors [(rrc/coerce-exceptions-interceptor) - (rrc/coerce-request-interceptor) - (rrc/coerce-response-interceptor)] - :coercion (malli/create options)}}) - {:executor sieppari/executor})) + (http/router + ["/api" + ["/default" (endpoint [:map [:x int?]])] + ["/closed" (endpoint [:map {:closed true} [:x int?]])] + ["/open" (endpoint [:map {:closed false} [:x int?]])]] + {:data {:interceptors [(rrc/coerce-exceptions-interceptor) + (rrc/coerce-request-interceptor) + (rrc/coerce-response-interceptor)] + :coercion (malli/create options)}}) + {:executor sieppari/executor})) ->request (fn [uri] {:uri (str "/api/" uri) :request-method :get :muuntaja/request {:format "application/json"} @@ -399,23 +399,23 @@ (testing "sequence schemas" (let [app (http/ring-handler - (http/router - ["/ping" {:get {:parameters {:body [:vector [:map [:message string?]]]} - :responses {200 {:body [:vector [:map [:pong string?]]]} - 501 {:body [:vector [:map [:error string?]]]}} - :handler (fn [{{[{:keys [message]}] :body} :parameters :as req}] - (condp = message - "ping" {:status 200 - :body [{:pong message}]} - "fail" {:status 501 - :body [{:error "fail"}]} - {:status 200 - :body {:invalid "response"}}))}}] - {:data {:interceptors [(rrc/coerce-exceptions-interceptor) - (rrc/coerce-request-interceptor) - (rrc/coerce-response-interceptor)] - :coercion malli/coercion}}) - {:executor sieppari/executor}) + (http/router + ["/ping" {:get {:parameters {:body [:vector [:map [:message string?]]]} + :responses {200 {:body [:vector [:map [:pong string?]]]} + 501 {:body [:vector [:map [:error string?]]]}} + :handler (fn [{{[{:keys [message]}] :body} :parameters :as req}] + (condp = message + "ping" {:status 200 + :body [{:pong message}]} + "fail" {:status 501 + :body [{:error "fail"}]} + {:status 200 + :body {:invalid "response"}}))}}] + {:data {:interceptors [(rrc/coerce-exceptions-interceptor) + (rrc/coerce-request-interceptor) + (rrc/coerce-response-interceptor)] + :coercion malli/coercion}}) + {:executor sieppari/executor}) ->request (fn [body] {:uri "/ping" :request-method :get @@ -439,19 +439,19 @@ (deftest muuntaja-test (let [app (http/ring-handler - (http/router - ["/api" - ["/plus" - {:post {:parameters {:body {:int int?, :keyword keyword?}} - :responses {200 {:body {:int int?, :keyword keyword?}}} - :handler (fn [{{:keys [body]} :parameters}] - {:status 200 - :body body})}}]] - {:data {:interceptors [(muuntaja.interceptor/format-interceptor) - (rrc/coerce-response-interceptor) - (rrc/coerce-request-interceptor)] - :coercion spec/coercion}}) - {:executor sieppari/executor}) + (http/router + ["/api" + ["/plus" + {:post {:parameters {:body {:int int?, :keyword keyword?}} + :responses {200 {:body {:int int?, :keyword keyword?}}} + :handler (fn [{{:keys [body]} :parameters}] + {:status 200 + :body body})}}]] + {:data {:interceptors [(muuntaja.interceptor/format-interceptor) + (rrc/coerce-response-interceptor) + (rrc/coerce-request-interceptor)] + :coercion spec/coercion}}) + {:executor sieppari/executor}) request (fn [content-type body] (-> {:request-method :post :headers {"content-type" content-type, "accept" content-type} diff --git a/test/clj/reitit/http_test.clj b/test/clj/reitit/http_test.clj index 196fb732..a9143837 100644 --- a/test/clj/reitit/http_test.clj +++ b/test/clj/reitit/http_test.clj @@ -21,14 +21,14 @@ (testing "http-handler" (let [api-interceptor (interceptor :api) router (http/router - ["/api" {:interceptors [api-interceptor]} - ["/all" handler] - ["/get" {:get handler}] - ["/users" {:interceptors [[interceptor :users]] - :get handler - :post {:handler handler - :interceptors [[interceptor :post]]} - :handler handler}]]) + ["/api" {:interceptors [api-interceptor]} + ["/all" handler] + ["/get" {:get handler}] + ["/users" {:interceptors [[interceptor :users]] + :get handler + :post {:handler handler + :interceptors [[interceptor :post]]} + :handler handler}]]) app (http/ring-handler router nil {:executor sieppari/executor})] (testing "router can be extracted" @@ -68,14 +68,14 @@ (testing "named routes" (let [router (http/router - [["/api" - ["/all" {:handler handler :name ::all}] - ["/get" {:get {:handler handler :name ::HIDDEN} - :name ::get}] - ["/users" {:get handler - :post handler - :handler handler - :name ::users}]]]) + [["/api" + ["/all" {:handler handler :name ::all}] + ["/get" {:get {:handler handler :name ::HIDDEN} + :name ::get}] + ["/users" {:get handler + :post handler + :handler handler + :name ::users}]]]) app (http/ring-handler router nil {:executor sieppari/executor})] (testing "router can be extracted" @@ -102,13 +102,13 @@ (deftest enforcing-data-rules-at-runtime-test (let [handler (constantly {:status 200, :body "ok"}) app (http/ring-handler - (http/router - [["/api" - ["/ping" handler] - ["/admin" {::roles #{:admin}} - ["/ping" handler]]]] - {:data {:interceptors [enforce-roles-interceptor]}}) - nil {:executor sieppari/executor})] + (http/router + [["/api" + ["/ping" handler] + ["/admin" {::roles #{:admin}} + ["/ping" handler]]]] + {:data {:interceptors [enforce-roles-interceptor]}}) + nil {:executor sieppari/executor})] (testing "public handler" (is (= {:status 200, :body "ok"} @@ -128,8 +128,8 @@ (deftest default-handler-test (let [response {:status 200, :body "ok"} router (http/router - [["/ping" {:get (constantly response)}] - ["/pong" (constantly nil)]]) + [["/ping" {:get (constantly response)}] + ["/pong" (constantly nil)]]) app (http/ring-handler router nil {:executor sieppari/executor})] (testing "match" @@ -146,9 +146,9 @@ (testing "with default http responses" (let [app (http/ring-handler - router - (ring/create-default-handler) - {:executor sieppari/executor})] + router + (ring/create-default-handler) + {:executor sieppari/executor})] (testing "route doesn't match yields 404" (is (= 404 (:status (app {:request-method :get, :uri "/"}))))) (testing "method doesn't match yields 405" @@ -158,12 +158,12 @@ (testing "with custom http responses" (let [app (http/ring-handler - router - (ring/create-default-handler - {:not-found (constantly {:status -404}) - :method-not-allowed (constantly {:status -405}) - :not-acceptable (constantly {:status -406})}) - {:executor sieppari/executor})] + router + (ring/create-default-handler + {:not-found (constantly {:status -404}) + :method-not-allowed (constantly {:status -405}) + :not-acceptable (constantly {:status -406})}) + {:executor sieppari/executor})] (testing "route doesn't match" (is (= -404 (:status (app {:request-method :get, :uri "/"}))))) (testing "method doesn't match" @@ -180,12 +180,12 @@ (testing "with defaults" (let [app (http/ring-handler - (http/router - [["/get" {:get (constantly response) - :post (constantly response)}] - ["/options" {:options (constantly response)}] - ["/any" (constantly response)]]) - {:executor sieppari/executor})] + (http/router + [["/get" {:get (constantly response) + :post (constantly response)}] + ["/options" {:options (constantly response)}] + ["/any" (constantly response)]]) + {:executor sieppari/executor})] (testing "endpoint with a non-options handler" (is (= response (app {:request-method :get, :uri "/get"}))) @@ -201,12 +201,12 @@ (testing "disabled via options" (let [app (http/ring-handler - (http/router - [["/get" {:get (constantly response)}] - ["/options" {:options (constantly response)}] - ["/any" (constantly response)]] - {::http/default-options-endpoint nil}) - {:executor sieppari/executor})] + (http/router + [["/get" {:get (constantly response)}] + ["/options" {:options (constantly response)}] + ["/any" (constantly response)]] + {::http/default-options-endpoint nil}) + {:executor sieppari/executor})] (testing "endpoint with a non-options handler" (is (= response (app {:request-method :get, :uri "/get"}))) @@ -227,8 +227,8 @@ (reset! value x)))) response {:status 200, :body "ok"} router (http/router - [["/ping" {:get (fn [_] response)}] - ["/pong" (fn [_] nil)]]) + [["/ping" {:get (fn [_] response)}] + ["/pong" (fn [_] nil)]]) app (http/ring-handler router nil {:executor sieppari/executor})] (testing "match" @@ -287,11 +287,11 @@ (require '[sieppari.async.core-async]) (let [response {:status 200, :body "ok"} app (http/ring-handler - (http/router - ["/ping" {:get {:interceptors [{:enter #(a/go %)}] - :handler (fn [_] (a/go response))}}]) - (ring/create-default-handler) - {:executor sieppari/executor})] + (http/router + ["/ping" {:get {:interceptors [{:enter #(a/go %)}] + :handler (fn [_] (a/go response))}}]) + (ring/create-default-handler) + {:executor sieppari/executor})] (let [respond (promise)] (app {:request-method :get, :uri "/ping"} respond ::irrelevant) (is (= response (deref respond 100 ::timeout))))))) @@ -302,11 +302,11 @@ (testing "works if registered" (let [response {:status 200, :body "ok"} app (http/ring-handler - (http/router - ["/ping" {:get {:interceptors [{:enter map->MyAsyncContext}] - :handler (fn [_] response)}}]) - (ring/create-default-handler) - {:executor sieppari/executor}) + (http/router + ["/ping" {:get {:interceptors [{:enter map->MyAsyncContext}] + :handler (fn [_] response)}}]) + (ring/create-default-handler) + {:executor sieppari/executor}) respond (promise) raise (promise)] (app {:request-method :get, :uri "/ping"} respond raise) @@ -321,14 +321,14 @@ request {:uri "/api/avaruus" :request-method :get} create (fn [options] (http/ring-handler - (http/router - ["/api" {:interceptors [(interceptor :olipa)]} - ["/avaruus" {:interceptors [(interceptor :kerran)] - :get {:handler handler - :interceptors [(interceptor :avaruus)]}}]] - options) - nil - {:executor sieppari/executor}))] + (http/router + ["/api" {:interceptors [(interceptor :olipa)]} + ["/avaruus" {:interceptors [(interceptor :kerran)] + :get {:handler handler + :interceptors [(interceptor :avaruus)]}}]] + options) + nil + {:executor sieppari/executor}))] (testing "by default, all middleware are applied in order" (let [app (create nil)] @@ -352,10 +352,10 @@ (testing "from root" (let [app (http/ring-handler - (http/router - ["/*" (ring/create-resource-handler)]) - (ring/create-default-handler) - {:executor sieppari/executor})] + (http/router + ["/*" (ring/create-resource-handler)]) + (ring/create-default-handler) + {:executor sieppari/executor})] (testing test (testing "different file-types" (let [response (app (request "/hello.json"))] @@ -388,10 +388,10 @@ (testing "from path" (let [app (http/ring-handler - (http/router - ["/files/*" (ring/create-resource-handler)]) - (ring/create-default-handler) - {:executor sieppari/executor}) + (http/router + ["/files/*" (ring/create-resource-handler)]) + (ring/create-default-handler) + {:executor sieppari/executor}) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] (testing test @@ -428,11 +428,11 @@ (testing "from root" (let [app (http/ring-handler - (http/router []) - (ring/routes - (ring/create-resource-handler {:path "/"}) - (ring/create-default-handler)) - {:executor sieppari/executor})] + (http/router []) + (ring/routes + (ring/create-resource-handler {:path "/"}) + (ring/create-default-handler)) + {:executor sieppari/executor})] (testing test (testing "different file-types" (let [response (app (request "/hello.json"))] @@ -465,11 +465,11 @@ (testing "from path" (let [app (http/ring-handler - (http/router []) - (ring/routes - (ring/create-resource-handler {:path "/files"}) - (ring/create-default-handler)) - {:executor sieppari/executor}) + (http/router []) + (ring/routes + (ring/create-resource-handler {:path "/files"}) + (ring/create-default-handler)) + {:executor sieppari/executor}) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] (testing test @@ -510,18 +510,18 @@ interceptor (fn [x] {:enter (fn [ctx] (swap! times update-in [:enter x] (fnil inc 0)) ctx) :leave (fn [ctx] (swap! times update-in [:leave x] (fnil inc 0)) ctx)}) app (http/ring-handler - (http/router - ["/api" - {:interceptors [(interceptor :api)]} - ["/ping" - {:interceptors [(interceptor :ping)] - :get {:interceptors [(interceptor :get)] - :handler (fn [_] response)}}]]) - (ring/routes - (ring/create-default-handler) - {:data {:interceptors [(interceptor :router)]}}) - {:executor sieppari/executor - :interceptors [(interceptor :top)]})] + (http/router + ["/api" + {:interceptors [(interceptor :api)]} + ["/ping" + {:interceptors [(interceptor :ping)] + :get {:interceptors [(interceptor :get)] + :handler (fn [_] response)}}]]) + (ring/routes + (ring/create-default-handler) + {:data {:interceptors [(interceptor :router)]}}) + {:executor sieppari/executor + :interceptors [(interceptor :top)]})] (is (= response (app {:request-method :get, :uri "/api/ping"}))) (is (= {:enter {:top 1, :api 1, :ping 1, :get 1} :leave {:get 1, :ping 1, :api 1, :top 1}} @@ -530,15 +530,15 @@ (deftest router-available-in-default-branch (testing "1-arity" ((http/ring-handler - (http/router []) - (fn [{::r/keys [router]}] - (is router)) - {:executor sieppari/executor}) + (http/router []) + (fn [{::r/keys [router]}] + (is router)) + {:executor sieppari/executor}) {})) (testing "3-arity" ((http/ring-handler - (http/router []) - (fn [{::r/keys [router]}] - (is router)) - {:executor sieppari/executor}) + (http/router []) + (fn [{::r/keys [router]}] + (is router)) + {:executor sieppari/executor}) {} ::respond ::raise))) diff --git a/test/clj/reitit/pedestal_test.clj b/test/clj/reitit/pedestal_test.clj index 8a0ea30b..32a7446d 100644 --- a/test/clj/reitit/pedestal_test.clj +++ b/test/clj/reitit/pedestal_test.clj @@ -28,11 +28,11 @@ (deftest pedestal-e2e-test (let [router (pedestal/routing-interceptor - (http/router - ["" - {:interceptors [{:name :nop} (exception/exception-interceptor)]} - ["/ok" (fn [_] {:status 200, :body "ok"})] - ["/fail" (fn [_] (throw (ex-info "kosh" {})))]])) + (http/router + ["" + {:interceptors [{:name :nop} (exception/exception-interceptor)]} + ["/ok" (fn [_] {:status 200, :body "ok"})] + ["/fail" (fn [_] (throw (ex-info "kosh" {})))]])) service (-> {:io.pedestal.http/request-logger nil :io.pedestal.http/routes []} (io.pedestal.http/default-interceptors) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 5ef64770..479311f5 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -18,25 +18,25 @@ (create f nil)) ([f wrap] (ring/ring-handler - (ring/router - [["/defaults" - {:handler f}] - ["/http-response" - {:handler (fn [req] - (http-response/unauthorized! "Unauthorized"))}] - ["/coercion" - {:middleware [reitit.ring.coercion/coerce-request-middleware - reitit.ring.coercion/coerce-response-middleware] - :coercion reitit.coercion.spec/coercion - :parameters {:query {:x int?, :y int?}} - :responses {200 {:body {:total pos-int?}}} - :handler f}]] - {:data {:middleware [(exception/create-exception-middleware - (merge - exception/default-handlers - {::kikka (constantly {:status 400, :body "kikka"}) - SQLException (constantly {:status 400, :body "sql"}) - ::exception/wrap wrap}))]}}))))] + (ring/router + [["/defaults" + {:handler f}] + ["/http-response" + {:handler (fn [req] + (http-response/unauthorized! "Unauthorized"))}] + ["/coercion" + {:middleware [reitit.ring.coercion/coerce-request-middleware + reitit.ring.coercion/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion + :parameters {:query {:x int?, :y int?}} + :responses {200 {:body {:total pos-int?}}} + :handler f}]] + {:data {:middleware [(exception/create-exception-middleware + (merge + exception/default-handlers + {::kikka (constantly {:status 400, :body "kikka"}) + SQLException (constantly {:status 400, :body "sql"}) + ::exception/wrap wrap}))]}}))))] (testing "normal calls work ok" (let [response {:status 200, :body "ok"} @@ -66,7 +66,6 @@ :response response}))))] (is (= response (app {:request-method :post, :uri "/http-response"}))))) - (testing ":muuntaja/decode" (let [app (create (fn [_] (m/decode m/instance "application/json" "{:so \"invalid\"}")))] (is (= {:body "Malformed \"application/json\" request." @@ -130,21 +129,21 @@ (deftest spec-coercion-exception-test (let [app (ring/ring-handler - (ring/router - ["/plus" - {:get - {:parameters {:query {:x int?, :y int?}} - :responses {200 {:body {:total pos-int?}}} - :handler (fn [{{{:keys [x y]} :query} :parameters}] - {:status 200, :body {:total (+ x y)}})}}] - {:data {:coercion reitit.coercion.spec/coercion - :middleware [(exception/create-exception-middleware - (merge - exception/default-handlers - {::coercion/request-coercion (fn [e _] {:status 400, :body (ex-data e)}) - ::coercion/response-coercion (fn [e _] {:status 500, :body (ex-data e)})})) - reitit.ring.coercion/coerce-request-middleware - reitit.ring.coercion/coerce-response-middleware]}}))] + (ring/router + ["/plus" + {:get + {:parameters {:query {:x int?, :y int?}} + :responses {200 {:body {:total pos-int?}}} + :handler (fn [{{{:keys [x y]} :query} :parameters}] + {:status 200, :body {:total (+ x y)}})}}] + {:data {:coercion reitit.coercion.spec/coercion + :middleware [(exception/create-exception-middleware + (merge + exception/default-handlers + {::coercion/request-coercion (fn [e _] {:status 400, :body (ex-data e)}) + ::coercion/response-coercion (fn [e _] {:status 500, :body (ex-data e)})})) + reitit.ring.coercion/coerce-request-middleware + reitit.ring.coercion/coerce-response-middleware]}}))] (testing "success" (let [{:keys [status body]} (app {:uri "/plus", :request-method :get, :query-params {"x" "1", "y" "2"}})] (is (= 200 status)) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index 6483192c..c23ebbe3 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -8,10 +8,10 @@ (deftest muuntaja-test (let [data {:kikka "kukka"} app (ring/ring-handler - (ring/router - ["/ping" {:get (constantly {:status 200, :body data})}] - {:data {:muuntaja m/instance - :middleware [muuntaja/format-middleware]}}))] + (ring/router + ["/ping" {:get (constantly {:status 200, :body data})}] + {:data {:muuntaja m/instance + :middleware [muuntaja/format-middleware]}}))] (is (= data (->> {:request-method :get, :uri "/ping"} (app) :body @@ -22,26 +22,26 @@ no-edn-decode (m/create (-> m/default-options (update-in [:formats "application/edn"] dissoc :decoder))) just-edn (m/create (-> m/default-options (m/select-formats ["application/edn"]))) app (ring/ring-handler - (ring/router - [["/defaults" - {:get identity}] - ["/explicit-defaults" - {:muuntaja with-defaults - :get identity}] - ["/no-edn-decode" - {:muuntaja no-edn-decode - :get identity}] - ["/just-edn" - {:muuntaja just-edn - :get identity}] - ["/form-params" - {:post {:parameters {:form {:x string?}} - :handler identity}}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:muuntaja m/instance - :middleware [muuntaja/format-middleware]}})) + (ring/router + [["/defaults" + {:get identity}] + ["/explicit-defaults" + {:muuntaja with-defaults + :get identity}] + ["/no-edn-decode" + {:muuntaja no-edn-decode + :get identity}] + ["/just-edn" + {:muuntaja just-edn + :get identity}] + ["/form-params" + {:post {:parameters {:form {:x string?}} + :handler identity}}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:muuntaja m/instance + :middleware [muuntaja/format-middleware]}})) spec (fn [method path] (let [path (keyword path)] (-> {:request-method :get :uri "/swagger.json"} @@ -97,41 +97,41 @@ (deftest muuntaja-swagger-parts-test (let [app (ring/ring-handler - (ring/router - [["/request" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-request-middleware] - :get identity}] - ["/response" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-response-middleware] - :get identity}] - ["/both" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-response-middleware - muuntaja/format-request-middleware] - :get identity}] - ["/form-request" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-request-middleware] - :post {:parameters {:form {:x string?}} - :handler identity}}] - ["/form-response" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-response-middleware] - :post {:parameters {:form {:x string?}} - :handler identity}}] - ["/form-with-both" - {:middleware [muuntaja/format-negotiate-middleware - muuntaja/format-response-middleware - muuntaja/format-request-middleware] - :post {:parameters {:form {:x string?}} - :handler identity}}] + (ring/router + [["/request" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-request-middleware] + :get identity}] + ["/response" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware] + :get identity}] + ["/both" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware + muuntaja/format-request-middleware] + :get identity}] + ["/form-request" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-request-middleware] + :post {:parameters {:form {:x string?}} + :handler identity}}] + ["/form-response" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware] + :post {:parameters {:form {:x string?}} + :handler identity}}] + ["/form-with-both" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware + muuntaja/format-request-middleware] + :post {:parameters {:form {:x string?}} + :handler identity}}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:muuntaja m/instance}})) + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:muuntaja m/instance}})) spec (fn [method path] (-> {:request-method :get :uri "/swagger.json"} (app) :body :paths (get path) method)) diff --git a/test/clj/reitit/ring/middleware/parameters_test.clj b/test/clj/reitit/ring/middleware/parameters_test.clj index 06d297ad..b7318e35 100644 --- a/test/clj/reitit/ring/middleware/parameters_test.clj +++ b/test/clj/reitit/ring/middleware/parameters_test.clj @@ -6,9 +6,9 @@ (deftest parameters-test (let [app (ring/ring-handler - (ring/router - ["/ping" {:get #(select-keys % [:params :query-params])}] - {:data {:middleware [parameters/parameters-middleware]}}))] + (ring/router + ["/ping" {:get #(select-keys % [:params :query-params])}] + {:data {:middleware [parameters/parameters-middleware]}}))] (is (= {:query-params {"kikka" "kukka"} :params {"kikka" "kukka"}} (app {:request-method :get @@ -17,14 +17,14 @@ (deftest parameters-swagger-test (let [app (ring/ring-handler - (ring/router - [["/form-params" {:post {:parameters {:form {:x string?}} - :handler identity}}] - ["/body-params" {:post {:parameters {:body {:x string?}} - :handler identity}}] - ["/swagger.json" {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]] - {:data {:middleware [parameters/parameters-middleware]}})) + (ring/router + [["/form-params" {:post {:parameters {:form {:x string?}} + :handler identity}}] + ["/body-params" {:post {:parameters {:body {:x string?}} + :handler identity}}] + ["/swagger.json" {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:middleware [parameters/parameters-middleware]}})) spec (fn [path] (-> {:request-method :get :uri "/swagger.json"} app diff --git a/test/cljc/reitit/coercion_test.cljc b/test/cljc/reitit/coercion_test.cljc index 93b067ec..2e896cd1 100644 --- a/test/cljc/reitit/coercion_test.cljc +++ b/test/cljc/reitit/coercion_test.cljc @@ -12,23 +12,23 @@ (deftest coercion-test (let [r (r/router - [["/schema" {:coercion reitit.coercion.schema/coercion} - ["/:number/:keyword" {:parameters {:path {:number s/Int - :keyword s/Keyword} - :query (s/maybe {:int s/Int, :ints [s/Int], :map {s/Int s/Int}})}}]] - ["/malli" {:coercion reitit.coercion.malli/coercion} - ["/:number/:keyword" {:parameters {:path [:map [:number int?] [:keyword keyword?]] - :query [:maybe [:map [:int int?] - [:ints [:vector int?]] - [:map [:map-of int? int?]]]]}}]] - ["/spec" {:coercion reitit.coercion.spec/coercion} - ["/:number/:keyword" {:parameters {:path {:number int? - :keyword keyword?} - :query (ds/maybe {:int int?, :ints [int?], :map {int? int?}})}}]] - ["/none" - ["/:number/:keyword" {:parameters {:path {:number int? - :keyword keyword?}}}]]] - {:compile coercion/compile-request-coercers})] + [["/schema" {:coercion reitit.coercion.schema/coercion} + ["/:number/:keyword" {:parameters {:path {:number s/Int + :keyword s/Keyword} + :query (s/maybe {:int s/Int, :ints [s/Int], :map {s/Int s/Int}})}}]] + ["/malli" {:coercion reitit.coercion.malli/coercion} + ["/:number/:keyword" {:parameters {:path [:map [:number int?] [:keyword keyword?]] + :query [:maybe [:map [:int int?] + [:ints [:vector int?]] + [:map [:map-of int? int?]]]]}}]] + ["/spec" {:coercion reitit.coercion.spec/coercion} + ["/:number/:keyword" {:parameters {:path {:number int? + :keyword keyword?} + :query (ds/maybe {:int int?, :ints [int?], :map {int? int?}})}}]] + ["/none" + ["/:number/:keyword" {:parameters {:path {:number int? + :keyword keyword?}}}]]] + {:compile coercion/compile-request-coercers})] (testing "schema-coercion" (testing "succeeds" @@ -80,10 +80,10 @@ (deftest data-spec-example-test (let [router (r/router - ["/:company/users/:user-id" {:name ::user-view - :coercion reitit.coercion.spec/coercion - :parameters {:path {:company string? - :user-id int?}}}] - {:compile coercion/compile-request-coercers})] + ["/:company/users/:user-id" {:name ::user-view + :coercion reitit.coercion.spec/coercion + :parameters {:path {:company string? + :user-id int?}}}] + {:compile coercion/compile-request-coercers})] (is (= {:path {:user-id 123, :company "metosin"}} (:parameters (match-by-path-and-coerce! router "/metosin/users/123")))))) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 290e46ab..394b864d 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -21,38 +21,38 @@ (is (= nil (r/match-by-path router "/api"))) (is (= (r/map->Match - {:template "/api/ipa/:size" - :data {:name ::beer} - :path "/api/ipa/large" - :path-params {:size "large"}}) + {:template "/api/ipa/:size" + :data {:name ::beer} + :path "/api/ipa/large" + :path-params {:size "large"}}) (r/match-by-path router "/api/ipa/large"))) (is (= (r/map->Match - {:template "/api/ipa/:size" - :data {:name ::beer} - :path "/api/ipa/large" - :path-params {:size "large"}}) + {:template "/api/ipa/:size" + :data {:name ::beer} + :path "/api/ipa/large" + :path-params {:size "large"}}) (r/match-by-name router ::beer {:size "large"}))) (is (= (r/map->Match - {:template "/api/ipa/:size" - :data {:name ::beer} - :path "/api/ipa/large" - :path-params {:size "large"}}) + {:template "/api/ipa/:size" + :data {:name ::beer} + :path "/api/ipa/large" + :path-params {:size "large"}}) (r/match-by-name router ::beer {:size :large}))) (is (= nil (r/match-by-name router "ILLEGAL"))) (is (= [::beer] (r/route-names router))) (testing "name-based routing with missing parameters" (is (= (r/map->PartialMatch - {:template "/api/ipa/:size" - :data {:name ::beer} - :required #{:size} - :path-params nil}) + {:template "/api/ipa/:size" + :data {:name ::beer} + :required #{:size} + :path-params nil}) (r/match-by-name router ::beer))) (is (r/partial-match? (r/match-by-name router ::beer))) (is (thrown-with-msg? - ExceptionInfo - #"^missing path-params for route /api/ipa/:size -> \#\{:size\}$" - (r/match-by-name! router ::beer)))))) + ExceptionInfo + #"^missing path-params for route /api/ipa/:size -> \#\{:size\}$" + (r/match-by-name! router ::beer)))))) (testing "decode %-encoded path params" (let [router (r/router [["/one-param-path/:param1" ::one] @@ -71,14 +71,14 @@ (testing "complex" (let [router (r/router - [["/:abba" ::abba] - ["/abba/1" ::abba2] - ["/:jabba/2" ::jabba2] - ["/:abba/:dabba/doo" ::doo] - ["/abba/dabba/boo/baa" ::baa] - ["/abba/:dabba/boo" ::boo] - ["/:jabba/:dabba/:doo/:daa/*foo" ::wild]] - {:router r}) + [["/:abba" ::abba] + ["/abba/1" ::abba2] + ["/:jabba/2" ::jabba2] + ["/:abba/:dabba/doo" ::doo] + ["/abba/dabba/boo/baa" ::baa] + ["/abba/:dabba/boo" ::boo] + ["/:jabba/:dabba/:doo/:daa/*foo" ::wild]] + {:router r}) by-path #(-> router (r/match-by-path %) :data :name)] (is (= ::abba (by-path "/abba"))) (is (= ::abba2 (by-path "/abba/1"))) @@ -93,19 +93,19 @@ (testing "bracket-params" (testing "successful" (let [router (r/router - [["/{abba}" ::abba] - ["/abba/1" ::abba2] - ["/{jabba}/2" ::jabba2] - ["/{abba}/{dabba}/doo" ::doo] - ["/abba/dabba/boo/baa" ::baa] - ["/abba/{dabba}/boo" ::boo] - ["/{a/jabba}/{a.b/dabba}/{a.b.c/doo}/{a.b.c.d/daa}/{*foo/bar}" ::wild] - ["/files/file-{name}.html" ::html] - ["/files/file-{name}.json" ::json] - ["/{eskon}/{saum}/pium\u2215paum" ::loru] - ["/{🌈}🤔/🎈" ::emoji] - ["/extra-end}s-are/ok" ::bracket]] - {:router r}) + [["/{abba}" ::abba] + ["/abba/1" ::abba2] + ["/{jabba}/2" ::jabba2] + ["/{abba}/{dabba}/doo" ::doo] + ["/abba/dabba/boo/baa" ::baa] + ["/abba/{dabba}/boo" ::boo] + ["/{a/jabba}/{a.b/dabba}/{a.b.c/doo}/{a.b.c.d/daa}/{*foo/bar}" ::wild] + ["/files/file-{name}.html" ::html] + ["/files/file-{name}.json" ::json] + ["/{eskon}/{saum}/pium\u2215paum" ::loru] + ["/{🌈}🤔/🎈" ::emoji] + ["/extra-end}s-are/ok" ::bracket]] + {:router r}) by-path #(-> router (r/match-by-path %) ((juxt (comp :name :data) :path-params)))] (is (= [::abba {:abba "abba"}] (by-path "/abba"))) (is (= [::abba2 {}] (by-path "/abba/1"))) @@ -130,22 +130,22 @@ (testing "invalid syntax fails fast" (testing "unclosed brackets" (is (thrown-with-msg? - ExceptionInfo - #":reitit.trie/unclosed-brackets" - (r/router ["/kikka/{kukka"])))) + ExceptionInfo + #":reitit.trie/unclosed-brackets" + (r/router ["/kikka/{kukka"])))) (testing "multiple terminators" (is (thrown-with-msg? - ExceptionInfo - #":reitit.trie/multiple-terminators" - (r/router [["/{kukka}.json"] - ["/{kukka}-json"]])))))) + ExceptionInfo + #":reitit.trie/multiple-terminators" + (r/router [["/{kukka}.json"] + ["/{kukka}-json"]])))))) (testing "empty path segments" (let [router (r/router - [["/items" ::list] - ["/items/:id" ::item] - ["/items/:id/:side" ::deep]] - {:router r}) + [["/items" ::list] + ["/items/:id" ::item] + ["/items/:id/:side" ::deep]] + {:router r}) matches #(-> router (r/match-by-path %) :data :name)] (is (= ::list (matches "/items"))) (is (= nil (matches "/items/"))) @@ -169,28 +169,28 @@ (is (= nil (r/match-by-path router "/api"))) (is (= (r/map->Match - {:template "/api/ipa/large" - :data {:name ::beer} - :path "/api/ipa/large" - :path-params {}}) + {:template "/api/ipa/large" + :data {:name ::beer} + :path "/api/ipa/large" + :path-params {}}) (r/match-by-path router "/api/ipa/large"))) (is (= (r/map->Match - {:template "/api/ipa/large" - :data {:name ::beer} - :path "/api/ipa/large" - :path-params {:size "large"}}) + {:template "/api/ipa/large" + :data {:name ::beer} + :path "/api/ipa/large" + :path-params {:size "large"}}) (r/match-by-name router ::beer {:size "large"}))) (is (= nil (r/match-by-name router "ILLEGAL"))) (is (= [::beer] (r/route-names router))) (testing "can't be created with wildcard routes" (is (thrown-with-msg? - ExceptionInfo - #"can't create :lookup-router with wildcard routes" - (r/lookup-router - (impl/resolve-routes - ["/api/:version/ping"] - (r/default-router-options))))))) + ExceptionInfo + #"can't create :lookup-router with wildcard routes" + (r/lookup-router + (impl/resolve-routes + ["/api/:version/ping"] + (r/default-router-options))))))) r/lookup-router :lookup-router r/single-static-path-router :single-static-path-router @@ -216,14 +216,14 @@ (swap! compile-times inc) (constantly path)) router (r/router - ["/api" {:roles #{:admin}} - ["/ping" ::ping] - ["/pong" ::pong] - ["/hidden" {:invalid? true} - ["/utter"] - ["/crap"]]] - {:coerce coerce - :compile compile})] + ["/api" {:roles #{:admin}} + ["/ping" ::ping] + ["/pong" ::pong] + ["/hidden" {:invalid? true} + ["/utter"] + ["/crap"]]] + {:coerce coerce + :compile compile})] (testing "routes are coerced" (is (= [["/api/ping" {:name ::ping @@ -281,10 +281,10 @@ router (r/router routes)] (is (= expected (impl/resolve-routes routes (r/default-router-options)))) (is (= (r/map->Match - {:template "/api/user/:id/:sub-id" - :data {:mw [:api], :parameters {:id "String", :sub-id "String"}} - :path "/api/user/1/2" - :path-params {:id "1", :sub-id "2"}}) + {:template "/api/user/:id/:sub-id" + :data {:mw [:api], :parameters {:id "String", :sub-id "String"}} + :path "/api/user/1/2" + :path-params {:id "1", :sub-id "2"}}) (r/match-by-path router "/api/user/1/2")))))) (deftest conflicting-routes-test @@ -334,10 +334,10 @@ (testing "router with conflicting routes" (testing "throws by default" (is (thrown-with-msg? - ExceptionInfo - #"Router contains conflicting route paths" - (r/router - [["/a"] ["/a"]])))) + ExceptionInfo + #"Router contains conflicting route paths" + (r/router + [["/a"] ["/a"]])))) (testing "can be configured to ignore with route data" (are [paths expected] (let [router (r/router paths)] @@ -364,9 +364,9 @@ (testing "unmarked path conflicts throw" (are [paths] (is (thrown-with-msg? - ExceptionInfo - #"Router contains conflicting route paths" - (r/router paths))) + ExceptionInfo + #"Router contains conflicting route paths" + (r/router paths))) [["/a"] ["/a" {:conflicting true}]] [["/a" {:conflicting true}] ["/a"]]))) (testing "can be configured to ignore with router option" @@ -375,10 +375,10 @@ (testing "name conflicts" (testing "router with conflicting routes always throws" (is (thrown-with-msg? - ExceptionInfo - #"Router contains conflicting route names" - (r/router - [["/1" ::1] ["/2" ::1]])))))) + ExceptionInfo + #"Router contains conflicting route names" + (r/router + [["/1" ::1] ["/2" ::1]])))))) (deftest match->path-test (let [router (r/router ["/:a/:b" ::route])] @@ -406,10 +406,10 @@ (r/routes))))) (testing "sequential route definition fails" (is (thrown? - #?(:clj Exception, :cljs js/Error) - (-> ["/api" - (list "/ipa")] - (r/router)))))) + #?(:clj Exception, :cljs js/Error) + (-> ["/api" + (list "/ipa")] + (r/router)))))) (defrecord Named [n] r/Expand @@ -422,12 +422,12 @@ (deftest routing-order-test-229 (let [router (r/router - [["/" :root] - ["/" {:name :create :method :post}]] - {:conflicts nil}) + [["/" :root] + ["/" {:name :create :method :post}]] + {:conflicts nil}) router2 (r/router - [["/*a" :root] - ["/:a/b/c/d" {:name :create :method :post}]] - {:conflicts nil})] + [["/*a" :root] + ["/:a/b/c/d" {:name :create :method :post}]] + {:conflicts nil})] (is (= :root (-> (r/match-by-path router "/") :data :name))) (is (= :root (-> (r/match-by-path router2 "/") :data :name))))) diff --git a/test/cljc/reitit/exception_test.cljc b/test/cljc/reitit/exception_test.cljc index bde403a7..205a42fb 100644 --- a/test/cljc/reitit/exception_test.cljc +++ b/test/cljc/reitit/exception_test.cljc @@ -17,12 +17,12 @@ (are [exception] (are [error routes] (is (thrown-with-msg? - ExceptionInfo - error - (r/router - routes - {:validate rs/validate - :exception exception}))) + ExceptionInfo + error + (r/router + routes + {:validate rs/validate + :exception exception}))) #"Router contains conflicting route paths" [["/:a/1"] diff --git a/test/cljc/reitit/interceptor_test.cljc b/test/cljc/reitit/interceptor_test.cljc index 11f32964..3190d230 100644 --- a/test/cljc/reitit/interceptor_test.cljc +++ b/test/cljc/reitit/interceptor_test.cljc @@ -9,9 +9,9 @@ (defn execute [interceptors ctx] (as-> ctx $ - (reduce #(%2 %1) $ (keep :enter interceptors)) - (reduce #(%2 %1) $ (reverse (keep :leave interceptors))) - (:response $))) + (reduce #(%2 %1) $ (keep :enter interceptors)) + (reduce #(%2 %1) $ (reverse (keep :leave interceptors))) + (:response $))) (defn f [value ctx] (update ctx :request conj value)) @@ -36,8 +36,8 @@ (create interceptors nil)) ([interceptors opts] (let [chain (interceptor/chain - (conj interceptors handler) - :data opts)] + (conj interceptors handler) + :data opts)] (partial execute chain)))) (deftest expand-interceptor-test @@ -74,9 +74,9 @@ (testing "missing keyword" (is (thrown-with-msg? - ExceptionInfo - #"Interceptor :enter not found in registry" - (create [:enter])))) + ExceptionInfo + #"Interceptor :enter not found in registry" + (create [:enter])))) (testing "existing keyword, compiling to nil" (let [app (create [:enter] {::interceptor/registry {:enter {:compile (constantly nil)}}})] @@ -134,9 +134,9 @@ (testing "too deeply compiled interceptor fails" (binding [interceptor/*max-compile-depth* 2] (is (thrown? - ExceptionInfo - #"Too deep Interceptor compilation" - (create [[i3 :value]]))))) + ExceptionInfo + #"Too deep Interceptor compilation" + (create [[i3 :value]]))))) (testing "nil unmounts the interceptor" (let [app (create [{:compile (constantly nil)} @@ -155,11 +155,11 @@ (testing "interceptor-handler" (let [api-interceptor (interceptor :api) router (interceptor/router - [["/ping" handler] - ["/api" {:interceptors [api-interceptor]} - ["/ping" handler] - ["/admin" {:interceptors [[interceptor :admin]]} - ["/ping" handler]]]]) + [["/ping" handler] + ["/api" {:interceptors [api-interceptor]} + ["/ping" handler] + ["/admin" {:interceptors [[interceptor :admin]]} + ["/ping" handler]]]]) app (create-app router)] (testing "not found" @@ -179,8 +179,8 @@ i2 {:name ::i2, :compile (constantly nil)} i3 (interceptor ::i3) router (interceptor/router - ["/api" {:interceptors [i1 i2 i3 i2] - :handler handler}]) + ["/api" {:interceptors [i1 i2 i3 i2] + :handler handler}]) app (create-app router)] (is (= [::enter_i1 ::enter_i3 :ok ::leave_i3 ::leave_i1] (app "/api"))) @@ -221,12 +221,12 @@ (let [debug-i (enter ::debug) create (fn [options] (create-app - (interceptor/router - ["/ping" {:interceptors [(enter ::olipa) - (enter ::kerran) - (enter ::avaruus)] - :handler handler}] - options))) + (interceptor/router + ["/ping" {:interceptors [(enter ::olipa) + (enter ::kerran) + (enter ::avaruus)] + :handler handler}] + options))) inject-debug (interceptor/transform-butlast #(interleave % (repeat debug-i))) sort-interceptors (interceptor/transform-butlast (partial sort-by :name))] diff --git a/test/cljc/reitit/middleware_test.cljc b/test/cljc/reitit/middleware_test.cljc index 2bfc2f82..d3fb8053 100644 --- a/test/cljc/reitit/middleware_test.cljc +++ b/test/cljc/reitit/middleware_test.cljc @@ -15,10 +15,10 @@ (create middleware nil)) ([middleware opts] (middleware/chain - middleware - handler - :data - opts))) + middleware + handler + :data + opts))) (deftest expand-middleware-test @@ -61,9 +61,9 @@ (testing "missing keyword" (is (thrown-with-msg? - ExceptionInfo - #"Middleware :wrap not found in registry" - (create [:wrap])))) + ExceptionInfo + #"Middleware :wrap not found in registry" + (create [:wrap])))) (testing "existing keyword, compiling to nil" (let [app (create [:wrap] {::middleware/registry {:wrap {:compile (constantly nil)}}})] @@ -142,9 +142,9 @@ (testing "too deeply compiled Middleware fails" (binding [middleware/*max-compile-depth* 2] (is (thrown? - ExceptionInfo - #"Too deep Middleware compilation" - (create [[(middleware/map->Middleware mw3) :value]]))))) + ExceptionInfo + #"Too deep Middleware compilation" + (create [[(middleware/map->Middleware mw3) :value]]))))) (testing "nil unmounts the middleware" (let [app (create [{:compile (constantly nil)} @@ -162,9 +162,9 @@ (testing "all paths should have a handler" (is (thrown-with-msg? - ExceptionInfo - #"path \"/ping\" doesn't have a :handler defined" - (middleware/router ["/ping"])))) + ExceptionInfo + #"path \"/ping\" doesn't have a :handler defined" + (middleware/router ["/ping"])))) (testing "middleware-handler" (let [mw (fn [handler value] @@ -173,11 +173,11 @@ api-mw #(mw % :api) handler #(conj % :ok) router (middleware/router - [["/ping" handler] - ["/api" {:middleware [api-mw]} - ["/ping" handler] - ["/admin" {:middleware [[mw :admin]]} - ["/ping" handler]]]]) + [["/ping" handler] + ["/api" {:middleware [api-mw]} + ["/ping" handler] + ["/admin" {:middleware [[mw :admin]]} + ["/ping" handler]]]]) app (create-app router)] (testing "not found" @@ -197,9 +197,9 @@ mw2 {:name ::mw2, :compile (constantly nil)} mw3 {:name ::mw3, :wrap #(mw % ::mw3)} router (middleware/router - ["/api" {:name ::api - :middleware [mw1 mw2 mw3 mw2] - :handler handler}]) + ["/api" {:name ::api + :middleware [mw1 mw2 mw3 mw2] + :handler handler}]) app (create-app router)] (is (= [::mw1 ::mw3 :ok ::mw3 ::mw1] (app "/api"))) @@ -241,12 +241,12 @@ debug-mw {:name ::debug, :wrap #(wrap % ::debug)} create (fn [options] (create-app - (middleware/router - ["/ping" {:middleware [{:name ::olipa, :wrap #(wrap % ::olipa)} - {:name ::kerran, :wrap #(wrap % ::kerran)} - {:name ::avaruus, :wrap #(wrap % ::avaruus)}] - :handler #(conj % :ok)}] - options)))] + (middleware/router + ["/ping" {:middleware [{:name ::olipa, :wrap #(wrap % ::olipa)} + {:name ::kerran, :wrap #(wrap % ::kerran)} + {:name ::avaruus, :wrap #(wrap % ::avaruus)}] + :handler #(conj % :ok)}] + options)))] (testing "by default, all middleware are applied in order" (let [app (create nil)] diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index 06b5808c..888cdb31 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -77,19 +77,19 @@ (deftest spec-coercion-test (let [create (fn [middleware] (ring/ring-handler - (ring/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query {(ds/opt :a) int?} - :body {:b int?} - :form {:c int?} - :header {:d int?} - :path {:e int?}} - :responses {200 {:body {:total pos-int?}} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:middleware middleware - :coercion spec/coercion}})))] + (ring/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query {(ds/opt :a) int?} + :body {:b int?} + :form {:c int?} + :header {:d int?} + :path {:e int?}} + :responses {200 {:body {:total pos-int?}} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:middleware middleware + :coercion spec/coercion}})))] (testing "without exception handling" (let [app (create [rrc/coerce-request-middleware @@ -111,15 +111,15 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) (testing "with exception handling" (let [app (create [rrc/coerce-exceptions-middleware @@ -144,19 +144,19 @@ (deftest schema-coercion-test (let [create (fn [middleware] (ring/ring-handler - (ring/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query {(s/optional-key :a) s/Int} - :body {:b s/Int} - :form {:c s/Int} - :header {:d s/Int} - :path {:e s/Int}} - :responses {200 {:body {:total (s/constrained s/Int pos? 'positive)}} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:middleware middleware - :coercion schema/coercion}})))] + (ring/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query {(s/optional-key :a) s/Int} + :body {:b s/Int} + :form {:c s/Int} + :header {:d s/Int} + :path {:e s/Int}} + :responses {200 {:body {:total (s/constrained s/Int pos? 'positive)}} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:middleware middleware + :coercion schema/coercion}})))] (testing "withut exception handling" (let [app (create [rrc/coerce-request-middleware @@ -175,19 +175,19 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1))) (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app valid-request3)))) + ExceptionInfo + #"Request coercion failed" + (app valid-request3)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) (testing "with exception handling" (let [app (create [rrc/coerce-exceptions-middleware @@ -210,50 +210,50 @@ (deftest malli-coercion-test (let [create (fn [middleware] (ring/ring-handler - (ring/router - ["/api" + (ring/router + ["/api" - ["/validate" {:summary "just validation" - :coercion (reitit.coercion.malli/create {:transformers {}}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] + ["/validate" {:summary "just validation" + :coercion (reitit.coercion.malli/create {:transformers {}}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - ["/no-op" {:summary "no-operation" - :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] + ["/no-op" {:summary "no-operation" + :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - ["/skip" {:summary "skip" - :coercion (reitit.coercion.malli/create {:enabled false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] - - ["/or" {:post {:summary "accepts either of two map schemas" - :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} - :responses {200 {:body [:map [:msg string?]]}} - :handler (fn [{{{:keys [x]} :body} :parameters}] + ["/skip" {:summary "skip" + :coercion (reitit.coercion.malli/create {:enabled false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] {:status 200 - :body {:msg (if x "you sent x" "you sent y")}})}}] + :body (-> req :parameters :body)})}}] - ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] - :body [:map [:b int?]] - :form [:map [:c [int? {:default 3}]]] - :header [:map [:d int?]] - :path [:map [:e int?]]} - :responses {200 {:body [:map [:total pos-int?]]} - 500 {:description "fail"}} - :handler handler}}]] - {:data {:middleware middleware - :coercion malli/coercion}})))] + ["/or" {:post {:summary "accepts either of two map schemas" + :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} + :responses {200 {:body [:map [:msg string?]]}} + :handler (fn [{{{:keys [x]} :body} :parameters}] + {:status 200 + :body {:msg (if x "you sent x" "you sent y")}})}}] + + ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] + :body [:map [:b int?]] + :form [:map [:c [int? {:default 3}]]] + :header [:map [:d int?]] + :path [:map [:e int?]]} + :responses {200 {:body [:map [:total pos-int?]]} + 500 {:description "fail"}} + :handler handler}}]] + {:data {:middleware middleware + :coercion malli/coercion}})))] (testing "without exception handling" (let [app (create [rrc/coerce-request-middleware @@ -279,15 +279,15 @@ (testing "invalid request" (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) (testing "invalid response" (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) (testing "with exception handling" (let [app (create [rrc/coerce-exceptions-middleware @@ -350,15 +350,15 @@ {:status 200, :body (assoc body :response true)})}}) ->app (fn [options] (ring/ring-handler - (ring/router - ["/api" - ["/default" (endpoint [:map [:x int?]])] - ["/closed" (endpoint [:map {:closed true} [:x int?]])] - ["/open" (endpoint [:map {:closed false} [:x int?]])]] - {:data {:middleware [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion (malli/create options)}}))) + (ring/router + ["/api" + ["/default" (endpoint [:map [:x int?]])] + ["/closed" (endpoint [:map {:closed true} [:x int?]])] + ["/open" (endpoint [:map {:closed false} [:x int?]])]] + {:data {:middleware [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion (malli/create options)}}))) ->request (fn [uri] {:uri (str "/api/" uri) :request-method :get :muuntaja/request {:format "application/json"} @@ -414,22 +414,22 @@ (testing "sequence schemas" (let [app (ring/ring-handler - (ring/router - ["/ping" {:get {:parameters {:body [:vector [:map [:message string?]]]} - :responses {200 {:body [:vector [:map [:pong string?]]]} - 501 {:body [:vector [:map [:error string?]]]}} - :handler (fn [{{[{:keys [message]}] :body} :parameters :as req}] - (condp = message - "ping" {:status 200 - :body [{:pong message}]} - "fail" {:status 501 - :body [{:error "fail"}]} - {:status 200 - :body {:invalid "response"}}))}}] - {:data {:middleware [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion malli/coercion}})) + (ring/router + ["/ping" {:get {:parameters {:body [:vector [:map [:message string?]]]} + :responses {200 {:body [:vector [:map [:pong string?]]]} + 501 {:body [:vector [:map [:error string?]]]}} + :handler (fn [{{[{:keys [message]}] :body} :parameters :as req}] + (condp = message + "ping" {:status 200 + :body [{:pong message}]} + "fail" {:status 501 + :body [{:error "fail"}]} + {:status 200 + :body {:invalid "response"}}))}}] + {:data {:middleware [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion malli/coercion}})) ->request (fn [body] {:uri "/ping" :request-method :get @@ -454,15 +454,15 @@ (testing "encoding responses" (let [->app (fn [total-schema] (ring/ring-handler - (ring/router - ["/total" {:get {:parameters {:query [:map [:x :int]]} - :responses {200 {:body [:map [:total total-schema]]}} - :handler (fn [{{{:keys [x]} :query} :parameters}] - {:status 200 - :body {:total (* x x)}})}}] - {:data {:middleware [rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion malli/coercion}}))) + (ring/router + ["/total" {:get {:parameters {:query [:map [:x :int]]} + :responses {200 {:body [:map [:total total-schema]]}} + :handler (fn [{{{:keys [x]} :query} :parameters}] + {:status 200 + :body {:total (* x x)}})}}] + {:data {:middleware [rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion malli/coercion}}))) call (fn [accept total-schema] ((->app total-schema) {:uri "/total" :request-method :get @@ -482,18 +482,18 @@ #?(:clj (deftest muuntaja-test (let [app (ring/ring-handler - (ring/router - ["/api" - ["/plus" - {:post {:parameters {:body {:int int?, :keyword keyword?}} - :responses {200 {:body {:int int?, :keyword keyword?}}} - :handler (fn [{{:keys [body]} :parameters}] - {:status 200 - :body body})}}]] - {:data {:middleware [muuntaja.middleware/wrap-format - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion spec/coercion}})) + (ring/router + ["/api" + ["/plus" + {:post {:parameters {:body {:int int?, :keyword keyword?}} + :responses {200 {:body {:int int?, :keyword keyword?}}} + :handler (fn [{{:keys [body]} :parameters}] + {:status 200 + :body body})}}]] + {:data {:middleware [muuntaja.middleware/wrap-format + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion spec/coercion}})) request (fn [content-type body] (-> {:request-method :post :headers {"content-type" content-type, "accept" content-type} diff --git a/test/cljc/reitit/ring_spec_test.cljc b/test/cljc/reitit/ring_spec_test.cljc index 9a615efd..57a6c0de 100644 --- a/test/cljc/reitit/ring_spec_test.cljc +++ b/test/cljc/reitit/ring_spec_test.cljc @@ -15,69 +15,69 @@ (deftest route-data-validation-test (testing "validation is turned off by default" (is (r/router? - (r/router - ["/api" {:handler "identity"}])))) + (r/router + ["/api" {:handler "identity"}])))) (testing "with default spec validates :name, :handler and :middleware" (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (ring/router - ["/api" {:handler "identity"}] - {:validate rrs/validate}))) + ExceptionInfo + #"Invalid route data" + (ring/router + ["/api" {:handler "identity"}] + {:validate rrs/validate}))) (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (ring/router - ["/api" {:handler identity - :name "kikka"}] - {:validate rrs/validate})))) + ExceptionInfo + #"Invalid route data" + (ring/router + ["/api" {:handler identity + :name "kikka"}] + {:validate rrs/validate})))) (testing "all endpoints are validated" (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (ring/router - ["/api" {:patch {:handler "identity"}}] - {:validate rrs/validate})))) + ExceptionInfo + #"Invalid route data" + (ring/router + ["/api" {:patch {:handler "identity"}}] + {:validate rrs/validate})))) (testing "spec can be overridden" (is (r/router? - (ring/router - ["/api" {:handler "identity"}] - {:spec (s/spec any?) - :validate rrs/validate}))) + (ring/router + ["/api" {:handler "identity"}] + {:spec (s/spec any?) + :validate rrs/validate}))) (testing "predicates are not allowed" (is (thrown-with-msg? - ExceptionInfo - #":reitit.ring.spec/invalid-specs" - (ring/router - ["/api" {:handler "identity"}] - {:spec any? - :validate rrs/validate}))))) + ExceptionInfo + #":reitit.ring.spec/invalid-specs" + (ring/router + ["/api" {:handler "identity"}] + {:spec any? + :validate rrs/validate}))))) (testing "middleware can contribute to specs" (is (r/router? - (ring/router - ["/api" {:get {:handler identity - :roles #{:admin}}}] - {:validate rrs/validate - :data {:middleware [{:spec (s/keys :opt-un [::roles]) - :wrap (fn [handler] - (fn [request] - (handler request)))}]}}))) + (ring/router + ["/api" {:get {:handler identity + :roles #{:admin}}}] + {:validate rrs/validate + :data {:middleware [{:spec (s/keys :opt-un [::roles]) + :wrap (fn [handler] + (fn [request] + (handler request)))}]}}))) (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (ring/router - ["/api" {:get {:handler identity - :roles #{:adminz}}}] - {:validate rrs/validate - :data {:middleware [{:spec (s/keys :opt-un [::roles]) - :wrap (fn [handler] - (fn [request] - (handler request)))}]}})))) + ExceptionInfo + #"Invalid route data" + (ring/router + ["/api" {:get {:handler identity + :roles #{:adminz}}}] + {:validate rrs/validate + :data {:middleware [{:spec (s/keys :opt-un [::roles]) + :wrap (fn [handler] + (fn [request] + (handler request)))}]}})))) (testing "middleware cannot be a list" (is (thrown-with-msg? ExceptionInfo @@ -89,46 +89,46 @@ (deftest coercion-spec-test (is (r/router? - (ring/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query {:a string?} - :body {:b string?} - :form {:c string?} - :header {:d string?} - :path {:e string?}} - :responses {200 {:body {:total pos-int?}} - 400 {:description "fail"} - 500 {}} - :handler identity}}]] - {:data {:middleware [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion reitit.coercion.spec/coercion} - :validate rrs/validate}))) + (ring/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query {:a string?} + :body {:b string?} + :form {:c string?} + :header {:d string?} + :path {:e string?}} + :responses {200 {:body {:total pos-int?}} + 400 {:description "fail"} + 500 {}} + :handler identity}}]] + {:data {:middleware [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion} + :validate rrs/validate}))) (is (r/router? - (ring/router - ["/api" - ["/plus/:e" - {:get {:parameters {:query (s/keys)} - :handler identity}}]] - {:data {:middleware [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion reitit.coercion.spec/coercion} - :validate rrs/validate}))) + (ring/router + ["/api" + ["/plus/:e" + {:get {:parameters {:query (s/keys)} + :handler identity}}]] + {:data {:middleware [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion} + :validate rrs/validate}))) (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (ring/router - ["/api" - ["/plus/:e" - {:get {:responses {"200" {}} - :handler identity}}]] - {:data {:middleware [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :coercion reitit.coercion.spec/coercion} - :validate rrs/validate})))) + ExceptionInfo + #"Invalid route data" + (ring/router + ["/api" + ["/plus/:e" + {:get {:responses {"200" {}} + :handler identity}}]] + {:data {:middleware [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion} + :validate rrs/validate})))) diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index b057b401..4e069a1b 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -28,35 +28,35 @@ (testing "nils are removed" (is (= 123 ((ring/routes - (constantly nil) - nil - (constantly 123)) + (constantly nil) + nil + (constantly 123)) ::irrelevant)))) (testing "can return nil" (is (= nil (ring/routes - nil - nil))))) + nil + nil))))) (deftest ring-router-test (testing "all paths should have a handler" (is (thrown-with-msg? - ExceptionInfo - #"path \"/ping\" doesn't have a :handler defined for :get" - (ring/router ["/ping" {:get {}}])))) + ExceptionInfo + #"path \"/ping\" doesn't have a :handler defined for :get" + (ring/router ["/ping" {:get {}}])))) (testing "ring-handler" (let [api-mw #(mw % :api) router (ring/router - ["/api" {:middleware [api-mw]} - ["/all" handler] - ["/get" {:get handler}] - ["/users" {:middleware [[mw :users]] - :get handler - :post {:handler handler - :middleware [[mw :post]]} - :handler handler}]]) + ["/api" {:middleware [api-mw]} + ["/all" handler] + ["/get" {:get handler}] + ["/users" {:middleware [[mw :users]] + :get handler + :post {:handler handler + :middleware [[mw :post]]} + :handler handler}]]) app (ring/ring-handler router)] (testing "router can be extracted" @@ -95,8 +95,8 @@ (testing "with top-level middleware" (let [router (ring/router - ["/api" {:middleware [[mw :api]]} - ["/get" {:get handler}]]) + ["/api" {:middleware [[mw :api]]} + ["/get" {:get handler}]]) app (ring/ring-handler router nil {:middleware [[mw :top]]})] (testing "router can be extracted" @@ -111,14 +111,14 @@ (testing "named routes" (let [router (ring/router - [["/api" - ["/all" {:handler handler :name ::all}] - ["/get" {:get {:handler handler :name ::HIDDEN} - :name ::get}] - ["/users" {:get handler - :post handler - :handler handler - :name ::users}]]]) + [["/api" + ["/all" {:handler handler :name ::all}] + ["/get" {:get {:handler handler :name ::HIDDEN} + :name ::get}] + ["/users" {:get handler + :post handler + :handler handler + :name ::users}]]]) app (ring/ring-handler router)] (testing "router can be extracted" @@ -141,21 +141,21 @@ (deftest mw-variadic-test (let [app (ring/ring-handler - (ring/router - ["/" {:middleware [[mw-variadic "kikka" "kakka" "kukka"]] - :handler handler}]))] + (ring/router + ["/" {:middleware [[mw-variadic "kikka" "kakka" "kukka"]] + :handler handler}]))] (is (= {:status 200, :body [:kikka_kakka_kukka :ok]} (app {:request-method :get, :uri "/"}))))) (deftest enforcing-data-rules-at-runtime-test (let [handler (constantly {:status 200, :body "ok"}) app (ring/ring-handler - (ring/router - [["/api" - ["/ping" handler] - ["/admin" {::roles #{:admin}} - ["/ping" handler]]]] - {:data {:middleware [wrap-enforce-roles]}}))] + (ring/router + [["/api" + ["/ping" handler] + ["/admin" {::roles #{:admin}} + ["/ping" handler]]]] + {:data {:middleware [wrap-enforce-roles]}}))] (testing "public handler" (is (= {:status 200, :body "ok"} @@ -175,8 +175,8 @@ (deftest default-handler-test (let [response {:status 200, :body "ok"} router (ring/router - [["/ping" {:get (constantly response)}] - ["/pong" (constantly nil)]]) + [["/ping" {:get (constantly response)}] + ["/pong" (constantly nil)]]) app (ring/ring-handler router)] (testing "match" @@ -202,9 +202,9 @@ (testing "with custom http responses" (let [app (ring/ring-handler router (ring/create-default-handler - {:not-found (constantly {:status -404}) - :method-not-allowed (constantly {:status -405}) - :not-acceptable (constantly {:status -406})}))] + {:not-found (constantly {:status -404}) + :method-not-allowed (constantly {:status -405}) + :not-acceptable (constantly {:status -406})}))] (testing "route doesn't match" (is (= -404 (:status (app {:request-method :get, :uri "/"}))))) (testing "method doesn't match" @@ -214,7 +214,7 @@ (testing "with some custom http responses" (let [app (ring/ring-handler router (ring/create-default-handler - {:not-found (constantly {:status -404})}))] + {:not-found (constantly {:status -404})}))] (testing "route doesn't match" (is (= 405 (:status (app {:request-method :post, :uri "/ping"})))))))))) @@ -227,11 +227,11 @@ (testing "with defaults" (let [app (ring/ring-handler - (ring/router - [["/get" {:get (constantly response) - :post (constantly response)}] - ["/options" {:options (constantly response)}] - ["/any" (constantly response)]]))] + (ring/router + [["/get" {:get (constantly response) + :post (constantly response)}] + ["/options" {:options (constantly response)}] + ["/any" (constantly response)]]))] (testing "endpoint with a non-options handler" (let [request {:request-method :options, :uri "/get"}] @@ -258,10 +258,10 @@ (constantly {:status 200, :body "ok"})]] (let [response {:status 200, :body "ok"} app (ring/ring-handler - (ring/router - ["/get" {:get (constantly response) - :post (constantly response)}] - {::ring/default-options-endpoint endpoint}))] + (ring/router + ["/get" {:get (constantly response) + :post (constantly response)}] + {::ring/default-options-endpoint endpoint}))] (testing "endpoint with a non-options handler" (let [request {:request-method :options, :uri "/get"}] @@ -270,11 +270,11 @@ (testing "disabled via options" (let [app (ring/ring-handler - (ring/router - [["/get" {:get (constantly response)}] - ["/options" {:options (constantly response)}] - ["/any" (constantly response)]] - {::ring/default-options-endpoint nil}))] + (ring/router + [["/get" {:get (constantly response)}] + ["/options" {:options (constantly response)}] + ["/any" (constantly response)]] + {::ring/default-options-endpoint nil}))] (testing "endpoint with a non-options handler" (is (= response (app {:request-method :get, :uri "/get"}))) @@ -297,8 +297,8 @@ :post (constantly ok)}]]] (testing "using :method :add" (let [app (ring/ring-handler - (ring/router routes) - (ring/redirect-trailing-slash-handler {:method :add}))] + (ring/router routes) + (ring/redirect-trailing-slash-handler {:method :add}))] (testing "exact matches work" (is (= ok (app {:request-method :get, :uri "/slash-less"}))) @@ -316,8 +316,8 @@ (testing "using :method :strip" (let [app (ring/ring-handler - (ring/router routes) - (ring/redirect-trailing-slash-handler {:method :strip}))] + (ring/router routes) + (ring/redirect-trailing-slash-handler {:method :strip}))] (testing "stripping to empty string doesn't match" (is (= nil (:status (app {:request-method :get, :uri "/"}))))) @@ -342,8 +342,8 @@ (testing "without option (equivalent to using :method :both)" (let [app (ring/ring-handler - (ring/router routes) - (ring/redirect-trailing-slash-handler))] + (ring/router routes) + (ring/redirect-trailing-slash-handler))] (testing "exact matches work" (is (= ok (app {:request-method :get, :uri "/slash-less"}))) @@ -370,10 +370,10 @@ ([x] (reset! value x)))) response {:status 200, :body "ok"} router (ring/router - [["/ping" {:get (fn [_ respond _] - (respond response))}] - ["/pong" (fn [_ respond _] - (respond nil))]]) + [["/ping" {:get (fn [_ respond _] + (respond response))}] + ["/pong" (fn [_ respond _] + (respond nil))]]) app (ring/ring-handler router)] (testing "match" @@ -436,12 +436,12 @@ request {:uri "/api/avaruus" :request-method :get} create (fn [options] (ring/ring-handler - (ring/router - ["/api" {:middleware [(middleware :olipa)]} - ["/avaruus" {:middleware [(middleware :kerran)] - :get {:handler handler - :middleware [(middleware :avaruus)]}}]] - options)))] + (ring/router + ["/api" {:middleware [(middleware :olipa)]} + ["/avaruus" {:middleware [(middleware :kerran)] + :get {:handler handler + :middleware [(middleware :avaruus)]}}]] + options)))] (testing "by default, all middleware are applied in order" (let [app (create nil)] @@ -510,9 +510,9 @@ (testing "from path" (let [app (ring/ring-handler - (ring/router - ["/files/*" (create nil)]) - (ring/create-default-handler)) + (ring/router + ["/files/*" (create nil)]) + (ring/create-default-handler)) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] (testing "different file-types" @@ -553,10 +553,10 @@ (testing "from root" (let [app (ring/ring-handler - (ring/router []) - (ring/routes - (create {:path "/" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) - (ring/create-default-handler)))] + (ring/router []) + (ring/routes + (create {:path "/" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) + (ring/create-default-handler)))] (testing "different file-types" (let [response (app (request "/hello.json"))] (is (= "application/json" (get-in response [:headers "Content-Type"]))) @@ -594,10 +594,10 @@ (testing "from path" (let [app (ring/ring-handler - (ring/router []) - (ring/routes - (create {:path "/files" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) - (ring/create-default-handler))) + (ring/router []) + (ring/routes + (create {:path "/files" :not-found-handler (fn [x] {:status 404 :body "resource-handler"})}) + (ring/create-default-handler))) request #(request (str "/files" %)) redirect #(redirect (str "/files" %))] (testing "different file-types" @@ -638,12 +638,11 @@ (is (get-in @result [:headers "Last-Modified"])) (is (= "file\n" (slurp (:body @result)))))))))))))) - #?(:clj - (deftest file-resource-handler-not-found-test - (let [redirect (fn [uri] {:status 302, :body "", :headers {"Location" uri}}) - request (fn [uri] {:uri uri, :request-method :get}) - not-found-handler (fn [_] {:status 404, :body "not-found-handler"})] + (deftest file-resource-handler-not-found-test + (let [redirect (fn [uri] {:status 302, :body "", :headers {"Location" uri}}) + request (fn [uri] {:uri uri, :request-method :get}) + not-found-handler (fn [_] {:status 404, :body "not-found-handler"})] (doseq [[name create] [["resource-handler" ring/create-resource-handler] ["file-handler" #(ring/create-file-handler (assoc % :root "dev-resources/public"))]]] @@ -681,15 +680,15 @@ (deftest router-available-in-default-branch (testing "1-arity" ((ring/ring-handler - (ring/router []) - (fn [{::r/keys [router]}] - (is router))) + (ring/router []) + (fn [{::r/keys [router]}] + (is router))) {})) (testing "3-arity" ((ring/ring-handler - (ring/router []) - (fn [{::r/keys [router]} _ _] - (is router))) + (ring/router []) + (fn [{::r/keys [router]} _ _] + (is router))) {} ::respond ::raise))) #?(:clj @@ -697,11 +696,11 @@ (testing "in enough concurrent system, path-parameters can bleed" (doseq [compiler [trie/java-trie-compiler trie/clojure-trie-compiler]] (let [app (ring/ring-handler - (ring/router - ["/:id" (fn [request] - {:status 200 - :body (-> request :path-params :id)})]) - {::trie/trie-compiler compiler})] + (ring/router + ["/:id" (fn [request] + {:status 200 + :body (-> request :path-params :id)})]) + {::trie/trie-compiler compiler})] (dotimes [_ 10] (future (dotimes [n 100000] diff --git a/test/cljc/reitit/spec_test.cljc b/test/cljc/reitit/spec_test.cljc index f8506b6a..11b72560 100644 --- a/test/cljc/reitit/spec_test.cljc +++ b/test/cljc/reitit/spec_test.cljc @@ -38,10 +38,10 @@ (testing "with invalid routes" (are [data] (is (thrown-with-msg? - ExceptionInfo - #"Call to #'reitit.core/router did not conform to spec" - (r/router - data))) + ExceptionInfo + #"Call to #'reitit.core/router did not conform to spec" + (r/router + data))) ;; path [:invalid {}] @@ -68,10 +68,10 @@ (are [opts] (is (thrown-with-msg? - ExceptionInfo - #"Call to #'reitit.core/router did not conform to spec" - (r/router - ["/api"] opts))) + ExceptionInfo + #"Call to #'reitit.core/router did not conform to spec" + (r/router + ["/api"] opts))) {:path :api} {:path nil} @@ -85,52 +85,52 @@ (deftest route-data-validation-test (testing "validation is turned off by default" (is (r/router? (r/router - ["/api" {:handler "identity"}])))) + ["/api" {:handler "identity"}])))) (testing "with default spec validates :name and :handler" (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (r/router - ["/api" {:handler "identity"}] - {:validate rs/validate}))) + ExceptionInfo + #"Invalid route data" + (r/router + ["/api" {:handler "identity"}] + {:validate rs/validate}))) (is (thrown-with-msg? - ExceptionInfo - #"Invalid route data" - (r/router - ["/api" {:name "kikka"}] - {:validate rs/validate})))) + ExceptionInfo + #"Invalid route data" + (r/router + ["/api" {:name "kikka"}] + {:validate rs/validate})))) (testing "spec can be overridden" (is (r/router? (r/router - ["/api" {:handler "identity"}] - {:spec any? - :validate rs/validate}))))) + ["/api" {:handler "identity"}] + {:spec any? + :validate rs/validate}))))) (deftest parameters-test (is (s/valid? - ::rs/parameters - {:parameters {:query {:a string?} - :body {:b string?} - :form {:c string?} - :header {:d string?} - :path {:e string?}}})) + ::rs/parameters + {:parameters {:query {:a string?} + :body {:b string?} + :form {:c string?} + :header {:d string?} + :path {:e string?}}})) (is (s/valid? - ::rs/parameters - {:parameters {:header (s/keys)}})) + ::rs/parameters + {:parameters {:header (s/keys)}})) (is (s/valid? - ::rs/responses - {:responses {200 {:description "ok", :body string?} - 400 {:description "fail"} - 500 {:body string?} - :default {}}})) + ::rs/responses + {:responses {200 {:description "ok", :body string?} + 400 {:description "fail"} + 500 {:body string?} + :default {}}})) (is (not (s/valid? - ::rs/responses - {:responses {"200" {:description "ok", :body string?}}}))) + ::rs/responses + {:responses {"200" {:description "ok", :body string?}}}))) (is (not (s/valid? - ::rs/responses - {:responses {200 {:description :ok, :body string?}}})))) + ::rs/responses + {:responses {200 {:description :ok, :body string?}}})))) diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index b87c695c..cb9a8d07 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -13,93 +13,93 @@ (def app (ring/ring-handler - (ring/router - ["/api" - {:swagger {:id ::math}} + (ring/router + ["/api" + {:swagger {:id ::math}} - ["/swagger.json" - {:get {:no-doc true - :swagger {:info {:title "my-api"}} - :handler (swagger/create-swagger-handler)}}] + ["/swagger.json" + {:get {:no-doc true + :swagger {:info {:title "my-api"}} + :handler (swagger/create-swagger-handler)}}] - ["/spec" {:coercion spec/coercion} - ["/plus/:z" - {:patch {:summary "patch" + ["/spec" {:coercion spec/coercion} + ["/plus/:z" + {:patch {:summary "patch" + :handler (constantly {:status 200})} + :options {:summary "options" + :middleware [{:data {:swagger {:responses {200 {:description "200"}}}}}] :handler (constantly {:status 200})} - :options {:summary "options" - :middleware [{:data {:swagger {:responses {200 {:description "200"}}}}}] - :handler (constantly {:status 200})} - :get {:summary "plus" - :parameters {:query {:x int?, :y int?} - :path {:z int?}} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body {:total int?}} - 500 {:description "fail"}} - :handler (fn [{{{:keys [x y]} :query - {:keys [z]} :path} :parameters}] - {:status 200, :body {:total (+ x y z)}})} - :post {:summary "plus with body" - :parameters {:body (ds/maybe [int?]) - :path {:z int?}} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body {:total int?}} - 500 {:description "fail"}} - :handler (fn [{{{:keys [z]} :path - xs :body} :parameters}] - {:status 200, :body {:total (+ (reduce + xs) z)}})}}]] + :get {:summary "plus" + :parameters {:query {:x int?, :y int?} + :path {:z int?}} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body {:total int?}} + 500 {:description "fail"}} + :handler (fn [{{{:keys [x y]} :query + {:keys [z]} :path} :parameters}] + {:status 200, :body {:total (+ x y z)}})} + :post {:summary "plus with body" + :parameters {:body (ds/maybe [int?]) + :path {:z int?}} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body {:total int?}} + 500 {:description "fail"}} + :handler (fn [{{{:keys [z]} :path + xs :body} :parameters}] + {:status 200, :body {:total (+ (reduce + xs) z)}})}}]] - ["/malli" {:coercion malli/coercion} - ["/plus/*z" - {:get {:summary "plus" - :parameters {:query [:map [:x int?] [:y int?]] - :path [:map [:z int?]]} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body [:map [:total int?]]} - 500 {:description "fail"}} - :handler (fn [{{{:keys [x y]} :query - {:keys [z]} :path} :parameters}] - {:status 200, :body {:total (+ x y z)}})} - :post {:summary "plus with body" - :parameters {:body [:maybe [:vector int?]] - :path [:map [:z int?]]} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body [:map [:total int?]]} - 500 {:description "fail"}} - :handler (fn [{{{:keys [z]} :path - xs :body} :parameters}] - {:status 200, :body {:total (+ (reduce + xs) z)}})}}]] + ["/malli" {:coercion malli/coercion} + ["/plus/*z" + {:get {:summary "plus" + :parameters {:query [:map [:x int?] [:y int?]] + :path [:map [:z int?]]} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body [:map [:total int?]]} + 500 {:description "fail"}} + :handler (fn [{{{:keys [x y]} :query + {:keys [z]} :path} :parameters}] + {:status 200, :body {:total (+ x y z)}})} + :post {:summary "plus with body" + :parameters {:body [:maybe [:vector int?]] + :path [:map [:z int?]]} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body [:map [:total int?]]} + 500 {:description "fail"}} + :handler (fn [{{{:keys [z]} :path + xs :body} :parameters}] + {:status 200, :body {:total (+ (reduce + xs) z)}})}}]] - ["/schema" {:coercion schema/coercion} - ["/plus/*z" - {:get {:summary "plus" - :parameters {:query {:x s/Int, :y s/Int} - :path {:z s/Int}} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body {:total s/Int}} - 500 {:description "fail"}} - :handler (fn [{{{:keys [x y]} :query - {:keys [z]} :path} :parameters}] - {:status 200, :body {:total (+ x y z)}})} - :post {:summary "plus with body" - :parameters {:body (s/maybe [s/Int]) - :path {:z s/Int}} - :swagger {:responses {400 {:schema {:type "string"} - :description "kosh"}}} - :responses {200 {:body {:total s/Int}} - 500 {:description "fail"}} - :handler (fn [{{{:keys [z]} :path - xs :body} :parameters}] - {:status 200, :body {:total (+ (reduce + xs) z)}})}}]]] + ["/schema" {:coercion schema/coercion} + ["/plus/*z" + {:get {:summary "plus" + :parameters {:query {:x s/Int, :y s/Int} + :path {:z s/Int}} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body {:total s/Int}} + 500 {:description "fail"}} + :handler (fn [{{{:keys [x y]} :query + {:keys [z]} :path} :parameters}] + {:status 200, :body {:total (+ x y z)}})} + :post {:summary "plus with body" + :parameters {:body (s/maybe [s/Int]) + :path {:z s/Int}} + :swagger {:responses {400 {:schema {:type "string"} + :description "kosh"}}} + :responses {200 {:body {:total s/Int}} + 500 {:description "fail"}} + :handler (fn [{{{:keys [z]} :path + xs :body} :parameters}] + {:status 200, :body {:total (+ (reduce + xs) z)}})}}]]] - {:data {:middleware [swagger/swagger-feature - rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware]}}))) + {:data {:middleware [swagger/swagger-feature + rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware]}}))) (require '[fipp.edn]) (deftest swagger-test @@ -300,21 +300,21 @@ {:get {:no-doc true :handler (swagger/create-swagger-handler)}}] app (ring/ring-handler - (ring/router - [["/common" {:swagger {:id #{::one ::two}}} - ping-route] + (ring/router + [["/common" {:swagger {:id #{::one ::two}}} + ping-route] - ["/one" {:swagger {:id ::one}} - ping-route - spec-route] + ["/one" {:swagger {:id ::one}} + ping-route + spec-route] - ["/two" {:swagger {:id ::two}} - ping-route - spec-route - ["/deep" {:swagger {:id ::one}} - ping-route]] - ["/one-two" {:swagger {:id #{::one ::two}}} - spec-route]]))] + ["/two" {:swagger {:id ::two}} + ping-route + spec-route + ["/deep" {:swagger {:id ::one}} + ping-route]] + ["/one-two" {:swagger {:id #{::one ::two}}} + spec-route]]))] (is (= ["/common/ping" "/one/ping" "/two/deep/ping"] (spec-paths app "/one/swagger.json"))) (is (= ["/common/ping" "/two/ping"] @@ -324,8 +324,8 @@ (deftest swagger-ui-config-test (let [app (swagger-ui/create-swagger-ui-handler - {:path "/" - :config {:jsonEditor true}})] + {:path "/" + :config {:jsonEditor true}})] (is (= 302 (:status (app {:request-method :get, :uri "/"})))) (is (= 200 (:status (app {:request-method :get, :uri "/index.html"})))) (is (= {:jsonEditor true, :url "/swagger.json"} @@ -334,12 +334,12 @@ (deftest without-swagger-id-test (let [app (ring/ring-handler - (ring/router - [["/ping" - {:get (constantly "ping")}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]]))] + (ring/router + [["/ping" + {:get (constantly "ping")}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]]))] (is (= ["/ping"] (spec-paths app "/swagger.json"))) (is (= #{::swagger/default} (-> {:request-method :get :uri "/swagger.json"} @@ -347,14 +347,14 @@ (deftest with-options-endpoint-test (let [app (ring/ring-handler - (ring/router - [["/ping" - {:options (constantly "options")}] - ["/pong" - (constantly "options")] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]]))] + (ring/router + [["/ping" + {:options (constantly "options")}] + ["/pong" + (constantly "options")] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]]))] (is (= ["/ping" "/pong"] (spec-paths app "/swagger.json"))) (is (= #{::swagger/default} (-> {:request-method :get :uri "/swagger.json"} @@ -362,18 +362,18 @@ (deftest all-parameter-types-test (let [app (ring/ring-handler - (ring/router - [["/parameters" - {:post {:coercion spec/coercion - :parameters {:query {:q string?} - :body {:b string?} - :form {:f string?} - :header {:h string?} - :path {:p string?}} - :handler identity}}] - ["/swagger.json" - {:get {:no-doc true - :handler (swagger/create-swagger-handler)}}]])) + (ring/router + [["/parameters" + {:post {:coercion spec/coercion + :parameters {:query {:q string?} + :body {:b string?} + :form {:f string?} + :header {:h string?} + :path {:p string?}} + :handler identity}}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]])) spec (:body (app {:request-method :get, :uri "/swagger.json"}))] (is (= ["query" "body" "formData" "header" "path"] (map :in (get-in spec [:paths "/parameters" :post :parameters])))))) From bdcb1eb5b1a8b1f9202dd08be780cca719ec84ba Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 12 Feb 2022 22:35:27 +0200 Subject: [PATCH 074/113] clean-ns --- modules/reitit-core/src/reitit/coercion.cljc | 8 ++++-- modules/reitit-core/src/reitit/core.cljc | 7 +++-- .../reitit-core/src/reitit/dependency.cljc | 3 +- modules/reitit-core/src/reitit/exception.cljc | 3 +- modules/reitit-core/src/reitit/impl.cljc | 16 ++++++----- .../reitit-core/src/reitit/interceptor.cljc | 11 ++++---- .../reitit-core/src/reitit/middleware.cljc | 11 ++++---- modules/reitit-core/src/reitit/spec.cljc | 9 +++--- modules/reitit-core/src/reitit/trie.cljc | 10 ++++--- modules/reitit-dev/src/reitit/dev/pretty.cljc | 27 +++++++++--------- .../reitit-frontend/src/reitit/frontend.cljs | 12 ++++---- .../src/reitit/frontend/easy.cljs | 3 +- .../src/reitit/frontend/history.cljs | 10 ++++--- modules/reitit-http/src/reitit/http.cljc | 11 ++++---- .../reitit-http/src/reitit/http/coercion.cljc | 7 +++-- modules/reitit-http/src/reitit/http/spec.cljc | 11 ++++---- .../src/reitit/http/interceptors/dev.clj | 9 +++--- .../reitit/http/interceptors/exception.clj | 14 ++++++---- .../reitit/http/interceptors/multipart.clj | 14 ++++++---- .../src/reitit/http/interceptors/muuntaja.clj | 7 +++-- .../reitit/http/interceptors/parameters.clj | 3 +- .../src/reitit/coercion/malli.cljc | 19 +++++++------ .../reitit-malli/src/reitit/ring/malli.cljc | 3 +- .../src/reitit/ring/middleware/dev.clj | 9 +++--- .../src/reitit/ring/middleware/exception.clj | 14 ++++++---- .../src/reitit/ring/middleware/multipart.clj | 12 ++++---- .../src/reitit/ring/middleware/muuntaja.clj | 7 +++-- .../src/reitit/ring/middleware/parameters.clj | 3 +- .../reitit-pedestal/src/reitit/pedestal.clj | 16 ++++++----- modules/reitit-ring/src/reitit/ring.cljc | 15 +++++----- .../reitit-ring/src/reitit/ring/coercion.cljc | 7 +++-- modules/reitit-ring/src/reitit/ring/spec.cljc | 9 +++--- .../src/reitit/coercion/schema.cljc | 19 +++++++------ .../reitit-schema/src/reitit/ring/schema.cljc | 8 ++++-- .../src/reitit/interceptor/sieppari.clj | 7 +++-- .../reitit-spec/src/reitit/coercion/spec.cljc | 18 ++++++------ .../src/reitit/swagger_ui.cljc | 5 ++-- .../reitit-swagger/src/reitit/swagger.cljc | 15 +++++----- test/clj/cljdoc/reaper.clj | 7 +++-- .../http/interceptors/exception_test.clj | 20 +++++++------ .../http/interceptors/muuntaja_test.clj | 13 +++++---- .../http/interceptors/parameters_test.clj | 11 ++++---- test/clj/reitit/http_coercion_test.clj | 28 ++++++++++--------- test/clj/reitit/http_test.clj | 20 +++++++------ test/clj/reitit/pedestal_test.clj | 13 +++++---- .../reitit/ring/middleware/exception_test.clj | 22 ++++++++------- .../reitit/ring/middleware/muuntaja_test.clj | 11 ++++---- .../ring/middleware/parameters_test.clj | 9 +++--- test/cljc/reitit/coercion_test.cljc | 20 +++++++------ test/cljc/reitit/core_test.cljc | 12 ++++---- test/cljc/reitit/dependency_test.cljc | 8 ++++-- test/cljc/reitit/exception_test.cljc | 16 ++++++----- test/cljc/reitit/impl_test.cljc | 5 ++-- test/cljc/reitit/interceptor_test.cljc | 10 ++++--- test/cljc/reitit/middleware_test.cljc | 10 ++++--- test/cljc/reitit/ring_coercion_test.cljc | 26 +++++++++-------- test/cljc/reitit/ring_spec_test.cljc | 18 ++++++------ test/cljc/reitit/ring_test.cljc | 16 ++++++----- test/cljc/reitit/spec_test.cljc | 14 ++++++---- test/cljc/reitit/swagger_test.clj | 23 +++++++-------- test/cljc/reitit/trie_test.cljc | 5 ++-- 61 files changed, 407 insertions(+), 322 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 0fd5d234..6cbd6627 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -1,8 +1,10 @@ (ns reitit.coercion - (:require [clojure.walk :as walk] - [reitit.impl :as impl]) + (:require + [clojure.walk :as walk] + [reitit.impl :as impl]) #?(:clj - (:import (java.io Writer)))) + (:import + (java.io Writer)))) ;; ;; Protocol diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index ca605189..8457130f 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -1,7 +1,8 @@ (ns reitit.core - (:require [reitit.impl :as impl] - [reitit.exception :as exception] - [reitit.trie :as trie])) + (:require + [reitit.exception :as exception] + [reitit.impl :as impl] + [reitit.trie :as trie])) ;; ;; Expand diff --git a/modules/reitit-core/src/reitit/dependency.cljc b/modules/reitit-core/src/reitit/dependency.cljc index 6f1209eb..fc31f13a 100644 --- a/modules/reitit-core/src/reitit/dependency.cljc +++ b/modules/reitit-core/src/reitit/dependency.cljc @@ -1,6 +1,7 @@ (ns reitit.dependency "Dependency resolution for middleware/interceptors." - (:require [reitit.exception :as exception])) + (:require + [reitit.exception :as exception])) (defn- providers "Map from provision key to provider. `get-provides` should return the provision keys of a dependent." diff --git a/modules/reitit-core/src/reitit/exception.cljc b/modules/reitit-core/src/reitit/exception.cljc index df61b66a..0465551f 100644 --- a/modules/reitit-core/src/reitit/exception.cljc +++ b/modules/reitit-core/src/reitit/exception.cljc @@ -1,5 +1,6 @@ (ns reitit.exception - (:require [clojure.string :as str])) + (:require + [clojure.string :as str])) (defn fail! ([type] diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index a77bf146..d59ebf0a 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -1,13 +1,15 @@ (ns ^:no-doc reitit.impl #?(:cljs (:require-macros [reitit.impl])) - (:require [clojure.string :as str] - [clojure.set :as set] - [meta-merge.core :as mm] - [reitit.trie :as trie] - [reitit.exception :as ex]) + (:require + [clojure.set :as set] + [clojure.string :as str] + [meta-merge.core :as mm] + [reitit.exception :as ex] + [reitit.trie :as trie]) #?(:clj - (:import (java.util HashMap Map) - (java.net URLEncoder URLDecoder)))) + (:import + (java.net URLEncoder URLDecoder) + (java.util HashMap Map)))) (defn parse [path opts] (let [path #?(:clj (.intern ^String (trie/normalize path opts)) :cljs (trie/normalize path opts)) diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index f60f1a50..7c34ab3b 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -1,9 +1,10 @@ (ns reitit.interceptor - (:require [meta-merge.core :refer [meta-merge]] - [clojure.pprint :as pprint] - [reitit.core :as r] - [reitit.impl :as impl] - [reitit.exception :as exception])) + (:require + [clojure.pprint :as pprint] + [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as exception] + [reitit.impl :as impl])) (defprotocol IntoInterceptor (into-interceptor [this data opts])) diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index 686d1e88..53df1b14 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -1,9 +1,10 @@ (ns reitit.middleware - (:require [meta-merge.core :refer [meta-merge]] - [clojure.pprint :as pprint] - [reitit.core :as r] - [reitit.impl :as impl] - [reitit.exception :as exception])) + (:require + [clojure.pprint :as pprint] + [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as exception] + [reitit.impl :as impl])) (defprotocol IntoMiddleware (into-middleware [this data opts])) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index d2e4fa54..7a11a4ed 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -1,8 +1,9 @@ (ns reitit.spec - (:require [clojure.spec.alpha :as s] - [clojure.spec.gen.alpha :as gen] - [reitit.exception :as exception] - [reitit.core :as r])) + (:require + [clojure.spec.alpha :as s] + [clojure.spec.gen.alpha :as gen] + [reitit.core :as r] + [reitit.exception :as exception])) ;; ;; routes diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 1c6be0e3..8ea30bf7 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -1,9 +1,11 @@ (ns reitit.trie (:refer-clojure :exclude [compile]) - (:require [clojure.string :as str] - [reitit.exception :as ex]) - #?(:clj (:import [reitit Trie Trie$Match Trie$Matcher] - (java.net URLDecoder)))) + (:require + [clojure.string :as str] + [reitit.exception :as ex]) + #?(:clj (:import + (java.net URLDecoder) + [reitit Trie Trie$Match Trie$Matcher]))) (defn ^:no-doc into-set [x] (cond diff --git a/modules/reitit-dev/src/reitit/dev/pretty.cljc b/modules/reitit-dev/src/reitit/dev/pretty.cljc index 8226aa67..44bbf59e 100644 --- a/modules/reitit-dev/src/reitit/dev/pretty.cljc +++ b/modules/reitit-dev/src/reitit/dev/pretty.cljc @@ -1,18 +1,17 @@ (ns reitit.dev.pretty - (:require [clojure.string :as str] - [clojure.spec.alpha :as s] - [reitit.exception :as exception] - [arrangement.core] - ;; spell-spec - [spell-spec.expound] - ;; expound - [expound.ansi] - [expound.alpha] - ;; fipp - [fipp.visit] - [fipp.edn] - [fipp.ednize] - [fipp.engine])) + (:require + [arrangement.core] ;; spell-spec + [clojure.spec.alpha :as s] + [clojure.string :as str] + [expound.alpha] ;; fipp + [expound.ansi] + [fipp.edn] + [fipp.ednize] + [fipp.engine] + [fipp.visit] + [reitit.exception :as exception] + [spell-spec.expound] ;; expound +)) ;; ;; colors diff --git a/modules/reitit-frontend/src/reitit/frontend.cljs b/modules/reitit-frontend/src/reitit/frontend.cljs index 60273f79..27a66a90 100644 --- a/modules/reitit-frontend/src/reitit/frontend.cljs +++ b/modules/reitit-frontend/src/reitit/frontend.cljs @@ -1,9 +1,11 @@ (ns reitit.frontend - (:require [clojure.set :as set] - [reitit.coercion :as coercion] - [reitit.core :as r]) - (:import goog.Uri - goog.Uri.QueryData)) + (:require + [clojure.set :as set] + [reitit.coercion :as coercion] + [reitit.core :as r]) + (:import + goog.Uri + goog.Uri.QueryData)) (defn- query-param [^QueryData q k] (let [vs (.getValues q k)] diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index 8a76b900..d35ef40f 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -2,7 +2,8 @@ "Easy wrapper over reitit.frontend.history, handling the state. Only one router can be active at a time." - (:require [reitit.frontend.history :as rfh])) + (:require + [reitit.frontend.history :as rfh])) (defonce history (atom nil)) diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index f135d7bc..74337ec7 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -1,10 +1,12 @@ (ns reitit.frontend.history "Provides integration to hash-change or HTML5 History events." - (:require [reitit.core :as reitit] - [reitit.frontend :as rf] - [goog.events :as gevents]) - (:import goog.Uri)) + (:require + [goog.events :as gevents] + [reitit.core :as reitit] + [reitit.frontend :as rf]) + (:import + goog.Uri)) (defprotocol History (-init [this] "Create event listeners") diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index 4551a86e..5366b701 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -1,9 +1,10 @@ (ns reitit.http - (:require [meta-merge.core :refer [meta-merge]] - [reitit.interceptor :as interceptor] - [reitit.exception :as ex] - [reitit.ring :as ring] - [reitit.core :as r])) + (:require + [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as ex] + [reitit.interceptor :as interceptor] + [reitit.ring :as ring])) (defrecord Endpoint [data interceptors queue handler path method]) diff --git a/modules/reitit-http/src/reitit/http/coercion.cljc b/modules/reitit-http/src/reitit/http/coercion.cljc index 30af60db..d2075045 100644 --- a/modules/reitit-http/src/reitit/http/coercion.cljc +++ b/modules/reitit-http/src/reitit/http/coercion.cljc @@ -1,7 +1,8 @@ (ns reitit.http.coercion - (:require [reitit.coercion :as coercion] - [reitit.spec :as rs] - [reitit.impl :as impl])) + (:require + [reitit.coercion :as coercion] + [reitit.impl :as impl] + [reitit.spec :as rs])) (defn coerce-request-interceptor "Interceptor for pluggable request coercion. diff --git a/modules/reitit-http/src/reitit/http/spec.cljc b/modules/reitit-http/src/reitit/http/spec.cljc index e4913abb..3ee5f819 100644 --- a/modules/reitit-http/src/reitit/http/spec.cljc +++ b/modules/reitit-http/src/reitit/http/spec.cljc @@ -1,9 +1,10 @@ (ns reitit.http.spec - (:require [clojure.spec.alpha :as s] - [reitit.ring.spec :as rrs] - [reitit.interceptor :as interceptor] - [reitit.exception :as exception] - [reitit.spec :as rs])) + (:require + [clojure.spec.alpha :as s] + [reitit.exception :as exception] + [reitit.interceptor :as interceptor] + [reitit.ring.spec :as rrs] + [reitit.spec :as rs])) ;; ;; Specs diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj index 896f99fc..f36c8298 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj @@ -1,8 +1,9 @@ (ns reitit.http.interceptors.dev - (:require [lambdaisland.deep-diff :as ddiff] - [lambdaisland.deep-diff.printer :as printer] - [puget.color :as color] - [reitit.core :as r])) + (:require + [lambdaisland.deep-diff :as ddiff] + [lambdaisland.deep-diff.printer :as printer] + [puget.color :as color] + [reitit.core :as r])) (def printer (-> (printer/puget-printer) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj index 9bb81029..c2e2efbe 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj @@ -1,10 +1,12 @@ (ns reitit.http.interceptors.exception - (:require [reitit.coercion :as coercion] - [reitit.ring :as ring] - [clojure.spec.alpha :as s] - [clojure.string :as str]) - (:import (java.time Instant) - (java.io PrintWriter Writer))) + (:require + [clojure.spec.alpha :as s] + [clojure.string :as str] + [reitit.coercion :as coercion] + [reitit.ring :as ring]) + (:import + (java.io PrintWriter Writer) + (java.time Instant))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj index 8719181f..5c38a8d2 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj @@ -1,10 +1,12 @@ (ns reitit.http.interceptors.multipart - (:require [reitit.coercion :as coercion] - [reitit.spec] - [ring.middleware.multipart-params :as multipart-params] - [clojure.spec.alpha :as s] - [spec-tools.core :as st]) - (:import (java.io File))) + (:require + [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [reitit.spec] + [ring.middleware.multipart-params :as multipart-params] + [spec-tools.core :as st]) + (:import + (java.io File))) (s/def ::filename string?) (s/def ::content-type string?) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj index 1521b3b9..7ddda390 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj @@ -1,7 +1,8 @@ (ns reitit.http.interceptors.muuntaja - (:require [muuntaja.core :as m] - [muuntaja.interceptor] - [clojure.spec.alpha :as s])) + (:require + [clojure.spec.alpha :as s] + [muuntaja.core :as m] + [muuntaja.interceptor])) (s/def ::muuntaja m/muuntaja?) (s/def ::spec (s/keys :opt-un [::muuntaja])) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj index 5731744e..91a7c98b 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj @@ -1,5 +1,6 @@ (ns reitit.http.interceptors.parameters - (:require [ring.middleware.params :as params])) + (:require + [ring.middleware.params :as params])) (defn parameters-interceptor "Interceptor to parse urlencoded parameters from the query string and form diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 2f87a610..9d56665e 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -1,13 +1,14 @@ (ns reitit.coercion.malli - (:require [reitit.coercion :as coercion] - [malli.transform :as mt] - [malli.edn :as edn] - [malli.error :as me] - [malli.util :as mu] - [malli.swagger :as swagger] - [malli.core :as m] - [clojure.set :as set] - [clojure.walk :as walk])) + (:require + [clojure.set :as set] + [clojure.walk :as walk] + [malli.core :as m] + [malli.edn :as edn] + [malli.error :as me] + [malli.swagger :as swagger] + [malli.transform :as mt] + [malli.util :as mu] + [reitit.coercion :as coercion])) ;; ;; coercion diff --git a/modules/reitit-malli/src/reitit/ring/malli.cljc b/modules/reitit-malli/src/reitit/ring/malli.cljc index a7987625..dfd5ea8e 100644 --- a/modules/reitit-malli/src/reitit/ring/malli.cljc +++ b/modules/reitit-malli/src/reitit/ring/malli.cljc @@ -1,5 +1,6 @@ (ns reitit.ring.malli - #?(:clj (:import (java.io File)))) + #?(:clj (:import + (java.io File)))) #?(:clj (def temp-file-part diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj index 587416ff..907cd680 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj @@ -1,8 +1,9 @@ (ns reitit.ring.middleware.dev - (:require [lambdaisland.deep-diff :as ddiff] - [lambdaisland.deep-diff.printer :as printer] - [puget.color :as color] - [reitit.core :as r])) + (:require + [lambdaisland.deep-diff :as ddiff] + [lambdaisland.deep-diff.printer :as printer] + [puget.color :as color] + [reitit.core :as r])) (def printer (-> (printer/puget-printer) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 46f6628f..89e99e20 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -1,10 +1,12 @@ (ns reitit.ring.middleware.exception - (:require [reitit.coercion :as coercion] - [reitit.ring :as ring] - [clojure.spec.alpha :as s] - [clojure.string :as str]) - (:import (java.time Instant) - (java.io Writer PrintWriter))) + (:require + [clojure.spec.alpha :as s] + [clojure.string :as str] + [reitit.coercion :as coercion] + [reitit.ring :as ring]) + (:import + (java.io Writer PrintWriter) + (java.time Instant))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index 829ae0e9..8f353cae 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -1,10 +1,12 @@ (ns reitit.ring.middleware.multipart (:refer-clojure :exclude [compile]) - (:require [reitit.coercion :as coercion] - [ring.middleware.multipart-params :as multipart-params] - [clojure.spec.alpha :as s] - [spec-tools.core :as st]) - (:import (java.io File))) + (:require + [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [ring.middleware.multipart-params :as multipart-params] + [spec-tools.core :as st]) + (:import + (java.io File))) (s/def ::filename string?) (s/def ::content-type string?) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 5cc9e0bf..9b1f1f34 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -1,7 +1,8 @@ (ns reitit.ring.middleware.muuntaja - (:require [muuntaja.core :as m] - [muuntaja.middleware] - [clojure.spec.alpha :as s])) + (:require + [clojure.spec.alpha :as s] + [muuntaja.core :as m] + [muuntaja.middleware])) (s/def ::muuntaja m/muuntaja?) (s/def ::spec (s/keys :opt-un [::muuntaja])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj b/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj index ec0a334b..e93b8a09 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj @@ -1,5 +1,6 @@ (ns reitit.ring.middleware.parameters - (:require [ring.middleware.params :as params])) + (:require + [ring.middleware.params :as params])) (def parameters-middleware "Middleware to parse urlencoded parameters from the query string and form diff --git a/modules/reitit-pedestal/src/reitit/pedestal.clj b/modules/reitit-pedestal/src/reitit/pedestal.clj index 98da41b5..5c33546d 100644 --- a/modules/reitit-pedestal/src/reitit/pedestal.clj +++ b/modules/reitit-pedestal/src/reitit/pedestal.clj @@ -1,11 +1,13 @@ (ns reitit.pedestal - (:require [io.pedestal.interceptor.chain :as chain] - [io.pedestal.interceptor :as interceptor] - [io.pedestal.http :as http] - [reitit.interceptor] - [reitit.http]) - (:import (reitit.interceptor Executor) - (java.lang.reflect Method))) + (:require + [io.pedestal.http :as http] + [io.pedestal.interceptor :as interceptor] + [io.pedestal.interceptor.chain :as chain] + [reitit.http] + [reitit.interceptor]) + (:import + (java.lang.reflect Method) + (reitit.interceptor Executor))) ;; TODO: variadic (defn- arities [f] diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 7ed01db3..6137cb51 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -1,12 +1,13 @@ (ns reitit.ring - (:require [meta-merge.core :refer [meta-merge]] - [reitit.middleware :as middleware] - [reitit.exception :as ex] - [reitit.core :as r] - [reitit.impl :as impl] - #?@(:clj [[ring.util.mime-type :as mime-type] + (:require + [clojure.string :as str] + [meta-merge.core :refer [meta-merge]] + #?@(:clj [[ring.util.mime-type :as mime-type] [ring.util.response :as response]]) - [clojure.string :as str])) + [reitit.core :as r] + [reitit.exception :as ex] + [reitit.impl :as impl] + [reitit.middleware :as middleware])) (declare get-match) (declare get-router) diff --git a/modules/reitit-ring/src/reitit/ring/coercion.cljc b/modules/reitit-ring/src/reitit/ring/coercion.cljc index 6b282054..6262f4f9 100644 --- a/modules/reitit-ring/src/reitit/ring/coercion.cljc +++ b/modules/reitit-ring/src/reitit/ring/coercion.cljc @@ -1,7 +1,8 @@ (ns reitit.ring.coercion - (:require [reitit.coercion :as coercion] - [reitit.spec :as rs] - [reitit.impl :as impl])) + (:require + [reitit.coercion :as coercion] + [reitit.impl :as impl] + [reitit.spec :as rs])) (defn handle-coercion-exception [e respond raise] (let [data (ex-data e)] diff --git a/modules/reitit-ring/src/reitit/ring/spec.cljc b/modules/reitit-ring/src/reitit/ring/spec.cljc index 3e1e0cdb..63d98119 100644 --- a/modules/reitit-ring/src/reitit/ring/spec.cljc +++ b/modules/reitit-ring/src/reitit/ring/spec.cljc @@ -1,8 +1,9 @@ (ns reitit.ring.spec - (:require [clojure.spec.alpha :as s] - [reitit.middleware :as middleware] - [reitit.spec :as rs] - [reitit.exception :as exception])) + (:require + [clojure.spec.alpha :as s] + [reitit.exception :as exception] + [reitit.middleware :as middleware] + [reitit.spec :as rs])) ;; ;; Specs diff --git a/modules/reitit-schema/src/reitit/coercion/schema.cljc b/modules/reitit-schema/src/reitit/coercion/schema.cljc index 1288a2c7..6ec9e60b 100644 --- a/modules/reitit-schema/src/reitit/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/coercion/schema.cljc @@ -1,13 +1,14 @@ (ns reitit.coercion.schema - (:require [clojure.walk :as walk] - [schema.core :as s] - [schema-tools.core :as st] - [schema.coerce :as sc] - [schema.utils :as su] - [schema-tools.coerce :as stc] - [schema-tools.swagger.core :as swagger] - [reitit.coercion :as coercion] - [clojure.set :as set])) + (:require + [clojure.set :as set] + [clojure.walk :as walk] + [reitit.coercion :as coercion] + [schema-tools.coerce :as stc] + [schema-tools.core :as st] + [schema-tools.swagger.core :as swagger] + [schema.coerce :as sc] + [schema.core :as s] + [schema.utils :as su])) (def string-coercion-matcher stc/string-coercion-matcher) diff --git a/modules/reitit-schema/src/reitit/ring/schema.cljc b/modules/reitit-schema/src/reitit/ring/schema.cljc index c4f400ab..96829af3 100644 --- a/modules/reitit-schema/src/reitit/ring/schema.cljc +++ b/modules/reitit-schema/src/reitit/ring/schema.cljc @@ -1,7 +1,9 @@ (ns reitit.ring.schema - (:require [schema.core :as s] - [schema-tools.swagger.core :as swagger]) - #?(:clj (:import (java.io File)))) + (:require + [schema-tools.swagger.core :as swagger] + [schema.core :as s]) + #?(:clj (:import + (java.io File)))) (defrecord Upload [m] s/Schema diff --git a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj index 6ef8fdc3..336a9cfa 100644 --- a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj +++ b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj @@ -1,7 +1,8 @@ (ns reitit.interceptor.sieppari - (:require [reitit.interceptor :as interceptor] - [sieppari.queue :as queue] - [sieppari.core :as sieppari])) + (:require + [reitit.interceptor :as interceptor] + [sieppari.core :as sieppari] + [sieppari.queue :as queue])) (def executor (reify diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index a1d7070f..12c88310 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -1,13 +1,15 @@ (ns reitit.coercion.spec - (:require [clojure.spec.alpha :as s] - [spec-tools.core :as st #?@(:cljs [:refer [Spec]])] - [spec-tools.data-spec :as ds #?@(:cljs [:refer [Maybe]])] - [spec-tools.swagger.core :as swagger] - [reitit.coercion :as coercion] - [clojure.set :as set]) + (:require + [clojure.set :as set] + [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [spec-tools.core :as st #?@(:cljs [:refer [Spec]])] + [spec-tools.data-spec :as ds #?@(:cljs [:refer [Maybe]])] + [spec-tools.swagger.core :as swagger]) #?(:clj - (:import (spec_tools.core Spec) - (spec_tools.data_spec Maybe)))) + (:import + (spec_tools.core Spec) + (spec_tools.data_spec Maybe)))) (def string-transformer (st/type-transformer diff --git a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc index cdd66b37..60d3d2af 100644 --- a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc +++ b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc @@ -1,6 +1,7 @@ (ns reitit.swagger-ui - #?(:clj (:require [reitit.ring :as ring] - [jsonista.core :as j]))) + #?(:clj (:require + [jsonista.core :as j] + [reitit.ring :as ring]))) #?(:clj (defn create-swagger-ui-handler diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index 300f0a20..951d3b80 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -1,11 +1,12 @@ (ns reitit.swagger - (:require [reitit.core :as r] - [meta-merge.core :refer [meta-merge]] - [clojure.spec.alpha :as s] - [clojure.set :as set] - [clojure.string :as str] - [reitit.coercion :as coercion] - [reitit.trie :as trie])) + (:require + [clojure.set :as set] + [clojure.spec.alpha :as s] + [clojure.string :as str] + [meta-merge.core :refer [meta-merge]] + [reitit.coercion :as coercion] + [reitit.core :as r] + [reitit.trie :as trie])) (s/def ::id (s/or :keyword keyword? :set (s/coll-of keyword? :into #{}))) (s/def ::no-doc boolean?) diff --git a/test/clj/cljdoc/reaper.clj b/test/clj/cljdoc/reaper.clj index bce3e68c..58887b83 100644 --- a/test/clj/cljdoc/reaper.clj +++ b/test/clj/cljdoc/reaper.clj @@ -1,7 +1,8 @@ (ns cljdoc.reaper - (:require [clojure.java.io :as io] - [clojure.pprint :as pprint] - [clojure.string :as str])) + (:require + [clojure.java.io :as io] + [clojure.pprint :as pprint] + [clojure.string :as str])) (defn reap! [] (let [docs (->> (for [line (-> (io/file "./doc/SUMMARY.md") (slurp) (str/split #"\n")) diff --git a/test/clj/reitit/http/interceptors/exception_test.clj b/test/clj/reitit/http/interceptors/exception_test.clj index c0849022..275ffd6f 100644 --- a/test/clj/reitit/http/interceptors/exception_test.clj +++ b/test/clj/reitit/http/interceptors/exception_test.clj @@ -1,13 +1,15 @@ (ns reitit.http.interceptors.exception-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.ring :as ring] - [reitit.http :as http] - [reitit.http.interceptors.exception :as exception] - [reitit.interceptor.sieppari :as sieppari] - [reitit.coercion.spec] - [reitit.http.coercion] - [muuntaja.core :as m]) - (:import (java.sql SQLException SQLWarning))) + (:require + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion.spec] + [reitit.http :as http] + [reitit.http.coercion] + [reitit.http.interceptors.exception :as exception] + [reitit.interceptor.sieppari :as sieppari] + [reitit.ring :as ring]) + (:import + (java.sql SQLException SQLWarning))) (derive ::kikka ::kukka) diff --git a/test/clj/reitit/http/interceptors/muuntaja_test.clj b/test/clj/reitit/http/interceptors/muuntaja_test.clj index fbc94058..9cb5c030 100644 --- a/test/clj/reitit/http/interceptors/muuntaja_test.clj +++ b/test/clj/reitit/http/interceptors/muuntaja_test.clj @@ -1,10 +1,11 @@ (ns reitit.http.interceptors.muuntaja-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.http :as http] - [reitit.http.interceptors.muuntaja :as muuntaja] - [reitit.swagger :as swagger] - [reitit.interceptor.sieppari :as sieppari] - [muuntaja.core :as m])) + (:require + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.http :as http] + [reitit.http.interceptors.muuntaja :as muuntaja] + [reitit.interceptor.sieppari :as sieppari] + [reitit.swagger :as swagger])) (deftest muuntaja-test (let [data {:kikka "kukka"} diff --git a/test/clj/reitit/http/interceptors/parameters_test.clj b/test/clj/reitit/http/interceptors/parameters_test.clj index d09951bc..4703d15b 100644 --- a/test/clj/reitit/http/interceptors/parameters_test.clj +++ b/test/clj/reitit/http/interceptors/parameters_test.clj @@ -1,9 +1,10 @@ (ns reitit.http.interceptors.parameters-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.http.interceptors.parameters :as parameters] - [reitit.http :as http] - [reitit.interceptor.sieppari :as sieppari] - [reitit.swagger :as swagger])) + (:require + [clojure.test :refer [deftest is testing]] + [reitit.http :as http] + [reitit.http.interceptors.parameters :as parameters] + [reitit.interceptor.sieppari :as sieppari] + [reitit.swagger :as swagger])) (deftest parameters-test (let [app (http/ring-handler diff --git a/test/clj/reitit/http_coercion_test.clj b/test/clj/reitit/http_coercion_test.clj index 4f4bc0d1..76e16a36 100644 --- a/test/clj/reitit/http_coercion_test.clj +++ b/test/clj/reitit/http_coercion_test.clj @@ -1,17 +1,19 @@ (ns reitit.http-coercion-test - (:require [clojure.test :refer [deftest testing is]] - [schema.core :as s] - [reitit.http :as http] - [reitit.http.coercion :as rrc] - [reitit.coercion.spec :as spec] - [reitit.coercion.schema :as schema] - [muuntaja.interceptor] - [jsonista.core :as j] - [reitit.interceptor.sieppari :as sieppari] - [reitit.coercion.malli :as malli] - [reitit.core :as r]) - (:import (clojure.lang ExceptionInfo) - (java.io ByteArrayInputStream))) + (:require + [clojure.test :refer [deftest is testing]] + [jsonista.core :as j] + [muuntaja.interceptor] + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.core :as r] + [reitit.http :as http] + [reitit.http.coercion :as rrc] + [reitit.interceptor.sieppari :as sieppari] + [schema.core :as s]) + (:import + (clojure.lang ExceptionInfo) + (java.io ByteArrayInputStream))) (defn mounted-interceptor [app path method] (->> app diff --git a/test/clj/reitit/http_test.clj b/test/clj/reitit/http_test.clj index a9143837..7dc79f89 100644 --- a/test/clj/reitit/http_test.clj +++ b/test/clj/reitit/http_test.clj @@ -1,14 +1,16 @@ (ns reitit.http-test "just Clojure before Sieppari is ported into cljs" - (:require [clojure.test :refer [deftest testing is]] - [clojure.set :as set] - [reitit.interceptor :as interceptor] - [reitit.interceptor.sieppari :as sieppari] - [reitit.http :as http] - [reitit.ring :as ring] - [reitit.core :as r] - [clojure.core.async :as a]) - (:import (clojure.lang ExceptionInfo))) + (:require + [clojure.core.async :as a] + [clojure.set :as set] + [clojure.test :refer [deftest is testing]] + [reitit.core :as r] + [reitit.http :as http] + [reitit.interceptor :as interceptor] + [reitit.interceptor.sieppari :as sieppari] + [reitit.ring :as ring]) + (:import + (clojure.lang ExceptionInfo))) (defn interceptor [name] {:enter (fn [ctx] (update-in ctx [:request ::i] (fnil conj []) name))}) diff --git a/test/clj/reitit/pedestal_test.clj b/test/clj/reitit/pedestal_test.clj index 32a7446d..a6678ec4 100644 --- a/test/clj/reitit/pedestal_test.clj +++ b/test/clj/reitit/pedestal_test.clj @@ -1,10 +1,11 @@ (ns reitit.pedestal-test - (:require [clojure.test :refer [deftest testing is]] - [io.pedestal.test] - [io.pedestal.http] - [reitit.http :as http] - [reitit.pedestal :as pedestal] - [reitit.http.interceptors.exception :as exception])) + (:require + [clojure.test :refer [deftest is testing]] + [io.pedestal.http] + [io.pedestal.test] + [reitit.http :as http] + [reitit.http.interceptors.exception :as exception] + [reitit.pedestal :as pedestal])) (deftest arities-test (is (= #{0} (#'pedestal/arities (fn [])))) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 479311f5..6fdd9224 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -1,14 +1,16 @@ (ns reitit.ring.middleware.exception-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.ring :as ring] - [reitit.ring.middleware.exception :as exception] - [reitit.coercion :as coercion] - [clojure.spec.alpha :as s] - [reitit.coercion.spec] - [reitit.ring.coercion] - [muuntaja.core :as m] - [ring.util.http-response :as http-response]) - (:import (java.sql SQLException SQLWarning))) + (:require + [clojure.spec.alpha :as s] + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion :as coercion] + [reitit.coercion.spec] + [reitit.ring :as ring] + [reitit.ring.coercion] + [reitit.ring.middleware.exception :as exception] + [ring.util.http-response :as http-response]) + (:import + (java.sql SQLException SQLWarning))) (derive ::kikka ::kukka) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index c23ebbe3..c714940c 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -1,9 +1,10 @@ (ns reitit.ring.middleware.muuntaja-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.ring :as ring] - [reitit.ring.middleware.muuntaja :as muuntaja] - [reitit.swagger :as swagger] - [muuntaja.core :as m])) + (:require + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.ring :as ring] + [reitit.ring.middleware.muuntaja :as muuntaja] + [reitit.swagger :as swagger])) (deftest muuntaja-test (let [data {:kikka "kukka"} diff --git a/test/clj/reitit/ring/middleware/parameters_test.clj b/test/clj/reitit/ring/middleware/parameters_test.clj index b7318e35..dc15c253 100644 --- a/test/clj/reitit/ring/middleware/parameters_test.clj +++ b/test/clj/reitit/ring/middleware/parameters_test.clj @@ -1,8 +1,9 @@ (ns reitit.ring.middleware.parameters-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.ring.middleware.parameters :as parameters] - [reitit.ring :as ring] - [reitit.swagger :as swagger])) + (:require + [clojure.test :refer [deftest is testing]] + [reitit.ring :as ring] + [reitit.ring.middleware.parameters :as parameters] + [reitit.swagger :as swagger])) (deftest parameters-test (let [app (ring/ring-handler diff --git a/test/cljc/reitit/coercion_test.cljc b/test/cljc/reitit/coercion_test.cljc index 2e896cd1..ffd86be5 100644 --- a/test/cljc/reitit/coercion_test.cljc +++ b/test/cljc/reitit/coercion_test.cljc @@ -1,14 +1,16 @@ (ns reitit.coercion-test - (:require [clojure.test :refer [deftest testing is]] - [schema.core :as s] - [spec-tools.data-spec :as ds] - [reitit.core :as r] - [reitit.coercion :as coercion] - [reitit.coercion.spec] - [reitit.coercion.malli] - [reitit.coercion.schema]) + (:require + [clojure.test :refer [deftest is testing]] + [reitit.coercion :as coercion] + [reitit.coercion.malli] + [reitit.coercion.schema] + [reitit.coercion.spec] + [reitit.core :as r] + [schema.core :as s] + [spec-tools.data-spec :as ds]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (deftest coercion-test (let [r (r/router diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 394b864d..8186184b 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -1,10 +1,12 @@ (ns reitit.core-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.core :as r #?@(:cljs [:refer [Router]])] - [reitit.impl :as impl]) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.core :as r #?@(:cljs [:refer [Router]])] + [reitit.impl :as impl]) #?(:clj - (:import (reitit.core Router) - (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo) + (reitit.core Router)))) (deftest reitit-test diff --git a/test/cljc/reitit/dependency_test.cljc b/test/cljc/reitit/dependency_test.cljc index 85ee206c..8795c3ad 100644 --- a/test/cljc/reitit/dependency_test.cljc +++ b/test/cljc/reitit/dependency_test.cljc @@ -1,7 +1,9 @@ (ns reitit.dependency-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.dependency :as rc]) - #?(:clj (:import [clojure.lang ExceptionInfo]))) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.dependency :as rc]) + #?(:clj (:import + [clojure.lang ExceptionInfo]))) (deftest post-order-test (let [base-middlewares [{:name ::bar, :provides #{:bar}, :requires #{:foo}, :wrap identity} diff --git a/test/cljc/reitit/exception_test.cljc b/test/cljc/reitit/exception_test.cljc index 205a42fb..c73bf1ea 100644 --- a/test/cljc/reitit/exception_test.cljc +++ b/test/cljc/reitit/exception_test.cljc @@ -1,12 +1,14 @@ (ns reitit.exception-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.spec :as rs] - [reitit.core :as r] - [reitit.dev.pretty :as pretty] - [clojure.spec.alpha :as s] - [reitit.exception :as exception]) + (:require + [clojure.spec.alpha :as s] + [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.dev.pretty :as pretty] + [reitit.exception :as exception] + [reitit.spec :as rs]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (s/def ::role #{:admin :manager}) (s/def ::roles (s/coll-of ::role :into #{})) diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 1b2165c5..b6a4c204 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -1,6 +1,7 @@ (ns reitit.impl-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.impl :as impl])) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.impl :as impl])) (deftest strip-nils-test (is (= {:a 1, :c false} (impl/strip-nils {:a 1, :b nil, :c false})))) diff --git a/test/cljc/reitit/interceptor_test.cljc b/test/cljc/reitit/interceptor_test.cljc index 3190d230..e4f510ba 100644 --- a/test/cljc/reitit/interceptor_test.cljc +++ b/test/cljc/reitit/interceptor_test.cljc @@ -1,9 +1,11 @@ (ns reitit.interceptor-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.interceptor :as interceptor] - [reitit.core :as r]) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.interceptor :as interceptor]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (def ctx (interceptor/context [])) diff --git a/test/cljc/reitit/middleware_test.cljc b/test/cljc/reitit/middleware_test.cljc index d3fb8053..df508b5f 100644 --- a/test/cljc/reitit/middleware_test.cljc +++ b/test/cljc/reitit/middleware_test.cljc @@ -1,9 +1,11 @@ (ns reitit.middleware-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.middleware :as middleware] - [reitit.core :as r]) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.middleware :as middleware]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (def request []) diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index 888cdb31..0b485825 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -1,18 +1,20 @@ (ns reitit.ring-coercion-test - (:require [clojure.test :refer [deftest testing is]] - [schema.core :as s] - [spec-tools.data-spec :as ds] - [reitit.ring :as ring] - [reitit.ring.coercion :as rrc] - [reitit.coercion.spec :as spec] - [reitit.coercion.malli :as malli] - [reitit.coercion.schema :as schema] - #?@(:clj [[muuntaja.middleware] + (:require + [clojure.test :refer [deftest is testing]] + #?@(:clj [[muuntaja.middleware] [jsonista.core :as j]]) - [reitit.core :as r]) + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.core :as r] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [schema.core :as s] + [spec-tools.data-spec :as ds]) #?(:clj - (:import (clojure.lang ExceptionInfo) - (java.io ByteArrayInputStream)))) + (:import + (clojure.lang ExceptionInfo) + (java.io ByteArrayInputStream)))) (defn mounted-middleware [app path method] (->> app diff --git a/test/cljc/reitit/ring_spec_test.cljc b/test/cljc/reitit/ring_spec_test.cljc index 57a6c0de..4822401b 100644 --- a/test/cljc/reitit/ring_spec_test.cljc +++ b/test/cljc/reitit/ring_spec_test.cljc @@ -1,13 +1,15 @@ (ns reitit.ring-spec-test - (:require [clojure.test :refer [deftest testing is]] - [reitit.ring :as ring] - [reitit.ring.spec :as rrs] - [reitit.ring.coercion :as rrc] - [reitit.coercion.spec] - [clojure.spec.alpha :as s] - [reitit.core :as r]) + (:require + [clojure.spec.alpha :as s] + [clojure.test :refer [deftest is testing]] + [reitit.coercion.spec] + [reitit.core :as r] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [reitit.ring.spec :as rrs]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (s/def ::role #{:admin :user}) (s/def ::roles (s/and (s/coll-of ::role :into #{}) set?)) diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 4e069a1b..5bf05d52 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -1,12 +1,14 @@ (ns reitit.ring-test - (:require [clojure.test :refer [deftest testing is]] - [clojure.set :as set] - [reitit.middleware :as middleware] - [reitit.ring :as ring] - [reitit.core :as r] - [reitit.trie :as trie]) + (:require + [clojure.set :as set] + [clojure.test :refer [deftest is testing]] + [reitit.core :as r] + [reitit.middleware :as middleware] + [reitit.ring :as ring] + [reitit.trie :as trie]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (defn mw [handler name] (fn diff --git a/test/cljc/reitit/spec_test.cljc b/test/cljc/reitit/spec_test.cljc index 11b72560..55d84fc0 100644 --- a/test/cljc/reitit/spec_test.cljc +++ b/test/cljc/reitit/spec_test.cljc @@ -1,11 +1,13 @@ (ns reitit.spec-test - (:require [clojure.test :refer [deftest testing is are use-fixtures]] - [#?(:clj clojure.spec.test.alpha :cljs cljs.spec.test.alpha) :as stest] - [clojure.spec.alpha :as s] - [reitit.core :as r] - [reitit.spec :as rs]) + (:require + [#?(:clj clojure.spec.test.alpha :cljs cljs.spec.test.alpha) :as stest] + [clojure.spec.alpha :as s] + [clojure.test :refer [are deftest is testing use-fixtures]] + [reitit.core :as r] + [reitit.spec :as rs]) #?(:clj - (:import (clojure.lang ExceptionInfo)))) + (:import + (clojure.lang ExceptionInfo)))) (defn instrument-all [f] (try diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index cb9a8d07..4110b190 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -1,15 +1,16 @@ (ns reitit.swagger-test - (:require [clojure.test :refer [deftest is testing]] - [reitit.ring :as ring] - [reitit.swagger :as swagger] - [reitit.swagger-ui :as swagger-ui] - [reitit.ring.coercion :as rrc] - [reitit.coercion.spec :as spec] - [reitit.coercion.malli :as malli] - [reitit.coercion.schema :as schema] - [muuntaja.core :as m] - [spec-tools.data-spec :as ds] - [schema.core :as s])) + (:require + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [reitit.swagger :as swagger] + [reitit.swagger-ui :as swagger-ui] + [schema.core :as s] + [spec-tools.data-spec :as ds])) (def app (ring/ring-handler diff --git a/test/cljc/reitit/trie_test.cljc b/test/cljc/reitit/trie_test.cljc index 983d52d0..1828b12b 100644 --- a/test/cljc/reitit/trie_test.cljc +++ b/test/cljc/reitit/trie_test.cljc @@ -1,6 +1,7 @@ (ns reitit.trie-test - (:require [clojure.test :refer [deftest testing is are]] - [reitit.trie :as trie])) + (:require + [clojure.test :refer [are deftest is testing]] + [reitit.trie :as trie])) (deftest into-set-test (is (= #{} (trie/into-set nil))) From 060e59341402ad37b2c48022c5803bf47f31cf4d Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 12 Feb 2022 22:42:10 +0200 Subject: [PATCH 075/113] dev guide --- .lsp/config.edn | 2 ++ doc/development.md | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 .lsp/config.edn diff --git a/.lsp/config.edn b/.lsp/config.edn new file mode 100644 index 00000000..bfbe9181 --- /dev/null +++ b/.lsp/config.edn @@ -0,0 +1,2 @@ +{:cljfmt {:indents {for-all [[:inner 0]] + are [[:inner 0]]}}} \ No newline at end of file diff --git a/doc/development.md b/doc/development.md index 46109017..b0721609 100644 --- a/doc/development.md +++ b/doc/development.md @@ -13,6 +13,13 @@ ./scripts/test.sh cljs ``` +## Formatting + +```bash +clojure-lsp format +clojure-lsp clean-ns +``` + ## Documentation The documentation lives under `doc` and it is hosted on [cljdoc](https://cljdoc.org). See their From d0f712649176fdef3e1369aca6fa593183c68440 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 13 Feb 2022 19:29:19 +0200 Subject: [PATCH 076/113] add support for malli-lite --- CHANGELOG.md | 12 + doc/coercion/malli_coercion.md | 20 ++ .../src/reitit/coercion/malli.cljc | 9 +- project.clj | 2 +- test/cljc/reitit/coercion_test.cljc | 21 +- test/cljc/reitit/ring_coercion_test.cljc | 285 ++++++++++-------- 6 files changed, 226 insertions(+), 123 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d4aeca3..66bf9794 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,18 @@ We use [Break Versioning][breakver]. The version numbers follow a `. ExceptionInfo Request coercion failed... ``` +## Lite Syntax + +Same using [Lite Syntax](https://github.com/metosin/malli#lite): + +```clj +(def router + (r/router + ["/:company/users/:user-id" {:name ::user-view + :coercion reitit.coercion.malli/coercion + :parameters {:path {:company string? + :user-id int?}}}] + {:compile coercion/compile-request-coercers})) +``` + ## Configuring coercion Using `create` with options to create the coercion instead of `coercion`: @@ -58,6 +76,8 @@ Using `create` with options to create the coercion instead of `coercion`: :response {:default reitit.coercion.malli/default-transformer-provider}} ;; set of keys to include in error messages :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} + ;; support lite syntax? + :lite true ;; schema identity function (default: close all map schemas) :compile mu/closed-schema ;; validate request & response diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 9d56665e..20d97fa2 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -3,6 +3,7 @@ [clojure.set :as set] [clojure.walk :as walk] [malli.core :as m] + [malli.experimental.lite :as l] [malli.edn :as edn] [malli.error :as me] [malli.swagger :as swagger] @@ -115,6 +116,8 @@ :formats {"application/json" json-transformer-provider}}} ;; set of keys to include in error messages :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} + ;; support lite syntax? + :lite true ;; schema identity function (default: close all map schemas) :compile mu/closed-schema ;; validate request & response @@ -134,9 +137,11 @@ ([] (create nil)) ([opts] - (let [{:keys [transformers compile options error-keys encode-error] :as opts} (merge default-options opts) + (let [{:keys [transformers lite compile options error-keys encode-error] :as opts} (merge default-options opts) show? (fn [key] (contains? error-keys key)) - transformers (walk/prewalk #(if (satisfies? TransformationProvider %) (-transformer % opts) %) transformers)] + transformers (walk/prewalk #(if (satisfies? TransformationProvider %) (-transformer % opts) %) transformers) + compile (if lite (fn [schema options] (compile (binding [l/*options* options] (l/schema schema)) options)) + compile)] ^{:type ::coercion/coercion} (reify coercion/Coercion (-get-name [_] :malli) diff --git a/project.clj b/project.clj index c2e4b3d0..c942499c 100644 --- a/project.clj +++ b/project.clj @@ -86,7 +86,7 @@ [metosin/muuntaja "0.6.8"] [metosin/sieppari "0.0.0-alpha13"] [metosin/jsonista "0.3.5"] - [metosin/malli "0.8.1"] + [metosin/malli "0.8.2-SNAPSHOT"] [lambdaisland/deep-diff "0.0-47"] [meta-merge "1.0.0"] [com.bhauman/spell-spec "0.1.2"] diff --git a/test/cljc/reitit/coercion_test.cljc b/test/cljc/reitit/coercion_test.cljc index ffd86be5..c836a853 100644 --- a/test/cljc/reitit/coercion_test.cljc +++ b/test/cljc/reitit/coercion_test.cljc @@ -7,7 +7,8 @@ [reitit.coercion.spec] [reitit.core :as r] [schema.core :as s] - [spec-tools.data-spec :as ds]) + [spec-tools.data-spec :as ds] + [malli.experimental.lite :as l]) #?(:clj (:import (clojure.lang ExceptionInfo)))) @@ -23,6 +24,12 @@ :query [:maybe [:map [:int int?] [:ints [:vector int?]] [:map [:map-of int? int?]]]]}}]] + ["/malli-lite" {:coercion reitit.coercion.malli/coercion} + ["/:number/:keyword" {:parameters {:path {:number int? + :keyword keyword?} + :query (l/maybe {:int int? + :ints (l/vector int?) + :map (l/map-of int? int?)})}}]] ["/spec" {:coercion reitit.coercion.spec/coercion} ["/:number/:keyword" {:parameters {:path {:number int? :keyword keyword?} @@ -56,6 +63,18 @@ (let [m (r/match-by-path r "/malli/kikka/abba")] (is (thrown? ExceptionInfo (coercion/coerce! m)))))) + (testing "malli-lite coercion" + (testing "succeeds" + (let [m (r/match-by-path r "/malli-lite/1/abba")] + (is (= {:path {:keyword :abba, :number 1}, :query nil} + (coercion/coerce! m)))) + (let [m (r/match-by-path r "/malli-lite/1/abba")] + (is (= {:path {:keyword :abba, :number 1}, :query {:int 10, :ints [1, 2, 3], :map {1 1, 2 2}}} + (coercion/coerce! (assoc m :query-params {"int" "10", "ints" ["1" "2" "3"], "map" {:1 "1", "2" "2"}})))))) + (testing "throws with invalid input" + (let [m (r/match-by-path r "/malli-lite/kikka/abba")] + (is (thrown? ExceptionInfo (coercion/coerce! m)))))) + ;; TODO: :map-of fails with string-keys (testing "spec-coercion" (testing "succeeds" diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index 0b485825..e527f0fe 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -2,7 +2,7 @@ (:require [clojure.test :refer [deftest is testing]] #?@(:clj [[muuntaja.middleware] - [jsonista.core :as j]]) + [jsonista.core :as j]]) [reitit.coercion.malli :as malli] [reitit.coercion.schema :as schema] [reitit.coercion.spec :as spec] @@ -10,7 +10,8 @@ [reitit.ring :as ring] [reitit.ring.coercion :as rrc] [schema.core :as s] - [spec-tools.data-spec :as ds]) + [spec-tools.data-spec :as ds] + [malli.experimental.lite :as l]) #?(:clj (:import (clojure.lang ExceptionInfo) @@ -210,139 +211,185 @@ (is (= 500 status)))))))) (deftest malli-coercion-test - (let [create (fn [middleware] + (let [create (fn [middleware routes] (ring/ring-handler (ring/router - ["/api" - - ["/validate" {:summary "just validation" - :coercion (reitit.coercion.malli/create {:transformers {}}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] - - ["/no-op" {:summary "no-operation" - :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] - - ["/skip" {:summary "skip" - :coercion (reitit.coercion.malli/create {:enabled false}) - :post {:parameters {:body [:map [:x int?]]} - :responses {200 {:body [:map [:x int?]]}} - :handler (fn [req] - {:status 200 - :body (-> req :parameters :body)})}}] - - ["/or" {:post {:summary "accepts either of two map schemas" - :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} - :responses {200 {:body [:map [:msg string?]]}} - :handler (fn [{{{:keys [x]} :body} :parameters}] - {:status 200 - :body {:msg (if x "you sent x" "you sent y")}})}}] - - ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] - :body [:map [:b int?]] - :form [:map [:c [int? {:default 3}]]] - :header [:map [:d int?]] - :path [:map [:e int?]]} - :responses {200 {:body [:map [:total pos-int?]]} - 500 {:description "fail"}} - :handler handler}}]] + routes {:data {:middleware middleware :coercion malli/coercion}})))] - (testing "without exception handling" - (let [app (create [rrc/coerce-request-middleware - rrc/coerce-response-middleware])] + (doseq [{:keys [style routes]} [{:style "malli" + :routes ["/api" + ["/validate" {:summary "just validation" + :coercion (reitit.coercion.malli/create {:transformers {}}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "all good" - (is (= {:status 200 - :body {:total 15}} - (app valid-request1))) - (is (= {:status 200 - :body {:total 115}} - (app valid-request2))) - (is (= {:status 200 - :body {:total 15}} - (app valid-request3))) - (testing "default values work" - (is (= {:status 200 - :body {:total 15}} - (app (update valid-request3 :form-params dissoc :c))))) - (is (= {:status 500 - :body {:evil true}} - (app (assoc-in valid-request1 [:query-params "a"] "666"))))) + ["/no-op" {:summary "no-operation" + :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "invalid request" - (is (thrown-with-msg? - ExceptionInfo - #"Request coercion failed" - (app invalid-request1)))) + ["/skip" {:summary "skip" + :coercion (reitit.coercion.malli/create {:enabled false}) + :post {:parameters {:body [:map [:x int?]]} + :responses {200 {:body [:map [:x int?]]}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "invalid response" - (is (thrown-with-msg? - ExceptionInfo - #"Response coercion failed" - (app invalid-request2)))))) + ["/or" {:post {:summary "accepts either of two map schemas" + :parameters {:body [:or [:map [:x int?]] [:map [:y int?]]]} + :responses {200 {:body [:map [:msg string?]]}} + :handler (fn [{{{:keys [x]} :body} :parameters}] + {:status 200 + :body {:msg (if x "you sent x" "you sent y")}})}}] - (testing "with exception handling" - (let [app (create [rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware])] + ["/plus/:e" {:get {:parameters {:query [:map [:a {:optional true} int?]] + :body [:map [:b int?]] + :form [:map [:c [int? {:default 3}]]] + :header [:map [:d int?]] + :path [:map [:e int?]]} + :responses {200 {:body [:map [:total pos-int?]]} + 500 {:description "fail"}} + :handler handler}}]]} + {:style "lite" + :routes ["/api" - (testing "just validation" - (is (= 400 (:status (app {:uri "/api/validate" - :request-method :post - :muuntaja/request {:format "application/edn"} - :body-params 123})))) - (is (= [:reitit.ring.coercion/coerce-exceptions - :reitit.ring.coercion/coerce-request - :reitit.ring.coercion/coerce-response] - (mounted-middleware app "/api/validate" :post)))) + ["/validate" {:summary "just validation" + :coercion (reitit.coercion.malli/create {:transformers {}}) + :post {:parameters {:body {:x int?}} + :responses {200 {:body {:x int?}}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "no tranformation & validation" - (is (= 123 (:body (app {:uri "/api/no-op" - :request-method :post - :muuntaja/request {:format "application/edn"} - :body-params 123})))) - (is (= [:reitit.ring.coercion/coerce-exceptions - :reitit.ring.coercion/coerce-request - :reitit.ring.coercion/coerce-response] - (mounted-middleware app "/api/no-op" :post)))) + ["/no-op" {:summary "no-operation" + :coercion (reitit.coercion.malli/create {:transformers {}, :validate false}) + :post {:parameters {:body {:x int?}} + :responses {200 {:body {:x int?}}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "skipping coercion" - (is (= nil (:body (app {:uri "/api/skip" - :request-method :post - :muuntaja/request {:format "application/edn"} - :body-params 123})))) - (is (= [:reitit.ring.coercion/coerce-exceptions] - (mounted-middleware app "/api/skip" :post)))) + ["/skip" {:summary "skip" + :coercion (reitit.coercion.malli/create {:enabled false}) + :post {:parameters {:body {:x int?}} + :responses {200 {:body {:x int?}}} + :handler (fn [req] + {:status 200 + :body (-> req :parameters :body)})}}] - (testing "or #407" - (is (= {:status 200 - :body {:msg "you sent x"}} - (app {:uri "/api/or" - :request-method :post - :body-params {:x 1}})))) + ["/or" {:post {:summary "accepts either of two map schemas" + :parameters {:body (l/or {:x int?} {:y int?})} + :responses {200 {:body {:msg string?}}} + :handler (fn [{{{:keys [x]} :body} :parameters}] + {:status 200 + :body {:msg (if x "you sent x" "you sent y")}})}}] - (testing "all good" - (is (= {:status 200 - :body {:total 15}} - (app valid-request1)))) + ["/plus/:e" {:get {:parameters {:query {:a (l/optional int?)} + :body {:b int?} + :form {:c [int? {:default 3}]} + :header {:d int?} + :path {:e int?}} + :responses {200 {:body {:total pos-int?}} + 500 {:description "fail"}} + :handler handler}}]]}]] - (testing "invalid request" - (let [{:keys [status]} (app invalid-request1)] - (is (= 400 status)))) + (testing (str "malli with style " style) - (testing "invalid response" - (let [{:keys [status]} (app invalid-request2)] - (is (= 500 status)))))) + (testing "without exception handling" + (let [app (create [rrc/coerce-request-middleware + rrc/coerce-response-middleware] routes)] + + (testing "all good" + (is (= {:status 200 + :body {:total 15}} + (app valid-request1))) + (is (= {:status 200 + :body {:total 115}} + (app valid-request2))) + (is (= {:status 200 + :body {:total 15}} + (app valid-request3))) + (testing "default values work" + (is (= {:status 200 + :body {:total 15}} + (app (update valid-request3 :form-params dissoc :c))))) + (is (= {:status 500 + :body {:evil true}} + (app (assoc-in valid-request1 [:query-params "a"] "666"))))) + + (testing "invalid request" + (is (thrown-with-msg? + ExceptionInfo + #"Request coercion failed" + (app invalid-request1)))) + + (testing "invalid response" + (is (thrown-with-msg? + ExceptionInfo + #"Response coercion failed" + (app invalid-request2)))))) + + (testing "with exception handling" + (let [app (create [rrc/coerce-exceptions-middleware + rrc/coerce-request-middleware + rrc/coerce-response-middleware] routes)] + + (testing "just validation" + (is (= 400 (:status (app {:uri "/api/validate" + :request-method :post + :muuntaja/request {:format "application/edn"} + :body-params 123})))) + (is (= [:reitit.ring.coercion/coerce-exceptions + :reitit.ring.coercion/coerce-request + :reitit.ring.coercion/coerce-response] + (mounted-middleware app "/api/validate" :post)))) + + (testing "no tranformation & validation" + (is (= 123 (:body (app {:uri "/api/no-op" + :request-method :post + :muuntaja/request {:format "application/edn"} + :body-params 123})))) + (is (= [:reitit.ring.coercion/coerce-exceptions + :reitit.ring.coercion/coerce-request + :reitit.ring.coercion/coerce-response] + (mounted-middleware app "/api/no-op" :post)))) + + (testing "skipping coercion" + (is (= nil (:body (app {:uri "/api/skip" + :request-method :post + :muuntaja/request {:format "application/edn"} + :body-params 123})))) + (is (= [:reitit.ring.coercion/coerce-exceptions] + (mounted-middleware app "/api/skip" :post)))) + + (testing "or #407" + (is (= {:status 200 + :body {:msg "you sent x"}} + (app {:uri "/api/or" + :request-method :post + :body-params {:x 1}})))) + + (testing "all good" + (is (= {:status 200 + :body {:total 15}} + (app valid-request1)))) + + (testing "invalid request" + (let [{:keys [status]} (app invalid-request1)] + (is (= 400 status)))) + + (testing "invalid response" + (let [{:keys [status]} (app invalid-request2)] + (is (= 500 status)))))))) (testing "open & closed schemas" (let [endpoint (fn [schema] From 40eb09b2a98bb90b161ff9110064cb5f5b4d73c8 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 13 Feb 2022 19:30:21 +0200 Subject: [PATCH 077/113] fix CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66bf9794..d4ff005f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Mon, 14 Feb 2022 16:58:10 +0200 Subject: [PATCH 078/113] format --- modules/reitit-dev/src/reitit/dev/pretty.cljc | 2 +- modules/reitit-malli/src/reitit/coercion/malli.cljc | 4 ++-- modules/reitit-ring/src/reitit/ring.cljc | 2 +- test/cljc/reitit/coercion_test.cljc | 4 ++-- test/cljc/reitit/ring_coercion_test.cljc | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/reitit-dev/src/reitit/dev/pretty.cljc b/modules/reitit-dev/src/reitit/dev/pretty.cljc index 44bbf59e..4c8a5433 100644 --- a/modules/reitit-dev/src/reitit/dev/pretty.cljc +++ b/modules/reitit-dev/src/reitit/dev/pretty.cljc @@ -11,7 +11,7 @@ [fipp.visit] [reitit.exception :as exception] [spell-spec.expound] ;; expound -)) + )) ;; ;; colors diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 20d97fa2..4f1614a8 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -3,9 +3,9 @@ [clojure.set :as set] [clojure.walk :as walk] [malli.core :as m] - [malli.experimental.lite :as l] [malli.edn :as edn] [malli.error :as me] + [malli.experimental.lite :as l] [malli.swagger :as swagger] [malli.transform :as mt] [malli.util :as mu] @@ -141,7 +141,7 @@ show? (fn [key] (contains? error-keys key)) transformers (walk/prewalk #(if (satisfies? TransformationProvider %) (-transformer % opts) %) transformers) compile (if lite (fn [schema options] (compile (binding [l/*options* options] (l/schema schema)) options)) - compile)] + compile)] ^{:type ::coercion/coercion} (reify coercion/Coercion (-get-name [_] :malli) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 6137cb51..1c06c6a6 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -3,7 +3,7 @@ [clojure.string :as str] [meta-merge.core :refer [meta-merge]] #?@(:clj [[ring.util.mime-type :as mime-type] - [ring.util.response :as response]]) + [ring.util.response :as response]]) [reitit.core :as r] [reitit.exception :as ex] [reitit.impl :as impl] diff --git a/test/cljc/reitit/coercion_test.cljc b/test/cljc/reitit/coercion_test.cljc index c836a853..0a1a4aaa 100644 --- a/test/cljc/reitit/coercion_test.cljc +++ b/test/cljc/reitit/coercion_test.cljc @@ -1,14 +1,14 @@ (ns reitit.coercion-test (:require [clojure.test :refer [deftest is testing]] + [malli.experimental.lite :as l] [reitit.coercion :as coercion] [reitit.coercion.malli] [reitit.coercion.schema] [reitit.coercion.spec] [reitit.core :as r] [schema.core :as s] - [spec-tools.data-spec :as ds] - [malli.experimental.lite :as l]) + [spec-tools.data-spec :as ds]) #?(:clj (:import (clojure.lang ExceptionInfo)))) diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index e527f0fe..3c5582a7 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -1,6 +1,7 @@ (ns reitit.ring-coercion-test (:require [clojure.test :refer [deftest is testing]] + [malli.experimental.lite :as l] #?@(:clj [[muuntaja.middleware] [jsonista.core :as j]]) [reitit.coercion.malli :as malli] @@ -10,8 +11,7 @@ [reitit.ring :as ring] [reitit.ring.coercion :as rrc] [schema.core :as s] - [spec-tools.data-spec :as ds] - [malli.experimental.lite :as l]) + [spec-tools.data-spec :as ds]) #?(:clj (:import (clojure.lang ExceptionInfo) From f3dee769fb309fe32b0f5cd9c4a11807608f7fe8 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 14 Feb 2022 16:59:20 +0200 Subject: [PATCH 079/113] format-ns --- .lsp/config.edn | 3 +- modules/reitit-core/src/reitit/coercion.cljc | 8 ++---- modules/reitit-core/src/reitit/core.cljc | 7 ++--- .../reitit-core/src/reitit/dependency.cljc | 3 +- modules/reitit-core/src/reitit/exception.cljc | 3 +- modules/reitit-core/src/reitit/impl.cljc | 16 +++++------ .../reitit-core/src/reitit/interceptor.cljc | 11 ++++---- .../reitit-core/src/reitit/middleware.cljc | 11 ++++---- modules/reitit-core/src/reitit/spec.cljc | 9 +++--- modules/reitit-core/src/reitit/trie.cljc | 10 +++---- modules/reitit-dev/src/reitit/dev/pretty.cljc | 25 ++++++++--------- .../reitit-frontend/src/reitit/frontend.cljs | 12 ++++---- .../src/reitit/frontend/easy.cljs | 3 +- .../src/reitit/frontend/history.cljs | 10 +++---- modules/reitit-http/src/reitit/http.cljc | 11 ++++---- .../reitit-http/src/reitit/http/coercion.cljc | 7 ++--- modules/reitit-http/src/reitit/http/spec.cljc | 11 ++++---- .../src/reitit/http/interceptors/dev.clj | 9 +++--- .../reitit/http/interceptors/exception.clj | 14 ++++------ .../reitit/http/interceptors/multipart.clj | 14 ++++------ .../src/reitit/http/interceptors/muuntaja.clj | 7 ++--- .../reitit/http/interceptors/parameters.clj | 3 +- .../src/reitit/coercion/malli.cljc | 21 +++++++------- .../reitit-malli/src/reitit/ring/malli.cljc | 3 +- .../src/reitit/ring/middleware/dev.clj | 9 +++--- .../src/reitit/ring/middleware/exception.clj | 14 ++++------ .../src/reitit/ring/middleware/multipart.clj | 12 ++++---- .../src/reitit/ring/middleware/muuntaja.clj | 7 ++--- .../src/reitit/ring/middleware/parameters.clj | 3 +- .../reitit-pedestal/src/reitit/pedestal.clj | 16 +++++------ modules/reitit-ring/src/reitit/ring.cljc | 15 +++++----- .../reitit-ring/src/reitit/ring/coercion.cljc | 7 ++--- modules/reitit-ring/src/reitit/ring/spec.cljc | 9 +++--- .../src/reitit/coercion/schema.cljc | 19 ++++++------- .../reitit-schema/src/reitit/ring/schema.cljc | 8 ++---- .../src/reitit/interceptor/sieppari.clj | 7 ++--- .../reitit-spec/src/reitit/coercion/spec.cljc | 18 ++++++------ .../src/reitit/swagger_ui.cljc | 5 ++-- .../reitit-swagger/src/reitit/swagger.cljc | 15 +++++----- test/clj/cljdoc/reaper.clj | 7 ++--- .../http/interceptors/exception_test.clj | 20 ++++++------- .../http/interceptors/muuntaja_test.clj | 13 ++++----- .../http/interceptors/parameters_test.clj | 11 ++++---- test/clj/reitit/http_coercion_test.clj | 28 +++++++++---------- test/clj/reitit/http_test.clj | 20 ++++++------- test/clj/reitit/pedestal_test.clj | 13 ++++----- .../reitit/ring/middleware/exception_test.clj | 22 +++++++-------- .../reitit/ring/middleware/muuntaja_test.clj | 11 ++++---- .../ring/middleware/parameters_test.clj | 9 +++--- test/cljc/reitit/coercion_test.cljc | 22 +++++++-------- test/cljc/reitit/core_test.cljc | 12 ++++---- test/cljc/reitit/dependency_test.cljc | 8 ++---- test/cljc/reitit/exception_test.cljc | 16 +++++------ test/cljc/reitit/impl_test.cljc | 5 ++-- test/cljc/reitit/interceptor_test.cljc | 10 +++---- test/cljc/reitit/middleware_test.cljc | 10 +++---- test/cljc/reitit/ring_coercion_test.cljc | 28 +++++++++---------- test/cljc/reitit/ring_spec_test.cljc | 18 ++++++------ test/cljc/reitit/ring_test.cljc | 16 +++++------ test/cljc/reitit/spec_test.cljc | 14 ++++------ test/cljc/reitit/swagger_test.clj | 23 ++++++++------- test/cljc/reitit/trie_test.cljc | 5 ++-- 62 files changed, 325 insertions(+), 411 deletions(-) diff --git a/.lsp/config.edn b/.lsp/config.edn index bfbe9181..577a7c9c 100644 --- a/.lsp/config.edn +++ b/.lsp/config.edn @@ -1,2 +1,3 @@ {:cljfmt {:indents {for-all [[:inner 0]] - are [[:inner 0]]}}} \ No newline at end of file + are [[:inner 0]]}} + :clean {:ns-inner-blocks-indentation :same-line}} \ No newline at end of file diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 6cbd6627..0fd5d234 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -1,10 +1,8 @@ (ns reitit.coercion - (:require - [clojure.walk :as walk] - [reitit.impl :as impl]) + (:require [clojure.walk :as walk] + [reitit.impl :as impl]) #?(:clj - (:import - (java.io Writer)))) + (:import (java.io Writer)))) ;; ;; Protocol diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 8457130f..c6776db4 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -1,8 +1,7 @@ (ns reitit.core - (:require - [reitit.exception :as exception] - [reitit.impl :as impl] - [reitit.trie :as trie])) + (:require [reitit.exception :as exception] + [reitit.impl :as impl] + [reitit.trie :as trie])) ;; ;; Expand diff --git a/modules/reitit-core/src/reitit/dependency.cljc b/modules/reitit-core/src/reitit/dependency.cljc index fc31f13a..6f1209eb 100644 --- a/modules/reitit-core/src/reitit/dependency.cljc +++ b/modules/reitit-core/src/reitit/dependency.cljc @@ -1,7 +1,6 @@ (ns reitit.dependency "Dependency resolution for middleware/interceptors." - (:require - [reitit.exception :as exception])) + (:require [reitit.exception :as exception])) (defn- providers "Map from provision key to provider. `get-provides` should return the provision keys of a dependent." diff --git a/modules/reitit-core/src/reitit/exception.cljc b/modules/reitit-core/src/reitit/exception.cljc index 0465551f..df61b66a 100644 --- a/modules/reitit-core/src/reitit/exception.cljc +++ b/modules/reitit-core/src/reitit/exception.cljc @@ -1,6 +1,5 @@ (ns reitit.exception - (:require - [clojure.string :as str])) + (:require [clojure.string :as str])) (defn fail! ([type] diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index d59ebf0a..03c55e72 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -1,15 +1,13 @@ (ns ^:no-doc reitit.impl #?(:cljs (:require-macros [reitit.impl])) - (:require - [clojure.set :as set] - [clojure.string :as str] - [meta-merge.core :as mm] - [reitit.exception :as ex] - [reitit.trie :as trie]) + (:require [clojure.set :as set] + [clojure.string :as str] + [meta-merge.core :as mm] + [reitit.exception :as ex] + [reitit.trie :as trie]) #?(:clj - (:import - (java.net URLEncoder URLDecoder) - (java.util HashMap Map)))) + (:import (java.net URLEncoder URLDecoder) + (java.util HashMap Map)))) (defn parse [path opts] (let [path #?(:clj (.intern ^String (trie/normalize path opts)) :cljs (trie/normalize path opts)) diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index 7c34ab3b..8d90c2e4 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -1,10 +1,9 @@ (ns reitit.interceptor - (:require - [clojure.pprint :as pprint] - [meta-merge.core :refer [meta-merge]] - [reitit.core :as r] - [reitit.exception :as exception] - [reitit.impl :as impl])) + (:require [clojure.pprint :as pprint] + [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as exception] + [reitit.impl :as impl])) (defprotocol IntoInterceptor (into-interceptor [this data opts])) diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index 53df1b14..49381b68 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -1,10 +1,9 @@ (ns reitit.middleware - (:require - [clojure.pprint :as pprint] - [meta-merge.core :refer [meta-merge]] - [reitit.core :as r] - [reitit.exception :as exception] - [reitit.impl :as impl])) + (:require [clojure.pprint :as pprint] + [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as exception] + [reitit.impl :as impl])) (defprotocol IntoMiddleware (into-middleware [this data opts])) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index 7a11a4ed..a3fa0290 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -1,9 +1,8 @@ (ns reitit.spec - (:require - [clojure.spec.alpha :as s] - [clojure.spec.gen.alpha :as gen] - [reitit.core :as r] - [reitit.exception :as exception])) + (:require [clojure.spec.alpha :as s] + [clojure.spec.gen.alpha :as gen] + [reitit.core :as r] + [reitit.exception :as exception])) ;; ;; routes diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 8ea30bf7..cda97066 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -1,11 +1,9 @@ (ns reitit.trie (:refer-clojure :exclude [compile]) - (:require - [clojure.string :as str] - [reitit.exception :as ex]) - #?(:clj (:import - (java.net URLDecoder) - [reitit Trie Trie$Match Trie$Matcher]))) + (:require [clojure.string :as str] + [reitit.exception :as ex]) + #?(:clj (:import (java.net URLDecoder) + [reitit Trie Trie$Match Trie$Matcher]))) (defn ^:no-doc into-set [x] (cond diff --git a/modules/reitit-dev/src/reitit/dev/pretty.cljc b/modules/reitit-dev/src/reitit/dev/pretty.cljc index 4c8a5433..158d09e0 100644 --- a/modules/reitit-dev/src/reitit/dev/pretty.cljc +++ b/modules/reitit-dev/src/reitit/dev/pretty.cljc @@ -1,17 +1,16 @@ (ns reitit.dev.pretty - (:require - [arrangement.core] ;; spell-spec - [clojure.spec.alpha :as s] - [clojure.string :as str] - [expound.alpha] ;; fipp - [expound.ansi] - [fipp.edn] - [fipp.ednize] - [fipp.engine] - [fipp.visit] - [reitit.exception :as exception] - [spell-spec.expound] ;; expound - )) + (:require [arrangement.core] ;; spell-spec + [clojure.spec.alpha :as s] + [clojure.string :as str] + [expound.alpha] ;; fipp + [expound.ansi] + [fipp.edn] + [fipp.ednize] + [fipp.engine] + [fipp.visit] + [reitit.exception :as exception] + [spell-spec.expound] ;; expound +)) ;; ;; colors diff --git a/modules/reitit-frontend/src/reitit/frontend.cljs b/modules/reitit-frontend/src/reitit/frontend.cljs index 27a66a90..60273f79 100644 --- a/modules/reitit-frontend/src/reitit/frontend.cljs +++ b/modules/reitit-frontend/src/reitit/frontend.cljs @@ -1,11 +1,9 @@ (ns reitit.frontend - (:require - [clojure.set :as set] - [reitit.coercion :as coercion] - [reitit.core :as r]) - (:import - goog.Uri - goog.Uri.QueryData)) + (:require [clojure.set :as set] + [reitit.coercion :as coercion] + [reitit.core :as r]) + (:import goog.Uri + goog.Uri.QueryData)) (defn- query-param [^QueryData q k] (let [vs (.getValues q k)] diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index d35ef40f..8a76b900 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -2,8 +2,7 @@ "Easy wrapper over reitit.frontend.history, handling the state. Only one router can be active at a time." - (:require - [reitit.frontend.history :as rfh])) + (:require [reitit.frontend.history :as rfh])) (defonce history (atom nil)) diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 74337ec7..600feaec 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -1,12 +1,10 @@ (ns reitit.frontend.history "Provides integration to hash-change or HTML5 History events." - (:require - [goog.events :as gevents] - [reitit.core :as reitit] - [reitit.frontend :as rf]) - (:import - goog.Uri)) + (:require [goog.events :as gevents] + [reitit.core :as reitit] + [reitit.frontend :as rf]) + (:import goog.Uri)) (defprotocol History (-init [this] "Create event listeners") diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index 5366b701..c85817f8 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -1,10 +1,9 @@ (ns reitit.http - (:require - [meta-merge.core :refer [meta-merge]] - [reitit.core :as r] - [reitit.exception :as ex] - [reitit.interceptor :as interceptor] - [reitit.ring :as ring])) + (:require [meta-merge.core :refer [meta-merge]] + [reitit.core :as r] + [reitit.exception :as ex] + [reitit.interceptor :as interceptor] + [reitit.ring :as ring])) (defrecord Endpoint [data interceptors queue handler path method]) diff --git a/modules/reitit-http/src/reitit/http/coercion.cljc b/modules/reitit-http/src/reitit/http/coercion.cljc index d2075045..8e63db28 100644 --- a/modules/reitit-http/src/reitit/http/coercion.cljc +++ b/modules/reitit-http/src/reitit/http/coercion.cljc @@ -1,8 +1,7 @@ (ns reitit.http.coercion - (:require - [reitit.coercion :as coercion] - [reitit.impl :as impl] - [reitit.spec :as rs])) + (:require [reitit.coercion :as coercion] + [reitit.impl :as impl] + [reitit.spec :as rs])) (defn coerce-request-interceptor "Interceptor for pluggable request coercion. diff --git a/modules/reitit-http/src/reitit/http/spec.cljc b/modules/reitit-http/src/reitit/http/spec.cljc index 3ee5f819..f6112c5a 100644 --- a/modules/reitit-http/src/reitit/http/spec.cljc +++ b/modules/reitit-http/src/reitit/http/spec.cljc @@ -1,10 +1,9 @@ (ns reitit.http.spec - (:require - [clojure.spec.alpha :as s] - [reitit.exception :as exception] - [reitit.interceptor :as interceptor] - [reitit.ring.spec :as rrs] - [reitit.spec :as rs])) + (:require [clojure.spec.alpha :as s] + [reitit.exception :as exception] + [reitit.interceptor :as interceptor] + [reitit.ring.spec :as rrs] + [reitit.spec :as rs])) ;; ;; Specs diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj index f36c8298..896f99fc 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj @@ -1,9 +1,8 @@ (ns reitit.http.interceptors.dev - (:require - [lambdaisland.deep-diff :as ddiff] - [lambdaisland.deep-diff.printer :as printer] - [puget.color :as color] - [reitit.core :as r])) + (:require [lambdaisland.deep-diff :as ddiff] + [lambdaisland.deep-diff.printer :as printer] + [puget.color :as color] + [reitit.core :as r])) (def printer (-> (printer/puget-printer) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj index c2e2efbe..559a55b3 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/exception.clj @@ -1,12 +1,10 @@ (ns reitit.http.interceptors.exception - (:require - [clojure.spec.alpha :as s] - [clojure.string :as str] - [reitit.coercion :as coercion] - [reitit.ring :as ring]) - (:import - (java.io PrintWriter Writer) - (java.time Instant))) + (:require [clojure.spec.alpha :as s] + [clojure.string :as str] + [reitit.coercion :as coercion] + [reitit.ring :as ring]) + (:import (java.io PrintWriter Writer) + (java.time Instant))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj index 5c38a8d2..d616c689 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/multipart.clj @@ -1,12 +1,10 @@ (ns reitit.http.interceptors.multipart - (:require - [clojure.spec.alpha :as s] - [reitit.coercion :as coercion] - [reitit.spec] - [ring.middleware.multipart-params :as multipart-params] - [spec-tools.core :as st]) - (:import - (java.io File))) + (:require [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [reitit.spec] + [ring.middleware.multipart-params :as multipart-params] + [spec-tools.core :as st]) + (:import (java.io File))) (s/def ::filename string?) (s/def ::content-type string?) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj index 7ddda390..3dbf7285 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/muuntaja.clj @@ -1,8 +1,7 @@ (ns reitit.http.interceptors.muuntaja - (:require - [clojure.spec.alpha :as s] - [muuntaja.core :as m] - [muuntaja.interceptor])) + (:require [clojure.spec.alpha :as s] + [muuntaja.core :as m] + [muuntaja.interceptor])) (s/def ::muuntaja m/muuntaja?) (s/def ::spec (s/keys :opt-un [::muuntaja])) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj index 91a7c98b..5731744e 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/parameters.clj @@ -1,6 +1,5 @@ (ns reitit.http.interceptors.parameters - (:require - [ring.middleware.params :as params])) + (:require [ring.middleware.params :as params])) (defn parameters-interceptor "Interceptor to parse urlencoded parameters from the query string and form diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index 4f1614a8..a57d2641 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -1,15 +1,14 @@ (ns reitit.coercion.malli - (:require - [clojure.set :as set] - [clojure.walk :as walk] - [malli.core :as m] - [malli.edn :as edn] - [malli.error :as me] - [malli.experimental.lite :as l] - [malli.swagger :as swagger] - [malli.transform :as mt] - [malli.util :as mu] - [reitit.coercion :as coercion])) + (:require [clojure.set :as set] + [clojure.walk :as walk] + [malli.core :as m] + [malli.edn :as edn] + [malli.error :as me] + [malli.experimental.lite :as l] + [malli.swagger :as swagger] + [malli.transform :as mt] + [malli.util :as mu] + [reitit.coercion :as coercion])) ;; ;; coercion diff --git a/modules/reitit-malli/src/reitit/ring/malli.cljc b/modules/reitit-malli/src/reitit/ring/malli.cljc index dfd5ea8e..a7987625 100644 --- a/modules/reitit-malli/src/reitit/ring/malli.cljc +++ b/modules/reitit-malli/src/reitit/ring/malli.cljc @@ -1,6 +1,5 @@ (ns reitit.ring.malli - #?(:clj (:import - (java.io File)))) + #?(:clj (:import (java.io File)))) #?(:clj (def temp-file-part diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj index 907cd680..587416ff 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/dev.clj @@ -1,9 +1,8 @@ (ns reitit.ring.middleware.dev - (:require - [lambdaisland.deep-diff :as ddiff] - [lambdaisland.deep-diff.printer :as printer] - [puget.color :as color] - [reitit.core :as r])) + (:require [lambdaisland.deep-diff :as ddiff] + [lambdaisland.deep-diff.printer :as printer] + [puget.color :as color] + [reitit.core :as r])) (def printer (-> (printer/puget-printer) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 89e99e20..7aa0db92 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -1,12 +1,10 @@ (ns reitit.ring.middleware.exception - (:require - [clojure.spec.alpha :as s] - [clojure.string :as str] - [reitit.coercion :as coercion] - [reitit.ring :as ring]) - (:import - (java.io Writer PrintWriter) - (java.time Instant))) + (:require [clojure.spec.alpha :as s] + [clojure.string :as str] + [reitit.coercion :as coercion] + [reitit.ring :as ring]) + (:import (java.io Writer PrintWriter) + (java.time Instant))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index 8f353cae..2542b0a3 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -1,12 +1,10 @@ (ns reitit.ring.middleware.multipart (:refer-clojure :exclude [compile]) - (:require - [clojure.spec.alpha :as s] - [reitit.coercion :as coercion] - [ring.middleware.multipart-params :as multipart-params] - [spec-tools.core :as st]) - (:import - (java.io File))) + (:require [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [ring.middleware.multipart-params :as multipart-params] + [spec-tools.core :as st]) + (:import (java.io File))) (s/def ::filename string?) (s/def ::content-type string?) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 9b1f1f34..06d0b0b8 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -1,8 +1,7 @@ (ns reitit.ring.middleware.muuntaja - (:require - [clojure.spec.alpha :as s] - [muuntaja.core :as m] - [muuntaja.middleware])) + (:require [clojure.spec.alpha :as s] + [muuntaja.core :as m] + [muuntaja.middleware])) (s/def ::muuntaja m/muuntaja?) (s/def ::spec (s/keys :opt-un [::muuntaja])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj b/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj index e93b8a09..ec0a334b 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/parameters.clj @@ -1,6 +1,5 @@ (ns reitit.ring.middleware.parameters - (:require - [ring.middleware.params :as params])) + (:require [ring.middleware.params :as params])) (def parameters-middleware "Middleware to parse urlencoded parameters from the query string and form diff --git a/modules/reitit-pedestal/src/reitit/pedestal.clj b/modules/reitit-pedestal/src/reitit/pedestal.clj index 5c33546d..04c262f8 100644 --- a/modules/reitit-pedestal/src/reitit/pedestal.clj +++ b/modules/reitit-pedestal/src/reitit/pedestal.clj @@ -1,13 +1,11 @@ (ns reitit.pedestal - (:require - [io.pedestal.http :as http] - [io.pedestal.interceptor :as interceptor] - [io.pedestal.interceptor.chain :as chain] - [reitit.http] - [reitit.interceptor]) - (:import - (java.lang.reflect Method) - (reitit.interceptor Executor))) + (:require [io.pedestal.http :as http] + [io.pedestal.interceptor :as interceptor] + [io.pedestal.interceptor.chain :as chain] + [reitit.http] + [reitit.interceptor]) + (:import (java.lang.reflect Method) + (reitit.interceptor Executor))) ;; TODO: variadic (defn- arities [f] diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 1c06c6a6..4aceaaf1 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -1,13 +1,12 @@ (ns reitit.ring - (:require - [clojure.string :as str] - [meta-merge.core :refer [meta-merge]] - #?@(:clj [[ring.util.mime-type :as mime-type] + (:require [clojure.string :as str] + [meta-merge.core :refer [meta-merge]] + #?@(:clj [[ring.util.mime-type :as mime-type] [ring.util.response :as response]]) - [reitit.core :as r] - [reitit.exception :as ex] - [reitit.impl :as impl] - [reitit.middleware :as middleware])) + [reitit.core :as r] + [reitit.exception :as ex] + [reitit.impl :as impl] + [reitit.middleware :as middleware])) (declare get-match) (declare get-router) diff --git a/modules/reitit-ring/src/reitit/ring/coercion.cljc b/modules/reitit-ring/src/reitit/ring/coercion.cljc index 6262f4f9..efbe83f7 100644 --- a/modules/reitit-ring/src/reitit/ring/coercion.cljc +++ b/modules/reitit-ring/src/reitit/ring/coercion.cljc @@ -1,8 +1,7 @@ (ns reitit.ring.coercion - (:require - [reitit.coercion :as coercion] - [reitit.impl :as impl] - [reitit.spec :as rs])) + (:require [reitit.coercion :as coercion] + [reitit.impl :as impl] + [reitit.spec :as rs])) (defn handle-coercion-exception [e respond raise] (let [data (ex-data e)] diff --git a/modules/reitit-ring/src/reitit/ring/spec.cljc b/modules/reitit-ring/src/reitit/ring/spec.cljc index 63d98119..9d68e8ed 100644 --- a/modules/reitit-ring/src/reitit/ring/spec.cljc +++ b/modules/reitit-ring/src/reitit/ring/spec.cljc @@ -1,9 +1,8 @@ (ns reitit.ring.spec - (:require - [clojure.spec.alpha :as s] - [reitit.exception :as exception] - [reitit.middleware :as middleware] - [reitit.spec :as rs])) + (:require [clojure.spec.alpha :as s] + [reitit.exception :as exception] + [reitit.middleware :as middleware] + [reitit.spec :as rs])) ;; ;; Specs diff --git a/modules/reitit-schema/src/reitit/coercion/schema.cljc b/modules/reitit-schema/src/reitit/coercion/schema.cljc index 6ec9e60b..022f3872 100644 --- a/modules/reitit-schema/src/reitit/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/coercion/schema.cljc @@ -1,14 +1,13 @@ (ns reitit.coercion.schema - (:require - [clojure.set :as set] - [clojure.walk :as walk] - [reitit.coercion :as coercion] - [schema-tools.coerce :as stc] - [schema-tools.core :as st] - [schema-tools.swagger.core :as swagger] - [schema.coerce :as sc] - [schema.core :as s] - [schema.utils :as su])) + (:require [clojure.set :as set] + [clojure.walk :as walk] + [reitit.coercion :as coercion] + [schema-tools.coerce :as stc] + [schema-tools.core :as st] + [schema-tools.swagger.core :as swagger] + [schema.coerce :as sc] + [schema.core :as s] + [schema.utils :as su])) (def string-coercion-matcher stc/string-coercion-matcher) diff --git a/modules/reitit-schema/src/reitit/ring/schema.cljc b/modules/reitit-schema/src/reitit/ring/schema.cljc index 96829af3..934948d8 100644 --- a/modules/reitit-schema/src/reitit/ring/schema.cljc +++ b/modules/reitit-schema/src/reitit/ring/schema.cljc @@ -1,9 +1,7 @@ (ns reitit.ring.schema - (:require - [schema-tools.swagger.core :as swagger] - [schema.core :as s]) - #?(:clj (:import - (java.io File)))) + (:require [schema-tools.swagger.core :as swagger] + [schema.core :as s]) + #?(:clj (:import (java.io File)))) (defrecord Upload [m] s/Schema diff --git a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj index 336a9cfa..1fa4e242 100644 --- a/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj +++ b/modules/reitit-sieppari/src/reitit/interceptor/sieppari.clj @@ -1,8 +1,7 @@ (ns reitit.interceptor.sieppari - (:require - [reitit.interceptor :as interceptor] - [sieppari.core :as sieppari] - [sieppari.queue :as queue])) + (:require [reitit.interceptor :as interceptor] + [sieppari.core :as sieppari] + [sieppari.queue :as queue])) (def executor (reify diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index 12c88310..5f9809a7 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -1,15 +1,13 @@ (ns reitit.coercion.spec - (:require - [clojure.set :as set] - [clojure.spec.alpha :as s] - [reitit.coercion :as coercion] - [spec-tools.core :as st #?@(:cljs [:refer [Spec]])] - [spec-tools.data-spec :as ds #?@(:cljs [:refer [Maybe]])] - [spec-tools.swagger.core :as swagger]) + (:require [clojure.set :as set] + [clojure.spec.alpha :as s] + [reitit.coercion :as coercion] + [spec-tools.core :as st #?@(:cljs [:refer [Spec]])] + [spec-tools.data-spec :as ds #?@(:cljs [:refer [Maybe]])] + [spec-tools.swagger.core :as swagger]) #?(:clj - (:import - (spec_tools.core Spec) - (spec_tools.data_spec Maybe)))) + (:import (spec_tools.core Spec) + (spec_tools.data_spec Maybe)))) (def string-transformer (st/type-transformer diff --git a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc index 60d3d2af..1c10ea27 100644 --- a/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc +++ b/modules/reitit-swagger-ui/src/reitit/swagger_ui.cljc @@ -1,7 +1,6 @@ (ns reitit.swagger-ui - #?(:clj (:require - [jsonista.core :as j] - [reitit.ring :as ring]))) + #?(:clj (:require [jsonista.core :as j] + [reitit.ring :as ring]))) #?(:clj (defn create-swagger-ui-handler diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index 951d3b80..2c71a6d3 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -1,12 +1,11 @@ (ns reitit.swagger - (:require - [clojure.set :as set] - [clojure.spec.alpha :as s] - [clojure.string :as str] - [meta-merge.core :refer [meta-merge]] - [reitit.coercion :as coercion] - [reitit.core :as r] - [reitit.trie :as trie])) + (:require [clojure.set :as set] + [clojure.spec.alpha :as s] + [clojure.string :as str] + [meta-merge.core :refer [meta-merge]] + [reitit.coercion :as coercion] + [reitit.core :as r] + [reitit.trie :as trie])) (s/def ::id (s/or :keyword keyword? :set (s/coll-of keyword? :into #{}))) (s/def ::no-doc boolean?) diff --git a/test/clj/cljdoc/reaper.clj b/test/clj/cljdoc/reaper.clj index 58887b83..bce3e68c 100644 --- a/test/clj/cljdoc/reaper.clj +++ b/test/clj/cljdoc/reaper.clj @@ -1,8 +1,7 @@ (ns cljdoc.reaper - (:require - [clojure.java.io :as io] - [clojure.pprint :as pprint] - [clojure.string :as str])) + (:require [clojure.java.io :as io] + [clojure.pprint :as pprint] + [clojure.string :as str])) (defn reap! [] (let [docs (->> (for [line (-> (io/file "./doc/SUMMARY.md") (slurp) (str/split #"\n")) diff --git a/test/clj/reitit/http/interceptors/exception_test.clj b/test/clj/reitit/http/interceptors/exception_test.clj index 275ffd6f..15a53197 100644 --- a/test/clj/reitit/http/interceptors/exception_test.clj +++ b/test/clj/reitit/http/interceptors/exception_test.clj @@ -1,15 +1,13 @@ (ns reitit.http.interceptors.exception-test - (:require - [clojure.test :refer [deftest is testing]] - [muuntaja.core :as m] - [reitit.coercion.spec] - [reitit.http :as http] - [reitit.http.coercion] - [reitit.http.interceptors.exception :as exception] - [reitit.interceptor.sieppari :as sieppari] - [reitit.ring :as ring]) - (:import - (java.sql SQLException SQLWarning))) + (:require [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion.spec] + [reitit.http :as http] + [reitit.http.coercion] + [reitit.http.interceptors.exception :as exception] + [reitit.interceptor.sieppari :as sieppari] + [reitit.ring :as ring]) + (:import (java.sql SQLException SQLWarning))) (derive ::kikka ::kukka) diff --git a/test/clj/reitit/http/interceptors/muuntaja_test.clj b/test/clj/reitit/http/interceptors/muuntaja_test.clj index 9cb5c030..c26a5160 100644 --- a/test/clj/reitit/http/interceptors/muuntaja_test.clj +++ b/test/clj/reitit/http/interceptors/muuntaja_test.clj @@ -1,11 +1,10 @@ (ns reitit.http.interceptors.muuntaja-test - (:require - [clojure.test :refer [deftest is testing]] - [muuntaja.core :as m] - [reitit.http :as http] - [reitit.http.interceptors.muuntaja :as muuntaja] - [reitit.interceptor.sieppari :as sieppari] - [reitit.swagger :as swagger])) + (:require [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.http :as http] + [reitit.http.interceptors.muuntaja :as muuntaja] + [reitit.interceptor.sieppari :as sieppari] + [reitit.swagger :as swagger])) (deftest muuntaja-test (let [data {:kikka "kukka"} diff --git a/test/clj/reitit/http/interceptors/parameters_test.clj b/test/clj/reitit/http/interceptors/parameters_test.clj index 4703d15b..648e1d4c 100644 --- a/test/clj/reitit/http/interceptors/parameters_test.clj +++ b/test/clj/reitit/http/interceptors/parameters_test.clj @@ -1,10 +1,9 @@ (ns reitit.http.interceptors.parameters-test - (:require - [clojure.test :refer [deftest is testing]] - [reitit.http :as http] - [reitit.http.interceptors.parameters :as parameters] - [reitit.interceptor.sieppari :as sieppari] - [reitit.swagger :as swagger])) + (:require [clojure.test :refer [deftest is testing]] + [reitit.http :as http] + [reitit.http.interceptors.parameters :as parameters] + [reitit.interceptor.sieppari :as sieppari] + [reitit.swagger :as swagger])) (deftest parameters-test (let [app (http/ring-handler diff --git a/test/clj/reitit/http_coercion_test.clj b/test/clj/reitit/http_coercion_test.clj index 76e16a36..53c749a7 100644 --- a/test/clj/reitit/http_coercion_test.clj +++ b/test/clj/reitit/http_coercion_test.clj @@ -1,19 +1,17 @@ (ns reitit.http-coercion-test - (:require - [clojure.test :refer [deftest is testing]] - [jsonista.core :as j] - [muuntaja.interceptor] - [reitit.coercion.malli :as malli] - [reitit.coercion.schema :as schema] - [reitit.coercion.spec :as spec] - [reitit.core :as r] - [reitit.http :as http] - [reitit.http.coercion :as rrc] - [reitit.interceptor.sieppari :as sieppari] - [schema.core :as s]) - (:import - (clojure.lang ExceptionInfo) - (java.io ByteArrayInputStream))) + (:require [clojure.test :refer [deftest is testing]] + [jsonista.core :as j] + [muuntaja.interceptor] + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.core :as r] + [reitit.http :as http] + [reitit.http.coercion :as rrc] + [reitit.interceptor.sieppari :as sieppari] + [schema.core :as s]) + (:import (clojure.lang ExceptionInfo) + (java.io ByteArrayInputStream))) (defn mounted-interceptor [app path method] (->> app diff --git a/test/clj/reitit/http_test.clj b/test/clj/reitit/http_test.clj index 7dc79f89..0894ab9a 100644 --- a/test/clj/reitit/http_test.clj +++ b/test/clj/reitit/http_test.clj @@ -1,16 +1,14 @@ (ns reitit.http-test "just Clojure before Sieppari is ported into cljs" - (:require - [clojure.core.async :as a] - [clojure.set :as set] - [clojure.test :refer [deftest is testing]] - [reitit.core :as r] - [reitit.http :as http] - [reitit.interceptor :as interceptor] - [reitit.interceptor.sieppari :as sieppari] - [reitit.ring :as ring]) - (:import - (clojure.lang ExceptionInfo))) + (:require [clojure.core.async :as a] + [clojure.set :as set] + [clojure.test :refer [deftest is testing]] + [reitit.core :as r] + [reitit.http :as http] + [reitit.interceptor :as interceptor] + [reitit.interceptor.sieppari :as sieppari] + [reitit.ring :as ring]) + (:import (clojure.lang ExceptionInfo))) (defn interceptor [name] {:enter (fn [ctx] (update-in ctx [:request ::i] (fnil conj []) name))}) diff --git a/test/clj/reitit/pedestal_test.clj b/test/clj/reitit/pedestal_test.clj index a6678ec4..6f5150a0 100644 --- a/test/clj/reitit/pedestal_test.clj +++ b/test/clj/reitit/pedestal_test.clj @@ -1,11 +1,10 @@ (ns reitit.pedestal-test - (:require - [clojure.test :refer [deftest is testing]] - [io.pedestal.http] - [io.pedestal.test] - [reitit.http :as http] - [reitit.http.interceptors.exception :as exception] - [reitit.pedestal :as pedestal])) + (:require [clojure.test :refer [deftest is testing]] + [io.pedestal.http] + [io.pedestal.test] + [reitit.http :as http] + [reitit.http.interceptors.exception :as exception] + [reitit.pedestal :as pedestal])) (deftest arities-test (is (= #{0} (#'pedestal/arities (fn [])))) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 6fdd9224..f905d994 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -1,16 +1,14 @@ (ns reitit.ring.middleware.exception-test - (:require - [clojure.spec.alpha :as s] - [clojure.test :refer [deftest is testing]] - [muuntaja.core :as m] - [reitit.coercion :as coercion] - [reitit.coercion.spec] - [reitit.ring :as ring] - [reitit.ring.coercion] - [reitit.ring.middleware.exception :as exception] - [ring.util.http-response :as http-response]) - (:import - (java.sql SQLException SQLWarning))) + (:require [clojure.spec.alpha :as s] + [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion :as coercion] + [reitit.coercion.spec] + [reitit.ring :as ring] + [reitit.ring.coercion] + [reitit.ring.middleware.exception :as exception] + [ring.util.http-response :as http-response]) + (:import (java.sql SQLException SQLWarning))) (derive ::kikka ::kukka) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index c714940c..8442b5a0 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -1,10 +1,9 @@ (ns reitit.ring.middleware.muuntaja-test - (:require - [clojure.test :refer [deftest is testing]] - [muuntaja.core :as m] - [reitit.ring :as ring] - [reitit.ring.middleware.muuntaja :as muuntaja] - [reitit.swagger :as swagger])) + (:require [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.ring :as ring] + [reitit.ring.middleware.muuntaja :as muuntaja] + [reitit.swagger :as swagger])) (deftest muuntaja-test (let [data {:kikka "kukka"} diff --git a/test/clj/reitit/ring/middleware/parameters_test.clj b/test/clj/reitit/ring/middleware/parameters_test.clj index dc15c253..dec3f9d5 100644 --- a/test/clj/reitit/ring/middleware/parameters_test.clj +++ b/test/clj/reitit/ring/middleware/parameters_test.clj @@ -1,9 +1,8 @@ (ns reitit.ring.middleware.parameters-test - (:require - [clojure.test :refer [deftest is testing]] - [reitit.ring :as ring] - [reitit.ring.middleware.parameters :as parameters] - [reitit.swagger :as swagger])) + (:require [clojure.test :refer [deftest is testing]] + [reitit.ring :as ring] + [reitit.ring.middleware.parameters :as parameters] + [reitit.swagger :as swagger])) (deftest parameters-test (let [app (ring/ring-handler diff --git a/test/cljc/reitit/coercion_test.cljc b/test/cljc/reitit/coercion_test.cljc index 0a1a4aaa..97ab0aae 100644 --- a/test/cljc/reitit/coercion_test.cljc +++ b/test/cljc/reitit/coercion_test.cljc @@ -1,17 +1,15 @@ (ns reitit.coercion-test - (:require - [clojure.test :refer [deftest is testing]] - [malli.experimental.lite :as l] - [reitit.coercion :as coercion] - [reitit.coercion.malli] - [reitit.coercion.schema] - [reitit.coercion.spec] - [reitit.core :as r] - [schema.core :as s] - [spec-tools.data-spec :as ds]) + (:require [clojure.test :refer [deftest is testing]] + [malli.experimental.lite :as l] + [reitit.coercion :as coercion] + [reitit.coercion.malli] + [reitit.coercion.schema] + [reitit.coercion.spec] + [reitit.core :as r] + [schema.core :as s] + [spec-tools.data-spec :as ds]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (deftest coercion-test (let [r (r/router diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 8186184b..1780982c 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -1,12 +1,10 @@ (ns reitit.core-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.core :as r #?@(:cljs [:refer [Router]])] - [reitit.impl :as impl]) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.core :as r #?@(:cljs [:refer [Router]])] + [reitit.impl :as impl]) #?(:clj - (:import - (clojure.lang ExceptionInfo) - (reitit.core Router)))) + (:import (clojure.lang ExceptionInfo) + (reitit.core Router)))) (deftest reitit-test diff --git a/test/cljc/reitit/dependency_test.cljc b/test/cljc/reitit/dependency_test.cljc index 8795c3ad..eff7b5a1 100644 --- a/test/cljc/reitit/dependency_test.cljc +++ b/test/cljc/reitit/dependency_test.cljc @@ -1,9 +1,7 @@ (ns reitit.dependency-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.dependency :as rc]) - #?(:clj (:import - [clojure.lang ExceptionInfo]))) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.dependency :as rc]) + #?(:clj (:import [clojure.lang ExceptionInfo]))) (deftest post-order-test (let [base-middlewares [{:name ::bar, :provides #{:bar}, :requires #{:foo}, :wrap identity} diff --git a/test/cljc/reitit/exception_test.cljc b/test/cljc/reitit/exception_test.cljc index c73bf1ea..bb77421d 100644 --- a/test/cljc/reitit/exception_test.cljc +++ b/test/cljc/reitit/exception_test.cljc @@ -1,14 +1,12 @@ (ns reitit.exception-test - (:require - [clojure.spec.alpha :as s] - [clojure.test :refer [are deftest is testing]] - [reitit.core :as r] - [reitit.dev.pretty :as pretty] - [reitit.exception :as exception] - [reitit.spec :as rs]) + (:require [clojure.spec.alpha :as s] + [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.dev.pretty :as pretty] + [reitit.exception :as exception] + [reitit.spec :as rs]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (s/def ::role #{:admin :manager}) (s/def ::roles (s/coll-of ::role :into #{})) diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index b6a4c204..526c140c 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -1,7 +1,6 @@ (ns reitit.impl-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.impl :as impl])) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.impl :as impl])) (deftest strip-nils-test (is (= {:a 1, :c false} (impl/strip-nils {:a 1, :b nil, :c false})))) diff --git a/test/cljc/reitit/interceptor_test.cljc b/test/cljc/reitit/interceptor_test.cljc index e4f510ba..185db2db 100644 --- a/test/cljc/reitit/interceptor_test.cljc +++ b/test/cljc/reitit/interceptor_test.cljc @@ -1,11 +1,9 @@ (ns reitit.interceptor-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.core :as r] - [reitit.interceptor :as interceptor]) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.interceptor :as interceptor]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (def ctx (interceptor/context [])) diff --git a/test/cljc/reitit/middleware_test.cljc b/test/cljc/reitit/middleware_test.cljc index df508b5f..0b7bb05e 100644 --- a/test/cljc/reitit/middleware_test.cljc +++ b/test/cljc/reitit/middleware_test.cljc @@ -1,11 +1,9 @@ (ns reitit.middleware-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.core :as r] - [reitit.middleware :as middleware]) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.core :as r] + [reitit.middleware :as middleware]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (def request []) diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index 3c5582a7..cf4c9092 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -1,21 +1,19 @@ (ns reitit.ring-coercion-test - (:require - [clojure.test :refer [deftest is testing]] - [malli.experimental.lite :as l] - #?@(:clj [[muuntaja.middleware] + (:require [clojure.test :refer [deftest is testing]] + [malli.experimental.lite :as l] + #?@(:clj [[muuntaja.middleware] [jsonista.core :as j]]) - [reitit.coercion.malli :as malli] - [reitit.coercion.schema :as schema] - [reitit.coercion.spec :as spec] - [reitit.core :as r] - [reitit.ring :as ring] - [reitit.ring.coercion :as rrc] - [schema.core :as s] - [spec-tools.data-spec :as ds]) + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.core :as r] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [schema.core :as s] + [spec-tools.data-spec :as ds]) #?(:clj - (:import - (clojure.lang ExceptionInfo) - (java.io ByteArrayInputStream)))) + (:import (clojure.lang ExceptionInfo) + (java.io ByteArrayInputStream)))) (defn mounted-middleware [app path method] (->> app diff --git a/test/cljc/reitit/ring_spec_test.cljc b/test/cljc/reitit/ring_spec_test.cljc index 4822401b..1112342b 100644 --- a/test/cljc/reitit/ring_spec_test.cljc +++ b/test/cljc/reitit/ring_spec_test.cljc @@ -1,15 +1,13 @@ (ns reitit.ring-spec-test - (:require - [clojure.spec.alpha :as s] - [clojure.test :refer [deftest is testing]] - [reitit.coercion.spec] - [reitit.core :as r] - [reitit.ring :as ring] - [reitit.ring.coercion :as rrc] - [reitit.ring.spec :as rrs]) + (:require [clojure.spec.alpha :as s] + [clojure.test :refer [deftest is testing]] + [reitit.coercion.spec] + [reitit.core :as r] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [reitit.ring.spec :as rrs]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (s/def ::role #{:admin :user}) (s/def ::roles (s/and (s/coll-of ::role :into #{}) set?)) diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 5bf05d52..d7b9f8f4 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -1,14 +1,12 @@ (ns reitit.ring-test - (:require - [clojure.set :as set] - [clojure.test :refer [deftest is testing]] - [reitit.core :as r] - [reitit.middleware :as middleware] - [reitit.ring :as ring] - [reitit.trie :as trie]) + (:require [clojure.set :as set] + [clojure.test :refer [deftest is testing]] + [reitit.core :as r] + [reitit.middleware :as middleware] + [reitit.ring :as ring] + [reitit.trie :as trie]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (defn mw [handler name] (fn diff --git a/test/cljc/reitit/spec_test.cljc b/test/cljc/reitit/spec_test.cljc index 55d84fc0..e2717989 100644 --- a/test/cljc/reitit/spec_test.cljc +++ b/test/cljc/reitit/spec_test.cljc @@ -1,13 +1,11 @@ (ns reitit.spec-test - (:require - [#?(:clj clojure.spec.test.alpha :cljs cljs.spec.test.alpha) :as stest] - [clojure.spec.alpha :as s] - [clojure.test :refer [are deftest is testing use-fixtures]] - [reitit.core :as r] - [reitit.spec :as rs]) + (:require [#?(:clj clojure.spec.test.alpha :cljs cljs.spec.test.alpha) :as stest] + [clojure.spec.alpha :as s] + [clojure.test :refer [are deftest is testing use-fixtures]] + [reitit.core :as r] + [reitit.spec :as rs]) #?(:clj - (:import - (clojure.lang ExceptionInfo)))) + (:import (clojure.lang ExceptionInfo)))) (defn instrument-all [f] (try diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index 4110b190..d1b2c81b 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -1,16 +1,15 @@ (ns reitit.swagger-test - (:require - [clojure.test :refer [deftest is testing]] - [muuntaja.core :as m] - [reitit.coercion.malli :as malli] - [reitit.coercion.schema :as schema] - [reitit.coercion.spec :as spec] - [reitit.ring :as ring] - [reitit.ring.coercion :as rrc] - [reitit.swagger :as swagger] - [reitit.swagger-ui :as swagger-ui] - [schema.core :as s] - [spec-tools.data-spec :as ds])) + (:require [clojure.test :refer [deftest is testing]] + [muuntaja.core :as m] + [reitit.coercion.malli :as malli] + [reitit.coercion.schema :as schema] + [reitit.coercion.spec :as spec] + [reitit.ring :as ring] + [reitit.ring.coercion :as rrc] + [reitit.swagger :as swagger] + [reitit.swagger-ui :as swagger-ui] + [schema.core :as s] + [spec-tools.data-spec :as ds])) (def app (ring/ring-handler diff --git a/test/cljc/reitit/trie_test.cljc b/test/cljc/reitit/trie_test.cljc index 1828b12b..7b252bc6 100644 --- a/test/cljc/reitit/trie_test.cljc +++ b/test/cljc/reitit/trie_test.cljc @@ -1,7 +1,6 @@ (ns reitit.trie-test - (:require - [clojure.test :refer [are deftest is testing]] - [reitit.trie :as trie])) + (:require [clojure.test :refer [are deftest is testing]] + [reitit.trie :as trie])) (deftest into-set-test (is (= #{} (trie/into-set nil))) From 2f31f658ccc081d7b584a0b804a6c64505ab4d60 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 14 Feb 2022 17:48:51 +0200 Subject: [PATCH 080/113] malli 0.8.2 --- CHANGELOG.md | 2 +- project.clj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ff005f..94b2b49b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Mon, 14 Feb 2022 17:52:32 +0200 Subject: [PATCH 081/113] 0.5.16-SNAPSHOT --- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 33 files changed, 60 insertions(+), 60 deletions(-) diff --git a/examples/buddy-auth/project.clj b/examples/buddy-auth/project.clj index 237773a6..8908b248 100644 --- a/examples/buddy-auth/project.clj +++ b/examples/buddy-auth/project.clj @@ -2,6 +2,6 @@ :description "Reitit Buddy Auth App" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.8.1"] - [metosin/reitit "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] [buddy "2.0.0"]] :repl-options {:init-ns example.server}) diff --git a/examples/frontend-auth/project.clj b/examples/frontend-auth/project.clj index a5b3bf58..e40af026 100644 --- a/examples/frontend-auth/project.clj +++ b/examples/frontend-auth/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.15"] - [metosin/reitit-schema "0.5.15"] - [metosin/reitit-frontend "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-schema "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-controllers/project.clj b/examples/frontend-controllers/project.clj index a5b3bf58..e40af026 100644 --- a/examples/frontend-controllers/project.clj +++ b/examples/frontend-controllers/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.15"] - [metosin/reitit-schema "0.5.15"] - [metosin/reitit-frontend "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-schema "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-links/project.clj b/examples/frontend-links/project.clj index c48b8ec5..f3063c57 100644 --- a/examples/frontend-links/project.clj +++ b/examples/frontend-links/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.15"] - [metosin/reitit-spec "0.5.15"] - [metosin/reitit-frontend "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-spec "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-prompt/project.clj b/examples/frontend-prompt/project.clj index c48b8ec5..f3063c57 100644 --- a/examples/frontend-prompt/project.clj +++ b/examples/frontend-prompt/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.15"] - [metosin/reitit-spec "0.5.15"] - [metosin/reitit-frontend "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-spec "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-re-frame/project.clj b/examples/frontend-re-frame/project.clj index 694ede82..0c997ef5 100644 --- a/examples/frontend-re-frame/project.clj +++ b/examples/frontend-re-frame/project.clj @@ -1,7 +1,7 @@ (defproject frontend-re-frame "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.10.0"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] [reagent "0.8.1"] [re-frame "0.10.6"]] diff --git a/examples/frontend/project.clj b/examples/frontend/project.clj index 75f999b0..0f2a5eb6 100644 --- a/examples/frontend/project.clj +++ b/examples/frontend/project.clj @@ -10,9 +10,9 @@ [ring "1.8.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.773"] - [metosin/reitit "0.5.15"] - [metosin/reitit-spec "0.5.15"] - [metosin/reitit-frontend "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-spec "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.23"]] diff --git a/examples/http-swagger/project.clj b/examples/http-swagger/project.clj index 6a99a2e2..d2a2ec55 100644 --- a/examples/http-swagger/project.clj +++ b/examples/http-swagger/project.clj @@ -3,5 +3,5 @@ :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] [aleph "0.4.7-alpha5"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/http/project.clj b/examples/http/project.clj index 5484918a..13cb9115 100644 --- a/examples/http/project.clj +++ b/examples/http/project.clj @@ -5,5 +5,5 @@ [funcool/promesa "1.9.0"] [manifold "0.1.8"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/just-coercion-with-ring/project.clj b/examples/just-coercion-with-ring/project.clj index c339536c..da8d5aa0 100644 --- a/examples/just-coercion-with-ring/project.clj +++ b/examples/just-coercion-with-ring/project.clj @@ -2,4 +2,4 @@ :description "Reitit coercion with vanilla ring" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]]) + [metosin/reitit "0.5.16-SNAPSHOT"]]) diff --git a/examples/pedestal-swagger/project.clj b/examples/pedestal-swagger/project.clj index 876382fd..89860540 100644 --- a/examples/pedestal-swagger/project.clj +++ b/examples/pedestal-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.15"] - [metosin/reitit "0.5.15"]] + [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/pedestal/project.clj b/examples/pedestal/project.clj index 876382fd..89860540 100644 --- a/examples/pedestal/project.clj +++ b/examples/pedestal/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.15"] - [metosin/reitit "0.5.15"]] + [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-example/project.clj b/examples/ring-example/project.clj index 99ed61b4..b4bcd759 100644 --- a/examples/ring-example/project.clj +++ b/examples/ring-example/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-integrant/project.clj b/examples/ring-integrant/project.clj index e66dd45f..30020485 100644 --- a/examples/ring-integrant/project.clj +++ b/examples/ring-integrant/project.clj @@ -2,7 +2,7 @@ :description "Reitit Ring App with Integrant" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"] + [metosin/reitit "0.5.16-SNAPSHOT"] [integrant "0.7.0"]] :main example.server :repl-options {:init-ns user} diff --git a/examples/ring-malli-swagger/project.clj b/examples/ring-malli-swagger/project.clj index 9a0d997e..9c16ad1c 100644 --- a/examples/ring-malli-swagger/project.clj +++ b/examples/ring-malli-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [metosin/jsonista "0.2.6"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-spec-swagger/project.clj b/examples/ring-spec-swagger/project.clj index aa7103f0..d7a2c84e 100644 --- a/examples/ring-spec-swagger/project.clj +++ b/examples/ring-spec-swagger/project.clj @@ -2,6 +2,6 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-swagger/project.clj b/examples/ring-swagger/project.clj index 135fc565..c18e2538 100644 --- a/examples/ring-swagger/project.clj +++ b/examples/ring-swagger/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.15"]] + [metosin/reitit "0.5.16-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/modules/reitit-core/project.clj b/modules/reitit-core/project.clj index 1030a3c6..19bdf9c7 100644 --- a/modules/reitit-core/project.clj +++ b/modules/reitit-core/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-core "0.5.15" +(defproject metosin/reitit-core "0.5.16-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-dev/project.clj b/modules/reitit-dev/project.clj index 507b0204..16942fb8 100644 --- a/modules/reitit-dev/project.clj +++ b/modules/reitit-dev/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-dev "0.5.15" +(defproject metosin/reitit-dev "0.5.16-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-frontend/project.clj b/modules/reitit-frontend/project.clj index 84f02bc4..cc8c86cd 100644 --- a/modules/reitit-frontend/project.clj +++ b/modules/reitit-frontend/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-frontend "0.5.15" +(defproject metosin/reitit-frontend "0.5.16-SNAPSHOT" :description "Reitit: Clojurescript frontend routing core" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-http/project.clj b/modules/reitit-http/project.clj index c4aa584b..abf5c8fd 100644 --- a/modules/reitit-http/project.clj +++ b/modules/reitit-http/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-http "0.5.15" +(defproject metosin/reitit-http "0.5.16-SNAPSHOT" :description "Reitit: HTTP routing with interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-interceptors/project.clj b/modules/reitit-interceptors/project.clj index 00c326f4..05411dac 100644 --- a/modules/reitit-interceptors/project.clj +++ b/modules/reitit-interceptors/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-interceptors "0.5.15" +(defproject metosin/reitit-interceptors "0.5.16-SNAPSHOT" :description "Reitit, common interceptors bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-malli/project.clj b/modules/reitit-malli/project.clj index 6c456fd4..65e1fc64 100644 --- a/modules/reitit-malli/project.clj +++ b/modules/reitit-malli/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-malli "0.5.15" +(defproject metosin/reitit-malli "0.5.16-SNAPSHOT" :description "Reitit: Malli coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-middleware/project.clj b/modules/reitit-middleware/project.clj index 9c52873d..e825dca0 100644 --- a/modules/reitit-middleware/project.clj +++ b/modules/reitit-middleware/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-middleware "0.5.15" +(defproject metosin/reitit-middleware "0.5.16-SNAPSHOT" :description "Reitit, common middleware bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-pedestal/project.clj b/modules/reitit-pedestal/project.clj index b913876e..80ffccea 100644 --- a/modules/reitit-pedestal/project.clj +++ b/modules/reitit-pedestal/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-pedestal "0.5.15" +(defproject metosin/reitit-pedestal "0.5.16-SNAPSHOT" :description "Reitit + Pedestal Integration" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-ring/project.clj b/modules/reitit-ring/project.clj index 66c54555..99f863c4 100644 --- a/modules/reitit-ring/project.clj +++ b/modules/reitit-ring/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-ring "0.5.15" +(defproject metosin/reitit-ring "0.5.16-SNAPSHOT" :description "Reitit: Ring routing" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-schema/project.clj b/modules/reitit-schema/project.clj index e822fbb9..0ba7a789 100644 --- a/modules/reitit-schema/project.clj +++ b/modules/reitit-schema/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-schema "0.5.15" +(defproject metosin/reitit-schema "0.5.16-SNAPSHOT" :description "Reitit: Plumatic Schema coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-sieppari/project.clj b/modules/reitit-sieppari/project.clj index 996aa6a1..36925423 100644 --- a/modules/reitit-sieppari/project.clj +++ b/modules/reitit-sieppari/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-sieppari "0.5.15" +(defproject metosin/reitit-sieppari "0.5.16-SNAPSHOT" :description "Reitit: Sieppari Interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-spec/project.clj b/modules/reitit-spec/project.clj index 78d8b4af..983af588 100644 --- a/modules/reitit-spec/project.clj +++ b/modules/reitit-spec/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-spec "0.5.15" +(defproject metosin/reitit-spec "0.5.16-SNAPSHOT" :description "Reitit: clojure.spec coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger-ui/project.clj b/modules/reitit-swagger-ui/project.clj index edbe8789..94ecb68b 100644 --- a/modules/reitit-swagger-ui/project.clj +++ b/modules/reitit-swagger-ui/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger-ui "0.5.15" +(defproject metosin/reitit-swagger-ui "0.5.16-SNAPSHOT" :description "Reitit: Swagger-ui support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger/project.clj b/modules/reitit-swagger/project.clj index 4178a895..ee608d13 100644 --- a/modules/reitit-swagger/project.clj +++ b/modules/reitit-swagger/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger "0.5.15" +(defproject metosin/reitit-swagger "0.5.16-SNAPSHOT" :description "Reitit: Swagger-support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit/project.clj b/modules/reitit/project.clj index 525c96b2..2188f302 100644 --- a/modules/reitit/project.clj +++ b/modules/reitit/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit "0.5.15" +(defproject metosin/reitit "0.5.16-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/project.clj b/project.clj index 9434d85d..88b19bec 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-parent "0.5.15" +(defproject metosin/reitit-parent "0.5.16-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" @@ -12,21 +12,21 @@ :url "https://github.com/metosin/reitit"} ;; TODO: need to verify that the code actually worked with Java1.8, see #242 :javac-options ["-Xlint:unchecked" "-target" "1.8" "-source" "1.8"] - :managed-dependencies [[metosin/reitit "0.5.15"] - [metosin/reitit-core "0.5.15"] - [metosin/reitit-dev "0.5.15"] - [metosin/reitit-spec "0.5.15"] - [metosin/reitit-malli "0.5.15"] - [metosin/reitit-schema "0.5.15"] - [metosin/reitit-ring "0.5.15"] - [metosin/reitit-middleware "0.5.15"] - [metosin/reitit-http "0.5.15"] - [metosin/reitit-interceptors "0.5.15"] - [metosin/reitit-swagger "0.5.15"] - [metosin/reitit-swagger-ui "0.5.15"] - [metosin/reitit-frontend "0.5.15"] - [metosin/reitit-sieppari "0.5.15"] - [metosin/reitit-pedestal "0.5.15"] + :managed-dependencies [[metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit-core "0.5.16-SNAPSHOT"] + [metosin/reitit-dev "0.5.16-SNAPSHOT"] + [metosin/reitit-spec "0.5.16-SNAPSHOT"] + [metosin/reitit-malli "0.5.16-SNAPSHOT"] + [metosin/reitit-schema "0.5.16-SNAPSHOT"] + [metosin/reitit-ring "0.5.16-SNAPSHOT"] + [metosin/reitit-middleware "0.5.16-SNAPSHOT"] + [metosin/reitit-http "0.5.16-SNAPSHOT"] + [metosin/reitit-interceptors "0.5.16-SNAPSHOT"] + [metosin/reitit-swagger "0.5.16-SNAPSHOT"] + [metosin/reitit-swagger-ui "0.5.16-SNAPSHOT"] + [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit-sieppari "0.5.16-SNAPSHOT"] + [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] [metosin/ring-swagger-ui "4.3.0"] [metosin/spec-tools "0.10.5"] [metosin/schema-tools "0.12.3"] From 0ac3a14805bb00831a9fea817f334a37b6736318 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 15 Feb 2022 13:37:12 +0200 Subject: [PATCH 082/113] initial commit --- examples/ring-malli-lite-swagger/.gitignore | 11 ++ examples/ring-malli-lite-swagger/README.md | 23 ++++ examples/ring-malli-lite-swagger/project.clj | 8 ++ .../resources/reitit.png | Bin 0 -> 506325 bytes .../src/example/server.clj | 129 ++++++++++++++++++ examples/ring-malli-lite-swagger/swagger.png | Bin 0 -> 233651 bytes .../test/example/server_test.clj | 38 ++++++ 7 files changed, 209 insertions(+) create mode 100644 examples/ring-malli-lite-swagger/.gitignore create mode 100644 examples/ring-malli-lite-swagger/README.md create mode 100644 examples/ring-malli-lite-swagger/project.clj create mode 100644 examples/ring-malli-lite-swagger/resources/reitit.png create mode 100644 examples/ring-malli-lite-swagger/src/example/server.clj create mode 100644 examples/ring-malli-lite-swagger/swagger.png create mode 100644 examples/ring-malli-lite-swagger/test/example/server_test.clj diff --git a/examples/ring-malli-lite-swagger/.gitignore b/examples/ring-malli-lite-swagger/.gitignore new file mode 100644 index 00000000..c53038ec --- /dev/null +++ b/examples/ring-malli-lite-swagger/.gitignore @@ -0,0 +1,11 @@ +/target +/classes +/checkouts +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +.hgignore +.hg/ diff --git a/examples/ring-malli-lite-swagger/README.md b/examples/ring-malli-lite-swagger/README.md new file mode 100644 index 00000000..3a2144c2 --- /dev/null +++ b/examples/ring-malli-lite-swagger/README.md @@ -0,0 +1,23 @@ +# reitit-ring, malli, swagger + +## Usage + +```clj +> lein repl +(start) +``` + +To test the endpoints using [httpie](https://httpie.org/): + +```bash +http GET :3000/math/plus x==1 y==20 +http POST :3000/math/plus x:=1 y:=20 + +http GET :3000/swagger.json +``` + + + +## License + +Copyright © 2017-2019 Metosin Oy diff --git a/examples/ring-malli-lite-swagger/project.clj b/examples/ring-malli-lite-swagger/project.clj new file mode 100644 index 00000000..9c16ad1c --- /dev/null +++ b/examples/ring-malli-lite-swagger/project.clj @@ -0,0 +1,8 @@ +(defproject ring-example "0.1.0-SNAPSHOT" + :description "Reitit Ring App with Swagger" + :dependencies [[org.clojure/clojure "1.10.0"] + [metosin/jsonista "0.2.6"] + [ring/ring-jetty-adapter "1.7.1"] + [metosin/reitit "0.5.16-SNAPSHOT"]] + :repl-options {:init-ns example.server} + :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-malli-lite-swagger/resources/reitit.png b/examples/ring-malli-lite-swagger/resources/reitit.png new file mode 100644 index 0000000000000000000000000000000000000000..c89c3654889a6c3a146f404a4fb4f24111477333 GIT binary patch literal 506325 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

I&&*DVD+A=oFO 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 D7ra$i;r}%Tp^pMb$l%$n@bYr`}dI1 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%0AJ|x@8s!$?DM%S|2Mv9wg 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

-Ea-aB+*UMya70x{tj?G4`M0D6 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 QI|q}9mK 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

*$K+^zFa5GZQ&&}!p38tdwQ4H9Qn+;YB2ge) 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 YaQDfSvkj$kT=0*En)dO;V`qH-52_+2(f|Me literal 0 HcmV?d00001 diff --git a/examples/ring-malli-lite-swagger/src/example/server.clj b/examples/ring-malli-lite-swagger/src/example/server.clj new file mode 100644 index 00000000..bc9c3861 --- /dev/null +++ b/examples/ring-malli-lite-swagger/src/example/server.clj @@ -0,0 +1,129 @@ +(ns example.server + (:require [reitit.ring :as ring] + [reitit.coercion.malli] + [reitit.ring.malli] + [reitit.swagger :as swagger] + [reitit.swagger-ui :as swagger-ui] + [reitit.ring.coercion :as coercion] + [reitit.dev.pretty :as pretty] + [reitit.ring.middleware.muuntaja :as muuntaja] + [reitit.ring.middleware.exception :as exception] + [reitit.ring.middleware.multipart :as multipart] + [reitit.ring.middleware.parameters :as parameters] + ; [reitit.ring.middleware.dev :as dev] + ; [reitit.ring.spec :as spec] + ; [spec-tools.spell :as spell] + [ring.adapter.jetty :as jetty] + [muuntaja.core :as m] + [clojure.java.io :as io] + [malli.util :as mu])) + +(def app + (ring/ring-handler + (ring/router + [["/swagger.json" + {:get {:no-doc true + :swagger {:info {:title "my-api" + :description "with [malli](https://github.com/metosin/malli) and reitit-ring"} + :tags [{:name "files", :description "file api"} + {:name "math", :description "math api"}]} + :handler (swagger/create-swagger-handler)}}] + + ["/files" + {:swagger {:tags ["files"]}} + + ["/upload" + {:post {:summary "upload a file" + :parameters {:multipart [:map [:file reitit.ring.malli/temp-file-part]]} + :responses {200 {:body [:map [:name string?] [:size int?]]}} + :handler (fn [{{{:keys [file]} :multipart} :parameters}] + {:status 200 + :body {:name (:filename file) + :size (:size file)}})}}] + + ["/download" + {:get {:summary "downloads a file" + :swagger {:produces ["image/png"]} + :handler (fn [_] + {:status 200 + :headers {"Content-Type" "image/png"} + :body (-> "reitit.png" + (io/resource) + (io/input-stream))})}}]] + + ["/math" + {:swagger {:tags ["math"]}} + + ["/plus" + {:get {:summary "plus with malli query parameters" + :parameters {:query [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} + :responses {200 {:body [:map [:total int?]]}} + :handler (fn [{{{:keys [x y]} :query} :parameters}] + {:status 200 + :body {:total (+ x y)}})} + :post {:summary "plus with malli body parameters" + :parameters {:body [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} + :responses {200 {:body [:map [:total int?]]}} + :handler (fn [{{{:keys [x y]} :body} :parameters}] + {:status 200 + :body {:total (+ x y)}})}}]]] + + {;;:reitit.middleware/transform dev/print-request-diffs ;; pretty diffs + ;;:validate spec/validate ;; enable spec validation for route data + ;;:reitit.spec/wrap spell/closed ;; strict top-level validation + :exception pretty/exception + :data {:coercion (reitit.coercion.malli/create + {;; set of keys to include in error messages + :error-keys #{#_:type :coercion :in :schema :value :errors :humanized #_:transformed} + ;; schema identity function (default: close all map schemas) + :compile mu/closed-schema + ;; strip-extra-keys (effects only predefined transformers) + :strip-extra-keys true + ;; add/set default values + :default-values true + ;; malli options + :options nil}) + :muuntaja m/instance + :middleware [;; swagger feature + swagger/swagger-feature + ;; query-params & form-params + parameters/parameters-middleware + ;; content-negotiation + muuntaja/format-negotiate-middleware + ;; encoding response body + muuntaja/format-response-middleware + ;; exception handling + exception/exception-middleware + ;; decoding request body + muuntaja/format-request-middleware + ;; coercing response bodys + coercion/coerce-response-middleware + ;; coercing request parameters + coercion/coerce-request-middleware + ;; multipart + multipart/multipart-middleware]}}) + (ring/routes + (swagger-ui/create-swagger-ui-handler + {:path "/" + :config {:validatorUrl nil + :operationsSorter "alpha"}}) + (ring/create-default-handler)))) + +(defn start [] + (jetty/run-jetty #'app {:port 3000, :join? false}) + (println "server running in port 3000")) + +(comment + (start)) diff --git a/examples/ring-malli-lite-swagger/swagger.png b/examples/ring-malli-lite-swagger/swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5a55b8c5edaa315c4c02ada18854974b20a306 GIT binary patch literal 233651 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

*7{$!8jkh*<3 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 z z{TY7)r#AiR9GlV(y-3efkm2IfUV&(cs(IINOO21?B~`q$tF7RD$b;c*_YdeVJh<{! zmr>LJdNAS1R%4yU) zPHF5Souo`j#h{Fk5q!la?d(8@Dc3ImV(B$9h?+q z>t#a6fI7ggLG%Gwc#`N)D8XIf_Y7!#(riZf$&~Kzcz8&|uCUcSDr=e-W!xF*i$Z-- zWWLdgH`DwfEF&PNkkGt68(TZrKVB!aznp(M8~)8@b`i3-NnMrbr}d@joLWO3SDlO3 z?u68k4FjLw*IBZC_`Q($K;w=Xj)Sl;Iav3VJRdd_iAcEs56`F`hZ>1`Vr#VG6y@7d z6GMQmOlD(FSrenxja5Z;tsq$q;^``@x3y!Pn=R=!MVF;lFkc=Q-0{jcc{LSTzTpXG zxRFZ~dg_wn5y_-|R=sWziheW2k92jNCZ*<}F-*2Ww&m^lR8EK!U`Cl;4n%?gtDC8D z>{#2HT$|1Paa&yCVv`xcifK7`6Oy#)9i$d%YqfEhF)5WkwKe2Ll=3)z`K}U{Q{b}( z)4_rpr>@EFG)LC@oxR$Wx?vA2D)7U%NCh~K|CDEXw8K2{aJ*F7#lgV#OM1TXpnMQS zB?mirGcc|fUgWctCh>15qO^3GgkSB*GYwK$jrAL0)HOKBt~qz4s$Nm`^vK5 zkkfW^+JxpwJ_lscQy|8#Fi^~laLVLzN+xo}OwI2=p@Un=dAQY)>z7ijeie8dFEh|o zywI|g69Oq05g2!{%gH?HtzK(YHQNX2*vsy>kjn;wS#)4imxqt+&N}*G)@Fwj@>HA zuX}C(U{7GWpI}y@l_r5{3@j{=7&Fosdn3W`VmV80<(r}Rv*k?_)~RV%Kix_{zC

f7Ww&kjt#FQ{L8dIiTi#KOQMSat$v<@a#yW0~--{Hmja$URC~p!v1iBs`HR znC6lFBNl8unTXbjS?e&s8CeQ`CRUdZq2UFOm1)F5GsYbv!`oek2||I!d4N=qbi3Q&%@yuRr{&jUZYrp3z7 zc`j*W{+BeOGciJCX_8xwEZ;kxT;tSnZTZ#vKA-#F4V)}AfsaIY=`_RYXqO$EYHYpR?h!h2+b3sw11V< zzd(j=>#G)v?!#ut(9`+M`> zVwb<*?*CehN=r%PEnxrp{ONf^?z&ByynwyFD;>ENQ?|SMc?+~i;u+^VXsEhI-BX-(X&kCLDN_}e{F+fEW4@*h^^e(=I{M+-5&|oWmOaeQZsVXwtoQuXCnMl8Tfw>D`O>^DmtL_`ypO zuPbm9cAf^3bldH(ZcEH} z>EXUL%Lvi@`)w(wi`Q<42=u2ERySEUF*^Nl?-Q4n6+NRq959w2FOFjNNCKG383D7{ z1vs^Wcd{DTY6OP+PyF~#;7e;(64m|p?+tMN%DKXLuPAD?u2 z9#eFSGblRgR!;_Fnk zX6DMzvLON1`Q@w%)9|jHmn4ET;_yPZ{&i~bke1E2-BtWlQ>xdqI3462_5-`#?6+*< zNaQHC%_!B&1>5bca30&7?h*R&5>Kt==O9U^l=R)^2?GW|D}&vR3JL%9QglBYyqZHM zvgC6dMeIl9F70t66dK6?Ox%PCl)-*T!-MD*&*J_!2b(lRY2-3OorcQf6*rJ zb39Gnh{B#{T#2{i&B?8tJX?Y)gyfrGGsupv-@YhXcjj|cdQb^bQyh@mv z9^fp4Y)#rYtPBfeFr~Ub#<2496VKxwQ&6qbzVINJe3=rbQT z)OD3}%oTy3Y*Gb(T{lVZvh$sE9~+-8zjp$2Lx&!CpDL$iRl0|otxOAC!`60U`cxtiB|sFLlJs+!Mq(5w*WcICtm8Ji28tfd@8iid6U zPPr1VhLRHSs#{NJKrhV?D_N9apUcdhEEaO%np14Ym6S6wDqzK6Wtlo4tjYaHRG;_} zwWi^E^LtDk(@)~8D*l-Ez=!_L={_Heu9<9-e#HgMm@Q;lwlht4H!a4m`E_BY+aN%V zG!lFC>ekIv@%w#737^i%6NM--(WX<8TRpJ#2;ZIIzlP>?ATtUIPGv6f*c&uFcB!|o z+$+BZqzIjjVJ17Xs9-Nu-D(ThKEd%*DR+#LTbV1UV(3C)gYnBl+;kV?B?A1b=;sd1 zLUFQfbK^p6SBYhe=Q`S2n!C;BQk!v^8uP+1)@*UzRq6oY36`I z54J8kp3V9nCMhb!8o(mdWwB;C?3@TmyW?+Skn6oEiQMoQcv{x2s>Q6eMN#X6cqugphUf{SIYZs1RAF>DY6D0UFufB`w5tsFf%z2Kx2ere0;4qT7%BQ(+2{+7G+NvivhC1iwqENuGH$`)d-lih#W9LvaiT%zz!qq!Ut5 z;bbRKHpQ0snEKCMa3RMZJzc7wl5;;c8_n|yPdzHs!ou&L6s>=gH%kZ>*MX=A4Zatp zy&qfU;H9|?m$8o18S7bu_jdm{qE*a-Rx0+7(!QqM@EAF42%a2%2~UK14|3Wdk}YRr z`Q$kKhTh4KFIQc=Wd%bUE56RzQZX?6EolBIXhDH~lcS~K8vRk^IridO^_QoRGcsn9 zkCVmbIWBxxW}2vJxH@(x)X)swl6L@*y{GZ;i%RTFOEXoNznAS;CfqrpW>4bv7~^)#fF%;a`NWx{BV$e- zr!jEe1jd+n7F&fD3=z<$GzI|A4Peu6kYeA2pB#Z-m4U^}8(ew0lAXtIX@71UuzdVn z+dAXOKm3i#P9o%Z1?t;G)0_y6L)UmjDUm(2wi{LKbQn%_Qm?Z-haDzmGOm-Lgxz@P z_37S`urSI{dh39i-L6AGpU~o=uATdnP?|Un!h4-HRX(0LbfZUwo+2uXwJK5ZDK;eeIUrsAl?o-F0gGFZ{G}^{F;>?b;+% z`%%5`a{KX)F88$W!AepxW;GmE+pCC~m~MRA-QMeW>WT85R?uklZcupPl*`NAtmE0I zC{k5-_=y2o_a|RhxXt8PPm2)Hzteme#q<}db zO);T>*FvnEIccIlOP`DB3rN%im6YUA&6Vwkyce5IS~GCpjP+|Cx#C`#;_`TBxfV;` z&}BAJkXxNq%{dHb2vhxRxX_Dgd{+8eYamtp@}BWom+)MGsU^|Na8lur`&ct=W=T?E z)jvv%)P%}bx1t=ACH;csTXI+Cp2H%^Q~rx+cSu8M)KN87#L&YZFXB^cd*91}@Ak8a zJU10ug({e)H3>=xrD0=vZ(g$7oDe?mQ4wS0maqCl&tzWVb*O> zW23vI^*;8k=uKw3qYVSGqq?!g^$iUTgOh%AZ(~cVUncjO;ue_*Xbf_^)3MLo54Ubh z2a*o|%nCj%fgwHd&G{KM{*bc((WCd^wqi! z0t9DmClgW%uU?QTb$Ba^S=;bb${GL_9)Vi`sN)x<$noP%l*WL1^yZ*xr6EocUDW*Z zZf#>Rq`dL&K)GeLj;zOsbV-n(|F@P%_gW9l*xfZrgE*L~9}W>SgDy^S=A6+8a}cm4 z^h7nzA0&&P5v_faJ3;^IIa#PZiHTU1D_6;~-LAb;Q}-*+LCo=MA>o0_%V1e$#jG{D z0U?6@9+7L3+ZkIZ=?8pZXkRyAAr&0IjDFi*V30Vo>U`Ly3*|rg>d_&8QFd}Uh~us3;3Xn{b`S_cq> z@S5M?1q&eZQz*COr3s9^j#mso^aKa*xK|V2YOs-p81~gucZe>S zBf}HOP4Lrig4L#7K3P zUUk>kiX(uM2KTlG&$x#7vIZv<@e{+JicakD?$zRfdE+NAe(}TG!Gk?_j1R}@2yPG- zR|fk;_Gh3Ah+5|da<$cT?2^w>cX&OATF@rWl^wpZEsx@m>5At$o1*We+P(SEr{PaP z#Tcic4&2&}RZs8_T(}kzHVuOSRzh-Pj(v%@jMoC_!#>rveCH}pqN94N+K^>C!S1rM zIW1a?&QcjwgmRvQlbX)}N6HEOxY zNh(ENRbqC^gscbexy}pd+&N*+bg5D%&unwd_k<6~th=@Jo_-K|lqRUb`G@WxnIjXIGPWjfGMP5#G5g8B~>C4Ec9U5VLccxs`~DJPYU?Ox)g52DHrl`zZw+q&_>+BJGLiU z-fd63JKQyyTS;K5%o#af-7$8{D9{ZDzA$^ae`AlD(im{tkZAw2vAlzK)r zm?L{`s6k5;V6ZpM-x&1kW4AMVD&eO%Za<-@IkEDNEJfB}6M|&Vp#$W0iCA9REx>VRc(1dpVT_lwiS`%KX@t3Q5rynyc?3_W|wi45$9*f(1#*Jp^P zH=Yb$2G~iXHdi#+TQaQM>nvMh9mnfiRK$dDm^9wWW`vGGi8ciaq+Yb1oSbn?aBI}o zsaKP$$|MzNN>w$#C#!1_X#a!>n^SS_x7X)u` zGp_M=%Q=zOB|U1ARbYFkr z4E`lCUa_bmo$Ky+c8g!)m4-pyvGvEOP=(%;6$ASugNH`wo!2Lkw0oXy7Wa53Yl)OD z5(c0x1zV(jiE|#ay`f|kcHJb6ahJcu_vFCd_SWL$gazu)%<=BPr1*hL#C`_#$@+{0 z{q3S2;U?(wywR-Flju}zm51oR?P(+on*NidrbVR7xp1QlODmX3bXkGE-p#}5ESsq} zqW>RzZy8kAwzQ1`fdGLZ3wMX$0fM``ySux)yGxMZ?iSo#gS)%CyWX|W`Of~%-f#BL zTXpN!TeW`7Sxn~W(W7UN?x%Zn3&(r>Vs*32Q$}fWA9Z(oNYF-9E_FE}DGiwACec`jcmsN?lJAsgX(f{l#w1-spj&LEHbi_wXnJ z11rE_7R%l>+Tk>7&8_0~@N5nL6WzVt2;`pi#EZAZM7JY^((RZ03{`1PcV~tB5u z!;8*Qys^2Dj&hmeDUi(97{BqYvQmKYAf+0}{@vfDnd8f(1D(3k>FF)C--fD+jDVb- zJ@K_|`kzDt8UHU$cyv?SsPr4t6BN888K~$P-E}l*e(TlE{&9$ajgz|Kf1WS+BLHVc z3XGwR;-V*o{|098;c)~2BaTwi;pV?nTs**O6AOT-s>o!;r_|-A%t~Yq|MofjE{GCu z5Y?X={;3)T&L_N|8{MljJZ*l;K@%dq7!RNRF6yFy=6i(4<5j~?>(Nn%n{pcK>~^9# z+L9~mc)8E^TQ-WA{P7>n(S)bdYD^PzUH6XqL$RcSVc2_!@w#%^h1d>lCnI8>jqy{1TC4a|~Kja8N>Z8!5 z#yQ;(j;nomx&D4H*?fFdFng$KQ~q1wAx`7j0*|2p!sPj;7vSd@x9(O=1%}3?D<8Il zev3~ON&TxZo10@^^XJr)C3sJ(s(xeVVySW8-^&0#0R)gH*h;^03+g3ySqw&`D_2|j z-_oK$`9~=)>$I|RZ}hTwvs?5=mETG+@Epcml;{H@8({C8x|N@hJl#y||u z7XC6++Z}SA+=<>Z=Mg$Ry2EbN`aQjJfBeUt3X^B60DD47#8|SJ;q7t2OSau_`7kSw zPXIg*AUdx2+W>IP15g`;zDG3i|8}qv3E=lUbin$13@4P92PFAn{0Fs& z{h@~>|DXSyY>r?~mY);qJ)1<`?@y-YA>ohK-{0g(8t|q?)MzTeFD#0apvS=d8ekB@q8K+NHN# zyb&b16=H_Mmstd(R&P)Y9@C_3QGfdDMh9&D4N^TNdWhhAM0;_$6}Z%99_&tpfq`MR zSe=i_WKootmv`iCzXA$2tB}>$sPcS&KA%Xf9{>IO_F7-EWXjRju$$5}`&RXT@8uf~ zh$25gs(}Ftrqczi>!$pfvU0ZKQ3oZr(;v@^E*xMGL$20|Yp&i+@k>HO!-`_161UCt z;uyx68EdYYm9tUSTMUxo*7ifMG_OMgZcH;Z!qK>5;^N`wMkc@=giKOrz1>r-+8`8e zX$DGxFXNk&)L$}f2foDMgBti2+)GS{BnZnMq?Ma`V^@0ZXJm9O$U0E8w%8ndtfnUC zlN(|$o_Cq1IGpq3CsuV-Go5SHtbldw9nCbE8aiUMWcst$9@U)6S+Xk!SC1)Xk$;~0 zM&SgXU+?rZt2c_Zm_Kt@va~Vs*m$FTy*jP!c{>{rt$2&iLJMXK#X_*N(qzAyxY{wB z%1W^PH5dB7?K*|XKlXF(YLF{N{*$!)Y&7QZsg(xHYNN3`X2ZksNZ`?n=J)h_eZ(&# z$=Nk6pW*P>ZmND^ItZ$p-lM5qh}CDfRT{JDtvo zKtiKI16F6OagV57Ul6c-eP47(dY~9`e}9*^mW!)~kbx414*5)n3;-o48k8c+!Oolc zf-K*toGTb9L!8ANNzOOnS1gBhyCwOWEksU2p(lXKm;*ZbF?J=!55YimLZn+x3g7$b zee7x^+1{?Y%7AsBp%RVN-YCO0@tz?q`EkT~5i?qeF=GEZ0-WQC7rI*w%Tu+1X_;ct zyOqBlOFO*~UWZ466jdtn=N;&5|e2?uO*hNQy2kkHEX4UVok}DS_iltvYpKjRPv&-<+8%+JNgd;0!IAH!> zd7eie;er$NiWL!myA&n{Q-eey5~X3DDs|a>chjTHiyVfX!hZroD&PhuRGn;qaHPk% zaVypGVVUwhd_|K)PK?90M|i8D2Fa!kus(EEwU^Epu)f9faL7>>&(?rPGp|py#>5CJ zZ*`XM*kj3hXUL?KXPg6-4aKJEm%%)s>*j&oZE1P#CVbZr6}!zJ+rkEe=aCZa4=_hu z#Zh^1;pmnOXKT|#6ywrP4OCu#L?9`=)!N!?Bpyk@)Ew2TY~OY|{^?Qtz=7i_M0S{J zj`})u>9H(BEMELZ4?HZ*YRiW;UOj@HrT!&Ncqrc+`UjIM@zSzDo?E2qetPgq5}-=V zxkI{psr+8QaW|~IE+KFh>&izeB?c)h)!JF-q*Kdn{gzuXU*(?LeA3H-BgmQ6hcQ`o za8=#!iiiZNgBsC(Tli?jsg2D3F`+RnJfEyL!TZnx(kc}*e5{_Ug~Cz06dAPoIm>17 zpfmBjdV+g!MLQ*0@qBkU2_Yi$%%)O&kIvbVDJ*|{dsl<%{ToaR1<_Yq4O)*nHl)h- zq+mPN>V163g7?BS+B5m*@5Opq@<=Curj|cX~uXf^X{;hX4%! z{uyilteC*f6~_)If+b#mU%B{;lyL$QFRxh+jlOz)hLPkaK973~mQ1|R2>j7V?j_99 za&+ZapUy6SNII7b9go{tWvI`e%N={w^iobvEM5+Txw{)fznfDJr~kc6#DoI)i--@h z@+$e23~j}N{Tfw&w|WG+SKoQQ?nI?r>y@`|YU7O%CSh;YsA)*rPMgM2OP|Ze9?ee; zhqgIVzLjm(1$ytiI%enM58u&35%vvTbH`P036lb z+}w#2jy9Cx>6A*~MR8JPUpD-fQEO-jy{<9px;(O9>}bx8<7+30oa;$_`x3;Uw4hII zYp%953CC$*1oIue%oM(tXgE>2-Uf(B1^)i`J{bP2g*~C-(9(M2fj#b+M zoci)n{n;imaqvN^og`x-z8)ZE;;kiJmwxQvf z#92*Nv@O0IM56a|B*?(5i&cpo1mf)N-hLMs$N-jQ~{s;`0>rv**W9@fL+O`|H z^xUWC^~m>zZEJI{ckAPm|DgsRAV4#b@Trf5s`RGNM)^jIRUryC6Wyn8C23EPbuZ0a z%ed1bDT%gjERjfbhmhVe!edJK$~^EthC6oAB5Gqx^Q-W%Dy^Z1JrWv?y0XG|v{8fc zCXlEk#Rfd18iosMu-#co^28V(7APi%)Ggz7#gwY+x*LI!j(@kSrb3xCOAJv$!7I!j zFDHLuDj#e5p4(R|v((Ov`O9sYkO~(~myV~G1!Y}MjQc_Z&S(`ia%gq2adQs*^#M|g zQsBt4P3F?@<5PqPct6=@TOkr%R$=Y6A`>nqVsxY&{VkC#Cm#BgkL~fS`-|;uA*r)- z^oO#_OxnmU>hP;wcPg!gC%=#uO&QsE|K}jKn>W*n(O~V#0A6LRr7p%OR}H8zc-+nw z7(E9g813O6a8ZltWuQd%~vZWEEwCsSIC_&X6sMkQoL&$eco$kPZci zUdv%4@Mcil=iYF?HFLD4YUvlOZ!BX~&c@LJdrG_&jdSCA?`B_^A24xaWlfKj98A~rGRtA^fI-^K1 zPqfu=6Ha$D?R$^Ncf)M(#rwj;lP5#U&oSB zQtDVcE4E~3577|)s=z8nN#Q$3?_^tbr;*0qmtt=Mch!zIDSvrArR7>|lX%J)Ijl-^ zA|-yxtA%d<8taX!Z`mGDm2~Ff6upiW+nK^>{?&5nTWQ~Hsq%LHvQq;9K?Go^Dyfm&H&=7$HKhzz}Oa#v*93(t?1a zxgSWG!$?WC>dQbK(8wRKcGvCPM{%}?FYa+gr5=wFjDnuA_-PhHW zJ@q_AYtHIETl@r3ZT<|cOB7>TO7!*^9Ybed)ZW*mzES{5f`6AS5YLec_lTE8I|&~e zxGrzIp7Aw=FtdamR*Jwq=*4y^1rdACOz zvGCC3G2>fa8ztfO53T+rwP(s#bc)vnQ+D)2K$5H$jf-ii#!^^iJ~bn-CDsS_*&jP( z8;=~DM9UV#^?khPRn$nk)_sR=#+$=*Azt{rOHuP3?Dw7_4_;M+^*GwOtz&f9=rDQ$xJr43?Le@Mt4eW@T8YQ9Tfb z<#0ru-3*b$Bwp?(@bx89g*U7(m!R75Cy6F#!MNl=?<5^M0*dcgvvn0+L*kEbT2zm7 zKWN&`mJ(d@Pu&?Y?+>jy#BAgPBcyk?IDpmW%O11}Krq6o2@7r;LQMrL$u@%A8K^<0 ztQ3m}$R!+fL}nbJI+|hBRF(9AJqyolg&UnE-i?qT%|#xzckz?lpM1Vmp-Ki&_vRy` z!N?;T?1%3b5`dZIXA(D(8o2l!N)nsHRz} z(WUrl`PZ|OIkEv3?E8?9{MO7RU_L`g@d@)p>C*`D>M2ed5M*@d;J^Y+uYz0?NrRY2S>9P?OeJZMk@8l)lf~uk7!1y z7`R_vxa-m%?J4l0DD?$AB811#q&Jpga$R00(TPRdSo@?R;?ckyZ_yNY2b;+ho(T0a zRhqQW0Dd&9hEfus)o$vcgNu(LD%7}w1&c}rP+hj3r}}7I>Wo}c2DIVA-8EP5Zkb3? zXKbjC@?r5=U*lV4Ln1`mZXyFKSrJ|fS>mmy!9~B1uMzLGC5C7bkPN<^n-I5Rhrh^g zMbW%BTxUAt8%0IDJYsXukz)#9(<3sFK>r}j*()t5dQ|gkOf>$qjl4ts{<)d$9e#Wy zLhxx!069a9pZ1uU?;Py?8>lY?464q2h32dpE{hGmoVK-o|@E+&R?iLljpCs>00kRT<|1&*L0(2%tnVs_~KT zy-TLK`x0;=12EpA)7y+{eBZ5h4{Rt+Pp5lJnRDnm{P*sTC1U{mEwhAFVKO=@kK{m> zsY-*&A=%C4_Y!y|kA50D>2t89(`Hcyq=&>z#n`rd?tZDJBl&1Md_}!Et&U---lxp^ zuv`e)J9^C~5xHbdtXH*Cb}HNyZZb`j0HWGKM~UW0GKSJdlbC&PX0N$SxV7g@ct8PK zt=7TuOuV&gh=_04&hS}WX=DtM`6O26Y`)@0c163%)?9Dt=}@+LCes@M`}Q%nlRG16 zNzkX5E$z>RP%Vk24v$Q|0Z}}D@1shMkT#%Irf$ z!t@rILsNa6ZKUv^a&-yRe0pU7z$i=9*skkfVjhdx3Hj7J@nJ{%$uOTxhl|0NNrhz> z7D!%C0SlDaZ*#RN6{I|7s5zGOGB5Kk4s?OtS9YR5Pzd$o+DSr4O!oNWI`@iIa&aDy zF@~oeyg*nKTgy+nxRS>!gK#$N({ICQ?q7lypIw zv`#;n2rRkyP_f`07jICm!gF-FW6&XBhGgEP(-zk5ACyxwdUT=E#k6Df4%-x`={g(a z(H3!Me5yqjr0`=gstqb8@wp-uq?l@@%F5DPu^!@`_Y2XEM1`bJe8eKN zSieOT3!^}9I5NH@sPgeI80%dTBl|iQ!#?C;zKXtEwR#IyS_fRoFFa;oGYN=rhpD~T zuQbqD1L&7R30YUY8oHPb6Jcmjxe*w*Rb<#095m9q;NqBw;^kGR>hH-U({VlJm5iZ0R=IrAX>dr)Ec(Aev+uW8ioQ zW1mRVtisniyD2Z3c=3}PrV2BOy6whV7BFOd^_BRlp1-(E8_wV_!am5hJWU!c;Tm!1 zdqkqJ3^L@O`&ngfq)6vb;FFM|0ag@iWwkeDI=NIUv=)zEwG(W%Zq6ID`E(-wYV!GnD zVP|TtLl#N!`Mm-zePzc5E-VTjQV0kF%{}VfM*)H0z#RV&U7`YFHB_%e5L2|xJWi4z zj6~5K&7)v(ri?joWf7(CVb%<7!s8(2(LLPD)U@ z&?+}&0|_Src{FOq<9a>;MGF2(F8r^M?;b3_}C681NT~=K7U4L&ls-XtvMZ!a&teH?|kfeec1rXs}jmdcRawA+XRy68BK#WCC))sy-fDe6kZf&)W!UnKlRx^DgQwZ0>7xg#Spu zHJxi&e7LYjEFdMu3^C|}JnOtNRHtxcqn#%WFBZ`+p_*e@K@&YEF9OvXYvgQY_KM6#7xV5C>a|>@f%;vz2o-b#RXerqYE>sWpBdx) z#TQ*biV*|K3DjRL$W9W{jU=!g2hof;ucQz;J=el&b#sg#Xk0k7Vlr^3l@s7Nssam- zUT-3*vBc!em{wJ4O{~%EJ`7UGo-sj=TTErWnKGidQ=T%d^}O2sV^ZB9$a+mGD;VN{ zPf>;Fdbzt!li%tQgW#|QC$8apo6Iaf=gv$Tpap5N*>7s z-KIHOS>7H1t7Bqe<>n>tjXFL=Zg)nVm5Tb3@^sYWahaZ{=>@dNP&M!9kliBU?{ui5 zU^UF@RG5+0N*~Q0m%Lj)XsQWAWnxolr&gj(1mqrm;4^4@)1MobLZq9quy3{zPx4Z+ zMX9UblKW zevKgUh^P~OBQYMlG%%Y^ld_bXgvX4U1=X0qG=ezWbyJsEtl(H+SZ}-*JKlgUr8DK$ z7OdHeOw^<|PEJf!DQLErUYc&)X!FOV)yJG=T%I|9+c*OfOuU30-69ow^Rw}~TjgWl zFwW#g4x}o6{jYX1w67etH5&2tw~gUfIr#dcU;^5X$QaB6p{Kc&o00a;i3T8*nm$xX ztgvmY9VxQ~sSpN=#kDA;j_kzAl3~O<#XNVJ!uW@V_8M2({WhlK0yq2^57Xa7`Dz$H z*xKhYNAGnev&p#`A}Nvc9C4%^XEK`4=`7WnD%~qpYDF$vwTwQUSq9Q9tQFZ{{Z-a@ z>FLv46q6%_=#Pr-@Bgf(zDLgmt*#}(>z%5js0xHb zKC<34#+UrKV-+qVL!&qr6^|%AYqo%nsi!-4;}l&fpFW*EJf6-R>zV?;znn2&nKi4n zM9?)@tzIYck}a^ztzvU>`Y4ANE!;@$RZw4e(B`mmQA!+rRpqjoDJ;Y*KAc3 zvs5adm0k5=h3J&Ezg0DN5Z}x4<=1Q1@MwNPExOCs(r>`isbE&{p<2xd6=lZC$yE|u z8pe3AG4ey9l!cDD3^&9@B|QX7SE9KD`qE7HMfDWnY?o2uK#7K@D zemfkO5vw6`RTc5;QQzFv^^y+`j57xE@d&?2fQzZO3eOq`AELhM+9BwXTt>-Pt1P22 zgUUI@pO5iQNdyxw$mSb(9%mvj4+apWUTcfRg@7#xza-dj;STz=Ot zp;Mf_t`UVE`9b%=y8V&V>-AWBJ3mRQq=pt5|5%_G>@W5T516Dxr!n|o_^yiW1Be)9 zT3l}4hh~RkzdObQu@a5^M!|ZsX_!srR6T!(P5?eh_OJWOUS3*vwV^tAK@~J**86rg z+p+_Yq0)#QX3ieMi8cOOds^*i>%w7Kk4EqWsY2ozXufeS#`)rY`T0h3%USYM94cO$ zB$>2WC;t}VtQt;`f_-4Gu!B^9eyM>BTuXBj@#`hkOy@a0UV__Q7XE$nNV{nZp8+o0 zJPZ7-b*0=M@;hiP;C@@YA!N{`xelv}TeCaPYL}J2jAK3wy;)u_=ni?UyAohmaaZ=J z(FYOHmJOE2<;Chuf>xin26^#An1rWfWJZdWOm{q`TzMl5^w5J+DnP4P^0{(hkMKbZ zLJq>ObySx6wJqzhth{`Q;u|#+!7u%(lVAFI`*#LRR>((Y;#jE{rDKitQ8wE4L^c;2 zys)?&=)hnd3SS>vdqp6afo4Es=6@OefAl*phL-VZ4PelLj+tF?rPU=W8)|?G(a8&S zqG7gVNX$)**{}9-Fzj#VK&KJ$Da)rETTR{yO7n530+WzQ&MHkn>#{6T@$Rl=Dyv@? zW zz-Gir2wV_@;!xAlB_&jY@ny5nb0%bB7QG|Ih;z>R`MaNDQkLDuQq>XINZ}@(a;2gX z6VFF@$9!daCByC(wwJYshtr{;q3u4)xfpUjvmr17q7Wyc?2vLa`x=G7oPaj+>9YU@(sw=v&Q!1-JZPzv^EORtf}gPNRC53(y^;S$&mdaSI7d z{EY=$mtD6m zISTV!S$|*WFOHuNxEdVrMbyR>3-W-*6Yx*%PmpjZ=fW;7EMCAcrS{$30uUGN>_dEb zI^6F-aF_r_oK`?TRFb^7HswS zn*fh0x0yb!-Ly!6!@+@c&%VmvNkRC76qD)&MSuw`*wCkH$KyG4His{oRahU`mhpW* z0w#I~ESKvyZw{wxy)5wAQOW)b!~g;sCLX}W#mZz=C-yax-WYBze|T$=Ys*YwcZ$a4 zoT$)bCoM3&V;F#Yq6ekk90^4tvpJX`SUpw4I!;h_?CSi1<>|VB{kLt;2Oc2{K5kz~aM{FCe zZ)$HHJ)V2Nw+Kf0r;~ze<6q?By+U!vPCx-`g$G)3f7Txn*8ZUo<@=W}^d$fULWDcn z1P(ajpWgakFH-zKAO;Jv#+d%b&Hwv+r!YkgY9Z3E;<)WnH#7T!Cw`?e}kHh zRNx*$K2%yYh#iYGV)~lm&rU9khe8f*ITe2GjUBM5TC0KH9`LZ~9Oymn^_P9Tb`pR4 zlK;FN4e>dLjsf)*L0^F5uIJ@)ywVtJ~3TA90CT6<9U2q+K8EX$zj_AGwBkjAj; zuC(s0^jaH}{y3)lPYv(Cp@6O<;V(P$jdc@Pf#t#7pAfXB)x(rZnXjvDdM8B){a9D! zJsa?Q3|t@u_i{d`{hA%U4mu$X@%B%1HsJtkC*!F{1*KmM2O*aTUq@v=El){x!dD`W z7Bn#baI<)Rr@I|wUFD@s0!w!G&NDtS_v0%m_WbRk!D#;?QQ+X3+((DTPf=BtKj~@^ ztWlJ=jG2WtoRQp)cfA&BV2+u+f>-FLaX2=(zt&0%M_{bO>*A=XI^wKWeK_~@gqx4V z3-MZrW}e55(|_aUp?tr_{o&;f?&aZuSH1p(iWM!=A(aWq*3i@afQ2}>R?@G*8tC`A z<)_mCG&Ty%M7`qvq~cPVfw{c7^>l{(;M-6w_-80o@ku6huVozv#l0NkXnbc&#I*(a z!1}5FUqh5O_72Pv=vcl?OyyHWr2x(6V11W)`m(2Weid5J4)484^l9al=IHZ*r-rc0 zIqq>DlV5fa72ziV$#AB_23AgKcz>?&-!8bMI>{gg8w7oBP**2XfwiehPa9tq`AM&t z=JkaHwyL0owo+=ey@M9sl`GJW(Lr8h46!F|dGKB=)mT2QErcv;r*!8g4dJ#pv-IE4 zx!p;VyK7S$BHBQ(g~b%D^lQ%6b;JD1y<{NSX;O7+7Avj`Fy+4}1x>#gS6=V&)GjWs z7)SX9JPUiW=+Az+kr{n(wph_-MvX8WC$!xR7xc;W++CPF=ZVEWrO~m0Lf~YW@e;N- zE;v}M(%d4ogqc=>QF{(dRG#Qx>k07?ukv4yZ^QuRK zsn4Wi`dHhuEWK6)(~{vSe5_=1V;Wp651F$;d%pdP$WG)~hhy^~(o6G$>{axu2ac^~cM}#ANNGm)^i&y_0vZCe;gj;HXj*>N zuyYBVm`QrrH<>R(3`PN4^Y%doXXPHIcsON-e5W-N+dy&IgeQC;Z!lWCibh-SS@Eo% zVgt7(gD)lB;v|OF#WvzYSLP(-x;ymkSY6hJn@JQy6lXrxD+b`7z9xSy;PztH>J_L9 z5#07H5Zp#zy#G;u-U<~71Dk!Bot(RQV6H;gOvUdz;Kh!q@77F(9BuW8Fl`5mD0f-| z6N6-R;=jI%YgJ3Zk%>$okK{TKfk9=dmG9<{XUE-3J1@!!+Pxv_?_2ks^3RF??Sf0Z z6B1%@X`kY1$w~zm&k#D^xPv_)*I139tdJlvozoM{cs!%~>=r^LOC9@T*zmQ=>h2=V z1LtLn`q!2GO3~ac8qW)Lg^$jB^QGSit~th((z=VM4OM8X2({=0o!oQh z{ZAf`Wf!RSlc^x&%WwEOd80$Jm8Ci8sdjhzrx^@i5O^z>wj_NNwz4QJLIbwg(r;iw zTZ)_-SL#clV=4$M7(->DHKF3AO_ig=O=mwhf)64MYPF(_A6Xs9&3UDH)D5^OoT`E4 zp*i1si{)fK-w1Hq{jAgQrJJws3DBM2Xl}PEDOdFS$CYar{bLTaIVzFz&h_ZtFXv!o z_g^NeJn`8S(-`!>%;EE-D8(L4)I2+dz}z_>mEK}3QX@bJkMw@i0v{YCKvbdY8_X)l zGYAc+a8fiBdteCYq*0;0#CunfZ%1>CxhpQCDsQ#~%NyOA@(O9V%@jTPg+_drcNDyu zGp+S@5Jh`=w0BO-P(OUCd3wH3h^5ssZ|GZ6fBjFUXD9Q&f>TJ3M=A7_G}*}53_r1q zqR#!LPM0?Z)HDYC*}p!Gr(_)fz%*$VDlCPt_Nz|&?yGphufHTFLRZb}bjRSD=r?2H zX?9>tbCuj2`IVP_igeqlBmub9%dUb=0l-LjN7mnLat%gN(Tq!TcvPR0Hm|TPqJEVu zlkzM9E?+EotXuIHTgNd;bA=@JWWyNV<8FC|9f1c(v5v0^*|f63^fNjqUrD|^G$UJE zaT|VWMi?GbU!h_zr?C(G2g|*4AL^kF#I#Q)UM0v{yue)f6J}?EN1r+XQ`%N$>x&qZ zgrZfO(Bs+tph34 z_#{z!CB3pUTU_<u%snIzsB99 zaRx9?I}`9bUnl;Ehan*~bWd_I!;7ASSPSLL9b5cml2=eHF%MU*dewwlEYq2Qcrz!%3K_XE68K7Xw7#ysquZi zD`Iyjmq%5i<@AbX>Lib@G`!}@krFvMzzyZznC042KwRDMj0#b+JH@fq1cv>Xne^(( zznNKnKAro-ja^*3l0JD#@ymyEVdTjZ%sNaaMVDkyb}rpeud8V_F@zLBpY21c!iiY% ze05H|<7~7U7%>IO^_>xitH5z6Rrv=*RaZEYxSJ=)StEWu2h6$)+JBf64-DxBJ6N89 z_FH74XOl0O^5ql!WoqX(I~;1#t=n`zBW1Asp`K>t@fSH&F(`N;Qo%`b+f;b~$I;qm%P zDg$W)-1F9bo_OhYv$_?6TFVfommgL&hQpZ$U6_k6DM01evm~D0;SaqXCmo)CK!rvh zip9%Q(NTK?6Yp;NmqyK|+Qe~M0ymnTgR@JG?`-b%UWERN((wG}c7y*9+rG7kwfF(9 zZ#^RhoJKiIa=__;A}6~_VQa>=$Mb0bXDL}JpsvB;sD+?Of$VD+Z>YaeLAs* z%tmbf)u4sAxoKy3kscW>VYBui)3;nL+dMi`43LJok|r&#UE+fWSz8SlE_zGj^b$}> z>t=m{RBM0}nqOOu$m1yC;pCRaA@83&4_sH3jA;YI>ET0kLfPh;L&6LH8>;mm>udZE zD1kx#m+#**qW{c2qfOfpALddfHFnKli`CUu-Y{F|Vf)1v~t||K&f_ z5>LGR0WEmhcjNw^E5HGL{(s3B4=tavrPRni?_UsVkP4Z#8#1uC+noUfZKdbtztkzl zLCe9^ub@)$&dHqHq6!(fKU81`xx$?BsnfPCTrMF!Jfj&NATYpO7YMnM>#jS%slQ!; zb1f{xP0Qg4cFf&*YWyGc%Qpy#rO_0Ee(qd2X24TYkz}G?`5URkBgvDamDW87qcQ>-c!NBXCgxuKHPTwrG{!vX_ zaIZnZqwl4g0{EmO+Ciyo?kC*Z0Vvl>8zB~F%=(B0f_2wlHXd(b-!j0kV#n)A=Wm`-E1+{e^D^YpT6HbRn3t+C);cpzYf&O( zv?l}0F(Pmj(xe5&vJbEb2TutC$+V}TbG~hnk2X8Lr;>>dOUWACZH_8((?8P=Tdp+i z943YTIHp-SX#ENoUB1@-ahPFFj!WN_zsHhzLIV0B5@gY7f{Ln9-AZY9G@@Q1oxCUN zmh#eRjo@((dK&c|_f_q%MeQ#08p6d*>tj>{UewG^ab0_x`QnE*>^AP;Tk*ZE@8`a7 zxkmbHy*3R(X?g_7C8{Dh%zz9paL!|oWv7qU;ULMvpi_}V9sgDv8Z5q?rI`qz)v#9g zjCP!MZ!$g&^vZhsx|e=2Xr|jcf=ge<(M-|SP6TmOZ+i%^SzX~Q`Q3B*JszxA{ zOu#vF)I<668)V)gQHt}x+%dIi%*T3~XLb%r4}E=jGi=;W34e~Pn4;QX9HWOHa5mUD zWd78fYx{LCe}pI4eh>Rs9ZgpIJaQW_;R*=Unt{EM@iZgS_6;>j>t$*vXrP+y|JYHe#d>++R&rW;%jh6J4QVx(o-^J21GxgY{p2d`V)l$Uy2+UXPHKr3p`1+8;g@ z*hBkwJ|8!M%xTx8<%->^Dj{wAj-VP(M@tNw{g1kN)m9{H%b`BwoU`7t(jpY<*%n`+Z;`9 z*kgORrtXc9+Cu10bn-^JHuvG~BK06ZV>-o$hY@tD9NuHBDx-tuhPBX+EJLeN&g*<7 z6Xn*JluqEBVMpn4wE8tj0eRDZl->8tpUz5z>}27F4uJ`lv(#ybVO{F=vBJ`XxL-2G zgrj9~57^=7nf8QDZkeGPSeqduv%#t><6MyC1UGPbKvF=$d%LM%Y+oM>(z^7BL-<)& zM5=w*gOoW_^Ef5A9RQ%b2XR|N@Gq%cA0T^t-ff~rP!^2p&r_MdZZm73+vlzOB@MVB z1A8Ol5gTcTnAN+(;p<;1w3%owO6!6g-q#=2r7iS%*%llpeTzm+-Lr0CIsDlT?B`f+vqBN4{|h;^KVHHiL;I8KfC0OC5KR0TiL%F>8eeb+pXtm{QS_iV%DRDr79yAk45XG|V&uGD(mjjh5_`rUTj z`n0an0T4d4uK%+&W-_A-^SQlab3V2?Bi6d_sVQ2&!80VJ+t08Df$9?b*p17HePkHT zF(bDQDyCS>r)-^rIGT-k{yXMMljZomBptj~(2ykY#x?khkdMHE09B(j4T4lpTFcQ4 z!A`{^|Gb-+-7a|q!W0zfjIF2>CGI~s<|2G&O#-$!z+tZ zAS6NmN)FblvX|ac;Y#S76jHAO8s&Igq_%u|c7df|`EBpjkY;Vo9S+9|z8Y8Opm8K=P%*nH#<58kg1*__LJx+ zSrAK!C8M}u=)||CVR`LYS2Ql464B{SebqoAq-Aa3&TWYl?xXEafBi6eL990JuD_&T zGg+yRa;4=8us)yBIurZxJ-=r1&gS+R}Tj)Y@@Li*i-#{?;I?m zdfjs>&&t~ZeQ&K2szkNu(>Ll(s~bzrAja{EPN}LH=r{zm3%RS1qC9KDO23(tpB-o#s7Vin&U&)!kw^&!Gh9s>B)5JmjU*JG|)#sVdz%rRr{gB7XS8bQfc&=sm<>`4D7P> z`JB(#zO>p(o_Tl<{vZL6YwL@VE8E9v7cS^3Wi_$iyagF{o0g#=)H~H{SX2H~*T85U zvb!}l-DQ{CHshFU8LDxlcc42-_PYEUreZfV>ZOhG&dKkk$BA&0e1mSZYVl)4-Tyil z#XQPlj%esrtuJT>w|UK@1xog^X0#y*Ohi?6VWFkZrz{Bs!-}+`*t~t_@lY74C;Q)V zn~>c|VOSAqQe5~E(BsHFMouygQh3!0^A@A>A5=;Nyjvyd9{bWG?h#Urui3%~`pvX> z^WEJZ%c$F=L&I_m^~ydR-wKELYt-(_J;n6AaN>?P2_-&x%)3m$ga~X+fgfuL-U72( zBVt)}8`N#Phc1MUkQT_{_x!haH#t{4TpB8hacNHqz*BHxDxMi;$r5e~QhV()IL{); z!9-fm6+-VV-5eE8JvGbhxa|9;6d-{pni>M=aYkJt*EQ=tVTL`2m-Os;@ZF2y%64jp z@+-+qV!{YLcFnG8d8(rY{7TJ(?2RHpImJ#gjUpiE2-hWAcbuMD*Km97zI5H-)LW!F zk}gDY&2EXTTYfodE<`vzdmIn#tuj$*Xq1dV4PLqCJ;b#7`g>h_8$Wn$3#rfMAI+(m ztz&ue>0pzu36a5{4A`nkl|3mB&v8AQ5%x&~n_r$%+Yg_^d~^4* z+X1SnHwm6q|DxwGGpe%VcBAC)J}-i5^xw)A*l(H&kcgc+sC{%Bp=%B30ui%A-ez`AEJ_ zEMK%{#ttdGJ}r=SAxQ4}I`}s3)G0>(+80GsP6}x(Ns^yeJYKRub|?);jbU=ruoMNK zafRjD*T~q%KE9v1#V#6yH*6~E=#6!0fwa#+ygz=eNW!!`0fgeYPQl7%2hg61j?mM) zdQi;KPU%SuO@-XQ9x*q0%_A~g8hyx!<*Y<<oIK0McG*P%?-zL&=Au%<*^@TKMivIDs+x%zmNrBWQJr z4P%`4P#tdkO)83Y9IzzbIR4`_ zK|DG)j0JPg8mUs#N$n{!BJ^~BuD>Zo$L?aVfXWRiPYIrKaXDX~kXf+o`z=&|@kzu0 z@!iyvE3T5H69&_I9Q#oWeoRqVv%z%IJuUo7*Fq}&{*mH z+9D<8J%5%G>8zEFg_@vd8PQpv!*=~z&g;WbeTWhIXwpts-j@$+b-fE|-%0RqJ+D9{ z^X$LPDq4_4{OhKcr5_qF(AbcGvizD~tl-`b>+Xcd$CCsM9lq0^P*Mo0zk2Zm^oGfu zEWcvZ?^yIBHqDvh;!U<>P9a@1RRjvnN1ba#GBe@utuG^eEgK4{+jWX2>Ql&E1s@E< z)dPJj0%q;5Y43@{?lIijcPXL97+DwrOZBTMxU=~~@2_z3kML=o4=6yq5c{I?WfAPt zW!ir;x0%1zXe&_R%yo5-0@$AV@7nL)Ga>ksMRvD0Fl{tad;CA_y=7RG%@;7fgru~B zgs_5uv~(w)*E-Q6wSDP5A%4btz8{^EHa`Tf8Buj~Erez~vRoqK0a z&p9(^=0pI;Kpm@ZU^9N^DJJaYgcoDhK1h$g8WC%vUv_D_2s*whVEg<*U5J$2B&Ka< z&Oy+Mgk>MUCTXzKw*M2?U;{6rF{!>Opt}{FrxPv03TLX$O>9vb7qE=g~Dct+j{$I~+&y4NX4P{3-NsTbx?x(h#N5F093 zDbGDpcX<8r!2dz|`Kj2yv{r=EwyRAbzIh53gnO zg~i~xe=U#T;43VMge)b+J3Z<2%kab=zVKUJVWD|ZAA_3W;N|9$fXNrKMViKFRwJTF zTav~iHH~dcF7{Ka8`})!n-HIx-(zFD&FJtPEh_xQXQV3DY2n0%Uov#q21EPS5ZkBQ zI4DWCI5p3x3KP2#p4zSpgiN^7F;vdBM2R1Yb8e{Q4GAo~1Qw&B94L=58PbBAJ|0)K9p3h6ey&;sYT~f1 zs4vMmJj>EeZ4?O~3S^5I`fv(8nNo9)T)d^0sTj{|jSs8kQ3;>@eD>_yu09Vf?eetd zYQ6q*RTNCJGsdc|akfK&!aSPQ+FFUiJY}r}%hU&tz^sj`&f)G8>nKHJtJc9Ps&>q{ z`3kb9L7Vu{YkCJFd#g)PT8B5g*ZuAN{S#blm}$Ebt<}cQZ=z_0_y(H&tDZ|m-{hZ) znG{Y~PiHjjDKvE_HGP{eB0J%?x9eqHmb;GAY;(`wJ1X%j>c9Xdd^~XbldNcm;$SqS z&it{dAKH9XE{BKC`3rPka?R4)){6+fTO%T?Y5^<9rVzR9XYe*(7o}P;Elk)C?RKj~ zZGNyT4@$Z?2YvU}!2@fOhlg#CUwdm>RDrgqk^(#(XUTJ3Z`N<@!Uvj>vrmTm_3j{Q z#0K|%>U!KM?7B_kaX9*-`?OP_7r})-TtoEX(-P z-O!LCyxw5sAhKiGw)ZdL#Ll?WkTE(7V-U?G`pmT}pNg9zzg>`GerfvU`)*0A;|w*1 z(b4KFsI{r_93dn7adV4=we1%6&I?;{Mf@sVmHwlQr!BuX|C$$&vJr($XJHCfJu0PD zxU&SbN}~C2h+Fa*_3~+IIzMnt`7+`T@uH+5+&=0&WY^R$!CjsXyquMPTk8;a;-eZ+ zi0>`s=_um8#jrnxCtwwV<%@h2^F4DwtAbe}->zJK+Gm-f=Je^+SbfaP0!+{T_qUsl znUBBWe$xleTh2^a4_O>Pq-{mFydGyVK|GH4AB$~me?8iJ-6wTMJ4t;SBQKHsdAM2` zeu8)NMle4(ocuc^)EDGvfK%l}i@{iij)7m`3dA8q$S*A0k8TsH8V@;z#7;+kO+xaX zAipC4#b*elLN<$sOO#6LSLN&*DzNFNyicSKP4GYD3)klc>IXE+5V!KO+q{yQy>l%K z^iOJn$IfPRrb}Pf*RBXed1d+&xUugNk(ccB8;h9^cH(?dMII^VbD+m1Q!8)iWjZeD z`No8?dF!h#?{>2pwEQ4hb5L`K;D`U7dBro8^DEu3RTN}ZtGkt!4q)ecjB821tA95y zAgRTSoB(AvrC9Tct1Uj?Q@cp9PgOqgq{lOH8t<^4EV;nH;vKBE$kF5S<-GD_ z?o{FLa0s8fFzq%gpre)=2$Rqd>WCXuJ)o;d+(~?<&FAAteqZM&c3qfR33@FOUr|}YsQZ(YBizYZ#e8#KYkv4PY&^41+5&|qf*pp3o z8h-n(%2VcCfn}n+K8=2j@JXwRXXS+G3<+B+2(beQku@kkEmPd(#obb*l!_~4Vft3i zxp{vNSKXs{jL<=wuI9v)q!vWR7KZ)9%kqrhUuxnBF-d1-Q}AQ+53`g83}YSrUwKRP zM(X`xuTCWJC$;M&P(mfi?J4?RHw}bO>X}#0E}O8;HT7$!W8@BYRLGL2A`40!tZ`)X z!xKD3Lm>=8B(eHD9u z@mZm*P^}ok7-!+b?9J3M^_V<_!Z1iLcqrxQ^B^bQeuA~|Y(_HEY=%rbPERYWG`HBH zdQw1@eXsR=)G~SR;ai&C(zTD*<;rh^@h0E6m>~rgqMvP*A#g- z)qKX)!DC0W_|D1>=%PU|o+a-$9wx{VYsr&+OAf&sv?(d}pHc|+gBg@A3AI1MEyv4t zARfC7OWEaZ8@UO+`O?e5q?o@>@_6f9TwWlE7el^P^%)F5>EaRW%BQ|n%X3SvET!&% zZ(8fYnKX8*oZSXVuVg-gKrdWH-oBDmBZrx3Kvb`q=2Y|c6lxb`tmfsi-}wmMSv#vo zl3yS2{fQR{25x7jc6&ynY?8T0jrrs!PI-egy^%V-w_H}mDQtR^cTLlL-#HG)PpDrY zl%C%7jhc2{DBu2**a>D1QtJZU3e<;|{coZYXyVBI37xnZVtvSj22-^OW8*7#0q#hA5h$zGxNUZ4yH8T`Hwz=TWJHj~lZGRE-rH==5t=s4 zRuS>r32%mNsTS|>iF}h<&)WF@OvIqvf?OYcualASE%NRYf3wY`UU{F1OZ*vEmy_~Y zJQtPBCLJ`hnKxejVq1kjrihv%AYv5F>j`4qPRUog^y7QH`uHx274hQ}zOi(IFTbzt zF$|R$n->k58Ni%fpK#d^^fH&JzA1m61G9NCj5OHE+V6=CMqFrmXs_ymfY?MAMs`+?c~4UAb`!` zGq= zi;(JiSCk#5hjqIS*<7di<10jv)LGhjdZ zS-E2L|HxtivVT)v0Wh;6;i3NXK)_$Ol7T$-F7F{NrQiD$_dPujunZ1hSK=marc+?b zUjEOG>rhB5^1GVLByW=ELco~~unCXv|Ag%-z!dlg)1z;wYi4%uB?76@^ZdRf&ZVlw~_vqOj{uGP@*Ko{cC#nJ{jO*UK^Bhj@1Hy<;P=*{oaTeg967d z<^mNz{)G+AZg=cUu2~b_devM9+GtygiPpTnVRkR0alITfALdRWjw<<`2jRW|jI~iE zGw5+A&5$EXi=S`W1lmZiR-MzugA8u2buj?4IDd54KniWoi+E|E$8}*W!^VxuDMn=Q z$tph%%fHQKxLM)+^N~CwZt(6BPDIZuRSp;lm=R!Io9AYfu(&Vx5Z&2953LZjl+EJb z*;Mv~g0Sr*`kMXvh$(YlDhV+IX1w8_*&o3?tf9kA)YTsDV)`TI$D1^>mVKDQ^>qJ_7$uffIM+g* zDOOHw@|BxIQ1*|~=nbo2Hl`Acj!d&23bFEC*am21M5|DCkLdWSF$z8R3jP(2231>6v^(rH~UUuR>? zsfPxVha$gP@>VoCrzgDr=8|8AX{jKfz3l#wXr6!pfdF!_#_}*OQo5k4#m6Jy3|77f=_b;`FH#12S;85#rj~;^m{|55|-Vae)xsFr-jV zz-Udu7i->`(VJ%wqlil=TVbI85mW!LVjVk1>-p;eRKnYt6$%K~t%pYo9OHfzL&=ZY z+cy(8qwq+8B6HJlXx&M#0mq#g)$bq!^npMepqmWs6!r=Pv9wb6y~zhmy8`i+Y$t)^ z2yzz{&P*X#V?D3M#tL-j3pLzy-xAr!q$O`yv?-xZdIa*yArIzaQc0|YPDXx}vz z;!!ttx3qc^DN?G$n9*S|GQly3i_V5S*hV4R=UW$+k^pX!mnEn9@&f+&?f5D zHKS^QnA(jL`6J!pLf!3QM*M(c4w@(4uih&~c`7UqNk zm{8`k6+?j|RHR7xPA`!TVj-Jr*gO^uvt@B&yCYBDsYfn=VM>46mYCGDtGt$p5;g!X zIKT`$62;=|r0;n%-a0(a95qKRy+R!``QpoZq%c+ib>*|dP9&4JC@A6-!!z%o;>etu>-R1K>=lAv1Mn!%? zC5AAD)%JB>>Do(;PpNiiM6+dG-Y2{Y(mqn=dC;X6iyr7GIs3CS>-(qzHrBkdb*BWL zy)&JT63aYyq|cU0JZ{;vB!yUwK6bk51Nr`VueY519ilwlw0@LI=TTl4C>? z|mOWq8y{R-lc$u`+WCj z_-&J zOjcI*qr95qvwWG*)sJd`a8t9>BfXyWH>lq?L$NZqeIKO=-NnfhiD%n%c`-YkeJ3j- z5h-=@A$WVuth@6b)E(Jo?YUl}kD14|OH|Yj8r~^5V^M_!21UUa#CQ)&UHs2QHP~HD>jheV)?X*A`d1Q6M$78XFO5$5#T|wC8oL;LR!4RV<;QF^xclUqNVC*Zd@cP*rY~}!8GlMrFDwxxvL%% z{^av~$z_j1)($r)2*$y*MlKB&z=ckVAmDJT?&%Z;wgK0j9VH%U0dC!iu%fMu?0Rq< z*>jj_8l6&u_}rjS=W=Oj0e+JV;(9mvEsJsA@=0+x-dWIWPr#$#0$BncLUYD53l5be z>ozZF^hQAG%N>Np#BvTEa|#?OdH~T|Dhf(%D@!{ zU<0R0DWV(5fxz5D@XiK?d6aQt?`y+8*3kXlNVrTsQ?C3)mt5mk%a1pF^~1Nmm(NAt z30Cwua6Ro@BiD+$=FGMs4Bva=vEC$|Q9k$~e=auoy8T2zf) zz6U5(tJkkt-xB$(#*v#kK)=E;(`%G{gH)!i;X>Nkv zpEQI=cG2!Rh{wgBzXCu z$9b%^vG!!8xe&&1X(0Z`+JMu!P(SV_bdk_H-)rxZ>6Y)n3-PVrBu`^ z`?)LCD~A*H_qCyNx7#k*tQV!CnBB#YQoxWdHd>tds6giN;n(Ve7r#And*Jsuhkf8Q zG-Me&`zI5k+l>0hXA#T8O=01ZZa0oxe3Q#>7lzT_)l8Lp8P95#Rp>!dUW`8L*0UPA zJs?`?BSG$$QwfmS4CTnEdmcNS)mesFs3dCzWdH4R1ASkc^>8ju1DNLrp`ZQE3?7RC z%)mvs7UypWl1U{?&@6cc6&Xo7MIUwrW$JDxu%njjN2~L(s-k-X9>@*A)$!!VViz!g z2j=>+n~3x-#9)C1z6F6|p}zwH771A367Jw9wody z^@k_$0mkk4-Y2h&1Vav~4Bah_zoS0{wm+fyhl-i`8n4dTZ#neqI9j`39)U6l7@6*U_@uyZ41PU5dc}eHQ&*@D;ctEXHLL>`C4l&3p=Q17Zz0!T zUs)`@8*&P(?0+A4-PgDytNkvg)n7*c`|H37{}&K-yEc=*cK!FyR{#@)Zxfw@f6XrU zf=tg1pc(U&k?^na*xx_j-gyvi>q%t)IHCXFw*a!Fw4;V1o;tfsJuCS;nE!nX5Egsb zhKrl4kC^{2*8gR){?0Aoe=IvJ-s>@dUeJs(xLH0}D&OSY+^}^^+Rcc-a-A zmzXkwU}z$n88NK(9&09_Ur>xH;??+);+$-xN1+|l)3(5{I64%30?#h@6ga{6Q%?w= z3mbg|cZ(j+8)jefp3PfF#LtF?s$z#9@wq)eOS0azPFg=nz&ffKJR zG{ZoVt+cvgy#G`rYE}W7=QqujXM)`cA$odxmDUtKzsoWhsH7AZzqAMim70xF9nPr&>$WU zKwzeWG7qiPvv&+W=mEk*nN>+WF zcKc8yu29ebRaMUaNSS$ddXs*m_Q(JqGQQ&|{>IFO)+ncF_g4N48W`XhnD~pJ^SD4? zcDJLB@Uq0A8v~iZkZc6$kocs{YOtnT5ApMYQ1L${LlO=n%Kk*tutv{A=!38 zw$qI@iYJ~jwiA7sm^~V5nP1ucZTmz6WIl%L_l=B2wpm1MVl?K3-yTpotkE61Nv3~= z`q=K6-exzAej>0}@eYp{k0LE>#2`(+}p+!^=w1;Trt zD>5d4KG(dSHcdxF9&Rp58uj}r*qiecBfS(`oHMr9hl$gdy(+x<0;9i#VH&6fW+LW& zjReLt_Sk9a9wH)qhh^%dCzMG1E^NFXDmf5sV|raG+>I-Yz@|}CN)MG2=^>EY>l%m5 zD9P1IN4S0_Bc%;ExzN`9izI)SG*e((HP~I6-)u%9f$R9}EWv|V2gW@u=v)p73Woxukm*ld( z$p{)u@#*V(SB^h=;ZS@O*WU|E2iL{VQ=wQ??Lnt^Pmyt7hjB$5<$$0x}PbF5F_>(zDv59y$`jN3Audk;< ztKP5s#~+j+!oXh?yX(UW-|}7BS@e8`C=8Uf+u^mZ8Xmfwdz`i8AYTa;V=SycHJiqV z>#7YoW_V*ZL?dpP(=?7p!k3G+OThKC5ti~-Ew~S_0HcH2@Qx7chan96u`y%maIUS1 zbs^M6-2oRSJ;>@|ki3nc482m^^Mxw$%cT`=sq}B>x+6Pma!zk5b6@u=R$LKoeuge2 zy&tWbOBpGE+j@9<>@sq30m$g}Iey$hF?6}fCByE9PiWah@4cL1613B8gfGEpP--%R z5Yb1lkE^}ENb+cc-|hLQ9f!h8mTNVzqSH z+B#?Q!?}p7ou|!iBfRPd@~QxTV*`%%||f z^AL~C7io;2;5j_>S^I^zjUu2Ht+ENeAlO7)3pnA8{xm+QDO*8>>mGp`D_vFuj7~2~ z2KA2JrSaw=(c_{X6vWV$jk*4h&oyF$LhITEyH;~Y1bL#bo)2WYhXMx$D1Gk6nlS3}3paJul*=eHyed%U&=J!71}2?1kb1QGpvtY*{Wmf1(ICA_!5oCY)HhVU|7cqt zCY_bCdRs1cyfHCv$6n7MF(@v-Tq>f!bhwZ$Zm<&qCUx(VwlF%`sl@$(pn_VibiPZF z<{_1DCW&9I5jPOqnnp3f|;9FJS_@;{K9w}Ux?BmEilk84n7e4M{nK}uJb7-Q?<`F9iS0&G6tdPE-`zR@Z23H8(r3?>@QJ_6?rIM7i zg;MCuhx8U9l&_#kJ9KwpRQY~Fmgw3nJ z(t!rW=2pjWxrep@o%dba(~KYD8MfoAy(-Ccw*$_+2VXvg46Fqklr1uKe(bfaq;arJ zg4RG$^5H%&dqoZ$&l1EZ85_gZO0?MZ+W8}y2l-T(2up*nYziwXIzEbBKAbrx$Han6 z@8Eo>ekYnlZBHBcq+s*3;^^V0dd}3G>D_B=Bk8wF-?2gqE*rmo-0sHJ5o$0WU?4W~ z1i`KgH*3S_jDGA3UjH(&Ls+BaOlBXvTcECFk_S2@Mg^nJ7>KUrU7Vg=B7tWXHQ50) z7jn87bad&!7+3t*`V17Mm^=e=|o@Cu{GpeO%E{~1Rkc|AO+%AN7$5C~wXo>%- zpDwOqtT5ShwGbt0rk+FntQzvxfWzE3iG)c|LZx85R^p|-k%8vn(P;Q_`5dZ;lBZv) z&rkxR`@4}-Rh6xS8m74lqnN|8M5p1(P5Y>*NaAXt)-#=bBz`PF^$aXHcac8+K$c?CfuiNl;<2*aC6E&&+{#47WV*O4W!ChTJQ zB7t|hzwP4mCFU`ln|hd)Gjh#n^o$%0Ec8!3$W@O@^$1$+Ar8;2dM$H0r{qP~D{Wfh zt(J&oAUwSk)$=Y4Wqsz2AFR`?F3f<%(WilBJXoY-UKn%uP#^!Oi1?zo9@41lg*9H~ z{N`YvnA2I}%EU zqYl=jnMX;Z#xg&rkcmojE+=%UURH21Q|(Xr2hp&eH_rN6h2yQ~{m7wh=f;RA0a?X9 z2+hO81FpV#-~1zi2p#OEl6mFishi_im2|UF{@&ei{rO<`ux*rsvc6k@{TAeGY$3JdPPMww6 z$zO4%wh)WW7Y>tECC+tq4^&1Cwo5iEWaW~v9;$>PA851k9Bd0wUl{kwNznu)g+4+` zNi0QBc2|-!z~FQQYZ&ua=3J(3TruWz3OsX%FktS#1?AxAP8VmWS~b@A5vJxaXBl$@ zJUjb1Q+Amr44S%LQ^f*Yt{(w_R=boa7~;S-2&K51m(2f65oGW0mbYT3bGZF(>~Jwk z$rqFyn_5%#N$~3lF_RGinTP+?L#N4iCE+o+c|ZL&tTK(bw<7f>xiT(yGzGaOa19cU z>^T9W@j<+q5GH-SHVVOB9+<((tenyBLY|ZwpkA&un))xkeGp7>ttu6Sq86Qh)-#6G z_NMS2I@Uz@5p3b35cq>&|7CQJs)0DB(;O5R0#wOu69xz<82SiMaU}52B|PArrxy#G z?@%cuesev}mc2gOriCUpmtW0K#Ew1jm;~gcV<0^I!W{^%PCYV*;P0Y3k0Z$YwS1BU z#EKM@zlLo20C0mB)+a|mna@L>EzI1zQI4$u+pRwDAxmmTJ8ZVovp#?&2?VOF&QY0|%*c5P6*&n3+@e!aZ-hTa+)W0Txe?SF%EL6lwKfMz*1HH{r=-XCs*i+q*D6?K`Ml`x32SG*r1n zy>l>gu*cnbJ*{RX%uPU#)L`z=c-ioly{$q)P| z1ku1%Cb=UXO|_j8hNC1Q*;m|C=Qv*y_SkA)c?>27kG?4@+Li`w6!E0Tp#PlxICJG< z-SY%mqh%4_$@%Z@|AO!bp!(#0;j#(%ls<;#q+xlffZMLjM5l<6}Ip>jUugo=!JM|Z`8xOeAZZ0{X zHJX9mLhlsJhdkz3sV{S-uKQPPnqWkq#$@}Y0WSZAjYJTiIZJ%r((yT^ZSK#ta`744 zCUzr(GGpZ<@x-Cv28|77F^6lm5tjLy`EnE7=YS%}9nx2OqLJ~J#fRVM|X zCxLn5FNFWabze|;e2NTg2?}_9)}f%#08xs=gsH4S?@np2&&E8V&x{!%R_$dj=+&&0cO?f@PY;-s>{AMCb|h_H zD8x_L7ATf{6}fHOONzU6JdN(rMz!mrS1Wzh5;g)R{iOC-L*&y~*bSa-eUS8MD%Lh45V3R&U54mpVaIOm{*?olY5*i_oJU-MeJnkmi7#siHmd1#K?Swy^(5!kNXA7x`#Q_8O$~Zf)*J-BIXaNj;tn>wDRj=gSYA6ZI|wpzu1WwYJvW30Qmi9%&CrYLyKHBA5X%nUBnQiI|~ zDoauj{bykr>V$4tVcBL^D?^N7@qutn@s^+TY;9`9QejkbH{mUhw4)8b6v5AyDKg#n zdomfOF6J4!@hjik^^{nDy5gKSHJML<3Qv&PO!~FZ-bK5Rb+Yq|7w*nCqt5y#jHd=2 z^L;}-A)X`+xt5DLOW-^D7#kE~O3TkFQPn~fp?lb2%$<><%S>gaB7|!I`sotHdirBt zq?TPmU1P?MvZs0Ui)T&Ctn;75pMD{E2^)$i-(7?-OPfbvv@fA8J;;Aizk60_H5D=k zQZ)(cvSm&V>*bP_2TALEo9)z5SE9tX?61+14k~b!-?S&9#b~Tj5KNGF*b-52U%&nm zd}Z<7W~y$ROP?^oK|627=Y-pjr&RjJ(WTQSfD)RQ0MdC{lVU8kVNveeA$YAYSNphh z@wPG4c3~2v;tVQ1!L72>f-6Y0_Z%NURd>>9QALY1L>D^df2D411dYqFO}F(V(`}Mr zuL>U5n`KZr+n7*CYtAP4%mz|A^CioWOCx(*UYX&t^J0OauD)sT$A~z+fm1WaafXJ1 zjDzj~g_8Cb(nJm!T`;GpxS`T>{e;|#7yV*zp%}(HL%a{rbXLesUmt9ssC6n=;r`(4 z?4c>z;!z$wLMYh4pTFTHP<2uC%q#3?eAPcZuN*Okz-$^iiVEqN*Psb0D6p6)y2T}u zQ?v~(HT1+_`xOxVjNnRuo~qck%E+U(sA zDY6t}#?P8Ixz*SPYX;iXDo!(Q(pn~aw`{{FH6KDwF%Uc6AtWj|H#3$XSE50BhJz|N zt*Q~ys%90;KvpFR#)Fvzt_(w;mlSNbdeK~FL|=XQcs7LqCM24WHTz-t`YVysN(J6T zFCjr$87rD8T8kHcBLDJ4g;?~hc3%BKyX%xTT-boB?P_O(M40>%0+`&e;aS8UNggY> z0=W(k^3dF^2b4YIn{+O66q*BHa!3u_;(g+0bnGuM|m!xB5>eY$ve)4MptwZT^y+!Jr zQP<+DiSR_LOHPVFeRW-?)Pa)2JQ9Agg+5Uvty*T^vS4F|h=v6N>-E@}Ui%`Z3VP3p zk%onz&@xZ+ISJi8eg;p8Ce^i16ti`UIQZ9aMcv1pgPUw~gcJ2DYOdSQoE346ka%3QU^uTk6hYw~*FWgP8YsTGGp9UDbZcx*^(G4)MyKo;P2tBG; z5H8r5d=*b}R@NWV&xO7nZfkrdI@i%DOta&|xVef5jxbWHwJvhnd1E?%EhjnpGTxSz z4@}4xAmWK55lTVOSNMV^Vvuk226tjFtUx)f)a7z~q{*~~aGP7y7;=g>;Z7SdrR-!i z$3E@0!WlG25NeCEQVX;5e0G1zOkr6Mx>|cgfWQiF9YBWZn$%a(?NksFQ5g+e@!*~A zT;*SFu&rB3WGYJT3Lxwu!F|hq9?ekM8@Gd)zTpRDl|T+Vc%j(%_bTakk)ARo1jO_P zRJxVDaX1-zR8GL~TtfE-|exZRNl4u8!e7RRjHB<&sOo{DM zZ^Ld!+iEW%gQ?mWwLo=hwjk_D(`Vsxrt|NNb1XkOl-1QUdRb;^L$1HX&*pnbQC4U7 zx6Q514tDi4xJ3o4!+&EtNGgQZ7j30H8yS&1oP4QfcGOU6wfmm4vRF8dB#T+$6G7c*upV4H4pc+bY4MD(e{;I`KZnmZnT_) z8hv8nW3->wQ^-FH9A$5b?eg)v7|*v;xR|Q1@Ta&LWJix)B7hTJ(a8{`EYZT@ zLd|gW35B`A=2v?{htn~7yIdowx^Ra3tLjx9N#~;RxC<$sLo6>Qurf64gk}m=B*AkM z*_1O)lVo{KEd7C_A+rgLAVZ;UzS^+BD-YndrSWe=gjWI+^C_=V(buHGPIk^zz4p5k zSWT>;$?Hd)X$N?&ppkBsqqL0O7)A%Ts&T(4Y7E#T#RZ7gB5Ilss_-k+XQR1I3O*WKc`d9-axam{5lEfSQziiN0SyAg9Z1>EBO zF@tT<2$#PxyV1tvgO{_;MAoaGEgO~{3+Ov$5{5q`tY#!k_jh>i?;cL#moTV@arM(< zS9PRS_ZM~EzGAjC$f8n3wul50ij>a!QJA@0P)E7m>YT?fZPCA9D&cjv!S0 z;-L4#WAch*VSCKDeu6&L+?GC7^#wD`IJ(1fwvD;mG)0Z6qK5MQBfY9-1aO7-vVd}H z$#-IJR2vGEYGj`676VEk<%&*1nZ57>BKkv@uY@7(`qec~>xB?Bzb1SlPy{m6uWhorQ%xAbiM^O*TTYalCrlNzYB zz`68R-Ea$WqyGID15?4#^>iHfdIk0QN?H2jxIqd;4jFhbh5_cD#B`lbr>m7_$<8QK z9o(|Y18|v&fV}n2RJKQ-e^GjI%kan-hujy6pSFh@anGD>(;tl$(Lm$a2RL>mQ%Q*I0b6M=H_pn`s@ZMxf)UGcb$iOuBYW4-G49hDI>5wgw-k~XN*Oghp z-|0P|R*@++@w4HUzf3v$B|z$XyQd$u-Y{|aZVfT46k zGQBTn^}odFZTr=k#3Y+;(a1|Go!9#`fsH(ZmTmEc1Z zho#jDDUtDuJ=cRYadD0C(ej0!B7c7y_k`%fnWp@FTzcD(Y%;RTEPnJ{0l`V(Khd;- zfeqD@jE#+@lwPj;x(^^kx58rCN0E{G5d&NKG!z9yZj_0^KSc$9?SP z30{*t#V5+Alyftz6d;GtXj<<-94tAZI|mEHOd+yc`#Lx(HOEMpSoO=z_5E%l{PXa$SNZA~FV2%~qG|UB2OufYD40OqA?}+Qy?D?{)ngrpd)~1F%yRzI%bF2u5m4!fhzRDN zN|g<)jDw9=%=+CjksxaepIQG7*sm2MR$#+i2Ra$x^9%zpA8=fGZ~qw^!@%dJf?&Fg zsz-CbQsB7fqd0k({>^ax1}?V|cqz9jBzFZD+dV(L?o-eofgaFP0`L-bl~`^k0+xF| z@ugqEJ;R|_L4uGV(J?W-NxV+zRk{VrZk`Be>6)$HR!jC01#;&UW&d34x<;P20)v#SPsurd zUTF8A2`o^r-LZ%B61a!u&)^Ced=(xEB44BS72%%P3uv|mn#U7d zM8yAC@4VwqwiUqFyjglp&-@7O-j_?+@SG9k%w0X zp#uj0HwP!d_cj{^0}PHUW9UZyV{Pt^5OU&xv_;L3n_%AC%nGEe>GV&DsoK)x8@RkSH90pR0Drg#S0P+sFcRXgpPwr<(5S(KV0a zV*WztsqNeTDeM113L~&299-yXsnvYlVO@KjF7zw9!9r=+mC52+y787bvJCacpbMey zcp6D}oFkfUm&9N+u8^E`?ekw7V*eCL2K`!#DJZV`mhyY_Z(FM}z&;rMyg!j&QBDpdSU_6;&`q&C^Y*C~!eDWYn&042+$ zFuYI4#sGQ2av#ea)GpsB%W-&t=C3nQZA~u65VCc9#ZKigiYCj)QCMVSB>DXqzs3fb zuWJ<8H>RZ#3l20MmzvB=pTA!Zv$|hP#(uq^zW%n!RiG)$lBq7uiK(wlxmEsgf-u6 z*i4IXY1GueypfB|y%wZkk4Mj(;(L15(DZgfZY_Nwy|617ZZ|j1#*lLG`lm2#XwGWv zeHtK%`oQQdsPt-QLZ>;ICHuw6N{c0)aY2XbsZLE_{LkFkIvOreEQjfW55acAcLeUa zim?dSoy}eWf}h)tz=cntHABn{_aFfY!pp{j=}NinbUZ9Z0MC$o0qI0ULs!EH2cs#3 zKCF82fsL)ir{yq@?*_BL z+4k8RCkPd3)#%*Ya;dZHZLEDTQtW|mLBZMeq%V<&4hdpp+S_J}<^J%;&wCZ#9c9cH zq=WhBQH{go`7|X^uCdtm(bnL6v{uQO~sGWEuPL7V8+#!RsCVj8H9`c;V`g!6x%Wbm}tY`5}gFq^VcM5uo(F zHpF}Fr!>-7AShk7t2aU;40(QW>~uIh*aesG-bp940)mDNF>>Wsp~e%RS<=7yVn*4$@3un= zCHVX-mqzD0Pb_2QHtKxTGjn?N@N1ib?j}8R4urVAAj^j96lto;uwwS8&i1gh3LZu{ zIT+*K=|hK3(i%22ZnYm3uX_>itV6%C@WugrlPAWo@tn-5;-E>Df8AXAaN6~DkD|6O z*h{w*1@a&J61jcl`o;O5Q|&K@Bn1~`EE|+Q<#x%ZLUnt6?C8*vGyJ(&h;S@M#IsK1 z%q|FNnZv&YJJchNPXs`RU3=`rGdanD6jDJ23DS*h!y!?6KJw6gJPr!qz z;O?akIFuc56dcmXHSZN|H( z3H5)N2PB9z!o8{r0hYMBwC=AT*SG@i~{4y<~Bzc%p@EGvlcat-+i+d*xeoQ zN=49wgMTHc{6T>`W`+YKLczPAxOc73g<$R--T|=1B7i7-3b7uQz#{DBJzd{P zZyvDFZgW87a7Ch$Q9Sf$35ANQA|&#d`#d!AhhqL~lr3D}u^`1n@qmr;ui1uJWt1+q zDX&E*%tD!{Lce_J7`gHi6e;s9eA9PrFj)*2ZK3|G;+gR)QH#4Q5KWQBrwm(qSSh}-FD0HCv%0{_3bF}Af z)naU3*}aeNb2CcqI&&0RFze4X8Sj;+4UgUPeORBVf5DWnNA%;IDYH{VQ}eK9EPt94 zLztZke@rQ%_g!NZ<@&KT2Z>I+-FfHX&ol;+Z7*xxpK^2I(YgNXTj@dhfecohZgIwq z>P2%-SZe3d8CDB{)G+1_EzpimmYrJ5gva-lg2b%}&JWj6)ZorChv?wQubHG*o&9;qFwE!9v;ah2I2!hChIM!L; zIqb{4xkjjHZy(=8spXg5BbL<{4DqS!)VEP-GZLtfI_C$?D|JzB?n! z+W~6QnKMdbS0CuMh9^|)VDqZQlqoVZCO(2kjn$SXo00Bb67oWZNx6iv@zw`H; zamM+<8p&9TnOW{N=iRRBE_P$=NWY|+n)WwlefHm^z1kdJL~RbC0E;x%y)pR)Eo%0_ z*`_tf9$}1S4%u*!JL`jV!U$#7TNf?v-?CKF-lw#IQ@h0`46{OLkf!RGV8gl~q`S|) zo*(U|l_AdRdK#pciDq=En_dZf$F`o+AL)Gx9GE=^uH7@vRW zvpD%guF@Fhzti}8Yyf}Y(Em`Dynn*vd-P?>&`NjoQd4lkWuz^HdRG3+FB@ePM+$pO zx5iOM7JlH@b;*_vsVvU5BQTt;h-0sWBesyh-j>xKAEI2hD7hM1q_zQzqd(|NcTqKD zX?&n?Yt0}=W-cPplv-0NHJfW{!*UctNXiQH%BEz!SNHe6Rc-e zZ`UU!>G$$p{F8o?I*52%Fq_jsynO?*hr_YOf0_{?7%tBh1WWM7)yMEtB|@Pm*`^V#MCwj2-a-%QAw?jDFX`7NCz$f@I;Puc1A_HOXn z()UB&vblnu@^k9RAEiXvi&!O^ceAH;bH6qbH3*rnuwS=~$PXNE^W!gf-f$)SagFD= z{4whbnKg@cKMF&GzFm3|0)_FNIX$3#MzK<@OQu;>$ayY_TP*FdV@tT&2)r*S$nfT< z=>@lsB5mpT`W-!j&Io+YdGH>K=U!d%3-RP%o&#y-q(H5A+l4D)q(YbNnoD7qKQs5- zR<@tv>5f@LFILIy^*-Z>YK{*w46b7p$R-Jrh%Yr2?qja)%|-8ahR4}I&BF!>!k$gli;h;`{V~;; zwYh@l@zK34Bg)}jFIhH7&(RBv$h;Z8qM(c-!|6}kN$=J-*Gf2hzjQ2fQM|5YA8lIC z9!)FK{z8W)2&X9voA4Kshc>BEJ*ExfiI1UAMUw!v?`BHk_X4oj=CR7AS^J$!pZ)kN z&EdqouY=h?gV#FceRNQ81C_>}y%0X?Q&yQ}u^Pjp(h=b5Z?8Lnr6R$;&C;v#61R&l zx;gHSc?2$HJm)DvA@fxW*$QNPa>BHHd=z5wkt5%;L^8FOjS z2XuBJY?|NQ$71+~)7-hNA*)IQ%i-^2<55C&fu2?k2`-Egv_q_qZ1NpOM`1&Btp(yN z&TpKP#5AkR70eTEr%G@i1HG|zP3xHlN{`{cdZh0}dFGTm8mF%A8M%V%QD#X^qDdaU zBEIQ}p`?D55u4Xo&7j5N8_=>iv(?AXC-my6-T9=zLh}apclpiVK1>Ys(fanKhkf-wD^1BbBmfm% zjqNe(om=d zR_`yQH=6Tz)IN=JF3S{7D|^H%5Lfo{(Fgg5B$h|Dse84>X81`$@50Yz~|v+h%oUhxTvCbG7p+$d)*LAv96WkC*#GRnSU z0nPU`y+zSJCOpiVz6kI1foP;X%hS=t+mk!{G9JXPI&rPGv1nHhR%h2Y)-7dMkb@&6 zog4|e8rh9~lWkN$Z!`Tz)q3Q3yDhREMzkr}CoT?8Zg z^AoVEOPecZh2@bY<))^VWA~^kKRchcSo<_X$<=8RAP1F-kh_%2%YAUlOui)POa?gy zOMv9m=hk|EXpz*hqJGz=!~2MRA3gyhu;sjV4}^& z4z)`c#H|}Wg?ax14)3arPf7Hxd*HoD{ z%~=J&VQzCv-z0AuA=-DVM>dy88k$vxr}V|c1Zy=W6@z@Y1KOIZqZ;4Z zNwc)7AhLpViL-7Y;zp+212fB9J=U6@h_>1O>mQfIeUE2zIQG?KdNjBnY*Fn=rSMli zG*ud%*;Jzg zSy$mn8I~5Rnl$R=3(z9Vt&bBm=~r4q2Bn+m!XCcda$tAIzD7O(=EG z+8nu!UlXILoyI6lW4(3~PF53)wTh(eqI;MCzU%(_R6lVezM=KFpJ7_0Z)Zy;ivT#Jkzs4g__>nV_Q1?t$5n6 zp0GC_>RseIx))+)x7Yh{sU4P2b;zLqzJV;WD6i`>_!Sl#+Ni1F&vzDO=QdvJXcwYY z9GFiq_-yaB8-VNyI}=3TvYJ240nfAoWOrJAx0Hd;`*G9}1f`(f+?YYUt$nAjdcn@f7mB?T# z#xIfR`=1;}N#ChGgYf7>6ME&HZOB6%=Ut|5@Dbd<;ToUC}!ZJ>K_llTH*og;c)Qc0e6J z38VGTUMjV?W?PG2-K~|e?p*Z(bt54H*|JKe3K{w{X=BNO0cKl200Ufx8HfFJ$(eA@ zg)_vHCD(FA@*|U?G)XNDy`>a<-&g;)+W7s3OY&2KBbJrB-RjN3(-x@S1BQ*N`io)i z?ui|VryJVVSc~)CG89)Z?KAGUF~9X`#X8I{?BZ0u%x$OVp1WtMS2x5}>npdCAIoKl zeyQvIc5ptR7u3-zM2|uZ0{x_1l6tzSUWLNR_EW+NZqRb`?#EmCXS&NjI1LuC`oP)XWsjL#Lxnzk6=#7 zY5K7Ap1$DRc5P?J&?nK6#}eR4u)I;3_1fo7U*7d`cUHEOZ*1Pd|X?cT$ThWO;duf7uw* z>_1I6->7x7aA1ZS)Z!OC}`i`xJSF(dZ_ud7& z0?0U5yy(RkKJi0|SqAE0t#BT)EJKloUduAMS7X2Z*!6mL0eCSL9vbjae0ievUaFGP z2=(zNwGwfe8;jSHLm_j}3BS~hvGRmAaUA~G)d*m__mpG5K{|P=h+NoTHUtsHIk#%B z2U|ptZ*FE`_RJ^^?q;d8yS>hbPBt^`*}BP36eiSRS^eM+(}cSFDyVf9bPEP>x0|GO zezP=Hi_FsU^1JUQve@HxoZm*}BM+W0-3y=$*SI~GZ_Rr5Ks&9l0eFYSfqduSvsaN^ zjt8AQzijrDgAgZjwGX4k8=iK-vjZaR^=*PF8!FSF@XOlZjh} zTQi;Pr$c?nO97$TdkC__<=rD<>ozJ?;>`v zF4(0CbhqiL(67?du4m$@8w_|%&7Ka`_k)a4!Ks%w=hLLX{>fIsiWipm zwq=w%RDe)042sLEzEAQN!Vp<4si|x!bMphrACS*QSFX>?OaM*f(IBB0spkl4a>BXL z?PuS=7YVu8m;i-drv_TGh!b#aJ)C{JwDUnR`xL`^kZFgglgUNGi!^f@Q>s|-4s~X_ z#>)W8z8*5;sk0#exTx@!C!K;j|XLab!;VbPY)&ZWMQiFw;E~5#$ zX}VTifn&8nHqjc@j0BFJYi;EYjN)I=16le0EpiqW*XS87nP4l}i95ytv= zDC`jM)8LHNDk*Z7>1IiZ`?9;$fqCRwtW45j;{&QL8;-oBgA`F9sR>{vXokd3qm-6R z&5);-9_FWBQiRPSyhjDK3o38y1w_@fnbpW5Tj8-I(UA$_ZJdoyS}L3M`d#f%s`L#w zo?lM#S^FQw|8p8c@sHq8b@{3Wzx94RJ?{D#zEAMFTK7=l3T?Bw-ua%_1}EUf0r1sZ zxwajLiR3(U{zUhH?Tu`78l(}Np1r~u9Ok`-(>e(D4>lDjeD%$M#-JNO8%=?Ip2?{*ptZ}c1%TE|EAV}D%tXY$NW zrTmh-+bt4NB?i=X#w0B&&R()NGt9|ao*EDr4yS%3Tv+9DYM5;4P@ZMV$G(uK1-pRs zJ=>&>-?gDVA*#X~Lg-X2^^ahl!ASJ<3{0rxgj}xd394XkYIkJ73TH;Jie_`56+M0@ zTrP+KGp6*{<04(oFU7^}k)%`GxnFj}pe&!6^E$-S67>;1zhcrfpHX}l6@wnaY4j7* zF?Fm6bF+x9))4J6Hur$y!dlppOzm6(1wk<%aqGp`#+spb_oZm`Y8}+QDm=~xQ z1cU*Tbsgl@W~WL>I58zloNWtroE-Hc&XG3fn z1Xlyb79PWk3te>Avw>0>6}0VT&cSE<5oB+%4j8Kgxy?|?qL;Q?GK?SR%fych>1TNB zOH3^wS&tp)T!U7M2{1TByp5JJE`o}bLw<;pR^KYK<{Tpsg) zycLtwEt>>wh#M31;A*IV6Lkc+mgYVw_CWY`J%*)@z&16GqAKi(t-6Nc`^SGkA0|EB z2v7T9g_B#_##FIy(t4({HQ&~Ec~hoU;OC^G1J^Xx>Yddv&z*}rpn&oh zPlv5tn*yoUYb=uDjn4<+L3+=RbjJBx-Eds~diOEmevNlYA6!{zt$xA*r`KL&iLM>n z=EImjr+*clv>H?52rENaroF*R{?Wm))c#S%27Y;7$?nv#*@GFcN}bIjFE5pkE^SxI<>BBl@vSneQ+1Eg3N}7Q zt6};!zst%Lc0W<>;OYmfQQE6qrOGRYzg4e!ea2>kH7 zF&T(|^l(HkQ_H*|wGY`>&UkMG^hMBArsz#;2g|peU?DhE zT8GPNENrK%vbXI7Hw;rU_C^=K1<|AMo?1A_UPahn=B-k)jC;G>38 z_r;Mr=VO+Sf07f56L3j;+p1P|$}tF4XemWldLLw#cVsyj47`~s_b_!i?CwpOU)8^Z z+w5!_9Owv#yKiR3{a?JA+Ij0|b4^a=nkT!87S&&R4+-427EK{n+>uc^tKt3&IFem{ z@Dxd$7BlEjT{-m4(^-Qi4K(Pr(1gp>>wrU5YG8#!fR0y<3r#0GyP`exEtahXA6X5C z;0)m_*N}zvcguL|IiIS?O zvOpQ(Z@oL7A-+<)qQk0cORN*6S2rG}cA)b)_iaOvSNFEUjA72jG9|3}oOiB^@ozkE zqq3UP=o*tHV=F*IfmQluj>Q+SLIm&~V}HO4Dm^bZwRemBpj2vkcOu7o+F_zP8LI?Oxx`!SlGHufswP{q{@IFu9v0Z$J8JEy*ERU9L9#tjJAi zmrrkb)M6b$4#V_$2?Pyn5f-@9{KixsN0fXkQX&XH9l1iaqgd{f{hWN)0%bqzL^+(o z3IC`|K8~>MH@(fs_y6f@*Gov(j0|>vRH}ULk=0t0l!dm666Vm&wa(?VY-pOua-Y6_ zjI75UMa#E`c_8V}W$Y6VRPukziSFvx@7S8wd&41*1-g+H@dV*?51+Md>5oHuc5wwg zp?2hWuYn1G;ZD%!6O--(w?Js|?PavMpEcj(pv|(-eD(YN?|&PkebPb(j}O_aI0my1 zheWz0H;~k#nO(iTkJe1Rf8;Dd+ZCNOr_+l&AUV? z>kl2GsY&Io5g+jok5bV!XVyETp`Vy3p9mO8vmiOGuyxY*dltzUq-X)Sd9ESyHLFr) zjX*o!KI)UBV zi8$x8?7v=$g!-m#kpkgU=WcqRp$hh=!e7IEM|gi~p+!9`idpk9T|e?)b#S?$CTfYz zuXxDR-g1)$+AlxKY7YwCjV6fqO6We^S93Qwyr|8Vq2ZQ^Xu(*YsaY~+Vo@Ra;H78MV7`HV-|)1tDJ+XEqKmU+rvtEXFm)2DyPI4rTyBz!Tl&G?nRtA?s{R z(PVOgG?{f(^Y}PbB*mPmoP>-!qI*}Q1EYqY+`oJ!P=>klTj`mTx&&9p3oQNr21pFL`qbT--%zK{by z;CD`cTmi^BTK2|I$VtR(s1C{9VUyy1yIXJb-KUPKx@oQ>=*Lo1XdPHY`0}P*(J{`L z1HVAE_#8F>d4Ca?EkE1I2)3=pmB&*vs8O$-b6w4*lWVCx@sfAj7BN|&CsE>1w#fnu=30ALcVfqBEW{YFIt)leAilmDR97H=dD-U# zs{mutrpOxK=~bM|_kkz%JX$q9ez``K6%bGY(u8<@_MTp@OZ{bNXsMX`PUE{i>*h^7 zkPF+E2@I27tzp&+Cid*7J8Z0}fF~&a)$LQn!Tpe&{`~$pEd>R{40WdQj&DoFeE_wM znspVZW&f1$;rO|oHn(`TR+r-BYg<4M)HC44`|fF(-GL3^CN#m#XSUM=lZVgR5|I@Y z$ToUa;E`3$wqzS!MhXQIn;%pUFyybp8FoaKDhs)@dr<@CI%#Wii0rX-Ao;;_?MqOh ze{xmo7<3KSm^H=L&l@!RyY3goMZRBD6lRs{+7bF(!I3IOzu&MIdu=B>aWUL3TS>@I z!`(Cf9_X?G)-B%@^-VM>Ipc#6ZJE%L*v!Y7;H&ifmS>kcG3<3% z>zyYM^w)OcGsHEIu4EDW>v)UjAtp2 zU0ko*kBE-Y)W`-=y!gvIalq1n%at{Om2wqYaufbhO082u(8BB%`3~SM%c;wxWR!ge zaBXYyd@@Ra1UvE>qGG_Rf41*aZ<^T9KQfQ@a}2Su8ykL7qzt)-mnHtOxU-I^i%WD^ z_#>GXrXO*rt|K9n?=m5i_|g%f5N80_ohdGK1tU92>fvOxw*5|Pq$G6XDvZea@_dHe zwTe9nbFU@q5$f&tDPnp&{hsO4t#12^qG|KO+MiH$;_YO{pAncsv-1~As4-(hMw{m{ z3hDm%!TCqr?YSyX;opCzoiBX?s2@fOMP#Aq2HNY14z^772 z^qeUPmI1{U@W}rZdrxAEO6ug0c;a>OL-qBs0BUs|g~(uRX`YTG?AB+ybDviO>rG`w zzYTy48t2 zdnq0gij9#Z$tX9t0@MA&vTZt8Z^HGy0D)JF;)Wq4M##6*&!)^sT=8j!lx2(ML?Pz( zxk=b|yDwf@udk?NioMs0$l}w(7x4#*6OO-furPlKIv8?oP%B{c>2bqEQ# ziFMfglioi5h!NHX@Px4`xDM8z@W02dHZ^3uBs6d{yu{Q^Tf*fx@p?|hA2Gx0(5PL%9Y_ON*mzU6ta-X#7GS=Q#h39-c0`uU>D|aYHHh3){FFAIG{qIS>39Iq?3J@g57;Qr!Eqgzl(JIbVpI z%2}Y%#3kwa?1D!3!2;0&I7%F~JcOdlqR}e;wrAsj)VB61d&za6Cv3?UtHai(`dli6 z+R5-p){ybnu(LxDMx?h^!U@j;zh&)xeRS=(Uz^ z>ei&q_Gt1ajS|t$IuXK}N8abmmEP!8c!{~;`CCEJD;8KQGlT&uY;FE%QN=Gc zh@|z{v>yQFA|`k9gI0_6E8i?rq?u4!gU+6W_LOv}HMyYOZ7=o_+3_s?_9v)=F-^E(tXuey)#=rC{Ik+3}Ry682-D6y~G+xUtF zF0qJ&YM$mlck7Gs)23}^XYiw}r#Tq)%ry@k1NI>=`SEBMw79zzG0i`RV`V2Z0HGQo z`*QuZ2kFT@`Iy~{D=a=#1D^4fla5Te$uvEU{I4c|JiB0S0j9u8=APl=A9-6xfX0$UlG{bSM$s)gVnA}pfdM>=exj%bmH7c-@qVnEjRp?5NWxEAdT zO}gnH^83J73Y``(d*ue9XWN{%sQe!V=%xkk+5F6HIF{QY4A5 zjhnt35KuE+&z|YlI>=$&ahTkyaR%^@KDjFnH7oRe#s82ceaqkV)9dtwsTbAI2GG+v z7Hk!#bt1WiBOq%5uqg9UPDwMO1Ce`h6t@gMyhPhr9{+v{k}O1@@sX+^Fd@d=z{2x; zVn*wUfP>>2H}wMA2kE;fq-i1cXb|@5PITya*jd@(yTdP#py}04LwGlbldH?c$RqgN zR=VL3pk5^kle$Zu_h4`2R*XonW3$!I0 zbg3U^5%O96U0EHR=O0lwyCe=6k+_Dx-om2AZ?-@=|{5Ueo!Q@>B8#khPI{>n4c7HjqH zklT9+#Hsw+9GEY{U)JETDv%9eMU*yQmt4=&K{0JxHopAwqU~#&$K+Oj>R_S+t^<6? zwyow?0pHIA?LOJHIM+Nl2+R!?ceRmFdYMY>R-8WcS-#vBH}cJ4AV;kJaCr3RnBSeN z>|Spnl*Qp0tWeCRL)?kr_WsLZ1Nd}@Cu{9`p*m>VSqn}?wSUuV$)pF6fl*mRW4L>5 zE9NsIk~Frw!Fd~T_M3X;bE4qEFWj}bt&DBY)9f~B9&%!4_b9$Qv*zy#dmM%lu)_&~ z2bp!&_8>WJ|`kOF|eaOQDYTM;dkA4Rs@+G*r9*IP) zqh5`RQ&VG8!;8-MB&G@V%?~d5sR1K)96DbtSWI8fcm+X*>7(8NAN#}dd6QrN(R3k=XZzUIzcw@52A`D@4)(3rfBnrcSr2E>~|jH@Dea@sy)+=zb|kYVE;idIYb_L-s^hZ{)8Wg}fw2q8N*FaS zBCAdMEh`e#Wdy#UPIVN%Nquh)5xbr#^Ky6Wt%tt+fo*TO)C(mzv8rp>shoFP{8#iioW=Wv zunXI`k53KdkAG4mTvHBMJ1`pR1nQ32_9E||Tx_7|!$QLSxefN)gWvnqi#cgzG?tVw zoT-STpx}eZxRT48HT$`ApM9sYlnR+LR)3Fz(DNOFogS#K8SSrpU7bXT+u)8Bb4jCj zabuPy%g5TUHZWuIXOw0eFeSUCQ14rU2m0k?3GV@PS2_^`gp;z8$$Y#MS9ZIT~8~@lRth zmi2AnTX#H+-QhM5^-zG=j&ZXJg*!HlU3nN!t;No39})dVuXpLk2G!+#aUIj9T{LiI z$j_!hfrt2KdR`W*ZBxnA0@r!VYOj^d@&ePsekW5h<%~DwF}>3{GlRyW=*TihuaYs& z6c45(w--#=)yQ@GVDQD|7v|2+aQ;dAV?A{`?BD{krs3^AW0#^S^{AuV(&PeGX)9X) zQ~7Ql@Nh_#xdWYX1W>~Ql8SITS&%eQo}i)u-8H!p?2p3ckvqND+og9U$m`w;3S~{R zQWXOrq3J!J15^cjs+Xa2(gsv%s&LZ(o-;b~L1w_6*CIN32{`@3RJcm*S5a+HsJgJN%$8Re{r5*|pI_>lD1h1~c&nHnpKT zMZCApks~1D!k}oT{U#TxACFs!Ymr(!l5O51M&TPo!~pO*6eGTz$9e4}C!HpQuxFsr7$x90O# z4h4%C*Z_k`JB`BjI02ms$iy;?GkJnNbx~Aa7D#Ng8aI_+3irZ%MxY%u$V(Ebn|Joe^c6YgZJ$x!g4uJ_s3 zYh+%|wx0bEN@!syEC|AULtN6c+|>_ht*lO2300`<)$yeU91P$p<#(srH8cADdPAsZ zpk`L<7d?H$5%}czr-N|hC${ngWqaflML3i5KD+??8DRisze|1Ry7#=jww>osSjO#e zc73C%pV)!sxHk{bu4yZrER!TH$Mu#D0Zj4Tr6Yx=Zbx?F-~bowYITcUCl~4{g?A^I zT2ABo&@!v5oZ7m1#>7^lA18peo~`T$M3*Bx=B@|PU?H|cyVbL0C~R=#&=dcpgL07c zaDy64D7`IlaHgUD?X7Ova3fN?<2c)_ZQZ>KD$)-CPv0FP?m+g{M-MtdeRtYAw5Hc{ zV19Gz@x^`x^uhIq%b(P2f(N1;4rRX~^d&?7iNY2zv=&dEu-ahd`p|}C=k0^?=B%5bge~e%3T(d z^&|)bg)V__YO*#$GW$1@;@ks}6@UWy`nd7xgp0AgKAA|Rl0e(8#eh|&vp*$oV>(4K z0TN{ej_H@XZf$*ZO2=DRYVGwlPRhJwZ4nnC?rua-6qXWXi7aztLMETeuOYF;yD%>OS`$=)J)s80Hx@xBenwvS!WDyk6~8rny{TJ@Fx1lV5OQXJP@eq z;g7Ei&xTld|A12df%m7J3oBK#e^tt`AhAc?zTR$jFvS|f8(!B8#Q{~{UbMU72{-BI z`VdMFAIPXNYWMvXmv3?p@#9*$e*AC4vRuE^5*|L27$N5q?RQ@vNr4EAICDL_dc^ePcKkalO^mr=I+GT8sFdMM5v zom|!AXjPwdU+TmJz2iGM5}eGk?f_ly~jQ z(a)b%C*M7gG<4OkhF6XODzog;{BOqJ|L#N11%}FS zjmb1724wnA;fnv!zn%sL&h1G2-fi3bKYYcErTv$Se#}2(EB*O1yYz2(vIX;hrY0m! zV)SpV7ytZcY{=gIftzCgOig?L#pS=XKK?x13>a4WlbZF{AO9nLC*ctBBEPc9 z+9}v!hGF_*t;J{9YDiv%5!YDg;UD75UZT0|BRTWYS_XD5seS&`zb?*ytw&FsYS}4O zd~|}*-@3`ryd)Vc4eULAssil)rv@1N??GeYt$&%m|2><h6eBk{@qH8KBFT;PmhwvHtJ9p=UWrR1~yPZ9c$Ir#s9p^ORszXgW=VH60Q zJqxRiG{c1zE8)n(jXxag|6{pTbDB?#e`H$N2OWYRVWktg1}cPzy77+D zeq#bp-GkiI(y{~fQbVtdDuY!=-mL{g-&$-YYn<4#Z(P~Crtn~XG)AGf2kYLt{H>bUl6jT$(7YwNU*a#+YpOXb zr^b7j7785YQjjNh7N`2{yU-^Or`EY&Bx=#zhWihj@sJ5}!t@+5BEuL0nnbIm6xepbQM| z@u}+fA7xsIV1U>K{{~|J^*9HAOn_G|#iT2XuT5OGO&D~@;9_(xtarO9PA5=Y9*Z%6 z-T1UGi|mMfMCZO{hyTO-yn#5@@SmRCVQW}*mNu48ENyUWD42B!ODwIzJt*o&w1ItH z86-miY+V1o35B}|>64Gdv#0mP%n$0Gc{+}7Gn4ZCTmma1BS!YVEAx6-ZImA@|8(E{ z#+-ok^UM0gI!gLvnD5$BsMS&zLJXFiA2MGMbPoy{2(KuJ+z|=fzK*b)#36g}EXRBj zWPLqy-CF}npWY&4r@o9$^*tce#%eo~r#$=nNu;zLLO|*|aSndhu|w>9HT_q>;<8CV zU$wHw`|pM9C++k}h6|shFm$fW?U3R?>naofk7C8<)(~V_ZUzpA>1uqxNiQyCvO}B2 zQjvW_q}`qq#{r146RH|S&VMICWTX^+QGL&*D#UsrB9m)N{Dzs~=7X}E%R4Nlw>_0M znqy7RqjV>%OM@HyC6{r!8;97|-%ofBo;Mu^Y)0pRe#k%%;M0{x5wT}zJo{tKwMo%{ zsV(2hRG+}W%`cMQUVOW_u`<4RZI3uJW>1qMFGij3l~Q7GY@i%%H*3}T!qy=E0N9H_ zbIj=@@x8$jp8xhzFomy({8XMwpiSzxVQ+aIPYk2G1CVH-AO19 z2BmT$J<@o@)8s={t;UH*mr;8!mxI#H)kn1iX0soiQgyM}P!q2FSb1bpte?JH7>k@K z4Wz9xl7Mq~4S^|4`7GZ-|919=sj{Cb4rJEENMOt_{E#WTuxF++)ohJ?`R%^*us%O9 zw7ph>rEqPm{S3*As^K=;T%e?QbzFP_#cSWiN9rAOXkxH6iyTgZQ{{OmQL6gI=r@?JCjbDs*7KKRG_LUJx;q znqcV$f*%#&O5WxAOGlA^Ix4@Jm{cp9!#Z=X1)mM~?_*Ou9s>dS^z50Ps?1#rJ_NI? zvS!|p9dRC16>~5ZS9MTPkm2|A5b5YZ@k#%@P0}UPf8i%hoXBf@fXSnZMeaOBb>a^q z-pyljp1)K?%OTag2HkFRuO1%<>xk)*`y`ldPGOUH*D*`dlXQRPo_!ybD*NqqKR}PS zoI^*cwV{v{(uM5W{gkCXz*>};$svD2wOQjJ=3kY^KPUe0ZcdohBk+v~B}3=}3Jy{u5l#8X8WpPG}YNv)`BsvG+`hcaldF;WTcFtW0424`Uxkayii%ik->l^U)yn2ua&t^SYX z<740OX?F9x6h@iFLf(&53N!coFzCnq<&E^aP;AfKvoK?PT6$dIBgcef58K4qpgrdL zRK&v1L${lHxN;W6N2UUfr{s4WPq`pv*?AG)TOIaebU0KWJxA!2J-e$0=m<0==yIq! z)QA=Jf9V)wD&*+FXu-`ucXPlm4eb`C#CwNKoK9D(B@FNcluNVy3cDQmUKSLfk@3O& z+H4#~()GY~6X&3x*}T2DQKgJg3;yow%)kCiX+R41b5VR!zV+jwe08e5)1-8`9*F&K z=jU-F=WsM{m=g6IgEhv#+4q%M!qsDvi+KLgI+)_UEj%i%XJ&GpNru?+XZOxNdvxbT zueSIKgSn+8yn{~!oBV9Zjj|sXdt7zpKoF39GtGa*VJcX*w{@A+*LF!sTAb1LlKTkL zY=m5tscI{WrBbKr7E)@{KdP_JcRIrT!}Fpr z{%mCmyZfYT#9$_ zX%s5R#Eh@EG!xT&2y<bNI3H#)R?#v5@LIlq{qRO7>?h`+0ZoNt4NZIVSi;ycP=@ec}WO zZWrY~x(;xUu;+5n-Iw|d9L$I9{^4`@pGxse}k#J)kV)cj6(M6&PlrolquFFM0u;J$vv5@G4HF3T6pYtYN43b!_e3B z(Y~Bzw}WMLl|)4l`=v)Q#tgonlJk9k;WK4`RnIX@aKo>c2T@t}w|fWex0UnlWz#6iVp{&_-f{Xg`4o&o&vz?T+4=ZesKn}2&=HAj}=d?+1g z>u}90waB9>@lP2k)VUhNZYEv$tC{@EfWfO%H|_2w{rB7IjN982dT!VMe*6Es|DA&d z2-r^H%J@hB4`Y{6&8b|b`1BoP?#XEU$nzJWWeP`&{U`HJsXr;u=WpJgFjf9z^==q^ zzAlqwT+cN|`M-aE!&TkS|6%^=L7VOL{z?4*-!6{-{Pgw8AIc@B&C}&&MnK>E zKRilh_SqqS^Z8sp@{d1@Q%%D5{J*!(aK=3e`{RuJfBnzb91dY=(I$_vdxy}nOX2TS zwH~X68yuB5cT)7cMgMgtx#OtxdnPrmXBwV~r5ZfGU-tES$j@V!Fb37nFS>oDpx`J;SO zd21u|_nE)VTlN!1xxgbmLn}2yet(Px72jPm?2{56JGW{FVr>63xNmxN2%=Y3(_x1M3P78D@jeU+S@jC*s{g#dnT6l7*Dc!lfA_fN#_Erwg79V>BYA1QbwB7nOH>Y-s$7iJIra%g? zJ{Y12AO@($APJMopkp1}#F{pft^hfpqB3;SVg-I zL6KjLk$dBKQ_wPJ(UE^SBWA`Kg|)J5m`tk*j0ihT<`Is{dDSBrmlxb}$tr~@fb`X% zQI3p2pSe-uS`*t0kw2Bm8lJV^B==lF) z@4cg%+Pc0`5D|_DcvL_@nhm8Yy@etwDgq)sG?Ct=L+B!K6e$)!I!Gr#KuD+|B1(tQ zLN6jcp+gb~gxu|Up7TDh-^nxHZ;X5IH@@%Q_a8;POF2(LV?rUXUS;Rn4ybs;R8d&lIX!3 zpHH&uiYqGW@crO~;fi;Syp*w1*i{ddGT78?jrYWYPo0NDgWYS+!VVpGZK%&EXa~Ri zf;Q_Gw-6k^Z%f)@bsKyhJN)8H)^hH*I~WxrQkn}BP|NdS0MY=?-z|%odP--W;)R9-%aUV^GS>9F)1H-o4PAiGW1Se zyg#<9D%x~*VkP>w9g6_-EA)k%@q_9({h>v$DEyH}TI4Is*Nj@S-MqyxZE(H^3SuD{ zGoCNjhQIe|2chgyQ$M3$q8Fl7oRse#uvQ)D9Wj+#$ly50;DwRC6b@w_IepxmFqw#1 zuG2(y1GWE5cfr~953ba_)`gY(q6y`LqX%bbt?d#J_}`c;-NAN+tbN_`Mz|KXc*iIX zx!6j3>mck{(Wpz#j1wl8xFE$%UD?=%LSrOYGp2R4YCZTdVMf|#no;OyGV)*kg?1&-@UG)T zLcB3hFO{g-{X18fIyeLry}Rf<2`nIB_dHbEBL9-SX3RmP+UzIHn~e0 zCU?({Aj}9E7Z8X2E2-WWDX<9jddG&>s))#al+hD=Q;N_PFZ~3 zu=3k;ymF1nHGdcZ#`9+RrT?n=6lV2g58@pk{LvwV;}zdTxo*!%`}QEs0a=rfobYFva1G|JL&UwQvVXnWj2 zActN#1$l60Df);R@(II#LyJX=rTmJ1EQ*ukdu;$NsWu}6x&ql;PT<$R_(A|nUAp?Hy$qPBvW_tv}*RPx$GdXA(Y2G0wU zYIkLNj5AB&&l+Vw%2%x|+EXpj&9PnHBSrl$XLCc;*QUiNume~Bf{EFhF7fWe6msS; zDYL<8ZA=JZ@B9W2nX*AzAa9JZo?vn{-uUsgV!Di7$d`EQj-udlV54jAfAnn`pa`YjG{NUy&d+Bem-H%VJ8Dg@Im18#qG;GfLhsDsqu&WOb6b%knYEsvj zw|KHKfs0T}hfFn;nBVRb?nT8?=q|~Tl zf7hm6wjZK4^**2D{l+;S)q1p#6{b7Xu`qE?^sDE_hFMWA(P9zNXcP+*WQ0t?U)MN0 z7G%HN{E>RY~If zbChrEJv_=iad9j?`-+U6t?V$RMB&yU|Sh7Z7!J?0yrO4?hW4GnYSNhwB%8cbV>fYcWrE*oh z#a?%p=h*xN=`fE}FO(0$#EocDe1wiuOny@lM4;0oz6jOiU|56aE*dn#wf)9EJ_fl? zPb6PjM1pF|^~;)kYeq`4+e!n8(?Y@UoqHRKb%#^?FL}$=bVi4WL2J+D!F944?wZho zA5Zd0vGv8{lP|-KmdEg1Zw}j7kp>b*d}9^PD)!8LxlhJl-jqpR+v_t!61qRMT{|Ej zEklS07&3!K@w6v0aZqS;MjzYq%8)dj@hwN;@Y7cvir?366_>tR5sKsc5UGv-L63pN z_jVp#J1y7^`SJ`1!{Y3Q%H(ox)=0tcKEU62pmbShdNcp);qz$MkmkOMk#3E4iuxEI zHqC^W_ef#(Ixbf7^3C0wjEfRqZg4yyg(@|KiBB98cFeL8h#F}bi0e5;8HlTrJ$lsD zJSdXRl{{^IEvR$`QA%rb+94&M@1b#8vUc4t#MR9ZJk|Wnz%i3NYXQ*Yf^j>}L$w>W zq>ssrqhHRMP8$L2;)=f8I)YUNGBMa6c?MaAB& zT5;_5Y4-Z1`o}dCuO=SA3((T3v(e_wAJy5v*8`lcdsP9C1E;GVp_UPkE#dU;XNZ;^ zbuw$bP22W~-doXLIzwH~=s}}{g-lcFrJY3vcXnkSIQ_lpPuXQvJ@Vk~t|eDem@grK zFeR*m|E{#x>RUW`$FV77+2Sek?NXg1+bvk_hRx}aF~5QW6ss9t9@f_R*vD6IrJzu% z`#^`D!kKtgY3E~s9pUya&tc%1`V%!Nl;H(qYybb$d^4)~Ktj@JapL^p&cib?^ZzyX@Cc3=O$>~f$GVJvtL%ZE%8dYd&LZWoo(3u!WYy3-!#=P)f_t$&NjNgz`^sPQ;&o zUu6`hIL-Q-g!)ZX`S(Jyu1cMWCDZ9I$kyir)v-m+CvVj{vVV!yjC@w!_MWH_x(s=4 zEjc-;EV5hh<8#9}XHnb(jV}#iCh91+;?ZVFUi&5RbtKJ3tBzwV$A7)b*bzf$Wu`1~i+Z(i*1`%#!R9RESd-nu#-TlZ&X-e=D(Ld^Wg$Wz*2QIpq@^pnMfhOJWPVq|yezc{~&4Bn!j@r>%qx0pL0-p1+>@~+*#-mUL>Tcwnfspl)*JwP( zhC^t*I#Ttmfd05ZhwM?hLrP106%V(MR)|S~?dj^M@I=*hjs-La00}?QJvVAJobnfEA#EMRn3QopO!v`h8|jY5e|FOht2%P zf-*zIK{J;b`QNn!3U+hB@?~BJN6a|Oa<Y`N5i-fv!f9Ropt*@vPRd76o7-MUB(tcvmwHzOKL!$mQkf}8 z+?+6FK(ehVdM5Ya6(^KI6H4y{pN*ye+8!aD9YA0NxmE3UlRA$WngZEBQQl;&UGFg0 z*j_dhh(J*;A8U^g9}5blD=5StbqwE?wO?@Ic3U^}=#iOJ+DR{R9w&Wu@Ig7IIGq{Y zZ?jt?vymQ!wwKmaw4-M7EO>f%AkWGu#95(6_nrIru!pST&>16CtaKeOtb_fq%p5p- zsLu~gyszHbHJCmW`YTgjnk(n8{U^l7bI2d*+X5tRO1>8<)mey8ImoAO_?qz$*Jn&;yU+w zIMYHR8-MNR$ORM<%@+gB+!w=k)t~QX`sPHVSvlWVK6?gs8*1420A{|>=;j;-zM=y^PF!$P}XU8T;D6AWwacW(YnWBD?09j2XE3~MGXWTix zYa3!|W>pX|!2#JvnhY+=R#P6{>o(_3rIYZELj^qR5{ku24n(oopRy&g%2k-_h)sMP z1~E8fqu$n9E>e^T4=mIyek4bG?F3;cyu?SLykH$QkxhU9TzTB8}@a8xlnkjJ>R0 zBG2b!qqBaEkLiH;_;85sp6MOT7Z?s2X<01T#ajPKG-{T|7Fe)9-2Iiml;sa%$P+T9 zQj9MS6-4zPumr?{U$nCJ&PU4~tzbfU5qDf61%@xm5Fa$*XP@)l8DlSCd@j%7vRau~ zohI08=_q`KWBfsfqnGZ9m?pV4=EV=G)~+zoj{~*YY0Ruzkq)!`@E@_Z*cs>Qk(L{v z+q)CEEDnp^7V$0&Q?H8Px#>MMYpwD&h{`&s?_L?2H8Ll<)ZU7Fr0NFT;nmDZm4`1; z8aIiP$37&YQ7{W5IdPOP$L_xH`GXdnvhG{C4I)yhu4%;6+Mpgp%uLDS<9~q1*D$ zkgnEQHQnDuKQiR;sgjt6Y8Tt1TD5r}6>$zLivFn;yBnH|bw_^kOy!s@5Z$W(XM`)qmhC1k2mupTMD$3M6xM52k zvlMn}QLpEa%yxV^!Ug=YuGsO)bFv{ygEcgH|9F8y`@SSi^j8Ni2XNp*oM`jP{7qAh|7Zc-cDwmvm@Uys zPwrMO>?CZ+B{E0lHAC`bUZ!P*S zTN$>JS^{Xdt9c-c-MJL6;0aq$q@x&rjh!U4PCLn3=ey8_yFZ<>SM`PPhKiJX6CldS7)r=mi^xtcCy zhbLMcR2wxW={t63X{AMlY$%yIy_%6xxA_uvt6Jnj`i&m5BdKq3KG9c~B6iguGJU>l zLbLdZeIxY<@z`4M$|87oDdJ&J7#z*&4;f8=L)oqYONP|f+|aN)ub;crm!#iV!D7i~|zjZEbm z=!`CKP}}y$pNF}Io_|N+c|c!9cxZDfg4NP!()arho>8p`rhHJ~J9`uEKwA?ZP`P&J zFVw>DL7y_I&8OwP#^{X& z=HduU)qDtO=ZS}B9z)V|~P)X@SF`8gkQ565RqyL7f{m&cTO3^u_k zOb$$&j=->zT1TI=&*{H3TaWAMVKPq zqN8fC-gf8NywGI~^Uv?UlkQwh?+%JhgFiZp(hJUc!;E;=Wz@n{b1rVApslUQdGIwC zOX;BbS~>pK71U*Cw2^bmJH(^D*qkN5%?vO6GBV;8+LAd-mZJD(wPP{b?`7Zu?0LpX z&6=bhU1F#&)0@kdpjY_iHI9|GnapyF*_`^2I`V6hHYqEaQ-2@*5KB~JhP5f9VS_!^ z;Ew}+l8;?L7dJ4UnQkHN)YrUYij)FoY!1Zsi8ALz>T%aHY(e=;$L-%gY_Q~^c-LH2 z;ekYz#nsL57FUMwXDE#aM~B>;I?}tmoWZ64juiiHb3+KV*JsBDuWM~On4M04`Q^L9 zlvmJbrnO2p0Udj|5=!~RHy`RZb)ivssrM6o(qVM-@5n(S%=FY?howR!Gx3QK&Mn6gwedEk-$q;ME)wyf0h^U zFr8LCqdL5G>5k7Y8u-_j^Nus}|HiMUL-(tK{&jf>$WvXWwc$~Dtp9)J;Q7~`RI^!*D|-Qw`k+fsh5Z4@Gw9Z_!eG{Ro%TqlU-p{+dJQ*=prN(#epMP1hClSFv08x3V*o#*s-c48Ki>0~Az)R*Xg;x=E~dsO z1HSkPP+vPgD{6fW0g(=c10vz!fBbJGZo|PJ*1i74g8JMS(E%b+P|Z6@{c^jQDox5% zB$Dc?;eW&ch{PxC9#tw1BY%Q<7>z^&Q{exG6YX$=c0M!FSt?XBzqhCBqvsG|A)|PB zUu$nAc) zKb?kxy>ICFO%Gf0C|9E8`w1Srf7kuKO?s|}H2Z{5vc(ngy1bi5m`{WIkf-_^*k z4^F)|jO#}Vsgw_qWLccQ<$Mh+e#w6HENpzw9f!5=i&7#_9&7IfruT{_=a*zYp=<&X<4w%~Le9 z3CvoT>E~;f!o$J4*I+*fCG}Jtz{en1xJp-?qeonn8RiaBVWAMmtCGzTT5~7fbuWfs z$V==5XN^3hK&Fg_psppYAXsAw$4t3?T8wx#Z^{AuSx1N~bPviCT2Sw!Xn85x$7oP; z0GiYZ59xrC;yGBH-E)-|jDQAD0b0^Ou;ti54~O;6xd!+TSw(mogq4MJ_)ega>%d25 zjomm*mY-oJ3GV{^Az(hp<234qx+6{4)M2EYqEDFN@u+)+niMfh9SvE!VlKZFRukOT ze#GVJ(W$NB>-g=*n$XmCgNYT}Vw7Ggz28Xh>% zy10J$IujFrA($rME5TT&!@jK0=BfExPvl+~JarR7kiUFDSkL363|-Of zd6SVU;{%NZk6B)#{iWJ%<3R%Qm!Jywr!olV*&x)02i2b);X zgA|r$XX#(QP3^86JqiLTUX>rQjh$F4fkkR0`9d0Q(asw)aYRS8e4Ced7dOd&yCnL1 z_i~Ogz86|=+v~=3whDC@%ow1KLa5DVCPJkSO^kHPjXpBWkD&_|f6MS8KEacMmiMx2 z@`ma(1j#}E+ab{`R#Yk`RI>@kn8m{$GO@Stx54e#Vz`=?vumonHpEE#Dn8qY8L_G- z*vQ*^qY|i;tHHSuU_SCArmV^QD;+c*^FGPgDCPa}szZ5Z%h|=ZO6oJn`dm`z{!YpG zPB||HuUxhnhhLHu899S<-B-PVw#sa^n6f~QXBDqOMZfO0^dgpUb*6!)!HM9l?_Q~h z3Fo&Yf*Z6lk_WRKF$D>l)fUx`dMkShm-~iX>SuB7`%bT1;mfOR2+W-<;Sn_Zx@I@h z!4-Hpe)p}!)Ed*0SdEWxlOtxh`?5iXxB1B3lI@+Tc$MKrBR^bt>`QrhQ-nKIu=R3u z3*SsW!&R4ow>F8ukYl2D-E!zAd>u&cEXQ+fPV+Za^+I&lHF?+8?=#>#RZ8+>{OIk} zKJO=M)f2+aNuT4IuqEq@K3093+eU`aW!Z)4gFttlydzhrj}~*BEgh9jEqn2&n5&&P zCJ?&geNHR2(*Xea<4Vizj6r>-R-zF@&9(a&ZBr3jD930%y;X1Dmx_I&ar|w+OpbHD zgRfH9&(!O-$VAV3$wb?1j#Em?gFfd+hb$-as%mq2<(E5UaVa#0%u2-0d^q0(nu}Az zLVMKYhKU1Wsax?cpAA80;Bzx?L6^t^i#cIBJ*LaWFO!S&XFg29u;UDVfoi5t_q=jb zYZPHJykc@aTPJJ8+XRl*P0p6dKJ`3mV>N^gz)_mJb{Cx0Yoeo~-6njdTt*fkciD}@ z4lC%}aZ93@J)ZIcrJnkU#W$xQ(!3S31o10T6AT~`b@k1`=h!(g$Udc@(HfIJ_$6x5 zGHL6umJ~p(S7!Pjsu8F7tpyZ(hP-m?A<+g%#9bqmq-8ewmZ${+^Rd#~qQ#jJ!&M%w zG;6^_&s#>$HqRzZFX8Hsc!mmmntFYC7UPUcI(u&V$1!o~(b{xrb6|^gr_QpGD7*oB zGg z=E$?F=ai^WevmAOOQ+y?hj-B2Cvt#KFQq7}pw2KEltPf42{~a^;TIsL)Hv{^C71oU zax&ww!DC@+g+_%0@3umF;FnwzIbe zfuk$X7v3|9sJr&8a;6vxP${JY&f600a zrrT9@F=N{ewrF5zjEf0OwuBQ9mAtvm&jQnKxSD+}>oD+WC%7 zP!iMI`sJrmVH1V*2IXrZaTNhqp}|ozX_9QJLgx-yDy>HSMsKWc8(CD$jzpIwJ-X(& z;ZIdZ8dY1E_`Qz%$CWs>2@hX#LlydB*yvNG^3=zJqWjZ3GNajR4c4YhzQyQ;*Kd`VP;2swX;a zdUIcZ(x>6KTT^$l1(wa6LnEOyQh?b?7rk8#=^eNY>pC=q5XzM~q1MsDHr&*#1mdTa z*j>8UEo7B5!z!{{C86^D0bax#Ide3S&@KU)sweDt&u$BQj;JFIywmZ>HX< zV~C^CptA~gn{4xi1CqTINF%T1ZnhCD6G1ock!_Z3p(H7gPQ8_Fr;m2-~p@F z=#R2KCEuY$uJP+qt0vL-+DQ8y(H9S2*t{mCY#gP$?K^;(fGSAiHz*TQuEx|m@`a6 zmv4OwO4JU%uTqszX*&_r)3ERu{?Iq7bR2oVMy0kZE&kc^4cz?^aSYwSR8~{6?+}tQ ziUE=aO>+jZS;@vdCic>LW7S<4si8{}u8D4n#I-9>{q3Nqw#!f6yyySkbtawOHiWf3 z7w$mp&rWt|)JUF;wfMIIV_t09w!FEeuy?(J;m-fanAv9oTyUG5WR887#hpxpH8 zDCGER2%;wPd8>`cx%VP-41bRS!al!bl4_^<s_el=RZf#0n;*r+5Twr#p9$iNfsq35TVT=k0s{m{V22mGl;MeJb}95=ok9tRdEgYTv;Ztuh7zr?7H8UP za^K-|+cNsbB7WlRNy_0YTH3v)Y{s04b>w|1EIZglbI`Xwd#jLLs(yCe4Zq1IY2=)W z5=)3or0+q$XW_vl<#}{zDl8Yfb6mz&d-*R^()u4F zObdI3JJejT?=R@Nv}sK2W~Z3gr|*beerh$_Na=sU^D@(aHm7+3hWyyTH^H~t&U8CX z7W4cj8Ix0oDtwF!B|mS4Y0^iAyzF(#tRmXdc1A!Y@J{RBF6-}M|C&$rBMs7`Jni$PyOY;m2& zvR6x5j?4?c=o(WQ_q_f{b8mwzrj`cRg9<~+_7$ywsl~6|{>*iaxvlJ1Aa76HiS}I< zNNe-(NQHT~3M`DXp;meI{p-(oFyP1W zS;;Q=Qfx4(VjI?}cu7Y~+#z2kixoZjK>>m7b6X3jG1Cx=gAPCzrCk$Yy&2$q7DoC6 z`egRei&AUV_H7eFl)YNO=fCZ$fJihQyo!Tj!=|UPQLLtqz&=sTM7J^)*R#mWRlJrl z8Cz>CMuuMTnerb0&p7(@byXV94ljvF8NpfS33$zqhd%55_qEPyDrG&4Ob;A5=Bp#)Hk@RR2~Lnz_6vTvOJH|uMD66z^J6ct?gyB1Nn$iG!oi>cv1&-7=fvxJ1O(mkA9ua z>~dffIPiNC^~?MKMt17jD3z%Mz8_xC4j^dGy4YW-4u9P#96-4wvY${37XXk83kEQ- z@;k+>zmDfGoD3-ZY7cw^{e*h}^`m@KK;|Vua&rvI0<3B9`3^aW1 z6~ML$`yaS*|I|(XTYzdFYh(LewUtKqHMP~N`T{^%kH-mL40}!c@jO+zF#<}+c){qu z1@cep5dQy9fs~+W=ci+xtG6T9#!Usx31z=y{X)9GJ)){sp9_KW-#Fby?xn0A*bi8$#1;SJ)A8#SJn5rCFFsx>QpVSHkHfKz$KBI|-~c z>pq+4pd^>Yk|5H?lbcS1r0=N{`S zeYqz6dfTSBqi3q!Z2xW?fWdoR36rJG>p3vC*-;k5Pni0{5M-wpP3^}Mniy56SrTjx zu*AEyidAUmLqtW*b0eZH24m;=w!k2-l^8C+JJ1ip+0<9Qo**!Z)|T$a+8-&hmJ1s| zVN;@P)9zlX>{Tay+oQCo*uHQQ;JL$7n$ec>tZL&C#&_;0ftZGWlaT5x* z&581Hw7c)v9rd;O=$Rf8qd=D`D6R-Jb-_tXC8)pmqtK>DD}$GO@L7s8`-nfZcl zUb&XFSQPagLfQ7G0&J2lsJ2RFQ2&Z{-OqUw1%~wBmiec__@CdZhO+6}>C*7?pLia} zXxE3_lht{Odu0no!5$}{5_*h2Jf99RZX~?asP@bn8ikkL!jfX2GK)DFmgQs0C1dWu z-(jD%RdzlgZ!qw!%%OrVX9Sdwo9)p{D??dS!b<+~`~J0AhC?p?RQgL?p8rw*jQz6) z*d@n2Kl1|QrJI=;Xtxu`W!_hm+8Z^{R=ut2WlqVs2rrNMygC{J+K-vRJ~^`GGEZkz zg9baq`sIypWJ&lBOA2vkn7Cu*C<;*1J?SAl`T-doO!+8Hsg%zBQC>e^X;NQKq31jZ zppv~!p9b8Nn?#rzLxTJJl}U@5`;mZ|i-|cyJI~Cnsw~=5Me`{SOtZq^N4LApu!9-I z*`235Z)EmQE82If@0-|hP{+tk#hK^*uS9)agWU!zAsOTR39wJ?ACj9d6{c-HClv{EXa$5J5EZoM)kPG^5zgKQ9=0N&phrT z%NbSh@)D7y+e&)%cbx4W&~K>am8_wo3+xT}v_i;adSoit)8zCGx8NUcKB!_T@7tus z++n&Mk_~Hj1UFDpIdAFEyxo%%QSZ2@S0(Ls59_5Ksg{Nl3Y%=ONg6j-Y&-bl*~FKu z0EvkGGv*GV$V zhrQ<>2r3;gv_xd1`B+^xgyR-?CCKy4mY?J=x-t^1xSy|Oos}??U*KXpYX5SJiM#8q zRjzO8fKfwy^=Z#A!;KVJNRPVUg}{-hCzi9!&B{*d6;((fg6qh1mDm7B3)IsT)~zHP zY8&_YhC*1iPDf*}3wuthi}{VmQ*EW&ggvH_7q6UA0WO8S^$s68nM$vlzAdESP6fMv zc@iuT+cTsq}B|x z*R1@Wit4v~aaAMXe0B4&mKuc1NG~g^rWRLmhem@GId!61%2-uUZeZdMX8u9e_+X>0 zRxZ$f8+qCT8Fj9BX}_}YHs7<=P`q*f2z-#0Z>pbNHSQD5Cv8KH_#^KJf8YMYbpW!X zL{ut`#Hsfu`K!ckSu=H>n|Lk}v-%#hK`|kx7W7VmoxGGo8mdXyacSchb{m@c^>&}9 zrf;n4$99xmXtp(HNWdu9u=rh2Y}B)ryy~xB;X`goRho15F;+C70_+zW0#9ts0-kv8 ztSSk~=^EFL*-+5~oEE-EV95t|JtJ#(rd-zV*7C;qM~pB;a?m0mlH{4J^gERVa8kO+Pf)9@OstSXLDu>`4u_{ntwQ08U= zUF!#aT|cp*{y=d}>BT;-V0h2w9*u-`oTXvDzPF~bl^*WbC)+C07edAq!3oAR5CfAHsXvE+pt@S-~z7pOo&L-v5j@u5MTCWU1;sb^tyY|+yj z_Exd2$mdQzP;K0|3?0A1GFkbvm_KkLVx!UW$`p%pb4{V?o&&7g;`K|(YKQJ*{l?Eo zPQYA%9rjU)T>c0C%*Gi5DqdUl zGRP*aw1yyV`794v4KCvPJ?K6WZ!1-sdljMw4zt9V*i(NaRw&ilrns$2D(G9v_8czw zRWG&GI1*-#Zu9kA@3h!x@<|QaIS16!pAu%;7y)+BDn4!}XGBlUgF@3y(jP|W+)NSH zxdfgGlMjY2JQQEgRXfEzzEljwtiAR^{71(Dwcv-&aZ*MxhlW^8O-+5~%(VhM)i96$nG*mz zS|8%{XzKo4J^YyOpIk$SzcW4F7^C740d=oUK-om=)jxaozVJfOpqA89_R)YS^e--~|xbS|=5#hGy8G z9K3F=q7mBpOESj~Oiwk({TBf(r>a{eZ$hw}9y%~{pzAE8&5ZWnMBxfQ1E2$75ZKRL z3vg~XQNFwZxSn)vc8YiD8!p+ny7N?rbb9aoPmz8G0)9tV<=XOxK*79e5uS+6MZG@F zY4gVms!^#PK=|YIV#3J!T@Af7IpHWB&7)j|P5x=C2h#e?iz- z;COVviwE$9yy~24ePLGp5AjqC|A2k$p%W0!uC@U`=z;O^^0ZQLZnq)b~dtdxy|foh^70XY6pLRhmW zP<2r*W9siN;Lo-3h=~@WI(#ff{qHf*PoO6Ir?Um$`QbnXvjnaeMFKWVv_kIOzd)V; z{K*M0L?(*jasMVg3I0jX|9|b#n<-5E&TTFI)Zcs4@ubT{@aRD;AX!XD+fff?40qcJ ze6Sd@QQhmBmeIbFPK_Q5Xbb)kkeTG2K9~A}YGOzoaI0Oe`Mt$aO^Rmoo&?^xCGFO` zzX!yCLGPt^N0BBIh^^M@A@sY8N%AZ&|sPVegZ~s|6 z{t`iW6o3PcJzBp!LbY5%6?6{BBS*_dUZoN>GxGO60(N)q&Ww45zwYWQC z`Yux)8P_X7gVpQanNeft{I8kpOqLOk#>WeM2H4fBvHJKe-3-7F%m{8>>3cT*2NfNA z_VF0=)v(Db&)7xx;-R_#lWTF~O^uQm1=P!?$*PEx3h++P(+$cu!!P~hqnk>v;X9r9 zJPhIux#X+k$J6!7isF1P^t}pzIrTRyO$C^S`p7lJmE?0#kxw|+Z&DvxL(;;Ng; zn|bKN7W7nY>9^`wy}!>-I6CYn;WgSK6-MBcg&nHaEpFVyf5rvg3Aa17lHhU99rrjJ zo8eOr>21pH>|HZm9)>Cw1$W&gEl1FSQ9pP<6)mi>J5tU+MljHTXZ}+z`fGhJ0;h*! z*j11IS+OwpK=kh_tIGVJDi#hFHm3770Gb)3Wen$5-}|1 zx{CLE*Z;ev3r;Z=@14nSjqrTp7lx^cE7&#`|3C%ea$Xke z#u*`I_i<2)6Y(pPP+IY7baLT(#~X8SrGLYNnjjaVunt4qp#f4M$l_Z|)5qR2u1Mi6 zM3_iqz~hg#>8e zHwFc!%EkpNsoA&ef}bTX-KW^~&gWEgK^`bOgRY$2QBA^qvnSX*3Bi4foeaEXq;ObU_Wos~i zlp6Uf5B|WfrePt3JB{O6F#ER4OZBB54d%h{&GxOWS$TQ;$(zQ(>SK+LqOlmRqlWEOjU`jL zU?YfJ23eJAZQIx1q#9`?M2$~b9(k;p9DIxtS6E(Koot8+Inn`+u&?QIp-tmBGi%*- zXqUPh%i_HHFwqGoN?brgozM-C!;ypP zFN%nN6#p3iQS%jIs{9>d3V|ubBI}V5xQgC{k?9{R(HXAj5w98o;*t>jM>EjW&F{x@ z6LP}I#Y#h(^rVK@vQ{tVUCumn3(3JoMRVtQ9rM{XT>8~i{ZT`X;Bqq+(^~YRk~d7! zWj0Z5`in5YIn?KlpD#2zsQi=0?|@Xl6qskIC|WtUCkDD<^)Bgh3@XrvgL!4@76W3f zZ+GSbO%sJ07Dqy9Q&Cm5ZK7|EJ7M#w*{D^V53}U=f z+6?zrdI9)G6H1|${(gz?_{A%x$j{}r2MEa1hYl9^n7%B|ScA??1z0>9)e^P?-&_79 zoTk1lpQbM1zZPm>r2KtAU1e93m0vKn?y(VEhnbt@n1Z5pD^J9bQJT*hUBhlTawE`@ zqi3(}wj36-F}~&Ak@+Shn}dZvt)@@!thnAY#gc}<&H~WfcyeG*gw_+9r!358;F$av z)MU}(S}!yl!4tfY`9Z^N_twhcqnuex<=VI#!r2Sz z#9{o$VMXLW3mMkUOxqXTOxs%{-%jJgnCn8X-<(%wy*u6{Dw#h2#L{F)Yf`cwpL z2pa&EvW;dE5WR=^B%@~X=|KoJ*J0>Ew%Un=%3~P{*gD;p)2;@vvdX%XXOS1}jpOT^ z)cg~Ru3)@w{C*E8Xn+uqnafvX^N9QP<)I94#|&7N`6Hjk#|BAh8Nt6)Gz_Ns%xiJq zLbh<&1q!~ng}F^L_7E3pQsp}`d?`?s<0L=%vsCTdT4pBNC8fga8>1fbU%K!+t6;Nx z%Zpo$4T-$fG-J#!Hv$8UdahwV5NM01;{f*e17>qRC*=LM`suvc zTx_!Uj;72hC5>f6+XW-E-xT4k8u(gRx;GSGUTu-pEIgz*08}x!>V8PAZb0zTmvcBK zjU+{)Mu@VDO_{rTLIxp4kL_h0ORCUEniY>88Okc&{9rj?^0Ri~otIS{j}>vZtN2b> zBbqUtOe4W|Siha*8?VB+Ug>vtGv1wJl`5w%d-x~0zx(&^@+l=eu+hoT15h5c{90e0 z0MEdp;_G2ef>QP8GAE*;s71AA{>BBZ$i$-#dlQ|G>oVTNRejcbp+yy;_kJw7fuvRp zL=l@^^ya~$PekN_e1>LxhX`%n!T-hHdqy?cZtsI20-^#60xuv0L3&fF)S!sefOP37 zp*QJLLRCk-vWj0*oOD7 zArKGRY0;M*&w$j2T@^Y*Uxgj89qqW7Mnzqkt-I^4HKoz~_w5fQP?^@t<Vbr9?MNILw^W_w<7=D@l$K>l~k_8`osjyttpgb#;*?xs0o{qpt&V_s<^h`(ehH zH1m%i)xGgRbJrU-4$z$oTYKpVCxTG0Mb7o;?YX>o{_A7xmv2$iI1j7(+Z{*o>%M+% zyXvQb_a)|NZ*Ijx{V&3d+>b7uXES1zi(U?m#3D})XlYAJU4L5t@~A)gc)Z)d1pP~8 zFL@uYw)^>YSqnn&iRq^jg3+&%>8f9zNGIohB9S?tsUNLrs2!E3u76i19L?lW5bAl8 z+;{S|j8o^d->p%qPJ>yNK=-cFJ`U3~TArlYj3|YLj3|K(#(WCr-)_<>XA6=_m$Mx5 z>U*%6n*+4Xptnb?&BKn>6EyE5L~pR%lC9M(u%Fz8o=T+LX0cy#v4^g_J>rXAIA{rUL7;PC@}a$7KMQ(<42OQyZ)D?cGMlPlyDrKrDK$(8j)?7;cOM?aIi z@$l)+@Lwg%+PpqR*ARO~(LMa0N>BIH>py~gI#PX@fB8BU%C25n?>Tjp@$9uMUPT9g z3y%4EJt$m>P~pyPorNgN_d?XShwgmON&Piz@s5ihRG?+}@a_9s(t&Td+Y&~#RPNt# z)P9liDEWr)y?5iJcW&K%A1p^~%bxO7K0=JJSK`XI0#aFbx?s;K<(v|;*DTO8V_%6J zGW7LbO}>IG_T#%7J*2W}Bg{t%<^gO{IXYDR^Cv#qI#s>1Tc>DpZk3XYWaRN2wrg$3 zuxmXvkwk=tk*Z>p3O#qbE)Tn`vD?>;c9%H(iSs)FLXGf#%=&`5xxW84Q)=5+rk?2v zG~8t7Iu9%R6O{%h-(R}qoAvO#XVDB38dlcEMV3CEchYbv=!^!DOD#jby15g+&%?aF zP)>7`)6EBY%z3q8G+I}8XX~QXEIfB3whgbMR(47v9M(wvJN>zQPc~RpITjhnocq9i z!p^p_WPLDI5N7QPbB3OQ5ihZ zO*dO~OjAO+|C(5|AGRTqkcsx>UuBRGgb%*Za~gRuDexDJXnP}{FyE+$Zj>&MP8|)Z ziU&F~wZlo6V}(`s^NdZ+4hs84+4M*Ye+QYtVy5GrlQm_w34~UwEe}xD9T80yg|zy` z-xFD_hx$4{x?$4cJTUk%Q1wI*laY@H2wH&S8yR*VjFQ(d(=5YWkNfZa(tqsVk@ z6*&%va_;LFWmhM*xc3Gw76+9wZmz3Q<+a>%UQF0DUClCq0gY6BA%1dXVq&*r$O?`}h^tGliu^Q>0gng7!tYYQQ~5#&;xo6xU;F z>Pmid6_vcJUf*3Y>!FopN#Ou4jGiG5{K{OY!Pug|9l2UGn&1y04GI3Vq zw>vbwG;ZbcYTh_>xXy}OKs0caUilu$kL&<`W{hs3kwDtYKP376<^l{RnAE{S3^cWk2aqu zoNw3guJp|}E3JEW`im?#NT2mUSBoY4Bw|&V{wmb2+-(N=nZ@lU(J?K%>7!(UGJ;Gn z6o+GQ$kDew(_WzT1HeTC2~yvfyJEIT#oEy@Ko{Y|hYt=a&cwkYJ9BYUxWpS2Et;fK zE*N&TH}ZN<|A)Q!_q+U3^&iZu%1D`D+ProfA19IB^9Nj-s^Ccup04Z@to8O3tO&ed zr->ow7>L4$JTg?`z8^BrxD&lUpQmN)QgFPrC_gj&#XLm0#sc3q{=tibklyW)TZiI7 zOakTNacM6c4jW=_;YZ~TaHyQvf^SzUJ}b&Hyn@5N(l7W|uKjzj|JO*^wBQh?$g_pF zR{x1J;2Io^}&n|3^=kTg5Zz@nU))Qyiw(v-nKle|_%Xdl2-0bGOs{ z2n<}-GC2aM8}YY3EnH3|%*fuo^m>fwuQ!%>dzjWBS3}NHxsx*4vL~&Nzm^cu%?xbu zw`nOtFcE8wJ^t5};nMEV#0;EFuQ%gcG6Fc#^&#O3`@8-p*YOOcoEuIq^)S!@HYAJ0 zbKPTkONN6H$yfwCEq*+}H_d5(K2HdCgPb1G#f3j86L^y`3sc}jF^7$DYlw^` z9ra&I>KNl9T5u(IRQFR{Zs6&D&>GL5*H0TmAuxRRiX|%C2BVTQ4epMR$9D-6(Z?-9 zNgT6k-IssdKBTfq96PSgRGL&M4) zfYd!pHJ72qOE3&0aGkQJmrL56eJH%97JD%;;`QY6Cnvb8#bGmnsJLcFS~ zvV5UQkK@>x@l|0>k(ZL^83qh7->gk!1Ru0Qh*VSX=HSV;{X-B41xnZYl^>`3%jI9$ zq+S6PRX8QMlVt^^>~}SThWL+ zr-A<>>~R84k^#m5S?r7OpXC?EX9oGs8b%GOw9(3+%Mth-1H$WRp?}B?B1CwX6u8@3 z#&V@Yj;na$vw>l2qb9m{EuIk!COv!b3X0L~8KmnmXfn{7n;kRwJ$h-DNNP4Y4X8{! zItrEOi=q=qFkLj{rn>Pcnyx>=l#*rxGq$?2-o)T8gx}n_<5nVWR6`eksd#T<(=*Kv zrZWQ)xG(E~h+B%5uCup$l1HjB%d2rP%UGJQI#$;}qr2R3yo$YredPS5Gm|ogL3*lD zH4||^IXkrQEGC@MNyK#xLJ~u#-WyTxh0vmZPzg0;mmgSqZ0(82hMg&E{-8eG_r+hA#+nS=l@&wvVW3n za%{NMp}d=*nkyjucJD+R6A`Gm6$=o~N;;|p_vFx7tF$W<3k7tMY_@urgMs3Pr}ma$ zXNl5Fpq0&4G`d;M48WU^WXPV1oiaSvU91pNO1Gkx6N}RzFT%IcVrp?+lOc{NaIT20 zy=#?#+Q0%@*Cx;Sk~NYGdiDpGTkQ}h>cE&-g6a>BrI{5$D}2+EtR{uKV|Gg9Y}#g? zn4pJ&YUm~_1w11c^a96J7*G=C(+O>XOb%YeuH1G&%`b$95KCS=RjUZ^PyD`9-xF~` zr1iTk$`4Xu6A){~lJ@&1;`^1pty5X%mAl;4}!vKfh3VNBG^$n1+STm!wtV95u%0^?7IHt z&EePk6?VoybwooK(UDDNiF_uH-8vj`lCOH*x z3}t7R;#4k$8MHtO+y{({-I}-EybOM8zQUud=FIvR3f86Nd z6NuH`<>j97lGAIyR7@Q%O00P}rMS`v7>av+NSb<(Fs(;g?i~;kF^*-Kr}1E6U?Q7+ zpSC$;z4EP6w|9J+L1_z&32`^wr^IuT5L^R2#~sS`ge#wg3l{UQRp@Q=<_1}8*ZNeF z#E3T$=6hGVYXn^^BdsMN3eBjfnBWFzk_+U5&^}{zrrbAF3}w0nTe(Ot8i22diSAL9 zck$uq>CH`q_;K;@trLFVB=8@H8j-Z#Hr3x)v;T22^#5eiiyOLzw}Ipw|2UJ(De0u} zGQ9tIR)g^WfA$YI`+sSyhPR0jB=MHrcqfr%i7el}aUxyAY7G%)IcO*Etfp#pVuw6$ z#{x4;O?bf{GWQansQP-?G9EhpQlPP3P`=>U!)JSNyQ%f22%MnW^kfRZJ9=ZhOfJ4M zuw0+q6R)F3T5ESAI&qhR=b+sSQm3kj#nknRw5|Ksg-qE>zqp zjdwxeT86Vct*+I=c2xH&Wa@z}y?G^$M{rvJ-uU&jqd2tz+!@9WQG;Vd~X zr__H5u+GK}$jcCK{NsUBxZ$(}t6*#Vow|eL+;7`G!t1U7KRU@Bmeg`tGtKgPOyvpo zhM~VRke2+F3F=I+B%@KdGL+f&0q>V$Q({~V$eaErS@)aXez>@7oCW_ras2A#jEvWd zgX}%pJXz)aiiGQ^4z+O(VGoHU5@$@;K+IhFCZ)@+_y2RemV{^;9j+m$uTIV4j*^ra z%Ahl6je4dJjZ2wJ1?>Gi)!KkpG7`m@-@8N&s;B&pU1zkfoPR+Y`Ytc2%jw!YS_Ng! zb}5?NKqX2j3auyBRS!RcP?wF{cm8utG#dZGqYigFnO4v#QhNS{#(GR;$4L}TdC`0f zV*|beYBIMnq&U2zTRGwG4Z0*TJuv;DqGTJdb&7U&FPP-=^_WUq0%c+_D|Zr}RntRe z>`w@WQygLpLb@ukIHd0qhxF;JDklpZ&QLnBo8L?>#f*YOzJrlv7<%?P(rbwPlvj9E z8%l;thqqYjHXVNT*139H{zM&a8=R2YzVWqNlsbeXRaQEPV^KyMk|hpn)*wqs*`*7LhU%j6PeKT=MDy~ijj4b8o+DCRv8Wv+sIC%<=KuB8!t54;Sy5~_k z7a(N27W%YRk0T1j>G-QznlHJvvW>0XzeX+Gs4jsbalOE@TkNnSv(*v-3TopO^yf12 zKWoc~E3@oxWGr|$>u+Fooa&d2ah}dCxDDE4owo2%BrR9YYG|Fxm)R!ig!Yhp)`jT{ zkcy)`T1_~Lj?-XGZ#5;)Yy`b5j}x8DoM@!egs%>MULI}*BqC7Ote^uUV{Uo(OU)dV zSps!sJHKFyDaWX~^Qko}B+MheeeV_PGPRBz$Lie{!NnF$^^0!Pa}Uj?jJ+6+q1A=L zvplV6Oce7O^)x0Gv+ZtEacO2X$Cc*<7uZdEg~z&xcm(wc1**+?K}lkcL<7gGlxwvP zMJp2A)2EX9VC!Bg3xF<6%zdG%Fg|oL9k+!0Ec*9tPR` zEnS7OmzD9*1*D*)2!&Cs<$u~FIcloLi))DDC9Zdz0=*@f@Rha`$&Qcett1Ov?H9?+ zgBPEkF?Fng#9QnZb1M4V%F^8>uW*ZKbLi0Spr7Pwri%v)7Oc%97}Y4$$*ML~f{JTNLbm{mgPivw?Q7z=-1lSzH=bi!Os{uwo`Eg-HPDf_Us zWQFPchlZMujePqCfve}PIC%WTpJr*HE**@PZMfz<68)m@js(kcz@hc|tFuSo{mAMK z==|I9>2`_eD{(D)+w>ID5SV94wbSGyTW5{6E-&zfFhCOHD&MNt1NG`ldzZ2#(s@t1 z{d(CqfqEQmLYW79WTgW<*ZkpuEd{i&EgGEWQ1e8Mo>`%M*P}K&9`p8tnx6Te|F+p& zotKMki>gpTc+js;`T>Fxv!Hj5@^)@iR_K>Qn@sB&3|&e~yAlU@^8CI8UQ5OW?(>79 zcMmZ=t(g;pt#J8W<7GVsfwWX^`L_G5b!HO9IU~7uwOR~Ax`54{KmV%O#;ol-jW%hM zHuZwl=y+E%XeUhyAm~)9{`zaxkZ2Tme#L)83cD?Hj=iu@|DH*<5E{_Psg;P-lCKT; zcypvb6tL%K@}p7^*_32B@tbnAr~ugOZfrwyL)Wpm;p}{65MIcfNlk-NAa*fyDSc>t z@f2b5S+DuaX^71;ec@?0ncRVrc8fIa1{*dM?d`J=UF(X^hTP3P7564y{uZrZZdGvy z05TGK%cPXnMW{JV6Wpx(3NC7d54VoOz`FTE8e`(cxUft_GzUfUV{z|;yc(~{na5Oe zD&)}ULAnc!(AwbaiXvN`p{P(IN~Yg+H^;{q%CmSG<}}*i%h}WmdABlW4Ye1W{sBqa zeu0nvNNen{q?c1~J(6_1R`Eb*Y0VG)le5}x(X6$~zBE+B%l^0fu1Q6f5w-1ADJq@k z8RN%K^dEodfnEf+qZR{HtFNJE<&Q@?t$&a=sfSYT?4I!25+P&_M}F6sE96acaXh^L z_Ba3epbA8O6HFoppW-NY8MAv&i543x_wm(^x=Av1R&1yuvyH< zP4PH9Cw*hab%AyQp{Ie?PBTpw&i2~#RO{Ht=Dg^B<}v=#_O4QAhy25rM7eGN<~aSy zD}$S|PxitRJuMtP;hwNlLhnQ~!f8cJ`h`J$yD~g&Y}>P53_cM!_Wr%R$X|UWx&-uE zkLhW!^RS<0M(b5Q8D~w%3+$syH}do&nXe1vr<%6%!z+{UXQmTaK)^5SuQ}-wx7Y?s zD{syrmwF-1wFx1BW{B?((iqm)G?ia)MU>>OvO6K&L*4p?p{8fn0ZIH7cwdQQoWcY`YG^ia?QpsMfZddHTRQT~c-Lf!i5WjP43NtRabRuL;3%>yWGD zMO@Vaj?KG}G;CRw+y3Io`m;%?180Wdv`6&{Mh0iUcSf zcLEm*fKTY%;P^z7M2;lK$STPB84 z2v7DQ5rZHrTDc$k>}bM#J=TSyiQvn5yQjX2t&hr8(^^j7rb(xJy)>N=FH*;b&dsw8 zZyWTkd^mURqJP=Fhw%@GFio>6Y=mGcW?gY(?LsG4f^2G|BH8?NPj34h?6@H^&+s-Xf=;_1a|NWoG8v z$+Qz2;6bON1-@sI4P1e#XW|bKD*|>P4`PC`v~ZPa8e1*L;KqyY_6PH|GN&a2GxvNxGm@m$*UHb>dgK}m+1EP~J#C*E-4-4Z z`9s7rZRQ=k7o!_|Jn(@{8~QIEzMpH*YE&}^xm7%zInY94vb)6p0P;BWy*bVU7?AES zd9NNMCt54`9IhFBLb0VZwHSRp(rV&?Bx0}|pohNXNDCiVB3`@eSiN(5iF$fHhJxP` zNiUvX8}=CJYirZ8LK?DKDyN%g;6&noJ_ScweNwL<)v?Bn&Ns1&hD+x(lPrvR^juSa zMVm-v=8?3oX?hBV2ms0~9_j*(=r&rJaQw#*$z_+^G?pa<=Y)C{`c#CFXbV$`l8apu zV~bAdHclJp?iVy(%r{uBrBM|HKi;ycw`V(V>MAgjg4b%5?JpejqPE{0)hO^99A|b4 zt@sH4a{C`f{xQ!=^Rq(#8t5FvD0zu_<=YyP-CEUqT<9nldBOx9x!3+{6reCmk`)BH zM!4eO$Rpcp%agV34aX=iu)UpIDvvsBUHT$lt&j|Y$SK~}cyjZU%w*3TECY=2;Gr^u zXt&kKEaVOiAbY7P$#09;3dZyEdLn`mkh-GR*SZa^#`R2J9kkU1)LdA*34M>4bA&lJ zFYK{-TCQ8Gp6_>Z zb(k65tFL$<)Zt@dfpmgueUG$H84S&vv0K~ z{IgaGjf3N;q*5ibZ4k{R&bFBE9PL5jy(Jc$`4^RR9{UMp1#V{ouDbc>p5|;`r*rfY zE*lY{It&R}@Mr11UU5z)TSYuD^btiC=nrwf<+1Rp#p{Kvc6d^Sp)xK*^A>^d&$p}W z0ZH0LqVJu&Kh$ncDeRf#M-RGLZaEFAB->|igJ#q)-#Ud|bumeZivw1kRlSe?yA-!jK}#0v7y}pnwa+dYt^0k)A(W( z<(6?^nnRVZo2GiJuTD5GEWz~BS1G+ziq4^`#vDI}=@*M@g;~CAH(nrlNeD;ZxAZ$d zO2%{aumpC{;j%WKD{Q$r{O9Ju(dGhfxc2v5khppO=d}`t8~M;P0tk0!K#Q zR`Ft@!|$$ZNzNJO#Xkrvze~r9Z~9nNECOe1H?6`w2ag;)pyD3{d6lPwO$sq+iqu)sU`zIj9B%^wVxj71eZk{pV-zxN_K zW*$%(cYM#8P#FIMs<;QxH&}*tW6KAZEiJB$r`tC%qi_%2yQP5iRnqX!_!{@|Pae-O zg6d!9LB?*gYCXnPPj42TMAEL&;6>sGa5z@A>@`H!2iJi>MetnjfYw{*A*+igE}M88 z^&A&hKZ%PlS0h5)zlPXQjL^sTw*iBHzEz2O+vR%9z1SqH9bmsQ>qd%zFxnXCt@hp-fsNDv`-sv*(ri+dbl3ofCZXys6t;6B6~Cap*ALv z4}2#r@OBN}F5@ySRWn~x8d;m-CzWQs{cLOwsBR3zGw5>VIH+IddQ3eK;leAf+Sw{& z5$TOjHl0Yv9w>tTktIxx$JXXF#Mz<0k>tfyG?Wdlr5qY8<+LQ3~vf(f}k~=1vd~R z%$Jp>>&@R7kU8wee(Qz{_y<(aog0 zLe&9Aoa1xoLox0ok)9SsqJgb659k70pFUIK>-ZY>R{5QwytexCqm%K~=Y#iSlEs*) zm3JOc|7g5)WuB>4KFxw9q$}d8Y11Um7`KIU9ML`J5ztXl(M3J<%}PGRZb&3&3B-?v z*RXQ$xYT^o*1iEZ$%+pqbj-EryVO4q|9tX$RAnBnV#nweFL{;z z?TbR?Wh3@W{xc*9G=XZWXWr9X5w?)k&l$@2BJHB3GT>dm$<^Af^}!ePxU|XB!W6wo zGx$YYYE#BpUju2vd@ydWE;^(Y*5OZ`8E@hQ8<-0){}xFteB5Z^^7&*g)&Up>wD)l zrrXwq?GVST;xSV2`DdwzC#P`m*QMH-?atXk7;<^1m{xf585;Niy4yc#gUhznjIr{5 zTZ5=^zS1l_9tm7}n^Su~JA{;fq%)-OJvnp!>|Et+OZn{fxFeeM*$2stc&`BaFVS}5 zBj#@|-EOh_dOqzhWdncz!O6Z(ag{|&151!tG%Oy{KNfMEmP~~TzZ}?llsW$(L~@Z+ zq4{&aC0crY<7f`2K_Ufjma_}71sEOEpFkg`UpY2MT&VOzWLxE{;ftIoB6|&^rl+)v zj92{$%ySR=aMA<`LBMdGqP_m@zGe8E;wRkaZtJ}(>$%au-7l-vtj_KgyhXf&_Y+Te z^?F01;b;CIWY;CuB%;%JEUmFr^jUBryArTk^88gA@8$$?*@)4H7M}PE_?Tt2|KPFLj$XxJJR@Ra);GB$3bP$A6L?y9tmY7X_)nd`};>b z#wA@AUKe*=8*^LhNn@u}+A{=hCsymq2)~i311`;{7pnSv!7y1+hy_^0uFSvgniMjC z&3mey40_d;NBbeaWrD|p5m&b!Vz0=fBi8#Y^OV*qUpb zUrYa&013%r(N01?aT#Zv6Eq{rQ0zU6{54(OX##owB5doOOx+WRGqwHCu)F>#8^prh zBKJ4WJ|bioUbWnze)Yt+de$c9IF>}&qx@yfx=u1?*~C0IHJpgSFxunUcNa>HE zl}ml=URH9=fm%cP5;AozUG8&v=cFEn!2CsFWsaz3g_YkgQqkia)~znQC-f~1r#Y_= z%2e}Fzbyyb@~@=1r_bdoLPWhdPtKgbcZxEMr{5{BRP*ICB5|iOfJ%u|J^JA{IWBA@ z1NxnU-RC=BAh%v!A4`_#-1_HPp_J{L^E@dEz$&b^zXp1Y3FljEvMIkEFn2wHZDo4V z&&UV$I7xPeq;vC@7-HA$-UXBKHSJ z-#+1a9xVggt@>4kb+HP>x^P&>-G&zwxyMl%03n~?CO@dP4plt)voz{_kF9!q24$98 zEH(NbRY)&t?(<%@Fuldv#E#j;A7yTr-);FZ78}&p&p3D3K$L z6c3S-4Ag=A9Wv}X?ciO(j06eCy%>c!eoSB1uo?RDsF(}6_B~*%a9V%ML;tQC2PELa z1nHG{BVbVdZ96BBj+tg_ch>I|$DquJF;WnB7K zRe93ILAfP?5ty!^Gqsb%uWXDDwL{p2b?=V@ndb^$H-^53+Wke_=&^fK7i-_O(ssCg zw3yUNXxN5i_hm zKj&Xlst7ie9DlDK8#wabYlg4km1OUG=jcguZY|4u4x=RyRRMHozY?|4*?uY|ke`

4n{N2E$wXF8c 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 literal 0 HcmV?d00001 diff --git a/examples/ring-malli-lite-swagger/test/example/server_test.clj b/examples/ring-malli-lite-swagger/test/example/server_test.clj new file mode 100644 index 00000000..e296b5a8 --- /dev/null +++ b/examples/ring-malli-lite-swagger/test/example/server_test.clj @@ -0,0 +1,38 @@ +(ns example.server-test + (:require [clojure.test :refer [deftest testing is]] + [example.server :refer [app]] + [ring.mock.request :refer [request json-body]])) + +(deftest example-server + + (testing "GET" + (is (= (-> (request :get "/math/plus?x=20&y=3") + app :body slurp) + (-> {:request-method :get :uri "/math/plus" :query-string "x=20&y=3"} + app :body slurp) + (-> {:request-method :get :uri "/math/plus" :query-params {:x 20 :y 3}} + app :body slurp) + "{\"total\":23}"))) + + (testing "POST" + (is (= (-> (request :post "/math/plus") (json-body {:x 40 :y 2}) + app :body slurp) + (-> {:request-method :post :uri "/math/plus" :body-params {:x 40 :y 2}} + app :body slurp) + "{\"total\":42}"))) + + (testing "Download" + (is (= (-> {:request-method :get :uri "/files/download"} + app :body (#(slurp % :encoding "ascii")) count) ;; binary + (.length (clojure.java.io/file "resources/reitit.png")) + 506325))) + + (testing "Upload" + (let [file (clojure.java.io/file "resources/reitit.png") + multipart-temp-file-part {:tempfile file + :size (.length file) + :filename (.getName file) + :content-type "image/png;"}] + (is (= (-> {:request-method :post :uri "/files/upload" :multipart-params {:file multipart-temp-file-part}} + app :body slurp) + "{\"name\":\"reitit.png\",\"size\":506325}"))))) From 20b37b7d43f49d3cc63c757dc6c7036103684f32 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 15 Feb 2022 13:50:35 +0200 Subject: [PATCH 083/113] lite-it! --- .../src/example/server.clj | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/examples/ring-malli-lite-swagger/src/example/server.clj b/examples/ring-malli-lite-swagger/src/example/server.clj index bc9c3861..09e632b1 100644 --- a/examples/ring-malli-lite-swagger/src/example/server.clj +++ b/examples/ring-malli-lite-swagger/src/example/server.clj @@ -34,8 +34,8 @@ ["/upload" {:post {:summary "upload a file" - :parameters {:multipart [:map [:file reitit.ring.malli/temp-file-part]]} - :responses {200 {:body [:map [:name string?] [:size int?]]}} + :parameters {:multipart {:file reitit.ring.malli/temp-file-part}} + :responses {200 {:body {:name :string, :size :int}}} :handler (fn [{{{:keys [file]} :multipart} :parameters}] {:status 200 :body {:name (:filename file) @@ -56,26 +56,20 @@ ["/plus" {:get {:summary "plus with malli query parameters" - :parameters {:query [:map - [:x - {:title "X parameter" - :description "Description for X parameter" - :json-schema/default 42} - int?] - [:y int?]]} - :responses {200 {:body [:map [:total int?]]}} + :parameters {:query {:x [:int {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42}] + :y :int}} + :responses {200 {:body {:total :int}}} :handler (fn [{{{:keys [x y]} :query} :parameters}] {:status 200 :body {:total (+ x y)}})} :post {:summary "plus with malli body parameters" - :parameters {:body [:map - [:x - {:title "X parameter" - :description "Description for X parameter" - :json-schema/default 42} - int?] - [:y int?]]} - :responses {200 {:body [:map [:total int?]]}} + :parameters {:body {:x [:int {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42}] + :y :int}} + :responses {200 {:body {:total :int}}} :handler (fn [{{{:keys [x y]} :body} :parameters}] {:status 200 :body {:total (+ x y)}})}}]]] From 382661a6c489316be61be83463de7542638623f3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 15 Feb 2022 16:55:08 +0200 Subject: [PATCH 084/113] 0.5.16 --- README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-lite-swagger/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 47 files changed, 77 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 1cfbfcd6..5fdd832e 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians All main modules bundled: ```clj -[metosin/reitit "0.5.15"] +[metosin/reitit "0.5.16"] ``` Optionally, the parts can be required separately. diff --git a/doc/README.md b/doc/README.md index 8aa8732a..592698f8 100644 --- a/doc/README.md +++ b/doc/README.md @@ -40,7 +40,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians All bundled: ```clj -[metosin/reitit "0.5.15"] +[metosin/reitit "0.5.16"] ``` Optionally, the parts can be required separately. diff --git a/doc/basics/error_messages.md b/doc/basics/error_messages.md index 22d318c5..81f1ed2d 100644 --- a/doc/basics/error_messages.md +++ b/doc/basics/error_messages.md @@ -22,7 +22,7 @@ The default exception formatting uses `reitit.exception/exception`. It produces ## Pretty Errors ```clj -[metosin/reitit-dev "0.5.15"] +[metosin/reitit-dev "0.5.16"] ``` For human-readable and developer-friendly exception messages, there is `reitit.dev.pretty/exception` (in the `reitit-dev` module). It is inspired by the lovely errors messages of [ELM](https://elm-lang.org/blog/compiler-errors-for-humans) and [ETA](https://twitter.com/jyothsnasrin/status/1037703436043603968) and uses [fipp](https://github.com/brandonbloom/fipp), [expound](https://github.com/bhb/expound) and [spell-spec](https://github.com/bhauman/spell-spec) for most of heavy lifting. diff --git a/doc/http/default_interceptors.md b/doc/http/default_interceptors.md index 49428e86..b1c5890d 100644 --- a/doc/http/default_interceptors.md +++ b/doc/http/default_interceptors.md @@ -1,7 +1,7 @@ # Default Interceptors ```clj -[metosin/reitit-interceptors "0.5.15"] +[metosin/reitit-interceptors "0.5.16"] ``` Just like the [ring default middleware](../ring/default_middleware.md), but for interceptors. diff --git a/doc/http/interceptors.md b/doc/http/interceptors.md index 621f00f4..d3c1d16d 100644 --- a/doc/http/interceptors.md +++ b/doc/http/interceptors.md @@ -5,7 +5,7 @@ Reitit has also support for [interceptors](http://pedestal.io/reference/intercep ## Reitit-http ```clj -[metosin/reitit-http "0.5.15"] +[metosin/reitit-http "0.5.16"] ``` A module for http-routing using interceptors instead of middleware. Builds on top of the [`reitit-ring`](../ring/ring.md) module having all the same features. diff --git a/doc/http/pedestal.md b/doc/http/pedestal.md index 4dd83e00..9bb38d07 100644 --- a/doc/http/pedestal.md +++ b/doc/http/pedestal.md @@ -3,7 +3,7 @@ [Pedestal](http://pedestal.io/) is a backend web framework for Clojure. `reitit-pedestal` provides an alternative routing engine for Pedestal. ```clj -[metosin/reitit-pedestal "0.5.15"] +[metosin/reitit-pedestal "0.5.16"] ``` Why should one use reitit instead of the Pedestal [default routing](http://pedestal.io/reference/routing-quick-reference)? @@ -26,8 +26,8 @@ A minimalistic example on how to to swap the default-router with a reitit router ```clj ; [io.pedestal/pedestal.service "0.5.5"] ; [io.pedestal/pedestal.jetty "0.5.5"] -; [metosin/reitit-pedestal "0.5.15"] -; [metosin/reitit "0.5.15"] +; [metosin/reitit-pedestal "0.5.16"] +; [metosin/reitit "0.5.16"] (require '[io.pedestal.http :as server]) (require '[reitit.pedestal :as pedestal]) diff --git a/doc/http/sieppari.md b/doc/http/sieppari.md index 0881e4c6..716859a1 100644 --- a/doc/http/sieppari.md +++ b/doc/http/sieppari.md @@ -1,7 +1,7 @@ # Sieppari ```clj -[metosin/reitit-sieppari "0.5.15"] +[metosin/reitit-sieppari "0.5.16"] ``` [Sieppari](https://github.com/metosin/sieppari) is a new and fast interceptor implementation for Clojure, with pluggable async supporting [core.async](https://github.com/clojure/core.async), [Manifold](https://github.com/ztellman/manifold) and [Promesa](http://funcool.github.io/promesa/latest). diff --git a/doc/http/transforming_interceptor_chain.md b/doc/http/transforming_interceptor_chain.md index 3b9ca651..655ff766 100644 --- a/doc/http/transforming_interceptor_chain.md +++ b/doc/http/transforming_interceptor_chain.md @@ -65,7 +65,7 @@ There is an extra option in http-router (actually, in the underlying interceptor ### Printing Context Diffs ```clj -[metosin/reitit-interceptors "0.5.15"] +[metosin/reitit-interceptors "0.5.16"] ``` Using `reitit.http.interceptors.dev/print-context-diffs` transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option: diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md index 007828d8..575aa139 100644 --- a/doc/ring/default_middleware.md +++ b/doc/ring/default_middleware.md @@ -1,7 +1,7 @@ # Default Middleware ```clj -[metosin/reitit-middleware "0.5.15"] +[metosin/reitit-middleware "0.5.16"] ``` Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. diff --git a/doc/ring/exceptions.md b/doc/ring/exceptions.md index 78c15027..a2a5a236 100644 --- a/doc/ring/exceptions.md +++ b/doc/ring/exceptions.md @@ -1,7 +1,7 @@ # Exception Handling with Ring ```clj -[metosin/reitit-middleware "0.5.15"] +[metosin/reitit-middleware "0.5.16"] ``` Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practice is to have a top-level exception handler to log and format errors for clients. diff --git a/doc/ring/ring.md b/doc/ring/ring.md index f609d0c1..d6970ae6 100644 --- a/doc/ring/ring.md +++ b/doc/ring/ring.md @@ -5,7 +5,7 @@ Read more about the [Ring Concepts](https://github.com/ring-clojure/ring/wiki/Concepts). ```clj -[metosin/reitit-ring "0.5.15"] +[metosin/reitit-ring "0.5.16"] ``` ## `reitit.ring/ring-router` diff --git a/doc/ring/swagger.md b/doc/ring/swagger.md index 1f8460de..dc2ea248 100644 --- a/doc/ring/swagger.md +++ b/doc/ring/swagger.md @@ -1,7 +1,7 @@ # Swagger Support ``` -[metosin/reitit-swagger "0.5.15"] +[metosin/reitit-swagger "0.5.16"] ``` Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys. @@ -44,7 +44,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus [Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module. ``` -[metosin/reitit-swagger-ui "0.5.15"] +[metosin/reitit-swagger-ui "0.5.16"] ``` `reitit.swagger-ui/create-swagger-ui-handler` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options: diff --git a/doc/ring/transforming_middleware_chain.md b/doc/ring/transforming_middleware_chain.md index a9fa3060..ab1985e1 100644 --- a/doc/ring/transforming_middleware_chain.md +++ b/doc/ring/transforming_middleware_chain.md @@ -59,7 +59,7 @@ There is an extra option in ring-router (actually, in the underlying middleware- ### Printing Request Diffs ```clj -[metosin/reitit-middleware "0.5.15"] +[metosin/reitit-middleware "0.5.16"] ``` Using `reitit.ring.middleware.dev/print-request-diffs` transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option: diff --git a/examples/buddy-auth/project.clj b/examples/buddy-auth/project.clj index 8908b248..1138b1d0 100644 --- a/examples/buddy-auth/project.clj +++ b/examples/buddy-auth/project.clj @@ -2,6 +2,6 @@ :description "Reitit Buddy Auth App" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.8.1"] - [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] [buddy "2.0.0"]] :repl-options {:init-ns example.server}) diff --git a/examples/frontend-auth/project.clj b/examples/frontend-auth/project.clj index e40af026..be164009 100644 --- a/examples/frontend-auth/project.clj +++ b/examples/frontend-auth/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-schema "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] + [metosin/reitit-schema "0.5.16"] + [metosin/reitit-frontend "0.5.16"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-controllers/project.clj b/examples/frontend-controllers/project.clj index e40af026..be164009 100644 --- a/examples/frontend-controllers/project.clj +++ b/examples/frontend-controllers/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-schema "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] + [metosin/reitit-schema "0.5.16"] + [metosin/reitit-frontend "0.5.16"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-links/project.clj b/examples/frontend-links/project.clj index f3063c57..7a7a6403 100644 --- a/examples/frontend-links/project.clj +++ b/examples/frontend-links/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-spec "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] + [metosin/reitit-spec "0.5.16"] + [metosin/reitit-frontend "0.5.16"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-prompt/project.clj b/examples/frontend-prompt/project.clj index f3063c57..7a7a6403 100644 --- a/examples/frontend-prompt/project.clj +++ b/examples/frontend-prompt/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-spec "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] + [metosin/reitit-spec "0.5.16"] + [metosin/reitit-frontend "0.5.16"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-re-frame/project.clj b/examples/frontend-re-frame/project.clj index 0c997ef5..c08286b7 100644 --- a/examples/frontend-re-frame/project.clj +++ b/examples/frontend-re-frame/project.clj @@ -1,7 +1,7 @@ (defproject frontend-re-frame "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.10.0"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] [reagent "0.8.1"] [re-frame "0.10.6"]] diff --git a/examples/frontend/project.clj b/examples/frontend/project.clj index 0f2a5eb6..74565f64 100644 --- a/examples/frontend/project.clj +++ b/examples/frontend/project.clj @@ -10,9 +10,9 @@ [ring "1.8.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.773"] - [metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-spec "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] + [metosin/reitit-spec "0.5.16"] + [metosin/reitit-frontend "0.5.16"] ;; Just for pretty printting the match [fipp "0.6.23"]] diff --git a/examples/http-swagger/project.clj b/examples/http-swagger/project.clj index d2a2ec55..fd6da544 100644 --- a/examples/http-swagger/project.clj +++ b/examples/http-swagger/project.clj @@ -3,5 +3,5 @@ :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] [aleph "0.4.7-alpha5"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/examples/http/project.clj b/examples/http/project.clj index 13cb9115..6968ca40 100644 --- a/examples/http/project.clj +++ b/examples/http/project.clj @@ -5,5 +5,5 @@ [funcool/promesa "1.9.0"] [manifold "0.1.8"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/examples/just-coercion-with-ring/project.clj b/examples/just-coercion-with-ring/project.clj index da8d5aa0..6ee8000c 100644 --- a/examples/just-coercion-with-ring/project.clj +++ b/examples/just-coercion-with-ring/project.clj @@ -2,4 +2,4 @@ :description "Reitit coercion with vanilla ring" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]]) + [metosin/reitit "0.5.16"]]) diff --git a/examples/pedestal-swagger/project.clj b/examples/pedestal-swagger/project.clj index 89860540..29c651c0 100644 --- a/examples/pedestal-swagger/project.clj +++ b/examples/pedestal-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit-pedestal "0.5.16"] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/examples/pedestal/project.clj b/examples/pedestal/project.clj index 89860540..29c651c0 100644 --- a/examples/pedestal/project.clj +++ b/examples/pedestal/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit-pedestal "0.5.16"] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-example/project.clj b/examples/ring-example/project.clj index b4bcd759..c8bb0577 100644 --- a/examples/ring-example/project.clj +++ b/examples/ring-example/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-integrant/project.clj b/examples/ring-integrant/project.clj index 30020485..2aa4e44e 100644 --- a/examples/ring-integrant/project.clj +++ b/examples/ring-integrant/project.clj @@ -2,7 +2,7 @@ :description "Reitit Ring App with Integrant" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"] + [metosin/reitit "0.5.16"] [integrant "0.7.0"]] :main example.server :repl-options {:init-ns user} diff --git a/examples/ring-malli-lite-swagger/project.clj b/examples/ring-malli-lite-swagger/project.clj index 9c16ad1c..f9f1a77a 100644 --- a/examples/ring-malli-lite-swagger/project.clj +++ b/examples/ring-malli-lite-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [metosin/jsonista "0.2.6"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-malli-swagger/project.clj b/examples/ring-malli-swagger/project.clj index 9c16ad1c..f9f1a77a 100644 --- a/examples/ring-malli-swagger/project.clj +++ b/examples/ring-malli-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [metosin/jsonista "0.2.6"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-spec-swagger/project.clj b/examples/ring-spec-swagger/project.clj index d7a2c84e..5bc2391e 100644 --- a/examples/ring-spec-swagger/project.clj +++ b/examples/ring-spec-swagger/project.clj @@ -2,6 +2,6 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-swagger/project.clj b/examples/ring-swagger/project.clj index c18e2538..8b8dd5ef 100644 --- a/examples/ring-swagger/project.clj +++ b/examples/ring-swagger/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.16-SNAPSHOT"]] + [metosin/reitit "0.5.16"]] :repl-options {:init-ns example.server}) diff --git a/modules/reitit-core/project.clj b/modules/reitit-core/project.clj index 19bdf9c7..6fc1f245 100644 --- a/modules/reitit-core/project.clj +++ b/modules/reitit-core/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-core "0.5.16-SNAPSHOT" +(defproject metosin/reitit-core "0.5.16" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-dev/project.clj b/modules/reitit-dev/project.clj index 16942fb8..07e3ab74 100644 --- a/modules/reitit-dev/project.clj +++ b/modules/reitit-dev/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-dev "0.5.16-SNAPSHOT" +(defproject metosin/reitit-dev "0.5.16" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-frontend/project.clj b/modules/reitit-frontend/project.clj index cc8c86cd..7fb68077 100644 --- a/modules/reitit-frontend/project.clj +++ b/modules/reitit-frontend/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-frontend "0.5.16-SNAPSHOT" +(defproject metosin/reitit-frontend "0.5.16" :description "Reitit: Clojurescript frontend routing core" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-http/project.clj b/modules/reitit-http/project.clj index abf5c8fd..f70f2e14 100644 --- a/modules/reitit-http/project.clj +++ b/modules/reitit-http/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-http "0.5.16-SNAPSHOT" +(defproject metosin/reitit-http "0.5.16" :description "Reitit: HTTP routing with interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-interceptors/project.clj b/modules/reitit-interceptors/project.clj index 05411dac..5d589c9f 100644 --- a/modules/reitit-interceptors/project.clj +++ b/modules/reitit-interceptors/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-interceptors "0.5.16-SNAPSHOT" +(defproject metosin/reitit-interceptors "0.5.16" :description "Reitit, common interceptors bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-malli/project.clj b/modules/reitit-malli/project.clj index 65e1fc64..3eaf25f4 100644 --- a/modules/reitit-malli/project.clj +++ b/modules/reitit-malli/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-malli "0.5.16-SNAPSHOT" +(defproject metosin/reitit-malli "0.5.16" :description "Reitit: Malli coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-middleware/project.clj b/modules/reitit-middleware/project.clj index e825dca0..b1359869 100644 --- a/modules/reitit-middleware/project.clj +++ b/modules/reitit-middleware/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-middleware "0.5.16-SNAPSHOT" +(defproject metosin/reitit-middleware "0.5.16" :description "Reitit, common middleware bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-pedestal/project.clj b/modules/reitit-pedestal/project.clj index 80ffccea..bb2b7df3 100644 --- a/modules/reitit-pedestal/project.clj +++ b/modules/reitit-pedestal/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-pedestal "0.5.16-SNAPSHOT" +(defproject metosin/reitit-pedestal "0.5.16" :description "Reitit + Pedestal Integration" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-ring/project.clj b/modules/reitit-ring/project.clj index 99f863c4..9e16f8a9 100644 --- a/modules/reitit-ring/project.clj +++ b/modules/reitit-ring/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-ring "0.5.16-SNAPSHOT" +(defproject metosin/reitit-ring "0.5.16" :description "Reitit: Ring routing" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-schema/project.clj b/modules/reitit-schema/project.clj index 0ba7a789..9f507fca 100644 --- a/modules/reitit-schema/project.clj +++ b/modules/reitit-schema/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-schema "0.5.16-SNAPSHOT" +(defproject metosin/reitit-schema "0.5.16" :description "Reitit: Plumatic Schema coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-sieppari/project.clj b/modules/reitit-sieppari/project.clj index 36925423..f6e61959 100644 --- a/modules/reitit-sieppari/project.clj +++ b/modules/reitit-sieppari/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-sieppari "0.5.16-SNAPSHOT" +(defproject metosin/reitit-sieppari "0.5.16" :description "Reitit: Sieppari Interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-spec/project.clj b/modules/reitit-spec/project.clj index 983af588..2bd73083 100644 --- a/modules/reitit-spec/project.clj +++ b/modules/reitit-spec/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-spec "0.5.16-SNAPSHOT" +(defproject metosin/reitit-spec "0.5.16" :description "Reitit: clojure.spec coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger-ui/project.clj b/modules/reitit-swagger-ui/project.clj index 94ecb68b..35352feb 100644 --- a/modules/reitit-swagger-ui/project.clj +++ b/modules/reitit-swagger-ui/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger-ui "0.5.16-SNAPSHOT" +(defproject metosin/reitit-swagger-ui "0.5.16" :description "Reitit: Swagger-ui support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger/project.clj b/modules/reitit-swagger/project.clj index ee608d13..4d066741 100644 --- a/modules/reitit-swagger/project.clj +++ b/modules/reitit-swagger/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger "0.5.16-SNAPSHOT" +(defproject metosin/reitit-swagger "0.5.16" :description "Reitit: Swagger-support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit/project.clj b/modules/reitit/project.clj index 2188f302..86dc7cb8 100644 --- a/modules/reitit/project.clj +++ b/modules/reitit/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit "0.5.16-SNAPSHOT" +(defproject metosin/reitit "0.5.16" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/project.clj b/project.clj index 88b19bec..7ce04d3f 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-parent "0.5.16-SNAPSHOT" +(defproject metosin/reitit-parent "0.5.16" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" @@ -12,21 +12,21 @@ :url "https://github.com/metosin/reitit"} ;; TODO: need to verify that the code actually worked with Java1.8, see #242 :javac-options ["-Xlint:unchecked" "-target" "1.8" "-source" "1.8"] - :managed-dependencies [[metosin/reitit "0.5.16-SNAPSHOT"] - [metosin/reitit-core "0.5.16-SNAPSHOT"] - [metosin/reitit-dev "0.5.16-SNAPSHOT"] - [metosin/reitit-spec "0.5.16-SNAPSHOT"] - [metosin/reitit-malli "0.5.16-SNAPSHOT"] - [metosin/reitit-schema "0.5.16-SNAPSHOT"] - [metosin/reitit-ring "0.5.16-SNAPSHOT"] - [metosin/reitit-middleware "0.5.16-SNAPSHOT"] - [metosin/reitit-http "0.5.16-SNAPSHOT"] - [metosin/reitit-interceptors "0.5.16-SNAPSHOT"] - [metosin/reitit-swagger "0.5.16-SNAPSHOT"] - [metosin/reitit-swagger-ui "0.5.16-SNAPSHOT"] - [metosin/reitit-frontend "0.5.16-SNAPSHOT"] - [metosin/reitit-sieppari "0.5.16-SNAPSHOT"] - [metosin/reitit-pedestal "0.5.16-SNAPSHOT"] + :managed-dependencies [[metosin/reitit "0.5.16"] + [metosin/reitit-core "0.5.16"] + [metosin/reitit-dev "0.5.16"] + [metosin/reitit-spec "0.5.16"] + [metosin/reitit-malli "0.5.16"] + [metosin/reitit-schema "0.5.16"] + [metosin/reitit-ring "0.5.16"] + [metosin/reitit-middleware "0.5.16"] + [metosin/reitit-http "0.5.16"] + [metosin/reitit-interceptors "0.5.16"] + [metosin/reitit-swagger "0.5.16"] + [metosin/reitit-swagger-ui "0.5.16"] + [metosin/reitit-frontend "0.5.16"] + [metosin/reitit-sieppari "0.5.16"] + [metosin/reitit-pedestal "0.5.16"] [metosin/ring-swagger-ui "4.3.0"] [metosin/spec-tools "0.10.5"] [metosin/schema-tools "0.12.3"] From acfc48faa180e7e194667425147bb9f9e870dc8c Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 15 Feb 2022 16:57:07 +0200 Subject: [PATCH 085/113] 0.5.16 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94b2b49b..c836b316 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,9 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Sat, 5 Mar 2022 01:46:03 +0100 Subject: [PATCH 086/113] Save three seq constructions --- modules/reitit-core/src/reitit/spec.cljc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index a3fa0290..80d1fdf6 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -119,11 +119,12 @@ (defrecord Problem [path scope data spec problems]) (defn validate-route-data [routes wrap spec] - (let [spec (wrap spec)] - (some->> (for [[p d _] routes] - (when-let [problems (and spec (s/explain-data spec d))] - (->Problem p nil d spec problems))) - (keep identity) (seq) (vec)))) + (let [spec (wrap spec) + spec-explain (fn [[p d _]] + (when-let [problems (and spec (s/explain-data spec d))] + (->Problem p nil d spec problems))) h + errors (into [] (keep spec-explain) routes)] + (when (pos? (count errors)) errors))) (defn validate [routes {:keys [spec] ::keys [wrap] :or {spec ::default-data, wrap identity}}] (when-let [problems (validate-route-data routes wrap spec)] From 1e5fb601da76199d1b7221dd17e72213db8e11c5 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 10 Mar 2022 13:42:53 +0200 Subject: [PATCH 087/113] fix #538 --- modules/reitit-core/src/reitit/core.cljc | 99 ++++++++++++++---------- test/cljc/reitit/core_test.cljc | 7 ++ 2 files changed, 66 insertions(+), 40 deletions(-) diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index c6776db4..78db2699 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -73,6 +73,23 @@ ;; Different routers ;; +(defn empty-router + "Creates an empty routes, not matching to anything" + ([] (empty-router nil)) + ([opts] + ^{:type ::router} + (reify Router + (router-name [_] + :empty-router) + (routes [_]) + (compiled-routes [_]) + (options [_] + opts) + (route-names [_]) + (match-by-path [_ _]) + (match-by-name [_ _]) + (match-by-name [_ _ _])))) + (defn linear-router "Creates a linear-router from resolved routes and optional expanded options. See [[router]] for available options, plus the following: @@ -180,46 +197,48 @@ ([compiled-routes] (trie-router compiled-routes {})) ([compiled-routes opts] - (let [compiler (::trie/trie-compiler opts (trie/compiler)) - names (impl/find-names compiled-routes opts) - [pl nl] (reduce - (fn [[pl nl] [p {:keys [name] :as data} result]] - (let [{:keys [path-params] :as route} (impl/parse p opts) - f #(if-let [path (impl/path-for route %)] - (->Match p data result (impl/url-decode-coll %) path) - (->PartialMatch p data result (impl/url-decode-coll %) path-params))] - [(trie/insert pl p (->Match p data result nil nil) opts) - (if name (assoc nl name f) nl)])) - [nil {}] - compiled-routes) - matcher (trie/compile pl compiler) - match-by-path (trie/path-matcher matcher compiler) - lookup (impl/fast-map nl) - routes (impl/uncompile-routes compiled-routes)] - ^{:type ::router} - (reify - Router - (router-name [_] - :trie-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) - (match-by-path [_ path] - (if-let [match (match-by-path path)] - (-> (:data match) - (assoc :path-params (:params match)) - (assoc :path path)))) - (match-by-name [_ name] - (if-let [match (impl/fast-get lookup name)] - (match nil))) - (match-by-name [_ name path-params] - (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))))))) + (if-not compiled-routes + (empty-router opts) + (let [compiler (::trie/trie-compiler opts (trie/compiler)) + names (impl/find-names compiled-routes opts) + [pl nl] (reduce + (fn [[pl nl] [p {:keys [name] :as data} result]] + (let [{:keys [path-params] :as route} (impl/parse p opts) + f #(if-let [path (impl/path-for route %)] + (->Match p data result (impl/url-decode-coll %) path) + (->PartialMatch p data result (impl/url-decode-coll %) path-params))] + [(trie/insert pl p (->Match p data result nil nil) opts) + (if name (assoc nl name f) nl)])) + [nil {}] + compiled-routes) + matcher (trie/compile pl compiler) + match-by-path (trie/path-matcher matcher compiler) + lookup (impl/fast-map nl) + routes (impl/uncompile-routes compiled-routes)] + ^{:type ::router} + (reify + Router + (router-name [_] + :trie-router) + (routes [_] + routes) + (compiled-routes [_] + compiled-routes) + (options [_] + opts) + (route-names [_] + names) + (match-by-path [_ path] + (if-let [match (match-by-path path)] + (-> (:data match) + (assoc :path-params (:params match)) + (assoc :path path)))) + (match-by-name [_ name] + (if-let [match (impl/fast-get lookup name)] + (match nil))) + (match-by-name [_ name path-params] + (if-let [match (impl/fast-get lookup name)] + (match (impl/path-params path-params))))))))) (defn single-static-path-router "Creates a fast router of 1 static route(s) and optional diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 1780982c..4c044fa1 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -431,3 +431,10 @@ {:conflicts nil})] (is (= :root (-> (r/match-by-path router "/") :data :name))) (is (= :root (-> (r/match-by-path router2 "/") :data :name))))) + +(deftest routing-bug-test-538 + (let [router (r/router + [["/:a"] + ["/:b"]] + {:conflicts nil})] + (is (nil? (r/match-by-path router ""))))) From f9841363c562eea1ea7f4dd30c45d397bb4ddb8a Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 10 Mar 2022 14:19:30 +0200 Subject: [PATCH 088/113] faster impl, removes all intermediate steps + cleanup --- modules/reitit-core/src/reitit/core.cljc | 164 ++++++++--------------- test/cljc/reitit/core_test.cljc | 7 +- 2 files changed, 62 insertions(+), 109 deletions(-) diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 78db2699..026bb1ea 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -69,27 +69,25 @@ ([match query-params] (some-> match :path (cond-> (seq query-params) (str "?" (impl/query-string query-params)))))) +(defn- matcher [router1 router2] + (if (and router1 router2) + (reify + Router + (match-by-path [_ path] + (or (match-by-path router1 path) + (match-by-path router2 path))) + (match-by-name [_ name] + (or (match-by-name router1 name) + (match-by-name router2 name))) + (match-by-name [_ name path-params] + (or (match-by-name router1 name path-params) + (match-by-name router2 name path-params)))) + (or router1 router2))) + ;; ;; Different routers ;; -(defn empty-router - "Creates an empty routes, not matching to anything" - ([] (empty-router nil)) - ([opts] - ^{:type ::router} - (reify Router - (router-name [_] - :empty-router) - (routes [_]) - (compiled-routes [_]) - (options [_] - opts) - (route-names [_]) - (match-by-path [_ _]) - (match-by-name [_ _]) - (match-by-name [_ _ _])))) - (defn linear-router "Creates a linear-router from resolved routes and optional expanded options. See [[router]] for available options, plus the following: @@ -120,16 +118,11 @@ ^{:type ::router} (reify Router - (router-name [_] - :linear-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) + (router-name [_] :linear-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) (match-by-path [_ path] (if-let [match (match-by-path path)] (-> (:data match) @@ -167,16 +160,11 @@ routes (impl/uncompile-routes compiled-routes)] ^{:type ::router} (reify Router - (router-name [_] - :lookup-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) + (router-name [_] :lookup-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) (match-by-path [_ path] (impl/fast-get data path)) (match-by-name [_ name] @@ -197,8 +185,7 @@ ([compiled-routes] (trie-router compiled-routes {})) ([compiled-routes opts] - (if-not compiled-routes - (empty-router opts) + (when compiled-routes (let [compiler (::trie/trie-compiler opts (trie/compiler)) names (impl/find-names compiled-routes opts) [pl nl] (reduce @@ -218,16 +205,11 @@ ^{:type ::router} (reify Router - (router-name [_] - :trie-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) + (router-name [_] :trie-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) (match-by-path [_ path] (if-let [match (match-by-path path)] (-> (:data match) @@ -257,25 +239,17 @@ routes (impl/uncompile-routes compiled-routes)] ^{:type ::router} (reify Router - (router-name [_] - :single-static-path-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) + (router-name [_] :single-static-path-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) (match-by-path [_ path] - (if (#?(:clj .equals :cljs =) p path) - match)) + (if (#?(:clj .equals :cljs =) p path) match)) (match-by-name [_ name] - (if (= n name) - match)) + (if (= n name) match)) (match-by-name [_ name path-params] - (if (= n name) - (impl/fast-assoc match :path-params (impl/path-params path-params)))))))) + (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params)))))))) (defn mixed-router "Creates two routers: [[lookup-router]] or [[single-static-path-router]] for @@ -290,28 +264,18 @@ wildcard-router (trie-router wild opts) static-router (->static-router lookup opts) names (impl/find-names compiled-routes opts) - routes (impl/uncompile-routes compiled-routes)] + routes (impl/uncompile-routes compiled-routes) + router (matcher static-router wildcard-router)] ^{:type ::router} (reify Router - (router-name [_] - :mixed-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) - (match-by-path [_ path] - (or (match-by-path static-router path) - (match-by-path wildcard-router path))) - (match-by-name [_ name] - (or (match-by-name static-router name) - (match-by-name wildcard-router name))) - (match-by-name [_ name path-params] - (or (match-by-name static-router name path-params) - (match-by-name wildcard-router name path-params))))))) + (router-name [_] :mixed-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) + (match-by-path [_ path] (match-by-path router path)) + (match-by-name [_ name] (match-by-name router name)) + (match-by-name [_ name path-params] (match-by-name router name path-params)))))) (defn quarantine-router "Creates two routers: [[mixed-router]] for non-conflicting routes @@ -326,28 +290,18 @@ linear-router (linear-router conflicting opts) mixed-router (mixed-router non-conflicting opts) names (impl/find-names compiled-routes opts) - routes (impl/uncompile-routes compiled-routes)] + routes (impl/uncompile-routes compiled-routes) + router (matcher mixed-router linear-router)] ^{:type ::router} (reify Router - (router-name [_] - :quarantine-router) - (routes [_] - routes) - (compiled-routes [_] - compiled-routes) - (options [_] - opts) - (route-names [_] - names) - (match-by-path [_ path] - (or (match-by-path mixed-router path) - (match-by-path linear-router path))) - (match-by-name [_ name] - (or (match-by-name mixed-router name) - (match-by-name linear-router name))) - (match-by-name [_ name path-params] - (or (match-by-name mixed-router name path-params) - (match-by-name linear-router name path-params))))))) + (router-name [_] :quarantine-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) + (match-by-path [_ path] (match-by-path router path)) + (match-by-name [_ name] (match-by-name router name)) + (match-by-name [_ name path-params] (match-by-name router name path-params)))))) ;; ;; Creating Routers diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 4c044fa1..347d63d3 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -433,8 +433,7 @@ (is (= :root (-> (r/match-by-path router2 "/") :data :name))))) (deftest routing-bug-test-538 - (let [router (r/router - [["/:a"] - ["/:b"]] - {:conflicts nil})] + (let [router (r/router [["/:a"] ["/:b"]] {:conflicts nil})] (is (nil? (r/match-by-path router ""))))) + + From b0602d60c9d9c6790d2971f9b3436d3a19ed33bf Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 10 Mar 2022 15:21:15 +0200 Subject: [PATCH 089/113] one more time --- modules/reitit-core/src/reitit/core.cljc | 116 +++++++++++------------ modules/reitit-core/src/reitit/trie.cljc | 3 +- 2 files changed, 56 insertions(+), 63 deletions(-) diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 026bb1ea..0b32fd73 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -69,21 +69,6 @@ ([match query-params] (some-> match :path (cond-> (seq query-params) (str "?" (impl/query-string query-params)))))) -(defn- matcher [router1 router2] - (if (and router1 router2) - (reify - Router - (match-by-path [_ path] - (or (match-by-path router1 path) - (match-by-path router2 path))) - (match-by-name [_ name] - (or (match-by-name router1 name) - (match-by-name router2 name))) - (match-by-name [_ name path-params] - (or (match-by-name router1 name path-params) - (match-by-name router2 name path-params)))) - (or router1 router2))) - ;; ;; Different routers ;; @@ -185,42 +170,41 @@ ([compiled-routes] (trie-router compiled-routes {})) ([compiled-routes opts] - (when compiled-routes - (let [compiler (::trie/trie-compiler opts (trie/compiler)) - names (impl/find-names compiled-routes opts) - [pl nl] (reduce - (fn [[pl nl] [p {:keys [name] :as data} result]] - (let [{:keys [path-params] :as route} (impl/parse p opts) - f #(if-let [path (impl/path-for route %)] - (->Match p data result (impl/url-decode-coll %) path) - (->PartialMatch p data result (impl/url-decode-coll %) path-params))] - [(trie/insert pl p (->Match p data result nil nil) opts) - (if name (assoc nl name f) nl)])) - [nil {}] - compiled-routes) - matcher (trie/compile pl compiler) - match-by-path (trie/path-matcher matcher compiler) - lookup (impl/fast-map nl) - routes (impl/uncompile-routes compiled-routes)] - ^{:type ::router} - (reify - Router - (router-name [_] :trie-router) - (routes [_] routes) - (compiled-routes [_] compiled-routes) - (options [_] opts) - (route-names [_] names) - (match-by-path [_ path] - (if-let [match (match-by-path path)] - (-> (:data match) - (assoc :path-params (:params match)) - (assoc :path path)))) - (match-by-name [_ name] - (if-let [match (impl/fast-get lookup name)] - (match nil))) - (match-by-name [_ name path-params] - (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params))))))))) + (let [compiler (::trie/trie-compiler opts (trie/compiler)) + names (impl/find-names compiled-routes opts) + [pl nl] (reduce + (fn [[pl nl] [p {:keys [name] :as data} result]] + (let [{:keys [path-params] :as route} (impl/parse p opts) + f #(if-let [path (impl/path-for route %)] + (->Match p data result (impl/url-decode-coll %) path) + (->PartialMatch p data result (impl/url-decode-coll %) path-params))] + [(trie/insert pl p (->Match p data result nil nil) opts) + (if name (assoc nl name f) nl)])) + [nil {}] + compiled-routes) + matcher (trie/compile pl compiler) + match-by-path (if matcher (trie/path-matcher matcher compiler)) + lookup (impl/fast-map nl) + routes (impl/uncompile-routes compiled-routes)] + ^{:type ::router} + (reify + Router + (router-name [_] :trie-router) + (routes [_] routes) + (compiled-routes [_] compiled-routes) + (options [_] opts) + (route-names [_] names) + (match-by-path [_ path] + (if-let [match (and match-by-path (match-by-path path))] + (-> (:data match) + (assoc :path-params (:params match)) + (assoc :path path)))) + (match-by-name [_ name] + (if-let [match (impl/fast-get lookup name)] + (match nil))) + (match-by-name [_ name path-params] + (if-let [match (impl/fast-get lookup name)] + (match (impl/path-params path-params)))))))) (defn single-static-path-router "Creates a fast router of 1 static route(s) and optional @@ -264,8 +248,7 @@ wildcard-router (trie-router wild opts) static-router (->static-router lookup opts) names (impl/find-names compiled-routes opts) - routes (impl/uncompile-routes compiled-routes) - router (matcher static-router wildcard-router)] + routes (impl/uncompile-routes compiled-routes)] ^{:type ::router} (reify Router (router-name [_] :mixed-router) @@ -273,9 +256,15 @@ (compiled-routes [_] compiled-routes) (options [_] opts) (route-names [_] names) - (match-by-path [_ path] (match-by-path router path)) - (match-by-name [_ name] (match-by-name router name)) - (match-by-name [_ name path-params] (match-by-name router name path-params)))))) + (match-by-path [_ path] + (or (match-by-path static-router path) + (match-by-path wildcard-router path))) + (match-by-name [_ name] + (or (match-by-name static-router name) + (match-by-name wildcard-router name))) + (match-by-name [_ name path-params] + (or (match-by-name static-router name path-params) + (match-by-name wildcard-router name path-params))))))) (defn quarantine-router "Creates two routers: [[mixed-router]] for non-conflicting routes @@ -290,8 +279,7 @@ linear-router (linear-router conflicting opts) mixed-router (mixed-router non-conflicting opts) names (impl/find-names compiled-routes opts) - routes (impl/uncompile-routes compiled-routes) - router (matcher mixed-router linear-router)] + routes (impl/uncompile-routes compiled-routes)] ^{:type ::router} (reify Router (router-name [_] :quarantine-router) @@ -299,9 +287,15 @@ (compiled-routes [_] compiled-routes) (options [_] opts) (route-names [_] names) - (match-by-path [_ path] (match-by-path router path)) - (match-by-name [_ name] (match-by-name router name)) - (match-by-name [_ name path-params] (match-by-name router name path-params)))))) + (match-by-path [_ path] + (or (match-by-path mixed-router path) + (match-by-path linear-router path))) + (match-by-name [_ name] + (or (match-by-name mixed-router name) + (match-by-name linear-router name))) + (match-by-name [_ name path-params] + (or (match-by-name mixed-router name path-params) + (match-by-name linear-router name path-params))))))) ;; ;; Creating Routers diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index cda97066..22c6356b 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -364,8 +364,7 @@ (into (for [[p c] catch-all] (catch-all-matcher compiler (:value p) params (:data c)))))] (cond (> (count matchers) 1) (linear-matcher compiler matchers false) - (= (count matchers) 1) (first matchers) - :else (data-matcher compiler {} nil))))) + (= (count matchers) 1) (first matchers))))) (defn pretty "Returns a simplified EDN structure of a compiled trie for printing purposes." From 650ff3d6b307f896790f0af2ced478e2f335bede Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 10 Mar 2022 15:23:07 +0200 Subject: [PATCH 090/113] . --- test/cljc/reitit/core_test.cljc | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 347d63d3..fc112239 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -435,5 +435,3 @@ (deftest routing-bug-test-538 (let [router (r/router [["/:a"] ["/:b"]] {:conflicts nil})] (is (nil? (r/match-by-path router ""))))) - - From f0405adc02fe6bc88fdeec5ee94d957045e805a9 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 10 Mar 2022 20:15:43 +0200 Subject: [PATCH 091/113] 0.5.17 --- CHANGELOG.md | 5 +++ README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-lite-swagger/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 48 files changed, 82 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c836b316..dc1d1aef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Fri, 18 Mar 2022 15:55:20 +0000 Subject: [PATCH 092/113] Update spec.cljc Stray character --- modules/reitit-core/src/reitit/spec.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index 80d1fdf6..6715eae3 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -122,7 +122,7 @@ (let [spec (wrap spec) spec-explain (fn [[p d _]] (when-let [problems (and spec (s/explain-data spec d))] - (->Problem p nil d spec problems))) h + (->Problem p nil d spec problems))) errors (into [] (keep spec-explain) routes)] (when (pos? (count errors)) errors))) From 54ae50525cfdc3bfb70da8cc9684a7c2823ec7f1 Mon Sep 17 00:00:00 2001 From: Anton Mostovoy Date: Fri, 25 Mar 2022 13:21:20 -0500 Subject: [PATCH 093/113] update jackson-databind for CVE-2020-36518 See https://github.com/FasterXML/jackson-databind/issues/2816 See https://github.com/FasterXML/jackson-databind/compare/jackson-databind-2.13.2...jackson-databind-2.13.2.1 --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index d8611b75..f5ac4d50 100644 --- a/project.clj +++ b/project.clj @@ -36,8 +36,8 @@ [metosin/malli "0.8.2"] ;; https://clojureverse.org/t/depending-on-the-right-versions-of-jackson-libraries/5111 - [com.fasterxml.jackson.core/jackson-core "2.13.1"] - [com.fasterxml.jackson.core/jackson-databind "2.13.1"] + [com.fasterxml.jackson.core/jackson-core "2.13.2.1"] + [com.fasterxml.jackson.core/jackson-databind "2.13.2.1"] [meta-merge "1.0.0"] [fipp "0.6.25" :exclusions [org.clojure/core.rrb-vector]] From 053ac5b9615cc2e43862410fecc0283ee74757ba Mon Sep 17 00:00:00 2001 From: Zachary Teo Date: Wed, 30 Mar 2022 21:35:42 +0800 Subject: [PATCH 094/113] Balance parenthesis in docs --- doc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README.md b/doc/README.md index 0faabf8c..34a15147 100644 --- a/doc/README.md +++ b/doc/README.md @@ -139,7 +139,7 @@ Routing: ```clj (app {:request-method :get, :uri "/api/admin/users"}) -; {:status 200, :body "ok", :wrap (:api :admin} +; {:status 200, :body "ok", :wrap (:api :admin)} (app {:request-method :put, :uri "/api/admin/users"}) ; nil From ea38b60b2848f29bfa426a4c9ad1bf9646fe9ee1 Mon Sep 17 00:00:00 2001 From: Anton Mostovoy Date: Thu, 31 Mar 2022 16:31:42 -0500 Subject: [PATCH 095/113] update jackson deps per most recent recommendation see https://github.com/FasterXML/jackson-databind/issues/2816#issue-678075273 --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index f5ac4d50..2d70dc95 100644 --- a/project.clj +++ b/project.clj @@ -36,8 +36,8 @@ [metosin/malli "0.8.2"] ;; https://clojureverse.org/t/depending-on-the-right-versions-of-jackson-libraries/5111 - [com.fasterxml.jackson.core/jackson-core "2.13.2.1"] - [com.fasterxml.jackson.core/jackson-databind "2.13.2.1"] + [com.fasterxml.jackson.core/jackson-core "2.13.2"] + [com.fasterxml.jackson.core/jackson-databind "2.13.2.2"] [meta-merge "1.0.0"] [fipp "0.6.25" :exclusions [org.clojure/core.rrb-vector]] From 9e4b420fc8825d1c1ede854748d5bbc3eef9885c Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 5 Apr 2022 17:33:25 +0300 Subject: [PATCH 096/113] on-coercion-error --- .../reitit-frontend/src/reitit/frontend.cljs | 30 ++++++++++++------- .../src/reitit/frontend/history.cljs | 4 +-- test/cljs/reitit/frontend/core_test.cljs | 9 ++++++ 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/modules/reitit-frontend/src/reitit/frontend.cljs b/modules/reitit-frontend/src/reitit/frontend.cljs index 60273f79..20d15b31 100644 --- a/modules/reitit-frontend/src/reitit/frontend.cljs +++ b/modules/reitit-frontend/src/reitit/frontend.cljs @@ -23,17 +23,25 @@ (defn match-by-path "Given routing tree and current path, return match with possibly coerced parameters. Return nil if no match found." - [router path] - (let [uri (.parse Uri path)] - (if-let [match (r/match-by-path router (.getPath uri))] - (let [q (query-params uri) - match (assoc match :query-params q) - ;; Return uncoerced values if coercion is not enabled - so - ;; that tha parameters are always accessible from same property. - parameters (or (coercion/coerce! match) - {:path (:path-params match) - :query q})] - (assoc match :parameters parameters))))) + ([router path] (match-by-path router path nil)) + ([router path {:keys [on-coercion-error]}] + (let [uri (.parse Uri path) + coerce! (if on-coercion-error + (fn [match] + (try (coercion/coerce! match) + (catch js/Error e + (on-coercion-error e) + (throw e)))) + coercion/coerce!)] + (if-let [match (r/match-by-path router (.getPath uri))] + (let [q (query-params uri) + match (assoc match :query-params q) + ;; Return uncoerced values if coercion is not enabled - so + ;; that tha parameters are always accessible from same property. + parameters (or (coerce! match) + {:path (:path-params match) + :query q})] + (assoc match :parameters parameters)))))) (defn match-by-name "Given a router, route name and optionally path-parameters, diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 600feaec..f95dcf12 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -40,7 +40,7 @@ nil) (-on-navigate [this path] (reset! last-fragment path) - (on-navigate (rf/match-by-path router path) this)) + (on-navigate (rf/match-by-path router path this) this)) (-get-path [this] ;; Remove # ;; "" or "#" should be same as "#/" @@ -125,7 +125,7 @@ (-on-navigate this (-get-path this)) this)) (-on-navigate [this path] - (on-navigate (rf/match-by-path router path) this)) + (on-navigate (rf/match-by-path router path this) this)) (-stop [this] (gevents/unlistenByKey listen-key) (gevents/unlistenByKey click-listen-key) diff --git a/test/cljs/reitit/frontend/core_test.cljs b/test/cljs/reitit/frontend/core_test.cljs index 22ac1db2..6acb5c1c 100644 --- a/test/cljs/reitit/frontend/core_test.cljs +++ b/test/cljs/reitit/frontend/core_test.cljs @@ -80,6 +80,15 @@ (is (= "/5" (r/match->path (rf/match-by-name router ::foo {:id 5})))) + (testing "coercion error" + (testing "throws without options" + (is (thrown? js/Error (m (rf/match-by-path router "/a"))))) + + (testing "thows and calles on-coercion-error" + (let [exception (atom nil)] + (is (thrown? js/Error (m (rf/match-by-path router "/a" {:on-coercion-error (fn [e] (reset! exception e))})))) + (is (= {:id "a"} (-> @exception (ex-data) :value)))))) + (testing "query param is read" (is (= (r/map->Match {:template "/:id" From 1ecfd1ae0272e5c76954931968018a054238d01d Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 5 Apr 2022 17:55:09 +0300 Subject: [PATCH 097/113] CHANGELOG, pass match too --- CHANGELOG.md | 4 ++++ modules/reitit-frontend/src/reitit/frontend.cljs | 2 +- test/cljs/reitit/frontend/core_test.cljs | 8 ++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1d1aef..e06f39e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ We use [Break Versioning][breakver]. The version numbers follow a `. @match :path-params))) (is (= {:id "a"} (-> @exception (ex-data) :value)))))) (testing "query param is read" From b282e32b738eedbe6c0be82ed0c048f9248124ae Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 5 Apr 2022 18:43:34 +0300 Subject: [PATCH 098/113] . --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e06f39e5..2b123b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 5 Apr 2022 21:22:36 +0300 Subject: [PATCH 099/113] doc the option --- modules/reitit-frontend/src/reitit/frontend.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/reitit-frontend/src/reitit/frontend.cljs b/modules/reitit-frontend/src/reitit/frontend.cljs index d50e9614..d1e9c50a 100644 --- a/modules/reitit-frontend/src/reitit/frontend.cljs +++ b/modules/reitit-frontend/src/reitit/frontend.cljs @@ -22,7 +22,9 @@ (defn match-by-path "Given routing tree and current path, return match with possibly - coerced parameters. Return nil if no match found." + coerced parameters. Return nil if no match found. + + :on-coercion-error - a sideeffecting fn of `match exception -> nil`" ([router path] (match-by-path router path nil)) ([router path {:keys [on-coercion-error]}] (let [uri (.parse Uri path) From 38d3fb0dda0728535adc29b0c2d2d301a1d1128e Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 5 Apr 2022 21:37:42 +0300 Subject: [PATCH 100/113] CHANGELOG --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b123b82..d77091f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,12 @@ We use [Break Versioning][breakver]. The version numbers follow a `. Date: Tue, 5 Apr 2022 21:38:04 +0300 Subject: [PATCH 101/113] 0.5.18 --- README.md | 2 +- doc/README.md | 2 +- doc/basics/error_messages.md | 2 +- doc/http/default_interceptors.md | 2 +- doc/http/interceptors.md | 2 +- doc/http/pedestal.md | 6 ++-- doc/http/sieppari.md | 2 +- doc/http/transforming_interceptor_chain.md | 2 +- doc/ring/default_middleware.md | 2 +- doc/ring/exceptions.md | 2 +- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 +-- doc/ring/transforming_middleware_chain.md | 2 +- examples/buddy-auth/project.clj | 2 +- examples/frontend-auth/project.clj | 6 ++-- examples/frontend-controllers/project.clj | 6 ++-- examples/frontend-links/project.clj | 6 ++-- examples/frontend-prompt/project.clj | 6 ++-- examples/frontend-re-frame/project.clj | 2 +- examples/frontend/project.clj | 6 ++-- examples/http-swagger/project.clj | 2 +- examples/http/project.clj | 2 +- examples/just-coercion-with-ring/project.clj | 2 +- examples/pedestal-swagger/project.clj | 4 +-- examples/pedestal/project.clj | 4 +-- examples/ring-example/project.clj | 2 +- examples/ring-integrant/project.clj | 2 +- examples/ring-malli-lite-swagger/project.clj | 2 +- examples/ring-malli-swagger/project.clj | 2 +- examples/ring-spec-swagger/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-dev/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-http/project.clj | 2 +- modules/reitit-interceptors/project.clj | 2 +- modules/reitit-malli/project.clj | 2 +- modules/reitit-middleware/project.clj | 2 +- modules/reitit-pedestal/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-sieppari/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 32 ++++++++++---------- 47 files changed, 77 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index a4a0596f..933b7be2 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians All main modules bundled: ```clj -[metosin/reitit "0.5.17"] +[metosin/reitit "0.5.18"] ``` Optionally, the parts can be required separately. diff --git a/doc/README.md b/doc/README.md index 34a15147..f71402fb 100644 --- a/doc/README.md +++ b/doc/README.md @@ -40,7 +40,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians All bundled: ```clj -[metosin/reitit "0.5.17"] +[metosin/reitit "0.5.18"] ``` Optionally, the parts can be required separately. diff --git a/doc/basics/error_messages.md b/doc/basics/error_messages.md index 40717046..2458dca7 100644 --- a/doc/basics/error_messages.md +++ b/doc/basics/error_messages.md @@ -22,7 +22,7 @@ The default exception formatting uses `reitit.exception/exception`. It produces ## Pretty Errors ```clj -[metosin/reitit-dev "0.5.17"] +[metosin/reitit-dev "0.5.18"] ``` For human-readable and developer-friendly exception messages, there is `reitit.dev.pretty/exception` (in the `reitit-dev` module). It is inspired by the lovely errors messages of [ELM](https://elm-lang.org/blog/compiler-errors-for-humans) and [ETA](https://twitter.com/jyothsnasrin/status/1037703436043603968) and uses [fipp](https://github.com/brandonbloom/fipp), [expound](https://github.com/bhb/expound) and [spell-spec](https://github.com/bhauman/spell-spec) for most of heavy lifting. diff --git a/doc/http/default_interceptors.md b/doc/http/default_interceptors.md index 7afa6aff..4ea63b95 100644 --- a/doc/http/default_interceptors.md +++ b/doc/http/default_interceptors.md @@ -1,7 +1,7 @@ # Default Interceptors ```clj -[metosin/reitit-interceptors "0.5.17"] +[metosin/reitit-interceptors "0.5.18"] ``` Just like the [ring default middleware](../ring/default_middleware.md), but for interceptors. diff --git a/doc/http/interceptors.md b/doc/http/interceptors.md index e04bab47..373360f7 100644 --- a/doc/http/interceptors.md +++ b/doc/http/interceptors.md @@ -5,7 +5,7 @@ Reitit has also support for [interceptors](http://pedestal.io/reference/intercep ## Reitit-http ```clj -[metosin/reitit-http "0.5.17"] +[metosin/reitit-http "0.5.18"] ``` A module for http-routing using interceptors instead of middleware. Builds on top of the [`reitit-ring`](../ring/ring.md) module having all the same features. diff --git a/doc/http/pedestal.md b/doc/http/pedestal.md index 3c3ec961..25b5e9ba 100644 --- a/doc/http/pedestal.md +++ b/doc/http/pedestal.md @@ -3,7 +3,7 @@ [Pedestal](http://pedestal.io/) is a backend web framework for Clojure. `reitit-pedestal` provides an alternative routing engine for Pedestal. ```clj -[metosin/reitit-pedestal "0.5.17"] +[metosin/reitit-pedestal "0.5.18"] ``` Why should one use reitit instead of the Pedestal [default routing](http://pedestal.io/reference/routing-quick-reference)? @@ -26,8 +26,8 @@ A minimalistic example on how to to swap the default-router with a reitit router ```clj ; [io.pedestal/pedestal.service "0.5.5"] ; [io.pedestal/pedestal.jetty "0.5.5"] -; [metosin/reitit-pedestal "0.5.17"] -; [metosin/reitit "0.5.17"] +; [metosin/reitit-pedestal "0.5.18"] +; [metosin/reitit "0.5.18"] (require '[io.pedestal.http :as server]) (require '[reitit.pedestal :as pedestal]) diff --git a/doc/http/sieppari.md b/doc/http/sieppari.md index f41dee2f..f886efb2 100644 --- a/doc/http/sieppari.md +++ b/doc/http/sieppari.md @@ -1,7 +1,7 @@ # Sieppari ```clj -[metosin/reitit-sieppari "0.5.17"] +[metosin/reitit-sieppari "0.5.18"] ``` [Sieppari](https://github.com/metosin/sieppari) is a new and fast interceptor implementation for Clojure, with pluggable async supporting [core.async](https://github.com/clojure/core.async), [Manifold](https://github.com/ztellman/manifold) and [Promesa](http://funcool.github.io/promesa/latest). diff --git a/doc/http/transforming_interceptor_chain.md b/doc/http/transforming_interceptor_chain.md index ea84e69e..a0e5c6b8 100644 --- a/doc/http/transforming_interceptor_chain.md +++ b/doc/http/transforming_interceptor_chain.md @@ -65,7 +65,7 @@ There is an extra option in http-router (actually, in the underlying interceptor ### Printing Context Diffs ```clj -[metosin/reitit-interceptors "0.5.17"] +[metosin/reitit-interceptors "0.5.18"] ``` Using `reitit.http.interceptors.dev/print-context-diffs` transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option: diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md index f02d66e5..ea9274aa 100644 --- a/doc/ring/default_middleware.md +++ b/doc/ring/default_middleware.md @@ -1,7 +1,7 @@ # Default Middleware ```clj -[metosin/reitit-middleware "0.5.17"] +[metosin/reitit-middleware "0.5.18"] ``` Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. diff --git a/doc/ring/exceptions.md b/doc/ring/exceptions.md index 70c75adb..0ba1321b 100644 --- a/doc/ring/exceptions.md +++ b/doc/ring/exceptions.md @@ -1,7 +1,7 @@ # Exception Handling with Ring ```clj -[metosin/reitit-middleware "0.5.17"] +[metosin/reitit-middleware "0.5.18"] ``` Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practice is to have a top-level exception handler to log and format errors for clients. diff --git a/doc/ring/ring.md b/doc/ring/ring.md index 4cf7bcfa..daf4b0a6 100644 --- a/doc/ring/ring.md +++ b/doc/ring/ring.md @@ -5,7 +5,7 @@ Read more about the [Ring Concepts](https://github.com/ring-clojure/ring/wiki/Concepts). ```clj -[metosin/reitit-ring "0.5.17"] +[metosin/reitit-ring "0.5.18"] ``` ## `reitit.ring/ring-router` diff --git a/doc/ring/swagger.md b/doc/ring/swagger.md index 591f8907..54eca320 100644 --- a/doc/ring/swagger.md +++ b/doc/ring/swagger.md @@ -1,7 +1,7 @@ # Swagger Support ``` -[metosin/reitit-swagger "0.5.17"] +[metosin/reitit-swagger "0.5.18"] ``` Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys. @@ -44,7 +44,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus [Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module. ``` -[metosin/reitit-swagger-ui "0.5.17"] +[metosin/reitit-swagger-ui "0.5.18"] ``` `reitit.swagger-ui/create-swagger-ui-handler` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options: diff --git a/doc/ring/transforming_middleware_chain.md b/doc/ring/transforming_middleware_chain.md index 53c73bc4..5175758e 100644 --- a/doc/ring/transforming_middleware_chain.md +++ b/doc/ring/transforming_middleware_chain.md @@ -59,7 +59,7 @@ There is an extra option in ring-router (actually, in the underlying middleware- ### Printing Request Diffs ```clj -[metosin/reitit-middleware "0.5.17"] +[metosin/reitit-middleware "0.5.18"] ``` Using `reitit.ring.middleware.dev/print-request-diffs` transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option: diff --git a/examples/buddy-auth/project.clj b/examples/buddy-auth/project.clj index f7c1917a..cdd0217a 100644 --- a/examples/buddy-auth/project.clj +++ b/examples/buddy-auth/project.clj @@ -2,6 +2,6 @@ :description "Reitit Buddy Auth App" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.8.1"] - [metosin/reitit "0.5.17"] + [metosin/reitit "0.5.18"] [buddy "2.0.0"]] :repl-options {:init-ns example.server}) diff --git a/examples/frontend-auth/project.clj b/examples/frontend-auth/project.clj index 11b3f4dc..4258aadc 100644 --- a/examples/frontend-auth/project.clj +++ b/examples/frontend-auth/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.17"] - [metosin/reitit-schema "0.5.17"] - [metosin/reitit-frontend "0.5.17"] + [metosin/reitit "0.5.18"] + [metosin/reitit-schema "0.5.18"] + [metosin/reitit-frontend "0.5.18"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-controllers/project.clj b/examples/frontend-controllers/project.clj index 11b3f4dc..4258aadc 100644 --- a/examples/frontend-controllers/project.clj +++ b/examples/frontend-controllers/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.439"] - [metosin/reitit "0.5.17"] - [metosin/reitit-schema "0.5.17"] - [metosin/reitit-frontend "0.5.17"] + [metosin/reitit "0.5.18"] + [metosin/reitit-schema "0.5.18"] + [metosin/reitit-frontend "0.5.18"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-links/project.clj b/examples/frontend-links/project.clj index 9d4dbd59..16c82efc 100644 --- a/examples/frontend-links/project.clj +++ b/examples/frontend-links/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.17"] - [metosin/reitit-spec "0.5.17"] - [metosin/reitit-frontend "0.5.17"] + [metosin/reitit "0.5.18"] + [metosin/reitit-spec "0.5.18"] + [metosin/reitit-frontend "0.5.18"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-prompt/project.clj b/examples/frontend-prompt/project.clj index 9d4dbd59..16c82efc 100644 --- a/examples/frontend-prompt/project.clj +++ b/examples/frontend-prompt/project.clj @@ -10,9 +10,9 @@ [ring "1.7.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.17"] - [metosin/reitit-spec "0.5.17"] - [metosin/reitit-frontend "0.5.17"] + [metosin/reitit "0.5.18"] + [metosin/reitit-spec "0.5.18"] + [metosin/reitit-frontend "0.5.18"] ;; Just for pretty printting the match [fipp "0.6.14"]] diff --git a/examples/frontend-re-frame/project.clj b/examples/frontend-re-frame/project.clj index 93b5f4d5..f5387c41 100644 --- a/examples/frontend-re-frame/project.clj +++ b/examples/frontend-re-frame/project.clj @@ -1,7 +1,7 @@ (defproject frontend-re-frame "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.10.0"] [org.clojure/clojurescript "1.10.520"] - [metosin/reitit "0.5.17"] + [metosin/reitit "0.5.18"] [reagent "0.8.1"] [re-frame "0.10.6"]] diff --git a/examples/frontend/project.clj b/examples/frontend/project.clj index fcd9953c..b359c55e 100644 --- a/examples/frontend/project.clj +++ b/examples/frontend/project.clj @@ -10,9 +10,9 @@ [ring "1.8.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.773"] - [metosin/reitit "0.5.17"] - [metosin/reitit-spec "0.5.17"] - [metosin/reitit-frontend "0.5.17"] + [metosin/reitit "0.5.18"] + [metosin/reitit-spec "0.5.18"] + [metosin/reitit-frontend "0.5.18"] ;; Just for pretty printting the match [fipp "0.6.23"]] diff --git a/examples/http-swagger/project.clj b/examples/http-swagger/project.clj index 355bda82..84d58af8 100644 --- a/examples/http-swagger/project.clj +++ b/examples/http-swagger/project.clj @@ -3,5 +3,5 @@ :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] [aleph "0.4.7-alpha5"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/examples/http/project.clj b/examples/http/project.clj index 846c1fc8..78769ce7 100644 --- a/examples/http/project.clj +++ b/examples/http/project.clj @@ -5,5 +5,5 @@ [funcool/promesa "1.9.0"] [manifold "0.1.8"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/examples/just-coercion-with-ring/project.clj b/examples/just-coercion-with-ring/project.clj index 093b93f4..8b35a3c2 100644 --- a/examples/just-coercion-with-ring/project.clj +++ b/examples/just-coercion-with-ring/project.clj @@ -2,4 +2,4 @@ :description "Reitit coercion with vanilla ring" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]]) + [metosin/reitit "0.5.18"]]) diff --git a/examples/pedestal-swagger/project.clj b/examples/pedestal-swagger/project.clj index 879bdb71..2cce08f7 100644 --- a/examples/pedestal-swagger/project.clj +++ b/examples/pedestal-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.17"] - [metosin/reitit "0.5.17"]] + [metosin/reitit-pedestal "0.5.18"] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/examples/pedestal/project.clj b/examples/pedestal/project.clj index 879bdb71..2cce08f7 100644 --- a/examples/pedestal/project.clj +++ b/examples/pedestal/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [io.pedestal/pedestal.service "0.5.5"] [io.pedestal/pedestal.jetty "0.5.5"] - [metosin/reitit-pedestal "0.5.17"] - [metosin/reitit "0.5.17"]] + [metosin/reitit-pedestal "0.5.18"] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-example/project.clj b/examples/ring-example/project.clj index f6235efc..286f65fd 100644 --- a/examples/ring-example/project.clj +++ b/examples/ring-example/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-integrant/project.clj b/examples/ring-integrant/project.clj index f5bce4a6..22b3ab9d 100644 --- a/examples/ring-integrant/project.clj +++ b/examples/ring-integrant/project.clj @@ -2,7 +2,7 @@ :description "Reitit Ring App with Integrant" :dependencies [[org.clojure/clojure "1.10.1"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"] + [metosin/reitit "0.5.18"] [integrant "0.7.0"]] :main example.server :repl-options {:init-ns user} diff --git a/examples/ring-malli-lite-swagger/project.clj b/examples/ring-malli-lite-swagger/project.clj index 89368041..42e408a8 100644 --- a/examples/ring-malli-lite-swagger/project.clj +++ b/examples/ring-malli-lite-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [metosin/jsonista "0.2.6"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-malli-swagger/project.clj b/examples/ring-malli-swagger/project.clj index 89368041..42e408a8 100644 --- a/examples/ring-malli-swagger/project.clj +++ b/examples/ring-malli-swagger/project.clj @@ -3,6 +3,6 @@ :dependencies [[org.clojure/clojure "1.10.0"] [metosin/jsonista "0.2.6"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-spec-swagger/project.clj b/examples/ring-spec-swagger/project.clj index 6c7c47ad..88225b36 100644 --- a/examples/ring-spec-swagger/project.clj +++ b/examples/ring-spec-swagger/project.clj @@ -2,6 +2,6 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server} :profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}}) diff --git a/examples/ring-swagger/project.clj b/examples/ring-swagger/project.clj index 39f0c840..335d63d4 100644 --- a/examples/ring-swagger/project.clj +++ b/examples/ring-swagger/project.clj @@ -2,5 +2,5 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.10.0"] [ring/ring-jetty-adapter "1.7.1"] - [metosin/reitit "0.5.17"]] + [metosin/reitit "0.5.18"]] :repl-options {:init-ns example.server}) diff --git a/modules/reitit-core/project.clj b/modules/reitit-core/project.clj index 97fe7756..9903a3c7 100644 --- a/modules/reitit-core/project.clj +++ b/modules/reitit-core/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-core "0.5.17" +(defproject metosin/reitit-core "0.5.18" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-dev/project.clj b/modules/reitit-dev/project.clj index bec8abb7..65da7e02 100644 --- a/modules/reitit-dev/project.clj +++ b/modules/reitit-dev/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-dev "0.5.17" +(defproject metosin/reitit-dev "0.5.18" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-frontend/project.clj b/modules/reitit-frontend/project.clj index e4327bef..9860511f 100644 --- a/modules/reitit-frontend/project.clj +++ b/modules/reitit-frontend/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-frontend "0.5.17" +(defproject metosin/reitit-frontend "0.5.18" :description "Reitit: Clojurescript frontend routing core" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-http/project.clj b/modules/reitit-http/project.clj index 53e2bbc6..968d74fa 100644 --- a/modules/reitit-http/project.clj +++ b/modules/reitit-http/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-http "0.5.17" +(defproject metosin/reitit-http "0.5.18" :description "Reitit: HTTP routing with interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-interceptors/project.clj b/modules/reitit-interceptors/project.clj index d1c2e537..a4cbab4e 100644 --- a/modules/reitit-interceptors/project.clj +++ b/modules/reitit-interceptors/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-interceptors "0.5.17" +(defproject metosin/reitit-interceptors "0.5.18" :description "Reitit, common interceptors bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-malli/project.clj b/modules/reitit-malli/project.clj index 1eb644ce..049c01eb 100644 --- a/modules/reitit-malli/project.clj +++ b/modules/reitit-malli/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-malli "0.5.17" +(defproject metosin/reitit-malli "0.5.18" :description "Reitit: Malli coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-middleware/project.clj b/modules/reitit-middleware/project.clj index e3241a38..c28fd24b 100644 --- a/modules/reitit-middleware/project.clj +++ b/modules/reitit-middleware/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-middleware "0.5.17" +(defproject metosin/reitit-middleware "0.5.18" :description "Reitit, common middleware bundled" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-pedestal/project.clj b/modules/reitit-pedestal/project.clj index 1fb66b8a..fc2b0ee1 100644 --- a/modules/reitit-pedestal/project.clj +++ b/modules/reitit-pedestal/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-pedestal "0.5.17" +(defproject metosin/reitit-pedestal "0.5.18" :description "Reitit + Pedestal Integration" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-ring/project.clj b/modules/reitit-ring/project.clj index 755df441..64b5cda2 100644 --- a/modules/reitit-ring/project.clj +++ b/modules/reitit-ring/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-ring "0.5.17" +(defproject metosin/reitit-ring "0.5.18" :description "Reitit: Ring routing" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-schema/project.clj b/modules/reitit-schema/project.clj index d9c437d4..de6f0d29 100644 --- a/modules/reitit-schema/project.clj +++ b/modules/reitit-schema/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-schema "0.5.17" +(defproject metosin/reitit-schema "0.5.18" :description "Reitit: Plumatic Schema coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-sieppari/project.clj b/modules/reitit-sieppari/project.clj index 5e3dd416..bab5da48 100644 --- a/modules/reitit-sieppari/project.clj +++ b/modules/reitit-sieppari/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-sieppari "0.5.17" +(defproject metosin/reitit-sieppari "0.5.18" :description "Reitit: Sieppari Interceptors" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-spec/project.clj b/modules/reitit-spec/project.clj index e4db07e7..602cf25c 100644 --- a/modules/reitit-spec/project.clj +++ b/modules/reitit-spec/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-spec "0.5.17" +(defproject metosin/reitit-spec "0.5.18" :description "Reitit: clojure.spec coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger-ui/project.clj b/modules/reitit-swagger-ui/project.clj index 9f30fd34..9086493a 100644 --- a/modules/reitit-swagger-ui/project.clj +++ b/modules/reitit-swagger-ui/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger-ui "0.5.17" +(defproject metosin/reitit-swagger-ui "0.5.18" :description "Reitit: Swagger-ui support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger/project.clj b/modules/reitit-swagger/project.clj index 9034a232..06f59705 100644 --- a/modules/reitit-swagger/project.clj +++ b/modules/reitit-swagger/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger "0.5.17" +(defproject metosin/reitit-swagger "0.5.18" :description "Reitit: Swagger-support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit/project.clj b/modules/reitit/project.clj index 4247c14e..632819e9 100644 --- a/modules/reitit/project.clj +++ b/modules/reitit/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit "0.5.17" +(defproject metosin/reitit "0.5.18" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/project.clj b/project.clj index 2d70dc95..8afdf260 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-parent "0.5.17" +(defproject metosin/reitit-parent "0.5.18" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" @@ -12,21 +12,21 @@ :url "https://github.com/metosin/reitit"} ;; TODO: need to verify that the code actually worked with Java1.8, see #242 :javac-options ["-Xlint:unchecked" "-target" "1.8" "-source" "1.8"] - :managed-dependencies [[metosin/reitit "0.5.17"] - [metosin/reitit-core "0.5.17"] - [metosin/reitit-dev "0.5.17"] - [metosin/reitit-spec "0.5.17"] - [metosin/reitit-malli "0.5.17"] - [metosin/reitit-schema "0.5.17"] - [metosin/reitit-ring "0.5.17"] - [metosin/reitit-middleware "0.5.17"] - [metosin/reitit-http "0.5.17"] - [metosin/reitit-interceptors "0.5.17"] - [metosin/reitit-swagger "0.5.17"] - [metosin/reitit-swagger-ui "0.5.17"] - [metosin/reitit-frontend "0.5.17"] - [metosin/reitit-sieppari "0.5.17"] - [metosin/reitit-pedestal "0.5.17"] + :managed-dependencies [[metosin/reitit "0.5.18"] + [metosin/reitit-core "0.5.18"] + [metosin/reitit-dev "0.5.18"] + [metosin/reitit-spec "0.5.18"] + [metosin/reitit-malli "0.5.18"] + [metosin/reitit-schema "0.5.18"] + [metosin/reitit-ring "0.5.18"] + [metosin/reitit-middleware "0.5.18"] + [metosin/reitit-http "0.5.18"] + [metosin/reitit-interceptors "0.5.18"] + [metosin/reitit-swagger "0.5.18"] + [metosin/reitit-swagger-ui "0.5.18"] + [metosin/reitit-frontend "0.5.18"] + [metosin/reitit-sieppari "0.5.18"] + [metosin/reitit-pedestal "0.5.18"] [metosin/ring-swagger-ui "4.3.0"] [metosin/spec-tools "0.10.5"] [metosin/schema-tools "0.12.3"] From 4e14b1f05e70f315bb05ee9b56c5f74c6f65eff2 Mon Sep 17 00:00:00 2001 From: Peder Refsnes Date: Tue, 19 Jul 2022 22:25:51 +0200 Subject: [PATCH 102/113] Polish pedestal chains when printing context diffs --- .../reitit-interceptors/src/reitit/http/interceptors/dev.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj index 896f99fc..54173d57 100644 --- a/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj +++ b/modules/reitit-interceptors/src/reitit/http/interceptors/dev.clj @@ -20,7 +20,9 @@ (defn- polish [ctx] (-> ctx - (dissoc ::original ::previous :stack :queue) + (dissoc ::original ::previous :stack :queue + :io.pedestal.interceptor.chain/stack + :io.pedestal.interceptor.chain/queue) (update :request dissoc ::r/match ::r/router))) (defn- handle [name stage] From fc73d02e01685bb5582e1b0c2779deb3eb4bb999 Mon Sep 17 00:00:00 2001 From: Paulo Feodrippe Date: Wed, 10 Aug 2022 21:20:35 -0400 Subject: [PATCH 103/113] add `:meta-merge-fn` option --- doc/advanced/configuring_routers.md | 25 ++++---- modules/reitit-core/src/reitit/impl.cljc | 6 +- .../reitit-core/src/reitit/interceptor.cljc | 4 +- .../reitit-core/src/reitit/middleware.cljc | 4 +- modules/reitit-http/src/reitit/http.cljc | 4 +- modules/reitit-ring/src/reitit/ring.cljc | 4 +- test/cljc/reitit/ring_coercion_test.cljc | 58 ++++++++++++++++++- 7 files changed, 81 insertions(+), 24 deletions(-) diff --git a/doc/advanced/configuring_routers.md b/doc/advanced/configuring_routers.md index 4cc30be9..35601c94 100644 --- a/doc/advanced/configuring_routers.md +++ b/doc/advanced/configuring_routers.md @@ -4,15 +4,16 @@ Routers can be configured via options. The following options are available for t | key | description |--------------|------------- -| `:path` | Base-path for routes -| `:routes` | Initial resolved routes (default `[]`) -| `:data` | Initial route data (default `{}`) -| `:spec` | clojure.spec definition for a route data, see `reitit.spec` on how to use this -| `:syntax` | Path-parameter syntax as keyword or set of keywords (default #{:bracket :colon}) -| `:expand` | Function of `arg opts => data` to expand route arg to route data (default `reitit.core/expand`) -| `:coerce` | Function of `route opts => route` to coerce resolved route, can throw or return `nil` -| `:compile` | Function of `route opts => result` to compile a route handler -| `:validate` | Function of `routes opts => ()` to validate route (data) via side-effects -| `:conflicts` | Function of `{route #{route}} => ()` to handle conflicting routes -| `:exception` | Function of `Exception => Exception ` to handle creation time exceptions (default `reitit.exception/exception`) -| `:router` | Function of `routes opts => router` to override the actual router implementation +| `:path` | Base-path for routes +| `:routes` | Initial resolved routes (default `[]`) +| `:data` | Initial route data (default `{}`) +| `:spec` | clojure.spec definition for a route data, see `reitit.spec` on how to use this +| `:syntax` | Path-parameter syntax as keyword or set of keywords (default #{:bracket :colon}) +| `:expand` | Function of `arg opts => data` to expand route arg to route data (default `reitit.core/expand`) +| `:coerce` | Function of `route opts => route` to coerce resolved route, can throw or return `nil` +| `:meta-merge-fn` | Function which follows the signature of `meta-merge.core/meta-merge`, useful for when you want to have more control over the meta merging +| `:compile` | Function of `route opts => result` to compile a route handler +| `:validate` | Function of `routes opts => ()` to validate route (data) via side-effects +| `:conflicts` | Function of `{route #{route}} => ()` to handle conflicting routes +| `:exception` | Function of `Exception => Exception ` to handle creation time exceptions (default `reitit.exception/exception`) +| `:router` | Function of `routes opts => router` to override the actual router implementation diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 03c55e72..0805f8ff 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -60,17 +60,17 @@ (defn map-data [f routes] (mapv (fn [[p ds]] [p (f p ds)]) routes)) -(defn merge-data [p x] +(defn merge-data [{:keys [meta-merge-fn] :as g} p x] (reduce (fn [acc [k v]] (try - (mm/meta-merge acc {k v}) + ((or meta-merge-fn mm/meta-merge) acc {k v}) (catch #?(:clj Exception, :cljs js/Error) e (ex/fail! ::merge-data {:path p, :left acc, :right {k v}, :exception e})))) {} x)) (defn resolve-routes [raw-routes {:keys [coerce] :as opts}] - (cond->> (->> (walk raw-routes opts) (map-data merge-data)) + (cond->> (->> (walk raw-routes opts) (map-data #(merge-data opts %1 %2))) coerce (into [] (keep #(coerce % opts))))) (defn path-conflicting-routes [routes opts] diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index 8d90c2e4..9b544638 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -155,8 +155,8 @@ :handler get-user}]])" ([data] (router data nil)) - ([data opts] - (let [opts (meta-merge {:compile compile-result} opts)] + ([data {:keys [meta-merge-fn] :as opts}] + (let [opts ((or meta-merge-fn meta-merge) {:compile compile-result} opts)] (r/router data opts)))) (defn interceptor-handler [router] diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index 49381b68..58c13f67 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -138,8 +138,8 @@ :handler get-user}]])" ([data] (router data nil)) - ([data opts] - (let [opts (meta-merge {:compile compile-result} opts)] + ([data {:keys [meta-merge-fn] :as opts}] + (let [opts ((or meta-merge-fn meta-merge) {:compile compile-result} opts)] (r/router data opts)))) (defn middleware-handler [router] diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index c85817f8..36e96504 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -14,7 +14,7 @@ (update acc method expand opts) acc)) data ring/http-methods)]) -(defn compile-result [[path data] {:keys [::default-options-endpoint expand] :as opts}] +(defn compile-result [[path data] {:keys [::default-options-endpoint expand meta-merge-fn] :as opts}] (let [[top childs] (ring/group-keys data) childs (cond-> childs (and (not (:options childs)) (not (:handler top)) default-options-endpoint) @@ -38,7 +38,7 @@ (->methods true top) (reduce-kv (fn [acc method data] - (let [data (meta-merge top data)] + (let [data ((or meta-merge-fn meta-merge) top data)] (assoc acc method (->endpoint path data method method)))) (->methods (:handler top) data) childs)))) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 4aceaaf1..0439ab86 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -29,7 +29,7 @@ (update acc method expand opts) acc)) data http-methods)]) -(defn compile-result [[path data] {:keys [::default-options-endpoint expand] :as opts}] +(defn compile-result [[path data] {:keys [::default-options-endpoint expand meta-merge-fn] :as opts}] (let [[top childs] (group-keys data) childs (cond-> childs (and (not (:options childs)) (not (:handler top)) default-options-endpoint) @@ -50,7 +50,7 @@ (->methods true top) (reduce-kv (fn [acc method data] - (let [data (meta-merge top data)] + (let [data ((or meta-merge-fn meta-merge) top data)] (assoc acc method (->endpoint path data method method)))) (->methods (:handler top) data) childs)))) diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index cf4c9092..fb9879bc 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -3,6 +3,9 @@ [malli.experimental.lite :as l] #?@(:clj [[muuntaja.middleware] [jsonista.core :as j]]) + [malli.core :as m] + [malli.util :as mu] + [meta-merge.core :refer [meta-merge]] [reitit.coercion.malli :as malli] [reitit.coercion.schema :as schema] [reitit.coercion.spec :as spec] @@ -208,6 +211,38 @@ (let [{:keys [status]} (app invalid-request2)] (is (= 500 status)))))))) +(defn- custom-meta-merge-checking-schema + ([] {}) + ([left] left) + ([left right] + (cond + (and (map? left) (map? right)) + (merge-with custom-meta-merge-checking-schema left right) + + (and (m/schema? left) + (m/schema? right)) + (mu/merge left right) + + :else + (meta-merge left right))) + ([left right & more] + (reduce custom-meta-merge-checking-schema left (cons right more)))) + +(defn- custom-meta-merge-checking-parameters + ([] {}) + ([left] left) + ([left right] + (if (and (map? left) (map? right) + (contains? left :parameters) + (contains? right :parameters)) + (-> (merge-with custom-meta-merge-checking-parameters left right) + (assoc :parameters (merge-with mu/merge + (:parameters left) + (:parameters right)))) + (meta-merge left right))) + ([left right & more] + (reduce custom-meta-merge-checking-parameters left (cons right more)))) + (deftest malli-coercion-test (let [create (fn [middleware routes] (ring/ring-handler @@ -524,7 +559,28 @@ (is (= {:status 200, :body {:total -4}} (call "application/json" [:int {:encode/json -}])))) (testing "edn encoding (nada)" - (is (= {:status 200, :body {:total +4}} (call "application/edn" [:int {:encode/json -}])))))))) + (is (= {:status 200, :body {:total +4}} (call "application/edn" [:int {:encode/json -}])))))) + + (testing "using custom meta-merge function" + (let [->app (fn [schema-fn meta-merge-fn] + (ring/ring-handler + (ring/router + ["/merging-params/:foo" {:parameters {:path (schema-fn [:map [:foo :string]])}} + ["/:bar" {:parameters {:path (schema-fn [:map [:bar :string]])} + :get {:handler (fn [{{{:keys [foo bar]} :path} :parameters}] + {:status 200 + :body {:total (str "FOO: " foo ", " + "BAR: " bar)}})}}]] + {:data {:middleware [rrc/coerce-request-middleware + rrc/coerce-response-middleware] + :coercion malli/coercion} + :meta-merge-fn meta-merge-fn}))) + call (fn [schema-fn meta-merge-fn] + ((->app schema-fn meta-merge-fn) {:uri "/merging-params/this/that" + :request-method :get}))] + + (is (= {:status 200, :body {:total "FOO: this, BAR: that"}} (call m/schema custom-meta-merge-checking-schema))) + (is (= {:status 200, :body {:total "FOO: this, BAR: that"}} (call identity custom-meta-merge-checking-parameters))))))) #?(:clj (deftest muuntaja-test From c69b4cde3a3516571ab4c9246cc8b8489b149e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20V=C3=A4is=C3=A4nen?= Date: Wed, 12 Oct 2022 13:19:10 +0300 Subject: [PATCH 104/113] Handle empty seq as empty string in `query-string` example: instead of ```clojure (query-string {:nil nil :vec [] :seq-empty '()}) ;; => "nil=&&" ``` now ```clojure (query-string {:nil nil :vec [] :seq-empty '()}) ;; => "nil=&vec=&seq-empty=" ``` --- modules/reitit-core/src/reitit/impl.cljc | 6 +++++- test/cljc/reitit/impl_test.cljc | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 03c55e72..4bce736e 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -249,6 +249,10 @@ (->> params (map (fn [[k v]] (if (or (sequential? v) (set? v)) - (str/join "&" (map query-parameter (repeat k) v)) + (if (seq v) + (str/join "&" (map query-parameter (repeat k) v)) + ;; Empty seq results in single & character in the query string. + ;; Handle as empty string to behave similarly as when the value is nil. + (query-parameter k "")) (query-parameter k v)))) (str/join "&"))) diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 526c140c..119a5fad 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -50,6 +50,8 @@ {"a" "b"} "a=b" {:a 1} "a=1" {:a nil} "a=" + {:a []} "a=" + {:a '()} "a=" {:a :b :c "d"} "a=b&c=d" {:a "b c"} "a=b+c" {:a ["b" "c"]} "a=b&a=c" From 148fa2167b52fed582c9de9b7b3c615653696097 Mon Sep 17 00:00:00 2001 From: Jesse Dowell Date: Sun, 13 Nov 2022 18:54:43 -0500 Subject: [PATCH 105/113] Swagger: support operationId in generated swagger json --- modules/reitit-swagger/src/reitit/swagger.cljc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index 2c71a6d3..daffaff4 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -10,11 +10,12 @@ (s/def ::id (s/or :keyword keyword? :set (s/coll-of keyword? :into #{}))) (s/def ::no-doc boolean?) (s/def ::tags (s/coll-of (s/or :keyword keyword? :string string?) :kind #{})) +(s/def ::operationId string?) (s/def ::summary string?) (s/def ::description string?) (s/def ::swagger (s/keys :opt-un [::id])) -(s/def ::spec (s/keys :opt-un [::swagger ::no-doc ::tags ::summary ::description])) +(s/def ::spec (s/keys :opt-un [::swagger ::no-doc ::tags ::operationId ::summary ::description])) (def swagger-feature "Feature for handling swagger-documentation for routes. @@ -52,6 +53,7 @@ [\"/plus\" {:get {:swagger {:tags \"math\"} + :operationId \"addTwoNumbers\" :summary \"adds numbers together\" :description \"takes `x` and `y` query-params and adds them together\" :parameters {:query {:x int?, :y int?}} @@ -75,7 +77,7 @@ (let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger) ids (trie/into-set id) strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions) - strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description) + strip-endpoint-keys #(dissoc % :id :operationId :parameters :responses :summary :description) swagger (->> (strip-endpoint-keys swagger) (merge {:swagger "2.0" :x-id ids})) @@ -93,7 +95,7 @@ (apply meta-merge (keep (comp :swagger :data) interceptors)) (if coercion (coercion/get-apidocs coercion :swagger data)) - (select-keys data [:tags :summary :description]) + (select-keys data [:tags :operationId :summary :description]) (strip-top-level-keys swagger))])) transform-path (fn [[p _ c]] (if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))] From eebc2a3df07c831ef71fc0672c6efff6f95cef5f Mon Sep 17 00:00:00 2001 From: Ian Fernandez Date: Sun, 4 Dec 2022 00:07:05 +0000 Subject: [PATCH 106/113] Add example for Reitit + Pedestal + Malli coercion --- examples/pedestal-malli-swagger/.gitignore | 11 ++ examples/pedestal-malli-swagger/project.clj | 9 + .../pedestal-malli-swagger/src/server.clj | 164 ++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 examples/pedestal-malli-swagger/.gitignore create mode 100644 examples/pedestal-malli-swagger/project.clj create mode 100644 examples/pedestal-malli-swagger/src/server.clj diff --git a/examples/pedestal-malli-swagger/.gitignore b/examples/pedestal-malli-swagger/.gitignore new file mode 100644 index 00000000..708f60f6 --- /dev/null +++ b/examples/pedestal-malli-swagger/.gitignore @@ -0,0 +1,11 @@ +/target +/classes +/checkouts +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +.hgignore +.hg/ \ No newline at end of file diff --git a/examples/pedestal-malli-swagger/project.clj b/examples/pedestal-malli-swagger/project.clj new file mode 100644 index 00000000..695bd0d3 --- /dev/null +++ b/examples/pedestal-malli-swagger/project.clj @@ -0,0 +1,9 @@ +(defproject pedestal-malli-swagger-example "0.1.0-SNAPSHOT" + :description "Reitit-http with pedestal" + :dependencies [[org.clojure/clojure "1.10.0"] + [io.pedestal/pedestal.service "0.5.5"] + [io.pedestal/pedestal.jetty "0.5.5"] + [metosin/reitit-malli "0.5.18"] + [metosin/reitit-pedestal "0.5.18"] + [metosin/reitit "0.5.18"]] + :repl-options {:init-ns example.server}) diff --git a/examples/pedestal-malli-swagger/src/server.clj b/examples/pedestal-malli-swagger/src/server.clj new file mode 100644 index 00000000..72c93967 --- /dev/null +++ b/examples/pedestal-malli-swagger/src/server.clj @@ -0,0 +1,164 @@ +(ns example.server + (:require [clojure.java.io :as io] + [io.pedestal.http.route] + [reitit.interceptor] + [reitit.dev.pretty :as pretty] + [reitit.coercion.malli] + [io.pedestal.http] + [reitit.ring] + [reitit.ring.malli] + [reitit.http] + [reitit.pedestal] + [reitit.swagger :as swagger] + [reitit.swagger-ui :as swagger-ui] + [reitit.http.coercion :as coercion] + [reitit.http.interceptors.parameters :as parameters] + [reitit.http.interceptors.muuntaja :as muuntaja] + [reitit.http.interceptors.multipart :as multipart] + [muuntaja.core] + [malli.util :as mu])) + +(defn reitit-routes + [_config] + [["/swagger.json" {:get {:no-doc true + :swagger {:info {:title "my-api" + :description "with [malli](https://github.com/metosin/malli) and reitit-ring"} + :tags [{:name "files", + :description "file api"} + {:name "math", + :description "math api"}]} + :handler (swagger/create-swagger-handler)}}] + ["/files" {:swagger {:tags ["files"]}} + ["/upload" + {:post {:summary "upload a file" + :parameters {:multipart [:map [:file reitit.ring.malli/temp-file-part]]} + :responses {200 {:body [:map + [:name string?] + [:size int?]]}} + :handler (fn [{{{{:keys [filename + size]} :file} + :multipart} + :parameters}] + {:status 200 + :body {:name filename + :size size}})}}] + ["/download" {:get {:summary "downloads a file" + :swagger {:produces ["image/png"]} + :handler (fn [_] + {:status 200 + :headers {"Content-Type" "image/png"} + :body (-> "reitit.png" + (io/resource) + (io/input-stream))})}}]] + ["/math" {:swagger {:tags ["math"]}} + ["/plus" + {:get {:summary "plus with malli query parameters" + :parameters {:query [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} + :responses {200 {:body [:map [:total int?]]}} + :handler (fn [{{{:keys [x + y]} + :query} + :parameters}] + {:status 200 + :body {:total (+ x y)}})} + :post {:summary "plus with malli body parameters" + :parameters {:body [:map + [:x + {:title "X parameter" + :description "Description for X parameter" + :json-schema/default 42} + int?] + [:y int?]]} + :responses {200 {:body [:map [:total int?]]}} + :handler (fn [{{{:keys [x + y]} + :body} + :parameters}] + {:status 200 + :body {:total (+ x y)}})}}]]]) + +(defn reitit-ring-routes + [_config] + [(swagger-ui/create-swagger-ui-handler + {:path "/" + :config {:validatorUrl nil + :operationsSorter "alpha"}}) + (reitit.ring/create-resource-handler) + (reitit.ring/create-default-handler)]) + + +(defn reitit-router-config + [_config] + {:exception pretty/exception + :data {:coercion (reitit.coercion.malli/create + {:error-keys #{:coercion + :in + :schema + :value + :errors + :humanized} + :compile mu/closed-schema + :strip-extra-keys true + :default-values true + :options nil}) + :muuntaja muuntaja.core/instance + :interceptors [swagger/swagger-feature + (parameters/parameters-interceptor) + (muuntaja/format-negotiate-interceptor) + (muuntaja/format-response-interceptor) + (muuntaja/format-request-interceptor) + (coercion/coerce-response-interceptor) + (coercion/coerce-request-interceptor) + (multipart/multipart-interceptor)]}}) + +(def config + {:env :dev + :io.pedestal.http/routes [] + :io.pedestal.http/type :jetty + :io.pedestal.http/port 3000 + :io.pedestal.http/join? false + :io.pedestal.http/secure-headers {:content-security-policy-settings + {:default-src "'self'" + :style-src "'self' 'unsafe-inline'" + :script-src "'self' 'unsafe-inline'"}} + ::reitit-routes reitit-routes + ::reitit-ring-routes reitit-ring-routes + ::reitit-router-config reitit-router-config}) + +(defn reitit-http-router + [{::keys [reitit-routes + reitit-ring-routes + reitit-router-config] + :as config}] + (reitit.pedestal/routing-interceptor + (reitit.http/router + (reitit-routes config) + (reitit-router-config config)) + (->> config + reitit-ring-routes + (apply reitit.ring/routes)))) + +(defonce server (atom nil)) + +(defn start + [server + config] + (when @server + (io.pedestal.http/stop @server) + (println "server stopped")) + (-> config + io.pedestal.http/default-interceptors + (reitit.pedestal/replace-last-interceptor (reitit-http-router config)) + io.pedestal.http/dev-interceptors + io.pedestal.http/create-server + io.pedestal.http/start + (->> (reset! server))) + (println "server running in port 3000")) + +#_(start server config) \ No newline at end of file From edee97a5506740b9bf64d067abaf089bfb796cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Vaeng=20R=C3=B8tnes?= Date: Mon, 5 Dec 2022 13:06:27 +0000 Subject: [PATCH 107/113] Rename variable handle -> handler --- modules/reitit-ring/src/reitit/ring.cljc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 4aceaaf1..7eb3b73b 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -56,15 +56,15 @@ childs)))) (def default-options-handler - (let [handle (fn [request] - (let [methods (->> request get-match :result (keep (fn [[k v]] (if v k)))) - allow (->> methods (map (comp str/upper-case name)) (str/join ","))] - {:status 200, :body "", :headers {"Allow" allow}}))] + (let [handler (fn [request] + (let [methods (->> request get-match :result (keep (fn [[k v]] (if v k)))) + allow (->> methods (map (comp str/upper-case name)) (str/join ","))] + {:status 200, :body "", :headers {"Allow" allow}}))] (fn ([request] - (handle request)) + (handler request)) ([request respond _] - (respond (handle request)))))) + (respond (handler request)))))) (def default-options-endpoint {:no-doc true From 544e264ffba9dea9c6b1c0eda8ffb6765386ef92 Mon Sep 17 00:00:00 2001 From: Ian Fernandez Date: Mon, 5 Dec 2022 14:56:56 +0000 Subject: [PATCH 108/113] fix example in project.clj --- examples/pedestal-malli-swagger/project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pedestal-malli-swagger/project.clj b/examples/pedestal-malli-swagger/project.clj index 695bd0d3..694d3beb 100644 --- a/examples/pedestal-malli-swagger/project.clj +++ b/examples/pedestal-malli-swagger/project.clj @@ -6,4 +6,4 @@ [metosin/reitit-malli "0.5.18"] [metosin/reitit-pedestal "0.5.18"] [metosin/reitit "0.5.18"]] - :repl-options {:init-ns example.server}) + :repl-options {:init-ns server}) From bc4443a935836b315cf2a7971b24f37dbca74db9 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:20:48 +0200 Subject: [PATCH 109/113] Remove schema and errors from default malli coercion error keys --- modules/reitit-malli/src/reitit/coercion/malli.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index a57d2641..e7b2607c 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -114,7 +114,7 @@ :response {:default default-transformer-provider :formats {"application/json" json-transformer-provider}}} ;; set of keys to include in error messages - :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} + :error-keys #{:type :coercion :in #_:schema :value #_:errors :humanized #_:transformed} ;; support lite syntax? :lite true ;; schema identity function (default: close all map schemas) From 8398c985956a59197736b5625110d2bf54c13fdc Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:34:13 +0200 Subject: [PATCH 110/113] Add serialize-failed-result coercion option False by default, if true will serialize the failed coercion result in the error message --- modules/reitit-core/src/reitit/coercion.cljc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 0fd5d234..27fe6159 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -41,10 +41,12 @@ :header (->ParameterCoercion :headers :string true true) :path (->ParameterCoercion :path-params :string true true)}) -(defn ^:no-doc request-coercion-failed! [result coercion value in request] +(defn ^:no-doc request-coercion-failed! [result coercion value in request serialize-failed-result] (throw (ex-info - (str "Request coercion failed: " (pr-str result)) + (if serialize-failed-result + (str "Request coercion failed: " (pr-str result)) + "Request coercion failed") (merge (into {} result) {:type ::request-coercion @@ -53,10 +55,12 @@ :in [:request in] :request request})))) -(defn ^:no-doc response-coercion-failed! [result coercion value request response] +(defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result] (throw (ex-info - (str "Response coercion failed: " (pr-str result)) + (if serialize-failed-result + (str "Response coercion failed: " (pr-str result)) + "Response coercion failed") (merge (into {} result) {:type ::response-coercion @@ -70,7 +74,7 @@ (-> request :muuntaja/request :format)) ;; TODO: support faster key walking, walk/keywordize-keys is quite slow... -(defn request-coercer [coercion type model {::keys [extract-request-format parameter-coercion] +(defn request-coercer [coercion type model {::keys [extract-request-format parameter-coercion serialize-failed-result] :or {extract-request-format extract-request-format-default parameter-coercion default-parameter-coercion}}] (if coercion @@ -83,13 +87,13 @@ format (extract-request-format request) result (coercer value format)] (if (error? result) - (request-coercion-failed! result coercion value in request) + (request-coercion-failed! result coercion value in request serialize-failed-result) result)))))))) (defn extract-response-format-default [request _] (-> request :muuntaja/response :format)) -(defn response-coercer [coercion body {:keys [extract-response-format] +(defn response-coercer [coercion body {:keys [extract-response-format serialize-failed-result] :or {extract-response-format extract-response-format-default}}] (if coercion (if-let [coercer (-response-coercer coercion body)] @@ -98,7 +102,7 @@ value (:body response) result (coercer value format)] (if (error? result) - (response-coercion-failed! result coercion value request response) + (response-coercion-failed! result coercion value request response serialize-failed-result) result)))))) (defn encode-error [data] From 24f38e0dfa24998c8f6dce98db886c010b307d47 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:35:26 +0200 Subject: [PATCH 111/113] Unroll merge and hash-map coercion --- modules/reitit-core/src/reitit/coercion.cljc | 34 +++++++++++--------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 27fe6159..4436214c 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -47,13 +47,15 @@ (if serialize-failed-result (str "Request coercion failed: " (pr-str result)) "Request coercion failed") - (merge - (into {} result) - {:type ::request-coercion - :coercion coercion - :value value - :in [:request in] - :request request})))) + (-> {} + transient + (as-> $ (reduce conj! $ result)) + (assoc! :type ::request-coercion) + (assoc! :coercion coercion) + (assoc! :value value) + (assoc! :in [:request in]) + (assoc! :request request) + persistent!)))) (defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result] (throw @@ -61,14 +63,16 @@ (if serialize-failed-result (str "Response coercion failed: " (pr-str result)) "Response coercion failed") - (merge - (into {} result) - {:type ::response-coercion - :coercion coercion - :value value - :in [:response :body] - :request request - :response response})))) + (-> {} + transient + (as-> $ (reduce conj! $ result)) + (assoc! :type ::response-coercion) + (assoc! :coercion coercion) + (assoc! :value value) + (assoc! :in [:response :body]) + (assoc! :request request) + (assoc! :response response) + persistent!)))) (defn extract-request-format-default [request] (-> request :muuntaja/request :format)) From 7e05f4931e48539a80250ad68d03737d18890937 Mon Sep 17 00:00:00 2001 From: Devin Walters Date: Sat, 17 Dec 2022 16:00:04 -0600 Subject: [PATCH 112/113] Upgrade jackson for CVE-2022-42003 and CVE-2022-42004 --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 8afdf260..edfe3e1b 100644 --- a/project.clj +++ b/project.clj @@ -36,8 +36,8 @@ [metosin/malli "0.8.2"] ;; https://clojureverse.org/t/depending-on-the-right-versions-of-jackson-libraries/5111 - [com.fasterxml.jackson.core/jackson-core "2.13.2"] - [com.fasterxml.jackson.core/jackson-databind "2.13.2.2"] + [com.fasterxml.jackson.core/jackson-core "2.14.1"] + [com.fasterxml.jackson.core/jackson-databind "2.14.1"] [meta-merge "1.0.0"] [fipp "0.6.25" :exclusions [org.clojure/core.rrb-vector]] From ffe8846de106dd2b6bbdb892bdecb99eb0c228c2 Mon Sep 17 00:00:00 2001 From: David Harrigan Date: Sun, 18 Dec 2022 07:09:30 +0000 Subject: [PATCH 113/113] Update documentation and link to the startrek project -=david=- --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 933b7be2..ce40a746 100644 --- a/README.md +++ b/README.md @@ -153,9 +153,13 @@ All examples are in https://github.com/metosin/reitit/tree/master/examples ## External resources * Simple web application using Ring/Reitit and Integrant: https://github.com/PrestanceDesign/usermanager-reitit-integrant-example -* A simple [ClojureScript](https://clojurescript.org/) frontend and Clojure backend using Reitit, [JUXT Clip](https://github.com/juxt/clip), [next.jdbc](https://github.com/seancorfield/next-jdbc) and other bits and bobs... - * [startrek](https://git.sr.ht/~dharrigan/startrek) - * [startrek-ui](https://git.sr.ht/~dharrigan/startrek-ui) +* A simple Clojure backend using Reitit to serve up a RESTful API: [startrek](https://github.com/dharrigan/startrek). Technologies include: + * [Donut System](https://github.com/donut-party/system) + * [next-jdbc](https://github.com/seancorfield/next-jdbc) + * [JUXT Clip](https://github.com/juxt/clip) + * [Flyway](https://github.com/flyway/flyway) + * [HoneySQL](https://github.com/seancorfield/honeysql) + * [Babashka](https://babashka.org) * https://www.learnreitit.com/ * Lipas, liikuntapalvelut: https://github.com/lipas-liikuntapaikat/lipas * Implementation of the Todo-Backend API spec, using Clojure, Ring/Reitit and next-jdbc: https://github.com/PrestanceDesign/todo-backend-clojure-reitit