From 111bdea286249e02efaca01fd681807e01094e04 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Wed, 15 Feb 2023 16:13:20 +0100 Subject: [PATCH] SiteSpec proliferated. --- .../ssg/AbstractBuildCommand.groovy | 12 ++- .../groovy/com/jessebrault/ssg/Build.groovy | 4 +- .../ssg/SimpleStaticSiteGenerator.groovy | 3 + .../com/jessebrault/ssg/SiteSpec.groovy | 27 ++++++ .../buildscript/BuildClosureDelegate.groovy | 15 ++- .../ssg/buildscript/BuildScriptBase.groovy | 11 ++- .../SiteSpecClosureDelegate.groovy | 14 +++ .../ssg/part/EmbeddablePart.groovy | 3 + .../ssg/part/EmbeddablePartsMap.groovy | 7 +- .../ssg/part/GspPartRenderer.groovy | 7 +- .../jessebrault/ssg/part/PartRenderer.groovy | 2 + .../specialpage/GspSpecialPageRenderer.groovy | 15 ++- .../specialpage/SpecialPageRenderer.groovy | 2 + .../ssg/template/GspTemplateRenderer.groovy | 6 +- .../ssg/template/TemplateRenderer.groovy | 2 + .../ssg/url/PathBasedUrlBuilder.groovy | 6 +- ...StaticSiteGeneratorIntegrationTests.groovy | 3 +- .../ssg/part/GspPartRendererTests.groovy | 10 ++ .../GspSpecialPageRendererTests.groovy | 91 ++++++++++++++++--- .../template/GspTemplateRendererTests.groovy | 42 ++++++++- .../ssg/url/PathBasedUrlBuilderTests.groovy | 4 +- .../ssg/url/AbstractUrlBuilderTests.groovy | 12 +-- 22 files changed, 259 insertions(+), 39 deletions(-) create mode 100644 lib/src/main/groovy/com/jessebrault/ssg/SiteSpec.groovy create mode 100644 lib/src/main/groovy/com/jessebrault/ssg/buildscript/SiteSpecClosureDelegate.groovy diff --git a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy index dba4ed5..d3cce49 100644 --- a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy +++ b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy @@ -44,6 +44,10 @@ abstract class AbstractBuildCommand extends AbstractSubCommand { partsProviders: [defaultPartsProvider], specialPagesProviders: [defaultSpecialPagesProvider] ) + def defaultSiteSpec = new SiteSpec( + name: '', + baseUrl: '' + ) def defaultGlobals = [:] // Run build script, if applicable @@ -56,7 +60,13 @@ abstract class AbstractBuildCommand extends AbstractSubCommand { if (this.builds.empty) { // Add default build - builds << new Build('default', defaultConfig, defaultGlobals, new File('build')) + builds << new Build( + 'default', + defaultConfig, + defaultSiteSpec, + defaultGlobals, + new File('build') + ) } // Get ssg object diff --git a/lib/src/main/groovy/com/jessebrault/ssg/Build.groovy b/lib/src/main/groovy/com/jessebrault/ssg/Build.groovy index c5d611a..d53e40c 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/Build.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/Build.groovy @@ -11,12 +11,14 @@ class Build { String name Config config + SiteSpec siteSpec Map globals File outDir @Override String toString() { - "Build(name: ${ this.name }, config: ${ this.config }, globals: ${ this.globals }, outDir: ${ this.outDir })" + "Build(name: ${ this.name }, config: ${ this.config }, siteSpec: ${ this.siteSpec }, " + + "globals: ${ this.globals }, outDir: ${ this.outDir })" } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy index c357c2e..97bd00b 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/SimpleStaticSiteGenerator.groovy @@ -27,6 +27,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { logger.info('processing build with name: {}', build.name) def config = build.config + def siteSpec = build.siteSpec // Get all texts, templates, parts, and specialPages def texts = config.textProviders.collectMany { it.provide() } @@ -80,6 +81,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { frontMatter, it, parts, + siteSpec, globals, targetPath ) @@ -105,6 +107,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator { it, texts, parts, + siteSpec, globals, targetPath ) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/SiteSpec.groovy b/lib/src/main/groovy/com/jessebrault/ssg/SiteSpec.groovy new file mode 100644 index 0000000..37a8835 --- /dev/null +++ b/lib/src/main/groovy/com/jessebrault/ssg/SiteSpec.groovy @@ -0,0 +1,27 @@ +package com.jessebrault.ssg + +import groovy.transform.EqualsAndHashCode +import groovy.transform.MapConstructor +import groovy.transform.NullCheck +import groovy.transform.TupleConstructor + +@TupleConstructor(force = true, defaults = false) +@MapConstructor +@NullCheck +@EqualsAndHashCode +final class SiteSpec { + + String name + String baseUrl + + SiteSpec(SiteSpec source) { + this.name = source.name + this.baseUrl = source.baseUrl + } + + @Override + String toString() { + "SiteSpec(${ this.name }, ${ this.baseUrl })" + } + +} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildClosureDelegate.groovy b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildClosureDelegate.groovy index 6572ee3..cc24ef2 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildClosureDelegate.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildClosureDelegate.groovy @@ -1,26 +1,37 @@ package com.jessebrault.ssg.buildscript import com.jessebrault.ssg.Config +import com.jessebrault.ssg.SiteSpec class BuildClosureDelegate { String name Config config + SiteSpec siteSpec Map globals File outDir void config( @DelegatesTo(value = ConfigClosureDelegate, strategy = Closure.DELEGATE_FIRST) - Closure configClosure + Closure configClosure ) { configClosure.setDelegate(new ConfigClosureDelegate(this.config)) configClosure.setResolveStrategy(Closure.DELEGATE_FIRST) configClosure.run() } + void siteSpec( + @DelegatesTo(value = SiteSpecClosureDelegate, strategy = Closure.DELEGATE_FIRST) + Closure siteSpecClosure + ) { + siteSpecClosure.setDelegate(new SiteSpecClosureDelegate(this.siteSpec)) + siteSpecClosure.setResolveStrategy(Closure.DELEGATE_FIRST) + siteSpecClosure.run() + } + void globals( @DelegatesTo(value = GlobalsClosureDelegate, strategy = Closure.DELEGATE_FIRST) - Closure globalsClosure + Closure globalsClosure ) { def globalsConfigurator = new GlobalsClosureDelegate(this.globals) globalsClosure.setDelegate(globalsConfigurator) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildScriptBase.groovy b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildScriptBase.groovy index 10907fa..3c9a84d 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildScriptBase.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/BuildScriptBase.groovy @@ -2,10 +2,12 @@ package com.jessebrault.ssg.buildscript import com.jessebrault.ssg.Build import com.jessebrault.ssg.Config +import com.jessebrault.ssg.SiteSpec abstract class BuildScriptBase extends Script { Config defaultConfig + SiteSpec defaultSiteSpec Map defaultGlobals Collection builds = [] @@ -20,13 +22,20 @@ abstract class BuildScriptBase extends Script { // Default values for Build properties name = 'build' + this.currentBuildNumber config = new Config(defaultConfig) + siteSpec = new SiteSpec(defaultSiteSpec) globals = new LinkedHashMap(defaultGlobals) outDir = new File(name) } buildClosure.setDelegate(buildClosureDelegate) buildClosure.setResolveStrategy(Closure.DELEGATE_FIRST) buildClosure.run() - this.builds << new Build(buildClosureDelegate.name, buildClosureDelegate.config, buildClosureDelegate.globals, buildClosureDelegate.outDir) + this.builds << new Build( + buildClosureDelegate.name, + buildClosureDelegate.config, + buildClosureDelegate.siteSpec, + buildClosureDelegate.globals, + buildClosureDelegate.outDir + ) this.currentBuildNumber++ } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/buildscript/SiteSpecClosureDelegate.groovy b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/SiteSpecClosureDelegate.groovy new file mode 100644 index 0000000..14a4e71 --- /dev/null +++ b/lib/src/main/groovy/com/jessebrault/ssg/buildscript/SiteSpecClosureDelegate.groovy @@ -0,0 +1,14 @@ +package com.jessebrault.ssg.buildscript + +import com.jessebrault.ssg.SiteSpec + +class SiteSpecClosureDelegate { + + @Delegate + private final SiteSpec siteSpec + + SiteSpecClosureDelegate(SiteSpec siteSpec) { + this.siteSpec = siteSpec + } + +} diff --git a/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePart.groovy b/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePart.groovy index d87e01b..1df64fa 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePart.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePart.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.part +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.text.EmbeddableText import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck @@ -12,6 +13,7 @@ import org.jetbrains.annotations.Nullable class EmbeddablePart { private final Part part + private final SiteSpec siteSpec private final Map globals private final Closure onDiagnostics @@ -26,6 +28,7 @@ class EmbeddablePart { def result = part.type.renderer.render( this.part, binding, + this.siteSpec, this.globals, this.text, this.allParts, diff --git a/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePartsMap.groovy b/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePartsMap.groovy index e867f95..1cd852d 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePartsMap.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/part/EmbeddablePartsMap.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.part +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.text.EmbeddableText import groovy.transform.EqualsAndHashCode import org.jetbrains.annotations.Nullable @@ -12,6 +13,7 @@ class EmbeddablePartsMap { EmbeddablePartsMap( Collection parts, + SiteSpec siteSpec, Map globals, Closure onDiagnostics, @Nullable EmbeddableText text = null, @@ -19,10 +21,13 @@ class EmbeddablePartsMap { String targetPath ) { Objects.requireNonNull(parts) + Objects.requireNonNull(siteSpec) Objects.requireNonNull(globals) Objects.requireNonNull(onDiagnostics) + Objects.requireNonNull(path) + Objects.requireNonNull(targetPath) parts.each { - this.put(it.path, new EmbeddablePart(it, globals, onDiagnostics, text, parts, path, targetPath)) + this.put(it.path, new EmbeddablePart(it, siteSpec, globals, onDiagnostics, text, parts, path, targetPath)) } } diff --git a/lib/src/main/groovy/com/jessebrault/ssg/part/GspPartRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/part/GspPartRenderer.groovy index 3448efc..ac514a2 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/part/GspPartRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/part/GspPartRenderer.groovy @@ -1,13 +1,13 @@ package com.jessebrault.ssg.part import com.jessebrault.ssg.Diagnostic +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.url.PathBasedUrlBuilder import groovy.text.GStringTemplateEngine import groovy.text.TemplateEngine import groovy.transform.EqualsAndHashCode -import groovy.transform.NullCheck import org.jetbrains.annotations.Nullable @EqualsAndHashCode @@ -19,6 +19,7 @@ class GspPartRenderer implements PartRenderer { Tuple2, String> render( Part part, Map binding, + SiteSpec siteSpec, Map globals, @Nullable EmbeddableText text = null, Collection allParts, @@ -27,6 +28,7 @@ class GspPartRenderer implements PartRenderer { ) { Objects.requireNonNull(part) Objects.requireNonNull(binding) + Objects.requireNonNull(siteSpec) Objects.requireNonNull(globals) Objects.requireNonNull(allParts) Objects.requireNonNull(path) @@ -38,6 +40,7 @@ class GspPartRenderer implements PartRenderer { globals: globals, parts: new EmbeddablePartsMap( allParts, + siteSpec, globals, embeddedPartDiagnostics.&addAll, text, @@ -48,7 +51,7 @@ class GspPartRenderer implements PartRenderer { tagBuilder: new DynamicTagBuilder(), targetPath: targetPath, text: text, - urlBuilder: new PathBasedUrlBuilder(targetPath) + urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl) ]) new Tuple2<>([], result.toString()) } catch (Exception e) { diff --git a/lib/src/main/groovy/com/jessebrault/ssg/part/PartRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/part/PartRenderer.groovy index 70fe1a8..4a281ae 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/part/PartRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/part/PartRenderer.groovy @@ -1,6 +1,7 @@ package com.jessebrault.ssg.part import com.jessebrault.ssg.Diagnostic +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.text.EmbeddableText import org.jetbrains.annotations.Nullable @@ -9,6 +10,7 @@ interface PartRenderer { Tuple2, String> render( Part part, Map binding, + SiteSpec siteSpec, Map globals, @Nullable EmbeddableText text, Collection allParts, diff --git a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy index 2a01dd9..e72762a 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRenderer.groovy @@ -1,8 +1,9 @@ package com.jessebrault.ssg.specialpage import com.jessebrault.ssg.Diagnostic -import com.jessebrault.ssg.part.Part +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.EmbeddablePartsMap +import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder import com.jessebrault.ssg.text.EmbeddableTextsCollection import com.jessebrault.ssg.text.Text @@ -23,6 +24,7 @@ class GspSpecialPageRenderer implements SpecialPageRenderer { SpecialPage specialPage, Collection texts, Collection parts, + SiteSpec siteSpec, Map globals, String targetPath ) { @@ -30,12 +32,19 @@ class GspSpecialPageRenderer implements SpecialPageRenderer { Collection diagnostics = [] def result = engine.createTemplate(specialPage.text).make([ globals: globals, - parts: new EmbeddablePartsMap(parts, globals, diagnostics.&addAll, specialPage.path, targetPath), + parts: new EmbeddablePartsMap( + parts, + siteSpec, + globals, + diagnostics.&addAll, + specialPage.path, + targetPath + ), path: specialPage.path, tagBuilder: new DynamicTagBuilder(), targetPath: targetPath, texts: new EmbeddableTextsCollection(texts, globals, diagnostics.&addAll), - urlBuilder: new PathBasedUrlBuilder(targetPath) + urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl) ]) new Tuple2<>(diagnostics, result.toString()) } catch (Exception e) { diff --git a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageRenderer.groovy index c597100..842267c 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/specialpage/SpecialPageRenderer.groovy @@ -1,6 +1,7 @@ package com.jessebrault.ssg.specialpage import com.jessebrault.ssg.Diagnostic +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.text.Text @@ -10,6 +11,7 @@ interface SpecialPageRenderer { SpecialPage specialPage, Collection texts, Collection parts, + SiteSpec siteSpec, Map globals, String targetPath ) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/template/GspTemplateRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/template/GspTemplateRenderer.groovy index 6bcb15c..8bfee53 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/template/GspTemplateRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/template/GspTemplateRenderer.groovy @@ -1,6 +1,7 @@ package com.jessebrault.ssg.template import com.jessebrault.ssg.Diagnostic +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.EmbeddablePartsMap import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder @@ -26,6 +27,7 @@ class GspTemplateRenderer implements TemplateRenderer { FrontMatter frontMatter, Text text, Collection parts, + SiteSpec siteSpec, Map globals, String targetPath ) { @@ -38,12 +40,12 @@ class GspTemplateRenderer implements TemplateRenderer { def result = engine.createTemplate(template.text).make([ frontMatter: frontMatter, globals: globals, - parts: new EmbeddablePartsMap(parts, globals, onDiagnostics, embeddableText, text.path, targetPath), + parts: new EmbeddablePartsMap(parts, siteSpec, globals, onDiagnostics, embeddableText, text.path, targetPath), path: text.path, tagBuilder: new DynamicTagBuilder(), targetPath: targetPath, text: embeddableText, - urlBuilder: new PathBasedUrlBuilder(targetPath) + urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl) ]) new Tuple2<>(diagnostics, result.toString()) } catch (Exception e) { diff --git a/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateRenderer.groovy b/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateRenderer.groovy index 71b97fe..986fe26 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateRenderer.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/template/TemplateRenderer.groovy @@ -1,6 +1,7 @@ package com.jessebrault.ssg.template import com.jessebrault.ssg.Diagnostic +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.text.FrontMatter import com.jessebrault.ssg.text.Text @@ -16,6 +17,7 @@ interface TemplateRenderer { FrontMatter frontMatter, Text text, Collection parts, + SiteSpec siteSpec, Map globals, String targetPath ) diff --git a/lib/src/main/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilder.groovy b/lib/src/main/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilder.groovy index 4050712..c3a4962 100644 --- a/lib/src/main/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilder.groovy +++ b/lib/src/main/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilder.groovy @@ -7,9 +7,9 @@ class PathBasedUrlBuilder implements UrlBuilder { private final String absolute private final Path fromDirectory - PathBasedUrlBuilder(String absolute) { - this.absolute = absolute - def fromFilePath = Path.of(absolute) + PathBasedUrlBuilder(String targetPath, String baseUrl) { + this.absolute = baseUrl + '/' + targetPath + def fromFilePath = Path.of(targetPath) if (fromFilePath.parent) { this.fromDirectory = fromFilePath.parent } else { diff --git a/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy index 2a009b1..5195786 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/SimpleStaticSiteGeneratorIntegrationTests.groovy @@ -53,9 +53,10 @@ class SimpleStaticSiteGeneratorIntegrationTests { partsProviders: [partsProvider], specialPagesProviders: [specialPagesProvider] ) + def siteSpec = new SiteSpec('Test Site', 'https://test.com') def globals = [:] - this.build = new Build('testBuild', config, globals, new File('build')) + this.build = new Build('testBuild', config, siteSpec, globals, new File('build')) this.ssg = new SimpleStaticSiteGenerator() } diff --git a/lib/src/test/groovy/com/jessebrault/ssg/part/GspPartRendererTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/part/GspPartRendererTests.groovy index c48fb5d..2339478 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/part/GspPartRendererTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/part/GspPartRendererTests.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.part +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.text.EmbeddableText import org.junit.jupiter.api.Test @@ -19,6 +20,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], null, [part], @@ -35,6 +37,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [greeting: 'Hello, World!'], + new SiteSpec('', ''), [:], null, [part], @@ -51,6 +54,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [greeting: 'Hello, World!'], null, [part], @@ -68,6 +72,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll), [part], @@ -85,6 +90,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], null, [part], @@ -103,6 +109,7 @@ class GspPartRendererTests { def r = this.renderer.render( part0, [:], + new SiteSpec('', ''), [:], null, [part0, part1], @@ -119,6 +126,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], null, [part], @@ -135,6 +143,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], null, [part], @@ -151,6 +160,7 @@ class GspPartRendererTests { def r = this.renderer.render( part, [:], + new SiteSpec('', ''), [:], null, [part], diff --git a/lib/src/test/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRendererTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRendererTests.groovy index 1329e52..8570145 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRendererTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/specialpage/GspSpecialPageRendererTests.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.specialpage +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.PartRenderer import com.jessebrault.ssg.part.PartType @@ -24,20 +25,34 @@ class GspSpecialPageRendererTests { void rendersGlobal() { def specialPage = new SpecialPage("<%= globals['greeting'] %>", 'test.gsp', null) def globals = [greeting: 'Hello, World!'] - def r = this.renderer.render(specialPage, [], [], globals, '') + def r = this.renderer.render( + specialPage, + [], + [], + new SiteSpec('', ''), + globals, + '' + ) assertEmptyDiagnostics(r) assertEquals('Hello, World!', r.v2) } @Test void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) { - when(partRenderer.render(any(), any(), any(), any(), any(), any(), any())) + when(partRenderer.render(any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(new Tuple2<>([], 'Hello, World!')) def partType = new PartType([], partRenderer) def part = new Part('test', partType , '') def specialPage = new SpecialPage("<%= parts['test'].render() %>", 'test.gsp', null) - def r = this.renderer.render(specialPage, [], [part], [:], '') + def r = this.renderer.render( + specialPage, + [], + [part], + new SiteSpec('', ''), + [:], + '' + ) assertEmptyDiagnostics(r) assertEquals('Hello, World!', r.v2) } @@ -45,7 +60,14 @@ class GspSpecialPageRendererTests { @Test void rendersPartWithBinding(@Mock PartRenderer partRenderer) { when(partRenderer.render( - any(), argThat { Map m -> m.get('greeting') == 'Hello, World!'}, any(), any(), any(), any(), any() + any(), + argThat { Map m -> m.get('greeting') == 'Hello, World!'}, + any(), + any(), + any(), + any(), + any(), + any() )).thenReturn(new Tuple2<>([], 'Hello, World!')) def partType = new PartType([], partRenderer) def part = new Part('test', partType, '') @@ -55,7 +77,14 @@ class GspSpecialPageRendererTests { 'test.gsp', null ) - def r = this.renderer.render(specialPage, [], [part], [:], '') + def r = this.renderer.render( + specialPage, + [], + [part], + new SiteSpec('', ''), + [:], + '' + ) assertEmptyDiagnostics(r) assertEquals('Hello, World!', r.v2) } @@ -72,7 +101,14 @@ class GspSpecialPageRendererTests { 'test.gsp', null ) - def r = this.renderer.render(specialPage, [text], [], [:], '') + def r = this.renderer.render( + specialPage, + [text], + [], + new SiteSpec('', ''), + [:], + '' + ) assertEmptyDiagnostics(r) assertEquals('

