From 9cd303d317587e031c19b6e2702637b7c1629e4e Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Mon, 15 May 2023 18:31:46 +0200 Subject: [PATCH] Introduced TaskInput and TaskOutput interfaces. --- TODO.md | 9 ++++-- .../ssg/html/AbstractHtmlTask.groovy | 31 +++++++++++++------ .../jessebrault/ssg/html/HtmlOutput.groovy | 7 +++++ .../com/jessebrault/ssg/html/HtmlTask.groovy | 7 ++++- .../ssg/html/ModelToHtmlTask.groovy | 14 ++++++--- .../ssg/html/PageToHtmlTask.groovy | 14 ++++++--- .../ssg/html/SimpleHtmlOutput.groovy | 15 +++++++++ .../ssg/html/TextToHtmlTask.groovy | 14 ++++++--- .../jessebrault/ssg/model/ModelInput.groovy | 14 +++++++++ .../com/jessebrault/ssg/page/PageInput.groovy | 14 +++++++++ .../jessebrault/ssg/task/FileOutput.groovy | 5 +++ .../com/jessebrault/ssg/task/TaskInput.groovy | 5 +++ .../jessebrault/ssg/task/TaskOutput.groovy | 5 +++ .../com/jessebrault/ssg/text/TextInput.groovy | 14 +++++++++ .../ssg/buildscript/TestHtmlTask.groovy | 14 ++++++++- .../ssg/dsl/StandardDslConsumerTests.groovy | 24 +++++++++++++- 16 files changed, 178 insertions(+), 28 deletions(-) create mode 100644 api/src/main/groovy/com/jessebrault/ssg/html/HtmlOutput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/html/SimpleHtmlOutput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/model/ModelInput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/page/PageInput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/task/FileOutput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/task/TaskInput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/task/TaskOutput.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/text/TextInput.groovy diff --git a/TODO.md b/TODO.md index 14ec1ab..7bcae11 100644 --- a/TODO.md +++ b/TODO.md @@ -6,7 +6,6 @@ Here will be kept all of the various todos for this project, organized by releas ### Add - [ ] Plan out plugin system such that we can create custom providers of texts, data, etc. -- [ ] Provide a way to override `ssgBuilds` variables from the cli. - [ ] Add `Watchable` interface/trait back; an abstraction over FS watching and other sources (such as a database, etc.). - [ ] Explore `apply(Plugin)` in buildScripts. @@ -17,19 +16,23 @@ Here will be kept all of the various todos for this project, organized by releas ### Add - [ ] Write manual. - [x] Remove `lib` module. -- [ ] Add a way for CLI to choose a build to do, or multiple builds, defaulting to 'default' if it exists. -- [ ] Write lots of tests for buildscript dsl, etc. +- [x] Add a way for CLI to choose a build to do, or multiple builds, defaulting to 'default' if it exists. + - [ ] Still must work on 'default'-ing. +- [x] Write lots of tests for buildscript dsl, etc. - [x] Explore `base` in buildScript dsl. - Get rid of `allBuilds` concept, and replace it with composable/concat-able builds. In the dsl we could have a notion of `abstractBuild` which can be 'extended' (i.e., on the left side of a concat operation) but not actually run (since it doesn't have a name). - `OutputDir` should be concat-able, such that the left is the *base* for the right. - `OutputDirFunctions.concat` should be concat-able as well, such that both are `BiFunction`, and the output of the left is the input of the right. - Make the delegates as dumb as possible; no more `getResult` methods; make different classes/object handle concat'ing and getting results. +- [x] Provide a way to override `ssgBuilds` variables from the cli. ### Fix - [ ] Update CHANGELOG to reflect the gsp-dsl changes. - [ ] `taskTypes` gone, use class name instead - [ ] introduction of `models` - [x] Change most instances of `Closure` to `Closure` to help with IDE expectations. +- [ ] Fix auto-imports in build script so we don't need to import things. +- [ ] Re-introduce input/output concept to tasks, if possible ## Finished diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/AbstractHtmlTask.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/AbstractHtmlTask.groovy index cadedda..10f07f0 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/html/AbstractHtmlTask.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/html/AbstractHtmlTask.groovy @@ -2,6 +2,7 @@ package com.jessebrault.ssg.html import com.jessebrault.ssg.task.AbstractTask import com.jessebrault.ssg.task.Task +import com.jessebrault.ssg.task.TaskInput import com.jessebrault.ssg.util.Diagnostic import com.jessebrault.ssg.util.Result import groovy.transform.EqualsAndHashCode @@ -10,15 +11,26 @@ import org.jsoup.Jsoup @NullCheck @EqualsAndHashCode -abstract class AbstractHtmlTask extends AbstractTask implements HtmlTask { +abstract class AbstractHtmlTask extends AbstractTask implements HtmlTask { - final String path - private final File buildDir + final String htmlPath + final I input + final HtmlOutput output - AbstractHtmlTask(String name, String path, File buildDir) { + AbstractHtmlTask( + String name, + String htmlPath, + I input, + File buildDir + ) { super(name) - this.path = path - this.buildDir = buildDir + this.htmlPath = htmlPath + this.input = input + this.output = new SimpleHtmlOutput( + "htmlOutput:${ htmlPath }", + new File(buildDir, htmlPath), + htmlPath + ) } protected abstract Result transform(Collection allTasks) @@ -33,16 +45,15 @@ abstract class AbstractHtmlTask extends AbstractTask implements HtmlTask { def document = Jsoup.parse(content) document.outputSettings().indentAmount(4) def formatted = document.toString() - def target = new File(this.buildDir, this.path) - target.createParentDirectories() - target.write(formatted) + this.output.file.createParentDirectories() + this.output.file.write(formatted) [] } } @Override String toString() { - "AbstractHtmlTask(path: ${ this.path }, super: ${ super.toString() })" + "AbstractHtmlTask(path: ${ this.htmlPath }, super: ${ super.toString() })" } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/HtmlOutput.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/HtmlOutput.groovy new file mode 100644 index 0000000..4fa1b30 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/html/HtmlOutput.groovy @@ -0,0 +1,7 @@ +package com.jessebrault.ssg.html + +import com.jessebrault.ssg.task.FileOutput + +interface HtmlOutput extends FileOutput { + String getHtmlPath() +} \ No newline at end of file diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/HtmlTask.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/HtmlTask.groovy index 6e217ae..9486cb2 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/html/HtmlTask.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/html/HtmlTask.groovy @@ -1,7 +1,12 @@ package com.jessebrault.ssg.html import com.jessebrault.ssg.task.Task +import com.jessebrault.ssg.task.TaskInput interface HtmlTask extends Task { - String getPath() + @Deprecated + String getHtmlPath() + + TaskInput getInput() + HtmlOutput getOutput() } \ No newline at end of file diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/ModelToHtmlTask.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/ModelToHtmlTask.groovy index 22d8b24..e170b9f 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/html/ModelToHtmlTask.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/html/ModelToHtmlTask.groovy @@ -2,6 +2,7 @@ package com.jessebrault.ssg.html import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.model.Model +import com.jessebrault.ssg.model.ModelInput import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.render.RenderContext import com.jessebrault.ssg.task.Task @@ -14,7 +15,7 @@ import groovy.transform.NullCheck @NullCheck @EqualsAndHashCode -final class ModelToHtmlTask extends AbstractHtmlTask { +final class ModelToHtmlTask extends AbstractHtmlTask> { private final SiteSpec siteSpec private final Map globals @@ -25,7 +26,7 @@ final class ModelToHtmlTask extends AbstractHtmlTask { private final Collection allParts ModelToHtmlTask( - String path, + String relativeHtmlPath, TaskSpec taskSpec, Model model, Template template, @@ -33,7 +34,12 @@ final class ModelToHtmlTask extends AbstractHtmlTask { Collection> allModels, Collection allParts ) { - super("modelToHtml:${ path }", path, taskSpec.outputDir) + super( + "modelToHtml:${ relativeHtmlPath }", + relativeHtmlPath, + new ModelInput<>(model.name, model), + taskSpec.outputDir + ) this.siteSpec = taskSpec.siteSpec this.globals = taskSpec.globals this.model = model @@ -47,7 +53,7 @@ final class ModelToHtmlTask extends AbstractHtmlTask { protected Result transform(Collection allTasks) { this.template.type.renderer.render(this.template, null, new RenderContext( sourcePath: this.model.name, - targetPath: this.path, + targetPath: this.htmlPath, tasks: allTasks, texts: this.allTexts, models: this.allModels, diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/PageToHtmlTask.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/PageToHtmlTask.groovy index 72eb340..da99946 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/html/PageToHtmlTask.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/html/PageToHtmlTask.groovy @@ -3,6 +3,7 @@ package com.jessebrault.ssg.html import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.model.Model import com.jessebrault.ssg.page.Page +import com.jessebrault.ssg.page.PageInput import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.render.RenderContext import com.jessebrault.ssg.task.Task @@ -14,7 +15,7 @@ import groovy.transform.NullCheck @NullCheck @EqualsAndHashCode(includeFields = true, callSuper = true) -final class PageToHtmlTask extends AbstractHtmlTask { +final class PageToHtmlTask extends AbstractHtmlTask { private final SiteSpec siteSpec private final Map globals @@ -24,14 +25,19 @@ final class PageToHtmlTask extends AbstractHtmlTask { private final Collection allParts PageToHtmlTask( - String path, + String relativeHtmlPath, TaskSpec taskSpec, Page page, Collection allTexts, Collection> allModels, Collection allParts ) { - super("pageToHtml:${ path }", path, taskSpec.outputDir) + super( + "pageToHtml:${ relativeHtmlPath }", + relativeHtmlPath, + new PageInput(page.path, page), + taskSpec.outputDir + ) this.siteSpec = taskSpec.siteSpec this.globals = taskSpec.globals this.page = page @@ -44,7 +50,7 @@ final class PageToHtmlTask extends AbstractHtmlTask { protected Result transform(Collection allTasks) { this.page.type.renderer.render(this.page, new RenderContext( this.page.path, - this.path, + this.htmlPath, allTasks, this.allTexts, this.allModels, diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/SimpleHtmlOutput.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/SimpleHtmlOutput.groovy new file mode 100644 index 0000000..235df51 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/html/SimpleHtmlOutput.groovy @@ -0,0 +1,15 @@ +package com.jessebrault.ssg.html + +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.PackageScope +import groovy.transform.TupleConstructor + +@TupleConstructor(defaults = false) +@NullCheck(includeGenerated = true) +@EqualsAndHashCode +final class SimpleHtmlOutput implements HtmlOutput { + final String name + final File file + final String htmlPath +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/html/TextToHtmlTask.groovy b/api/src/main/groovy/com/jessebrault/ssg/html/TextToHtmlTask.groovy index 075a614..fe36d26 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/html/TextToHtmlTask.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/html/TextToHtmlTask.groovy @@ -8,13 +8,14 @@ import com.jessebrault.ssg.task.Task import com.jessebrault.ssg.task.TaskSpec import com.jessebrault.ssg.template.Template import com.jessebrault.ssg.text.Text +import com.jessebrault.ssg.text.TextInput import com.jessebrault.ssg.util.Result import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck @NullCheck @EqualsAndHashCode(includeFields = true, callSuper = true) -final class TextToHtmlTask extends AbstractHtmlTask { +final class TextToHtmlTask extends AbstractHtmlTask { private final SiteSpec siteSpec private final Map globals @@ -25,7 +26,7 @@ final class TextToHtmlTask extends AbstractHtmlTask { private final Collection allParts TextToHtmlTask( - String path, + String relativeHtmlPath, TaskSpec taskSpec, Text text, Template template, @@ -33,7 +34,12 @@ final class TextToHtmlTask extends AbstractHtmlTask { Collection> allModels, Collection allParts ) { - super("textToHtml:${ path }", path, taskSpec.outputDir) + super( + "textToHtml:${ relativeHtmlPath }", + relativeHtmlPath, + new TextInput(text.path, text), + taskSpec.outputDir + ) this.siteSpec = taskSpec.siteSpec this.globals = taskSpec.globals this.text = text @@ -47,7 +53,7 @@ final class TextToHtmlTask extends AbstractHtmlTask { protected Result transform(Collection allTasks) { this.template.type.renderer.render(this.template, this.text, new RenderContext( this.text.path, - this.path, + this.htmlPath, allTasks, this.allTexts, this.allModels, diff --git a/api/src/main/groovy/com/jessebrault/ssg/model/ModelInput.groovy b/api/src/main/groovy/com/jessebrault/ssg/model/ModelInput.groovy new file mode 100644 index 0000000..d3edae6 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/model/ModelInput.groovy @@ -0,0 +1,14 @@ +package com.jessebrault.ssg.model + +import com.jessebrault.ssg.task.TaskInput +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.TupleConstructor + +@TupleConstructor(defaults = false) +@NullCheck(includeGenerated = true) +@EqualsAndHashCode +final class ModelInput implements TaskInput { + final String name + final Model model +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/PageInput.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/PageInput.groovy new file mode 100644 index 0000000..7694d28 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/page/PageInput.groovy @@ -0,0 +1,14 @@ +package com.jessebrault.ssg.page + +import com.jessebrault.ssg.task.TaskInput +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.TupleConstructor + +@TupleConstructor(defaults = false) +@NullCheck(includeGenerated = true) +@EqualsAndHashCode +final class PageInput implements TaskInput { + final String name + final Page page +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/task/FileOutput.groovy b/api/src/main/groovy/com/jessebrault/ssg/task/FileOutput.groovy new file mode 100644 index 0000000..3c3ece0 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/task/FileOutput.groovy @@ -0,0 +1,5 @@ +package com.jessebrault.ssg.task + +interface FileOutput extends TaskOutput { + File getFile() +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/task/TaskInput.groovy b/api/src/main/groovy/com/jessebrault/ssg/task/TaskInput.groovy new file mode 100644 index 0000000..c699393 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/task/TaskInput.groovy @@ -0,0 +1,5 @@ +package com.jessebrault.ssg.task + +interface TaskInput { + String getName() +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/task/TaskOutput.groovy b/api/src/main/groovy/com/jessebrault/ssg/task/TaskOutput.groovy new file mode 100644 index 0000000..73a0e6a --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/task/TaskOutput.groovy @@ -0,0 +1,5 @@ +package com.jessebrault.ssg.task + +interface TaskOutput { + String getName() +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/text/TextInput.groovy b/api/src/main/groovy/com/jessebrault/ssg/text/TextInput.groovy new file mode 100644 index 0000000..bc80373 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/text/TextInput.groovy @@ -0,0 +1,14 @@ +package com.jessebrault.ssg.text + +import com.jessebrault.ssg.task.TaskInput +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.TupleConstructor + +@TupleConstructor(defaults = false) +@NullCheck(includeGenerated = true) +@EqualsAndHashCode +final class TextInput implements TaskInput { + final String name + final Text text +} diff --git a/api/src/test/resources/com/jessebrault/ssg/buildscript/TestHtmlTask.groovy b/api/src/test/resources/com/jessebrault/ssg/buildscript/TestHtmlTask.groovy index c0d75af..a548d9d 100644 --- a/api/src/test/resources/com/jessebrault/ssg/buildscript/TestHtmlTask.groovy +++ b/api/src/test/resources/com/jessebrault/ssg/buildscript/TestHtmlTask.groovy @@ -1,11 +1,13 @@ +import com.jessebrault.ssg.html.HtmlOutput import com.jessebrault.ssg.html.HtmlTask import com.jessebrault.ssg.task.Task +import com.jessebrault.ssg.task.TaskInput import com.jessebrault.ssg.util.Diagnostic final class TestHtmlTask implements HtmlTask { @Override - String getPath() { + String getHtmlPath() { return null } @@ -19,4 +21,14 @@ final class TestHtmlTask implements HtmlTask { return null } + @Override + TaskInput getInput() { + return null + } + + @Override + HtmlOutput getOutput() { + return null + } + } \ No newline at end of file diff --git a/api/src/testFixtures/groovy/com/jessebrault/ssg/dsl/StandardDslConsumerTests.groovy b/api/src/testFixtures/groovy/com/jessebrault/ssg/dsl/StandardDslConsumerTests.groovy index a1b7062..a96dabc 100644 --- a/api/src/testFixtures/groovy/com/jessebrault/ssg/dsl/StandardDslConsumerTests.groovy +++ b/api/src/testFixtures/groovy/com/jessebrault/ssg/dsl/StandardDslConsumerTests.groovy @@ -169,7 +169,7 @@ interface StandardDslConsumerTests { [] ) this.doDslAssertionTest( - '<%= assert tasks.find { it.path == "testHtml" } != null %>', + '<%= assert tasks.find { it.htmlPath == "testHtml" } != null %>', new RenderContext(tasks: [task]) ) } @@ -186,6 +186,28 @@ interface StandardDslConsumerTests { ) } + @Test + default void htmlTaskInputAvailable() { + def t0 = blankTextToHtmlTask() + def t1 = blankPageToHtmlTask() + this.doDslAssertionTest( + '<% assert tasks.size() == 2 && ' + + 'tasks.inject(true) { acc, task -> acc && task.input != null } %>', + new RenderContext(tasks: [t0, t1]) + ) + } + + @Test + default void htmlTaskOutputAvailable() { + def t0 = blankTextToHtmlTask() + def t1 = blankPageToHtmlTask() + this.doDslAssertionTest( + '<% assert tasks.size() == 2 && ' + + 'tasks.inject(true) { acc, task -> acc && task.output != null } %>', + new RenderContext(tasks: [t0, t1]) + ) + } + @Test default void taskTypesImported() { this.doDslAssertionTest('<%= assert Task && HtmlTask && ModelToHtmlTask && PageToHtmlTask && TextToHtmlTask %>')