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 package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.Config 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 import groovy.transform.TupleConstructor
abstract class BuildScriptBase extends Script { 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) @TupleConstructor(includeFields = true, defaults = false)
static class GlobalsConfigurator { static class GlobalsClosureDelegate {
private final Map globals private final Map globals
@ -26,19 +66,19 @@ abstract class BuildScriptBase extends Script {
Map globals Map globals
void config( void config(
@DelegatesTo(value = Config, strategy = Closure.DELEGATE_FIRST) @DelegatesTo(value = ConfigClosureDelegate, strategy = Closure.DELEGATE_FIRST)
Closure configClosure Closure configClosure
) { ) {
configClosure.setDelegate(this.config) configClosure.setDelegate(new ConfigClosureDelegate(this.config))
configClosure.setResolveStrategy(Closure.DELEGATE_FIRST) configClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
configClosure.run() configClosure.run()
} }
void globals( void globals(
@DelegatesTo(value = GlobalsConfigurator, strategy = Closure.DELEGATE_FIRST) @DelegatesTo(value = GlobalsClosureDelegate, strategy = Closure.DELEGATE_FIRST)
Closure globalsClosure Closure globalsClosure
) { ) {
def globalsConfigurator = new GlobalsConfigurator(this.globals) def globalsConfigurator = new GlobalsClosureDelegate(this.globals)
globalsClosure.setDelegate(globalsConfigurator) globalsClosure.setDelegate(globalsConfigurator)
globalsClosure.setResolveStrategy(Closure.DELEGATE_FIRST) globalsClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
globalsClosure.run() globalsClosure.run()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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