Hello, World!

\n', r.v2) } @@ -80,7 +116,14 @@ class GspSpecialPageRendererTests { @Test void tagBuilderAvailable() { def specialPage = new SpecialPage('<%= tagBuilder.test() %>', 'test.gsp', null) - def r = this.renderer.render(specialPage, [], [], [:], '') + def r = this.renderer.render( + specialPage, + [], + [], + new SiteSpec('', ''), + [:], + '' + ) assertEmptyDiagnostics(r) assertEquals('', r.v2) } @@ -88,7 +131,14 @@ class GspSpecialPageRendererTests { @Test void pathAvailable() { def specialPage = new SpecialPage('<%= path %>', 'test.gsp', null) - def r = this.renderer.render(specialPage, [], [], [:], '') + def r = this.renderer.render( + specialPage, + [], + [], + new SiteSpec('', ''), + [:], + '' + ) assertEmptyDiagnostics(r) assertEquals('test.gsp', r.v2) } @@ -100,7 +150,14 @@ class GspSpecialPageRendererTests { 'test.gsp', null ) - def r = this.renderer.render(specialPage, [], [], [:], 'test.html') + def r = this.renderer.render( + specialPage, + [], + [], + new SiteSpec('', ''), + [:], + 'test.html' + ) assertEmptyDiagnostics(r) assertEquals('images/test.jpg', r.v2) } @@ -113,7 +170,12 @@ class GspSpecialPageRendererTests { null ) def r = this.renderer.render( - specialPage, [], [], [:], 'test/test.html' + specialPage, + [], + [], + new SiteSpec('', ''), + [:], + 'test/test.html' ) assertEmptyDiagnostics(r) assertEquals('../images/test.jpg', r.v2) @@ -126,7 +188,14 @@ class GspSpecialPageRendererTests { '', null ) - def r = this.renderer.render(specialPage, [], [], [:], 'test.html') + def r = this.renderer.render( + specialPage, + [], + [], + new SiteSpec('', ''), + [:], + 'test.html' + ) assertEmptyDiagnostics(r) assertEquals('test.html', r.v2) } diff --git a/lib/src/test/groovy/com/jessebrault/ssg/template/GspTemplateRendererTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/template/GspTemplateRendererTests.groovy index 8efe40d..7438b34 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/template/GspTemplateRendererTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/template/GspTemplateRendererTests.groovy @@ -1,5 +1,6 @@ package com.jessebrault.ssg.template +import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.PartRenderer import com.jessebrault.ssg.part.PartType @@ -31,7 +32,7 @@ class GspTemplateRendererTests { null ) - when(partRenderer.render(any(), any(), any(), any(), any(), any(), any())) + when(partRenderer.render(any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(new Tuple2<>([], 'Hello, World!')) def partType = new PartType([], partRenderer) def part = new Part('test', partType, null) @@ -41,6 +42,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [part], + new SiteSpec('', ''), [:], '' ) @@ -56,8 +58,17 @@ class GspTemplateRendererTests { null ) - when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any(), any(), any(), any())) - .thenReturn(new Tuple2<>([], 'Hello, World!')) + when(partRenderer.render( + any(), + argThat { Map m -> m.get('person') == 'World' }, + any(), + any(), + any(), + any(), + any(), + any() + )).thenReturn(new Tuple2<>([], 'Hello, World!')) + def partType = new PartType([], partRenderer) def part = new Part('greeting', partType, null) @@ -66,6 +77,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [part], + new SiteSpec('', ''), [:], '' ) @@ -81,6 +93,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [title: ['Hello!']]), blankText(), [], + new SiteSpec('', ''), [:], '' ) @@ -96,6 +109,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [], + new SiteSpec('', ''), [test: 'Hello, World!'], '' ) @@ -111,6 +125,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), renderableText('Hello, World!'), [], + new SiteSpec('', ''), [:], '' ) @@ -126,6 +141,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [], + new SiteSpec('', ''), [:], '' ) @@ -141,6 +157,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), textWithPath('test.md'), [], + new SiteSpec('', ''), [:], '' ) @@ -156,6 +173,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [], + new SiteSpec('', ''), [:], 'test.html' ) @@ -171,6 +189,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [], + new SiteSpec('', ''), [:], 'test/test.html' ) @@ -178,6 +197,22 @@ class GspTemplateRendererTests { assertEquals('../images/test.jpg', r.v2) } + @Test + void urlBuilderAbsolutePathCorrect() { + def template = new Template('<%= urlBuilder.absolute %>', null, null) + def r = this.renderer.render( + template, + new FrontMatter(null, [:]), + blankText(), + [], + new SiteSpec('', 'https://test.com'), + [:], + 'test/test.html' + ) + assertEmptyDiagnostics(r) + assertEquals('https://test.com/test/test.html', r.v2) + } + @Test void targetPathAvailable() { def template = new Template('<%= targetPath %>', null, null) @@ -186,6 +221,7 @@ class GspTemplateRendererTests { new FrontMatter(null, [:]), blankText(), [], + new SiteSpec('', ''), [:], 'test.html' ) diff --git a/lib/src/test/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilderTests.groovy b/lib/src/test/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilderTests.groovy index d05e6fd..4b56f50 100644 --- a/lib/src/test/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilderTests.groovy +++ b/lib/src/test/groovy/com/jessebrault/ssg/url/PathBasedUrlBuilderTests.groovy @@ -3,8 +3,8 @@ package com.jessebrault.ssg.url class PathBasedUrlBuilderTests extends AbstractUrlBuilderTests { @Override - protected UrlBuilder getUrlBuilder(String targetPath) { - new PathBasedUrlBuilder(targetPath) + protected UrlBuilder getUrlBuilder(String targetPath, String baseUrl) { + new PathBasedUrlBuilder(targetPath, baseUrl) } } diff --git a/lib/src/testFixtures/groovy/com/jessebrault/ssg/url/AbstractUrlBuilderTests.groovy b/lib/src/testFixtures/groovy/com/jessebrault/ssg/url/AbstractUrlBuilderTests.groovy index 3fa352e..73fd64b 100644 --- a/lib/src/testFixtures/groovy/com/jessebrault/ssg/url/AbstractUrlBuilderTests.groovy +++ b/lib/src/testFixtures/groovy/com/jessebrault/ssg/url/AbstractUrlBuilderTests.groovy @@ -6,11 +6,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals abstract class AbstractUrlBuilderTests { - protected abstract UrlBuilder getUrlBuilder(String targetPath); + protected abstract UrlBuilder getUrlBuilder(String targetPath, String baseUrl); @Test void upDownDown() { - def builder = this.getUrlBuilder('posts/post.html') + def builder = this.getUrlBuilder('posts/post.html', '') assertEquals('../images/test.jpg', builder.relative('images/test.jpg')) } @@ -18,7 +18,7 @@ abstract class AbstractUrlBuilderTests { void downDown() { assertEquals( 'images/test.jpg', - this.getUrlBuilder('test.html').relative('images/test.jpg') + this.getUrlBuilder('test.html', '').relative('images/test.jpg') ) } @@ -26,15 +26,15 @@ abstract class AbstractUrlBuilderTests { void upUpDownDown() { assertEquals( '../../images/test.jpg', - this.getUrlBuilder('posts/old/test.html').relative('images/test.jpg') + this.getUrlBuilder('posts/old/test.html', '').relative('images/test.jpg') ) } @Test void absoluteMatchesTargetPath() { assertEquals( - 'test/test.html', - this.getUrlBuilder('test/test.html').absolute + 'https://test.com/test/test.html', + this.getUrlBuilder('test/test.html', 'https://test.com').absolute ) }