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/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}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {}))
|
||||||
|
|
|
||||||
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
|
(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)")))))
|
||||||
|
|
|
||||||
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