Script config closure delegate and script auto imports.

This commit is contained in:
JesseBrault0709 2023-01-07 21:38:37 -06:00
parent 92515785a0
commit dd5ccc55e9
10 changed files with 80 additions and 5 deletions

View File

@ -1,12 +1,52 @@
package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.Config
import com.jessebrault.ssg.part.PartType
import com.jessebrault.ssg.specialpage.SpecialPageType
import com.jessebrault.ssg.template.TemplateType
import com.jessebrault.ssg.text.TextType
import groovy.transform.TupleConstructor
abstract class BuildScriptBase extends Script {
static class ConfigClosureDelegate {
@Delegate
private final Config config
private final Collection<TextType> defaultTextTypes
private final Collection<TemplateType> defaultTemplateTypes
private final Collection<PartType> defaultPartTypes
private final Collection<SpecialPageType> defaultSpecialPageTypes
ConfigClosureDelegate(Config config) {
this.config = config
this.defaultTextTypes = this.config.textProviders.collectMany { it.textTypes }
this.defaultTemplateTypes = this.config.templatesProviders.collectMany { it.templateTypes }
this.defaultPartTypes = this.config.partsProviders.collectMany { it.partTypes }
this.defaultSpecialPageTypes = this.config.specialPagesProviders.collectMany { it.specialPageTypes }
}
Collection<TextType> getDefaultTextTypes() {
this.defaultTextTypes
}
Collection<TemplateType> getDefaultTemplateTypes() {
this.defaultTemplateTypes
}
Collection<PartType> getDefaultPartTypes() {
this.defaultPartTypes
}
Collection<SpecialPageType> getDefaultSpecialPageTypes() {
this.defaultSpecialPageTypes
}
}
@TupleConstructor(includeFields = true, defaults = false)
static class GlobalsConfigurator {
static class GlobalsClosureDelegate {
private final Map globals
@ -26,19 +66,19 @@ abstract class BuildScriptBase extends Script {
Map globals
void config(
@DelegatesTo(value = Config, strategy = Closure.DELEGATE_FIRST)
@DelegatesTo(value = ConfigClosureDelegate, strategy = Closure.DELEGATE_FIRST)
Closure configClosure
) {
configClosure.setDelegate(this.config)
configClosure.setDelegate(new ConfigClosureDelegate(this.config))
configClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
configClosure.run()
}
void globals(
@DelegatesTo(value = GlobalsConfigurator, strategy = Closure.DELEGATE_FIRST)
@DelegatesTo(value = GlobalsClosureDelegate, strategy = Closure.DELEGATE_FIRST)
Closure globalsClosure
) {
def globalsConfigurator = new GlobalsConfigurator(this.globals)
def globalsConfigurator = new GlobalsClosureDelegate(this.globals)
globalsClosure.setDelegate(globalsConfigurator)
globalsClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
globalsClosure.run()

View File

@ -2,6 +2,7 @@ package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.Config
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
class GroovyBuildScriptRunner implements BuildScriptRunner {
@ -11,6 +12,16 @@ class GroovyBuildScriptRunner implements BuildScriptRunner {
Objects.requireNonNull(globals)
def engine = new GroovyScriptEngine([new File('.').toURI().toURL()] as URL[])
engine.config = new CompilerConfiguration().tap {
addCompilationCustomizers(new ImportCustomizer().tap {
addStarImports(
'com.jessebrault.ssg',
'com.jessebrault.ssg.part',
'com.jessebrault.ssg.specialpage',
'com.jessebrault.ssg.template',
'com.jessebrault.ssg.text',
'com.jessebrault.ssg.util'
)
})
scriptBaseClass = 'com.jessebrault.ssg.buildscript.BuildScriptBase'
}
def buildScript = engine.createScript('build.groovy', new Binding())

View File

@ -42,4 +42,9 @@ class PartFilePartsProvider implements PartsProvider {
parts
}
@Override
Collection<PartType> getPartTypes() {
this.partTypes
}
}

View File

@ -2,4 +2,5 @@ package com.jessebrault.ssg.part
interface PartsProvider {
Collection<Part> getParts()
Collection<PartType> getPartTypes()
}

View File

@ -44,4 +44,9 @@ class SpecialPageFileSpecialPagesProvider implements SpecialPagesProvider {
specialPages
}
@Override
Collection<SpecialPageType> getSpecialPageTypes() {
this.specialPageTypes
}
}

View File

@ -2,4 +2,5 @@ package com.jessebrault.ssg.specialpage
interface SpecialPagesProvider {
Collection<SpecialPage> getSpecialPages()
Collection<SpecialPageType> getSpecialPageTypes()
}

View File

@ -41,4 +41,9 @@ class TemplateFileTemplatesProvider implements TemplatesProvider {
templates
}
@Override
Collection<TemplateType> getTemplateTypes() {
this.templateTypes
}
}

View File

@ -2,4 +2,5 @@ package com.jessebrault.ssg.template
interface TemplatesProvider {
Collection<Template> getTemplates()
Collection<TemplateType> getTemplateTypes()
}

View File

@ -44,4 +44,9 @@ class TextFileTextsProvider implements TextsProvider {
textFiles
}
@Override
Collection<TextType> getTextTypes() {
this.textTypes
}
}

View File

@ -2,4 +2,5 @@ package com.jessebrault.ssg.text
interface TextsProvider {
Collection<Text> getTextFiles()
Collection<TextType> getTextTypes()
}