added schema & use separated resolver & includer component.

This commit is contained in:
jem 2018-05-16 18:41:54 +02:00
parent 464e9af7d6
commit 9607657cc1
5 changed files with 89 additions and 11 deletions

View file

@ -30,7 +30,8 @@
[ring/ring-anti-forgery "1.1.0"] [ring/ring-anti-forgery "1.1.0"]
[ring-server "0.4.0"] [ring-server "0.4.0"]
[selmer "1.11.0"] [selmer "1.11.0"]
[com.stuartsierra/component "0.3.2"]] [com.stuartsierra/component "0.3.2"]
[prismatic/schema "1.1.9"]]
:repl-options {:init-ns smeagol.repl} :repl-options {:init-ns smeagol.repl}

View file

@ -1,11 +1,26 @@
(ns smeagol.include (ns smeagol.include
(:require (:require
[com.stuartsierra.component :as component])) [schema.core :as s]
[com.stuartsierra.component :as component]
[smeagol.include.resolver :as resolver]))
(defrecord Resolver [resolver-fn]) (s/defrecord Includer
[resolver])
(defn new-resolver [resolver-fn] (defprotocol IncludeMd
(map->Resolver {:resolver-fn resolver-fn})) (expand-include-md
[includer md-src]
"return a markfown file content for given uri."))
(defn resolve-include [resolver uri] (extend-type Includer
(apply (:resolver-fn resolver) [uri])) IncludeMd
(expand-include-md [includer md-src]
;parse md-src
;resolve found includes
;indent & integrate
md-src))
(s/defn
new-includer
[]
(map->Includer {}))

View file

@ -0,0 +1,38 @@
(ns smeagol.include.resolver
(:require
[schema.core :as s]
[com.stuartsierra.component :as component]))
(s/defrecord Resolver
[type :- s/Keyword])
;As schema does'nt support s/defprotocol we use the dispatcher for annotation & validation.
(s/defn dispatch-by-resolver-type :- s/Keyword
"Dispatcher for different resolver implementations."
[resolver :- Resolver
uri :- s/Str]
(:type resolver))
(defmulti do-resolve-md
"Multimethod return a markfown file content for given uri."
dispatch-by-resolver-type)
(s/defmethod do-resolve-md :default
[resolver :- Resolver
uri :- s/Str]
(throw (Exception. (str "No implementation for " resolver))))
(defprotocol ResolveMd
(resolve-md
[resolver uri]
"return a markfown file content for given uru."))
(extend-type Resolver
ResolveMd
(resolve-md [resolver uri]
(s/validate s/Str uri)
(s/validate s/Str (do-resolve-md resolver uri))))
(s/defn
new-resolver
[type :- s/Keyword]
(map->Resolver {:type type}))

View file

@ -1,16 +1,32 @@
(ns smeagol.test.include (ns smeagol.test.include
(:require [clojure.test :refer :all] (:require [clojure.test :refer :all]
[schema.core :as s]
[com.stuartsierra.component :as component] [com.stuartsierra.component :as component]
[smeagol.include.resolver :as resolver]
[smeagol.include :as sut])) [smeagol.include :as sut]))
(defn test-include-resolver [uri] (s/defmethod resolver/do-resolve-md :test-mock
[resolver
uri :- s/Str]
(cond (cond
(= uri "./simple.md") "Simple content.")) (= uri "./simple.md") "Simple content."))
(def system-under-test (def system-under-test
(component/system-map (component/system-map
:resolver (sut/new-resolver test-include-resolver))) :resolver (resolver/new-resolver :test-mock)
:includer (component/using
(sut/new-includer)
{:resolver :resolver})))
(deftest test-local-links (deftest test-expand-include-md
(testing "Rewriting of local links" (testing "Rewriting of local links"
(is (= "Simple content." (sut/resolve-include (:resolver system-under-test) "./simple.md"))))) (is
(= "# Heading"
(sut/expand-include-md (:includer system-under-test) "# Heading")))
(is
(= "# Heading 1
Simple content."
(sut/expand-include-md
(:includer system-under-test)
"# Heading1
#[](.simple.md)")))))

View file

@ -0,0 +1,8 @@
(ns smeagol.test.include.resolver
(:require [clojure.test :refer :all]
[smeagol.include.resolver :as sut]))
(deftest test-local-links
(testing "Rewriting of local links"
(is (thrown? Exception
(sut/resolve-md (sut/new-resolver (:default)) "./some-uri.md")))))