SiteSpec proliferated.

This commit is contained in:
Jesse Brault 2023-02-15 16:13:20 +01:00
parent 0762dc6b8b
commit 111bdea286
22 changed files with 259 additions and 39 deletions

View File

@ -44,6 +44,10 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
partsProviders: [defaultPartsProvider], partsProviders: [defaultPartsProvider],
specialPagesProviders: [defaultSpecialPagesProvider] specialPagesProviders: [defaultSpecialPagesProvider]
) )
def defaultSiteSpec = new SiteSpec(
name: '',
baseUrl: ''
)
def defaultGlobals = [:] def defaultGlobals = [:]
// Run build script, if applicable // Run build script, if applicable
@ -56,7 +60,13 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
if (this.builds.empty) { if (this.builds.empty) {
// Add default build // 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 // Get ssg object

View File

@ -11,12 +11,14 @@ class Build {
String name String name
Config config Config config
SiteSpec siteSpec
Map globals Map globals
File outDir File outDir
@Override @Override
String toString() { 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 })"
} }
} }

View File

@ -27,6 +27,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
logger.info('processing build with name: {}', build.name) logger.info('processing build with name: {}', build.name)
def config = build.config def config = build.config
def siteSpec = build.siteSpec
// Get all texts, templates, parts, and specialPages // Get all texts, templates, parts, and specialPages
def texts = config.textProviders.collectMany { it.provide() } def texts = config.textProviders.collectMany { it.provide() }
@ -80,6 +81,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
frontMatter, frontMatter,
it, it,
parts, parts,
siteSpec,
globals, globals,
targetPath targetPath
) )
@ -105,6 +107,7 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
it, it,
texts, texts,
parts, parts,
siteSpec,
globals, globals,
targetPath targetPath
) )

View File

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

View File

