mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
added schema & use separated resolver & includer component.
This commit is contained in:
parent
464e9af7d6
commit
9607657cc1
5 changed files with 89 additions and 11 deletions
|
|
@ -30,7 +30,8 @@
|
|||
[ring/ring-anti-forgery "1.1.0"]
|
||||
[ring-server "0.4.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}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,26 @@
|
|||
(ns smeagol.include
|
||||
(: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]
|
||||
(map->Resolver {:resolver-fn resolver-fn}))
|
||||
(defprotocol IncludeMd
|
||||
(expand-include-md
|
||||
[includer md-src]
|
||||
"return a markfown file content for given uri."))
|
||||
|
||||
(defn resolve-include [resolver uri]
|
||||
(apply (:resolver-fn resolver) [uri]))
|
||||
(extend-type Includer
|
||||
IncludeMd
|
||||
(expand-include-md [includer md-src]
|
||||
;parse md-src
|
||||
;resolve found includes
|
||||
;indent & integrate
|
||||
md-src))
|
||||
|
||||
(s/defn
|
||||
new-includer
|
||||
[]
|
||||
(map->Includer {}))
|
||||
|
|
|
|||
38
src/smeagol/include/resolver.clj
Normal file
38
src/smeagol/include/resolver.clj
Normal 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}))
|
||||
|
|
@ -1,16 +1,32 @@
|
|||
(ns smeagol.test.include
|
||||
(:require [clojure.test :refer :all]
|
||||
[schema.core :as s]
|
||||
[com.stuartsierra.component :as component]
|
||||
[smeagol.include.resolver :as resolver]
|
||||
[smeagol.include :as sut]))
|
||||
|
||||
(defn test-include-resolver [uri]
|
||||
(s/defmethod resolver/do-resolve-md :test-mock
|
||||
[resolver
|
||||
uri :- s/Str]
|
||||
(cond
|
||||
(= uri "./simple.md") "Simple content."))
|
||||
|
||||
(def system-under-test
|
||||
(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"
|
||||
(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)")))))
|
||||
|
|
|
|||
8
test/smeagol/test/include/resolver.clj
Normal file
8
test/smeagol/test/include/resolver.clj
Normal 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")))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue