Implement public compound artifact interface

This commit is contained in:
HiPhish 2022-10-01 01:03:47 +02:00
parent 8523d63f6c
commit 903f81fb82
6 changed files with 89 additions and 20 deletions

View file

@ -59,4 +59,6 @@
(:file "template") (:file "template")
(:file "reader") (:file "reader")
(:module "readers" (:module "readers"
:components ((:file "lisp"))))))))) :components ((:file "lisp")))
(:module "artifacts"
:components ((:file "compound")))))))))

View file

@ -48,7 +48,7 @@
:documentation "Base template to apply to all pages") :documentation "Base template to apply to all pages")
(initial :initarg :initial :initform '() :type list (initial :initarg :initial :initform '() :type list
:documentation "Initial metadata for all pages.") :documentation "Initial metadata for all pages.")
(static :initform (make-instance 'hssg:compound-artifact) (static :initform (hssg:make-compound-artifact)
:documentation "Static files which will be added to the blog verbatim.")) :documentation "Static files which will be added to the blog verbatim."))
(:documentation "Artifact which represents an entire blog.")) (:documentation "Artifact which represents an entire blog."))

View file

@ -118,13 +118,11 @@
(with-slots ((static hssg.blog.artifacts:static) (with-slots ((static hssg.blog.artifacts:static)
(output-dir hssg.blog.artifacts:output)) (output-dir hssg.blog.artifacts:output))
blog blog
(with-slots ((artifacts hssg:artifacts)) (let ((artifact (hssg:make-directory-artifact
static
(let ((artifact (hssg:make-directory-artifact
pathname pathname
input-dir input-dir
output-dir))) output-dir)))
(push artifact artifacts))))) (hssg:compound-artifact-push static artifact))))
(defmethod push-post ((period hssg.blog.period:day-period) post) (defmethod push-post ((period hssg.blog.period:day-period) post)
(with-slots ((posts hssg.blog.period:posts)) period (with-slots ((posts hssg.blog.period:posts)) period

View file

@ -17,10 +17,22 @@
;;;; ;;;;
;;;; You should have received a copy of the GNU Affero General Public License ;;;; You should have received a copy of the GNU Affero General Public License
;;;; along with CL-HSSG If not, see <https://www.gnu.org/licenses/>.(in-package #:hssg.artifact) ;;;; along with CL-HSSG If not, see <https://www.gnu.org/licenses/>.(in-package #:hssg.artifact)
(in-package #:hssg.artifact) (in-package #:hssg.artifact._compound)
(defmethod write-artifact ((wrapper compound-artifact)) (defmethod hssg.artifact:write-artifact ((wrapper hssg.artifact:compound-artifact))
"Writes each of the artifacts inside the WRAPPER individually." "Writes each of the artifacts inside the WRAPPER individually."
(with-slots ((artifacts hssg.artifact::artifacts)) wrapper (dolist (artifact (slot-value wrapper 'hssg.artifact:artifacts))
(dolist (artifact artifacts) (hssg.artifact:write-artifact artifact)))
(write-artifact artifact))))
(defun make-compound-artifact (&rest artifacts)
"Create a new compound artifact, which is a wrapper around the given
ARTIFACTS. Writing a compound artifact writes all the wrapped artifact in the
same order that was given as argument."
(make-instance 'hssg.artifact:compound-artifact :artifacts artifacts))
(defun compound-artifact-push (compound artifact)
"Push ARTIFACT to the beginning of the list or artifacts of the COMPOUND
artifact. This mutates COMPOUND in-place."
(with-slots ((artifacts hssg.artifact:artifacts))
compound
(push artifact artifacts)))

View file

@ -27,7 +27,18 @@
(:documentation "Helper package, defines the artifact protocl.") (:documentation "Helper package, defines the artifact protocl.")
(:use #:cl) (:use #:cl)
(:export write-artifact artifacts (:export write-artifact artifacts
verbatim-artifact compound-artifact directory-artifact html-artifact xml-artifact)) compound-artifact verbatim-artifact directory-artifact html-artifact xml-artifact))
;;; ---------------------------------------------------------------------------
(defpackage #:hssg.artifact._compound
(:documentation "Implementatio of compound HSSG artifacts.")
(:use :cl)
(:export make-compound-artifact compound-artifact-push))
(defpackage #:hssg.artifact.directory
(:documentation "Helper package, contains verbatim artifacts")
(:use #:cl)
(:export make-directory-artifact))
(defpackage #:hssg.artifact.html (defpackage #:hssg.artifact.html
(:documentation "Implementaion of HTML artifacts.") (:documentation "Implementaion of HTML artifacts.")
@ -44,11 +55,6 @@
(:use #:cl) (:use #:cl)
(:export make-verbatim-artifact)) (:export make-verbatim-artifact))
(defpackage #:hssg.artifact.directory
(:documentation "Helper package, contains verbatim artifacts")
(:use #:cl)
(:export make-directory-artifact))
(defpackage #:hssg.template (defpackage #:hssg.template
(:documentation "HTML template macros; templates transform SHTML aslists.") (:documentation "HTML template macros; templates transform SHTML aslists.")
(:use #:cl) (:use #:cl)
@ -58,15 +64,20 @@
(defpackage #:hssg (defpackage #:hssg
(:documentation "The hackable static site generator") (:documentation "The hackable static site generator")
(:use #:cl) (:use #:cl)
(:import-from #:hssg.artifact write-artifact compound-artifact artifacts html-artifact xml-artifact ) (:import-from #:hssg.artifact write-artifact artifacts html-artifact xml-artifact )
(:import-from #:hssg.artifact.verbatim make-verbatim-artifact) (:import-from #:hssg.artifact._compound make-compound-artifact compound-artifact-push)
(:import-from #:hssg.artifact.directory make-directory-artifact) (:import-from #:hssg.artifact.directory make-directory-artifact)
(:import-from #:hssg.artifact.verbatim make-verbatim-artifact)
(:import-from #:hssg.artifact.html static-page read-html-lisp) (:import-from #:hssg.artifact.html static-page read-html-lisp)
(:import-from #:hssg.template deftemplate template let-metadata apply-template identity-template (:import-from #:hssg.template deftemplate template let-metadata apply-template identity-template
chain-templates template-with-data) chain-templates template-with-data)
(:export (:export
*site-url* *site-language* *site-url* *site-language*
write-artifact compound-artifact artifacts ;; Artifact protocol
write-artifact
;; Compound artifacts
make-compound-artifact compound-artifact-push
html-artifact xml-artifact static-page read-html-lisp html-artifact xml-artifact static-page read-html-lisp
make-verbatim-artifact make-directory-artifact make-verbatim-artifact make-directory-artifact
deftemplate template let-metadata apply-template identity-template chain-templates template-with-data)) deftemplate template let-metadata apply-template identity-template chain-templates template-with-data))

View file

@ -0,0 +1,46 @@
(defpackage #:hssg/test/artifact/compound
(:use #:cl))
(in-package #:hssg/test/artifact/compound)
(fiveam:def-suite hssg/artifact/compound
:description "Compound artifact implementation tests")
(fiveam:in-suite hssg/artifact/compound)
;;; ---------------------------------------------------------------------------
(defstruct counter
"A mutable counter to keep track of how often the dummy artifact has been
written."
(count 0))
(defclass dummy-artifact ()
((counter :initarg :counter :accessor dummy-counter
:documentation "A (possibly shared) counter instance"))
(:documentation "A fake artifact which increments its counter"))
(defmethod hssg:write-artifact ((dummy dummy-artifact))
(incf (counter-count (dummy-counter dummy)))
:ok)
;;; ---------------------------------------------------------------------------
(fiveam:test create-and-write
"Writing a compound artifacts writes all all of its artifacts"
(let ((counter (make-counter)))
(let ((artifact (hssg:make-compound-artifact
(make-instance 'dummy-artifact :counter counter)
(make-instance 'dummy-artifact :counter counter)
(make-instance 'dummy-artifact :counter counter))))
(hssg:write-artifact artifact))
(fiveam:is (= 3 (counter-count counter)))))
(fiveam:test push-artifact
"Push a new artifact onto the list of wrapped artifacts"
(let ((counter (make-counter)))
(let ((compound (hssg:make-compound-artifact))
(dummy1 (make-instance 'dummy-artifact :counter counter))
(dummy2 (make-instance 'dummy-artifact :counter counter)))
(hssg:compound-artifact-push compound dummy1)
(hssg:compound-artifact-push compound dummy2)
(hssg:write-artifact compound))
(fiveam:is (= 2 (counter-count counter)))))