@ -1,11 +1,13 @@
package com.jessebrault.ssg.buildscript package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.Config import com.jessebrault.ssg.Config
import com.jessebrault.ssg.SiteSpec
class BuildClosureDelegate { class BuildClosureDelegate {
String name String name
Config config Config config
SiteSpec siteSpec
Map globals Map globals
File outDir File outDir
@ -18,6 +20,15 @@ class BuildClosureDelegate {
configClosure.run() 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( void globals(
@DelegatesTo(value = GlobalsClosureDelegate, strategy = Closure.DELEGATE_FIRST) @DelegatesTo(value = GlobalsClosureDelegate, strategy = Closure.DELEGATE_FIRST)
Closure globalsClosure Closure globalsClosure

View File

@ -2,10 +2,12 @@ package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.Build import com.jessebrault.ssg.Build
import com.jessebrault.ssg.Config import com.jessebrault.ssg.Config
import com.jessebrault.ssg.SiteSpec
abstract class BuildScriptBase extends Script { abstract class BuildScriptBase extends Script {
Config defaultConfig Config defaultConfig
SiteSpec defaultSiteSpec
Map defaultGlobals Map defaultGlobals
Collection<Build> builds = [] Collection<Build> builds = []
@ -20,13 +22,20 @@ abstract class BuildScriptBase extends Script {
// Default values for Build properties // Default values for Build properties
name = 'build' + this.currentBuildNumber name = 'build' + this.currentBuildNumber
config = new Config(defaultConfig) config = new Config(defaultConfig)
siteSpec = new SiteSpec(defaultSiteSpec)
globals = new LinkedHashMap(defaultGlobals) globals = new LinkedHashMap(defaultGlobals)
outDir = new File(name) outDir = new File(name)
} }
buildClosure.setDelegate(buildClosureDelegate) buildClosure.setDelegate(buildClosureDelegate)
buildClosure.setResolveStrategy(Closure.DELEGATE_FIRST) buildClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
buildClosure.run() 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++ this.currentBuildNumber++
} }

View File

@ -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
}
}

View File

@ -1,5 +1,6 @@
package com.jessebrault.ssg.part package com.jessebrault.ssg.part
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.text.EmbeddableText
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck import groovy.transform.NullCheck
@ -12,6 +13,7 @@ import org.jetbrains.annotations.Nullable
class EmbeddablePart { class EmbeddablePart {
private final Part part private final Part part
private final SiteSpec siteSpec
private final Map globals private final Map globals
private final Closure onDiagnostics private final Closure onDiagnostics
@ -26,6 +28,7 @@ class EmbeddablePart {
def result = part.type.renderer.render( def result = part.type.renderer.render(
this.part, this.part,
binding, binding,
this.siteSpec,
this.globals, this.globals,
this.text, this.text,
this.allParts, this.allParts,

View File

@ -1,5 +1,6 @@
package com.jessebrault.ssg.part package com.jessebrault.ssg.part
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.text.EmbeddableText
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable
@ -12,6 +13,7 @@ class EmbeddablePartsMap {
EmbeddablePartsMap( EmbeddablePartsMap(
Collection<Part> parts, Collection<Part> parts,
SiteSpec siteSpec,
Map globals, Map globals,
Closure onDiagnostics, Closure onDiagnostics,
@Nullable EmbeddableText text = null, @Nullable EmbeddableText text = null,
@ -19,10 +21,13 @@ class EmbeddablePartsMap {
String targetPath String targetPath
) { ) {
Objects.requireNonNull(parts) Objects.requireNonNull(parts)
Objects.requireNonNull(siteSpec)
Objects.requireNonNull(globals) Objects.requireNonNull(globals)
Objects.requireNonNull(onDiagnostics) Objects.requireNonNull(onDiagnostics)
Objects.requireNonNull(path)
Objects.requireNonNull(targetPath)
parts.each { 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))
} }
} }

View File

@ -1,13 +1,13 @@
package com.jessebrault.ssg.part package com.jessebrault.ssg.part
import com.jessebrault.ssg.Diagnostic import com.jessebrault.ssg.Diagnostic
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.text.EmbeddableText
import com.jessebrault.ssg.url.PathBasedUrlBuilder import com.jessebrault.ssg.url.PathBasedUrlBuilder
import groovy.text.GStringTemplateEngine import groovy.text.GStringTemplateEngine
import groovy.text.TemplateEngine import groovy.text.TemplateEngine
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable
@EqualsAndHashCode @EqualsAndHashCode
@ -19,6 +19,7 @@ class GspPartRenderer implements PartRenderer {
Tuple2<Collection<Diagnostic>, String> render( Tuple2<Collection<Diagnostic>, String> render(
Part part, Part part,
Map binding, Map binding,
SiteSpec siteSpec,
Map globals, Map globals,
@Nullable EmbeddableText text = null, @Nullable EmbeddableText text = null,
Collection<Part> allParts, Collection<Part> allParts,
@ -27,6 +28,7 @@ class GspPartRenderer implements PartRenderer {
) { ) {
Objects.requireNonNull(part) Objects.requireNonNull(part)
Objects.requireNonNull(binding) Objects.requireNonNull(binding)
Objects.requireNonNull(siteSpec)
Objects.requireNonNull(globals) Objects.requireNonNull(globals)
Objects.requireNonNull(allParts) Objects.requireNonNull(allParts)
Objects.requireNonNull(path) Objects.requireNonNull(path)
@ -38,6 +40,7 @@ class GspPartRenderer implements PartRenderer {
globals: globals, globals: globals,
parts: new EmbeddablePartsMap( parts: new EmbeddablePartsMap(
allParts, allParts,
siteSpec,
globals, globals,
embeddedPartDiagnostics.&addAll, embeddedPartDiagnostics.&addAll,
text, text,
@ -48,7 +51,7 @@ class GspPartRenderer implements PartRenderer {
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath, targetPath: targetPath,
text: text, text: text,
urlBuilder: new PathBasedUrlBuilder(targetPath) urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl)
]) ])
new Tuple2<>([], result.toString()) new Tuple2<>([], result.toString())
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,6 +1,7 @@
package com.jessebrault.ssg.part package com.jessebrault.ssg.part
import com.jessebrault.ssg.Diagnostic import com.jessebrault.ssg.Diagnostic
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.text.EmbeddableText
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable
@ -9,6 +10,7 @@ interface PartRenderer {
Tuple2<Collection<Diagnostic>, String> render( Tuple2<Collection<Diagnostic>, String> render(
Part part, Part part,
Map binding, Map binding,
SiteSpec siteSpec,
Map globals, Map globals,
@Nullable EmbeddableText text, @Nullable EmbeddableText text,
Collection<Part> allParts, Collection<Part> allParts,

View File

@ -1,8 +1,9 @@
package com.jessebrault.ssg.specialpage package com.jessebrault.ssg.specialpage
import com.jessebrault.ssg.Diagnostic 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.EmbeddablePartsMap
import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
import com.jessebrault.ssg.text.EmbeddableTextsCollection import com.jessebrault.ssg.text.EmbeddableTextsCollection
import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.text.Text
@ -23,6 +24,7 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
SpecialPage specialPage, SpecialPage specialPage,
Collection<Text> texts, Collection<Text> texts,
Collection<Part> parts, Collection<Part> parts,
SiteSpec siteSpec,
Map globals, Map globals,
String targetPath String targetPath
) { ) {
@ -30,12 +32,19 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
Collection<Diagnostic> diagnostics = [] Collection<Diagnostic> diagnostics = []
def result = engine.createTemplate(specialPage.text).make([ def result = engine.createTemplate(specialPage.text).make([
globals: globals, 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, path: specialPage.path,
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath, targetPath: targetPath,
texts: new EmbeddableTextsCollection(texts, globals, diagnostics.&addAll), texts: new EmbeddableTextsCollection(texts, globals, diagnostics.&addAll),
urlBuilder: new PathBasedUrlBuilder(targetPath) urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl)
]) ])
new Tuple2<>(diagnostics, result.toString()) new Tuple2<>(diagnostics, result.toString())
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,6 +1,7 @@
package com.jessebrault.ssg.specialpage package com.jessebrault.ssg.specialpage
import com.jessebrault.ssg.Diagnostic import com.jessebrault.ssg.Diagnostic
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.text.Text
@ -10,6 +11,7 @@ interface SpecialPageRenderer {
SpecialPage specialPage, SpecialPage specialPage,
Collection<Text> texts, Collection<Text> texts,
Collection <Part> parts, Collection <Part> parts,
SiteSpec siteSpec,
Map globals, Map globals,
String targetPath String targetPath
) )

View File

@ -1,6 +1,7 @@
package com.jessebrault.ssg.template package com.jessebrault.ssg.template
import com.jessebrault.ssg.Diagnostic import com.jessebrault.ssg.Diagnostic
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.EmbeddablePartsMap import com.jessebrault.ssg.part.EmbeddablePartsMap
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
@ -26,6 +27,7 @@ class GspTemplateRenderer implements TemplateRenderer {
FrontMatter frontMatter, FrontMatter frontMatter,
Text text, Text text,
Collection<Part> parts, Collection<Part> parts,
SiteSpec siteSpec,
Map globals, Map globals,
String targetPath String targetPath
) { ) {
@ -38,12 +40,12 @@ class GspTemplateRenderer implements TemplateRenderer {
def result = engine.createTemplate(template.text).make([ def result = engine.createTemplate(template.text).make([
frontMatter: frontMatter, frontMatter: frontMatter,
globals: globals, 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, path: text.path,
tagBuilder: new DynamicTagBuilder(), tagBuilder: new DynamicTagBuilder(),
targetPath: targetPath, targetPath: targetPath,
text: embeddableText, text: embeddableText,
urlBuilder: new PathBasedUrlBuilder(targetPath) urlBuilder: new PathBasedUrlBuilder(targetPath, siteSpec.baseUrl)
]) ])
new Tuple2<>(diagnostics, result.toString()) new Tuple2<>(diagnostics, result.toString())
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,6 +1,7 @@
package com.jessebrault.ssg.template package com.jessebrault.ssg.template
import com.jessebrault.ssg.Diagnostic import com.jessebrault.ssg.Diagnostic
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.text.FrontMatter import com.jessebrault.ssg.text.FrontMatter
import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.text.Text
@ -16,6 +17,7 @@ interface TemplateRenderer {
FrontMatter frontMatter, FrontMatter frontMatter,
Text text, Text text,
Collection<Part> parts, Collection<Part> parts,
SiteSpec siteSpec,
Map globals, Map globals,
String targetPath String targetPath
) )

View File

@ -7,9 +7,9 @@ class PathBasedUrlBuilder implements UrlBuilder {
private final String absolute private final String absolute
private final Path fromDirectory private final Path fromDirectory
PathBasedUrlBuilder(String absolute) { PathBasedUrlBuilder(String targetPath, String baseUrl) {
this.absolute = absolute this.absolute = baseUrl + '/' + targetPath
def fromFilePath = Path.of(absolute) def fromFilePath = Path.of(targetPath)
if (fromFilePath.parent) { if (fromFilePath.parent) {
this.fromDirectory = fromFilePath.parent this.fromDirectory = fromFilePath.parent
} else { } else {

View File

@ -53,9 +53,10 @@ class SimpleStaticSiteGeneratorIntegrationTests {
partsProviders: [partsProvider], partsProviders: [partsProvider],
specialPagesProviders: [specialPagesProvider] specialPagesProviders: [specialPagesProvider]
) )
def siteSpec = new SiteSpec('Test Site', 'https://test.com')
def globals = [:] 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() this.ssg = new SimpleStaticSiteGenerator()
} }

View File

@ -1,5 +1,6 @@
package com.jessebrault.ssg.part package com.jessebrault.ssg.part
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.text.EmbeddableText import com.jessebrault.ssg.text.EmbeddableText
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@ -19,6 +20,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],
@ -35,6 +37,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[greeting: 'Hello, World!'], [greeting: 'Hello, World!'],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],
@ -51,6 +54,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[greeting: 'Hello, World!'], [greeting: 'Hello, World!'],
null, null,
[part], [part],
@ -68,6 +72,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll), new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll),
[part], [part],
@ -85,6 +90,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],
@ -103,6 +109,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part0, part0,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part0, part1], [part0, part1],
@ -119,6 +126,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],
@ -135,6 +143,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],
@ -151,6 +160,7 @@ class GspPartRendererTests {
def r = this.renderer.render( def r = this.renderer.render(
part, part,
[:], [:],
new SiteSpec('', ''),
[:], [:],
null, null,
[part], [part],

View File

@ -1,5 +1,6 @@
package com.jessebrault.ssg.specialpage package com.jessebrault.ssg.specialpage
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.part.PartRenderer import com.jessebrault.ssg.part.PartRenderer
import com.jessebrault.ssg.part.PartType import com.jessebrault.ssg.part.PartType
@ -24,20 +25,34 @@ class GspSpecialPageRendererTests {
void rendersGlobal() { void rendersGlobal() {
def specialPage = new SpecialPage("<%= globals['greeting'] %>", 'test.gsp', null) def specialPage = new SpecialPage("<%= globals['greeting'] %>", 'test.gsp', null)
def globals = [greeting: 'Hello, World!'] def globals = [greeting: 'Hello, World!']
def r = this.renderer.render(specialPage, [], [], globals, '') def r = this.renderer.render(
specialPage,
[],
[],
new SiteSpec('', ''),
globals,
''
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@Test @Test
void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) { 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!')) .thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType , '') def part = new Part('test', partType , '')
def specialPage = new SpecialPage("<%= parts['test'].render() %>", 'test.gsp', null) 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) assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@ -45,7 +60,14 @@ class GspSpecialPageRendererTests {
@Test @Test
void rendersPartWithBinding(@Mock PartRenderer partRenderer) { void rendersPartWithBinding(@Mock PartRenderer partRenderer) {
when(partRenderer.render( 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!')) )).thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType, '') def part = new Part('test', partType, '')
@ -55,7 +77,14 @@ class GspSpecialPageRendererTests {
'test.gsp', 'test.gsp',
null null
) )
def r = this.renderer.render(specialPage, [], [part], [:], '') def r = this.renderer.render(
specialPage,
[],
[part],
new SiteSpec('', ''),
[:],
''
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('Hello, World!', r.v2) assertEquals('Hello, World!', r.v2)
} }
@ -72,7 +101,14 @@ class GspSpecialPageRendererTests {
'test.gsp', 'test.gsp',
null null
) )
def r = this.renderer.render(specialPage, [text], [], [:], '') def r = this.renderer.render(
specialPage,
[text],
[],
new SiteSpec('', ''),
[:],
''
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('<p><strong>Hello, World!</strong></p>\n', r.v2) assertEquals('<p><strong>Hello, World!</strong></p>\n', r.v2)
} }
@ -80,7 +116,14 @@ class GspSpecialPageRendererTests {
@Test @Test
void tagBuilderAvailable() { void tagBuilderAvailable() {
def specialPage = new SpecialPage('<%= tagBuilder.test() %>', 'test.gsp', null) 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) assertEmptyDiagnostics(r)
assertEquals('<test />', r.v2) assertEquals('<test />', r.v2)
} }
@ -88,7 +131,14 @@ class GspSpecialPageRendererTests {
@Test @Test
void pathAvailable() { void pathAvailable() {
def specialPage = new SpecialPage('<%= path %>', 'test.gsp', null) def specialPage = new SpecialPage('<%= path %>', 'test.gsp', null)
def r = this.renderer.render(specialPage, [], [], [:], '') def r = this.renderer.render(
specialPage,
[],
[],
new SiteSpec('', ''),
[:],
''
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('test.gsp', r.v2) assertEquals('test.gsp', r.v2)
} }
@ -100,7 +150,14 @@ class GspSpecialPageRendererTests {
'test.gsp', 'test.gsp',
null null
) )
def r = this.renderer.render(specialPage, [], [], [:], 'test.html') def r = this.renderer.render(
specialPage,
[],
[],
new SiteSpec('', ''),
[:],
'test.html'
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('images/test.jpg', r.v2) assertEquals('images/test.jpg', r.v2)
} }
@ -113,7 +170,12 @@ class GspSpecialPageRendererTests {
null null
) )
def r = this.renderer.render( def r = this.renderer.render(
specialPage, [], [], [:], 'test/test.html' specialPage,
[],
[],
new SiteSpec('', ''),
[:],
'test/test.html'
) )
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('../images/test.jpg', r.v2) assertEquals('../images/test.jpg', r.v2)
@ -126,7 +188,14 @@ class GspSpecialPageRendererTests {
'', '',
null null
) )
def r = this.renderer.render(specialPage, [], [], [:], 'test.html') def r = this.renderer.render(
specialPage,
[],
[],
new SiteSpec('', ''),
[:],
'test.html'
)
assertEmptyDiagnostics(r) assertEmptyDiagnostics(r)
assertEquals('test.html', r.v2) assertEquals('test.html', r.v2)
} }

View File

@ -1,5 +1,6 @@
package com.jessebrault.ssg.template package com.jessebrault.ssg.template
import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.part.PartRenderer import com.jessebrault.ssg.part.PartRenderer
import com.jessebrault.ssg.part.PartType import com.jessebrault.ssg.part.PartType
@ -31,7 +32,7 @@ class GspTemplateRendererTests {
null 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!')) .thenReturn(new Tuple2<>([], 'Hello, World!'))
def partType = new PartType([], partRenderer) def partType = new PartType([], partRenderer)
def part = new Part('test', partType, null) def part = new Part('test', partType, null)
@ -41,6 +42,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[part], [part],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -56,8 +58,17 @@ class GspTemplateRendererTests {
null null
) )
when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any(), any(), any(), any())) when(partRenderer.render(
.thenReturn(new Tuple2<>([], 'Hello, World!')) 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 partType = new PartType([], partRenderer)
def part = new Part('greeting', partType, null) def part = new Part('greeting', partType, null)
@ -66,6 +77,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[part], [part],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -81,6 +93,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [title: ['Hello!']]), new FrontMatter(null, [title: ['Hello!']]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -96,6 +109,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[test: 'Hello, World!'], [test: 'Hello, World!'],
'' ''
) )
@ -111,6 +125,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
renderableText('Hello, World!'), renderableText('Hello, World!'),
[], [],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -126,6 +141,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -141,6 +157,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
textWithPath('test.md'), textWithPath('test.md'),
[], [],
new SiteSpec('', ''),
[:], [:],
'' ''
) )
@ -156,6 +173,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[:], [:],
'test.html' 'test.html'
) )
@ -171,6 +189,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[:], [:],
'test/test.html' 'test/test.html'
) )
@ -178,6 +197,22 @@ class GspTemplateRendererTests {
assertEquals('../images/test.jpg', r.v2) 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 @Test
void targetPathAvailable() { void targetPathAvailable() {
def template = new Template('<%= targetPath %>', null, null) def template = new Template('<%= targetPath %>', null, null)
@ -186,6 +221,7 @@ class GspTemplateRendererTests {
new FrontMatter(null, [:]), new FrontMatter(null, [:]),
blankText(), blankText(),
[], [],
new SiteSpec('', ''),
[:], [:],
'test.html' 'test.html'
) )

View File

@ -3,8 +3,8 @@ package com.jessebrault.ssg.url
class PathBasedUrlBuilderTests extends AbstractUrlBuilderTests { class PathBasedUrlBuilderTests extends AbstractUrlBuilderTests {
@Override @Override
protected UrlBuilder getUrlBuilder(String targetPath) { protected UrlBuilder getUrlBuilder(String targetPath, String baseUrl) {
new PathBasedUrlBuilder(targetPath) new PathBasedUrlBuilder(targetPath, baseUrl)
} }
} }

View File

@ -6,11 +6,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals
abstract class AbstractUrlBuilderTests { abstract class AbstractUrlBuilderTests {
protected abstract UrlBuilder getUrlBuilder(String targetPath); protected abstract UrlBuilder getUrlBuilder(String targetPath, String baseUrl);
@Test @Test
void upDownDown() { 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')) assertEquals('../images/test.jpg', builder.relative('images/test.jpg'))
} }
@ -18,7 +18,7 @@ abstract class AbstractUrlBuilderTests {
void downDown() { void downDown() {
assertEquals( assertEquals(
'images/test.jpg', '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() { void upUpDownDown() {
assertEquals( assertEquals(
'../../images/test.jpg', '../../images/test.jpg',
this.getUrlBuilder('posts/old/test.html').relative('images/test.jpg') this.getUrlBuilder('posts/old/test.html', '').relative('images/test.jpg')
) )
} }
@Test @Test
void absoluteMatchesTargetPath() { void absoluteMatchesTargetPath() {
assertEquals( assertEquals(
'test/test.html', 'https://test.com/test/test.html',
this.getUrlBuilder('test/test.html').absolute this.getUrlBuilder('test/test.html', 'https://test.com').absolute
) )
} }