Working on GroovyBuildScriptRunner tests.

This commit is contained in:
JesseBrault0709 2023-04-30 12:51:07 +02:00
parent f5f5bf9f6c
commit 7ec9107165
9 changed files with 146 additions and 44 deletions

View File

@ -3,9 +3,17 @@ package com.jessebrault.ssg.buildscript
import com.jessebrault.ssg.buildscript.Build.AllBuilds
import com.jessebrault.ssg.buildscript.dsl.AllBuildsDelegate
import com.jessebrault.ssg.buildscript.dsl.BuildDelegate
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.slf4j.Marker
import org.slf4j.MarkerFactory
abstract class BuildScriptBase extends Script {
private static final Logger logger = LoggerFactory.getLogger(BuildScriptBase)
private static final Marker enter = MarkerFactory.getMarker('ENTER')
private static final Marker exit = MarkerFactory.getMarker('EXIT')
private final Collection<AllBuildsDelegate> allBuildsDelegates = []
private final Collection<BuildDelegate> buildDelegates = []
@ -17,7 +25,9 @@ abstract class BuildScriptBase extends Script {
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
Closure<?> buildClosure
) {
logger.trace(enter, 'buildClosure: {}', buildClosure)
this.build('build' + this.currentBuildNumber, buildClosure)
logger.trace(exit, '')
}
void build(
@ -25,6 +35,7 @@ abstract class BuildScriptBase extends Script {
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
Closure<?> buildClosure
) {
logger.trace(enter, 'name: {}, buildClosure: {}', name, buildClosure)
def d = new BuildDelegate().tap {
it.name = name
}
@ -33,29 +44,35 @@ abstract class BuildScriptBase extends Script {
buildClosure()
this.buildDelegates << d
this.currentBuildNumber++
logger.trace(exit, '')
}
void allBuilds(
@DelegatesTo(value = AllBuildsDelegate, strategy = Closure.DELEGATE_FIRST)
Closure<?> allBuildsClosure
) {
logger.trace(enter, 'allBuildsClosure: {}', allBuildsClosure)
def d = new AllBuildsDelegate()
allBuildsClosure.setDelegate(d)
allBuildsClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
allBuildsClosure()
this.allBuildsDelegates << d
logger.trace(exit, '')
}
Collection<Build> getBuilds() {
logger.trace(enter, '')
def allBuilds = this.defaultAllBuilds
this.allBuildsDelegates.each {
allBuilds += it.getResult()
}
def baseBuild = Build.from(allBuilds)
this.buildDelegates.collect {
def result = this.buildDelegates.collect {
baseBuild + it.getResult()
}
logger.trace(exit, 'result: {}', result)
result
}
}

View File

@ -0,0 +1,29 @@
package com.jessebrault.ssg.buildscript
import java.util.function.Consumer
interface BuildScriptRunner {
Collection<Build> runBuildScript(
String scriptName,
URL scriptBaseDirUrl,
Collection<URL> otherUrls,
Consumer<BuildScriptBase> configureBuildScript
)
default Collection<Build> runBuildScript(
String scriptName,
URL scriptBaseDirUrl,
Collection<URL> otherUrls
) {
this.runBuildScript(scriptName, scriptBaseDirUrl, otherUrls) { }
}
default Collection<Build> runBuildScript(
String scriptName,
URL scriptBaseDirUrl
) {
this.runBuildScript(scriptName, scriptBaseDirUrl, [])
}
}

View File

@ -1,39 +0,0 @@
package com.jessebrault.ssg.buildscript
import groovy.transform.NullCheck
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
import java.util.function.Consumer
@NullCheck
final class BuildScriptUtil {
// TODO: check exactly what we are importing to the script automatically
// TODO: check the roots arg, do we include 'ssgBuilds'/'buildSrc' dir eventually?
static Collection<Build> runBuildScript(String relativePath, Consumer<BuildScriptBase> configureBuildScript) {
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.page',
'com.jessebrault.ssg.template',
'com.jessebrault.ssg.text',
'com.jessebrault.ssg.util'
)
})
scriptBaseClass = 'com.jessebrault.ssg.buildscript.BuildScriptBase'
}
def buildScript = engine.createScript(relativePath, new Binding())
assert buildScript instanceof BuildScriptBase
configureBuildScript.accept(buildScript)
buildScript()
buildScript.getBuilds()
}
private BuildScriptUtil() {}
}

View File

@ -0,0 +1,31 @@
package com.jessebrault.ssg.buildscript
import groovy.transform.NullCheck
import org.codehaus.groovy.control.CompilerConfiguration
import java.util.function.Consumer
@NullCheck
final class GroovyBuildScriptRunner implements BuildScriptRunner {
@Override
Collection<Build> runBuildScript(
String scriptName,
URL scriptBaseDirUrl,
Collection<URL> otherUrls,
Consumer<BuildScriptBase> configureBuildScript
) {
def engine = new GroovyScriptEngine([scriptBaseDirUrl, *otherUrls] as URL[])
engine.config = new CompilerConfiguration().tap {
scriptBaseClass = 'com.jessebrault.ssg.buildscript.BuildScriptBase'
}
def buildScript = engine.createScript(scriptName, new Binding())
assert buildScript instanceof BuildScriptBase
configureBuildScript.accept(buildScript)
buildScript.run()
buildScript.getBuilds()
}
}

View File

@ -0,0 +1,46 @@
package com.jessebrault.ssg.buildscript
import groovy.transform.NullCheck
import org.junit.jupiter.api.Test
import static org.junit.jupiter.api.Assertions.assertEquals
@NullCheck
final class GroovyBuildScriptRunnerTests {
/**
* Must be non-static, otherwise Groovy gets confused inside the Closures.
*/
@SuppressWarnings('GrMethodMayBeStatic')
private void copyLocalResourceToWriter(String name, Writer target) {
GroovyBuildScriptRunnerTests.getResourceAsStream(name).withReader {
it.transferTo(target)
}
}
/**
* Must be non-static, otherwise Groovy gets confused inside the Closures.
*/
@SuppressWarnings('GrMethodMayBeStatic')
private File setupScriptEnvironment(Collection<String> resourceNames) {
def tempDir = File.createTempDir()
new FileTreeBuilder(tempDir).tap {
resourceNames.each { String resourceName ->
file(resourceName).withWriter {
this.copyLocalResourceToWriter(resourceName, it)
}
}
}
tempDir
}
@Test
void simpleScript() {
def baseDir = this.setupScriptEnvironment(['simple.groovy'])
def runner = new GroovyBuildScriptRunner()
def builds = runner.runBuildScript('simple.groovy', baseDir.toURI().toURL(), [])
assertEquals(1, builds.size())
assertEquals('test', builds[0].name)
}
}

View File

@ -0,0 +1,17 @@
package com.jessebrault.ssg.buildscript
import groovy.transform.BaseScript
import org.slf4j.Logger
import org.slf4j.LoggerFactory
@BaseScript
BuildScriptBase base
final Logger logger = LoggerFactory.getLogger('simple.groovy')
logger.debug('executing simple buildScript')
build {
name = 'test'
}

View File

@ -10,7 +10,7 @@
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<Root level="trace">
<AppenderRef ref="standard" />
</Root>
</Loggers>

View File

@ -1,7 +1,7 @@
package com.jessebrault.ssg
import com.jessebrault.ssg.buildscript.Build
import com.jessebrault.ssg.buildscript.BuildScriptUtil
import com.jessebrault.ssg.buildscript.GroovyBuildScriptRunner
import com.jessebrault.ssg.buildscript.DefaultBuildScriptConfiguratorFactory
import com.jessebrault.ssg.util.Diagnostic
import org.apache.logging.log4j.LogManager
@ -21,6 +21,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
)
protected Collection<String> requestedBuilds = ['default']
// TODO: fix URLs for script, etc.
@CommandLine.Option(
names = ['-s', '--script', '--buildScript'],
description = 'The build script file to execute.',
@ -33,7 +34,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
if (buildScriptFile.exists()) {
logger.info('found buildScriptFile: {}', buildScriptFile)
def configuratorFactory = new DefaultBuildScriptConfiguratorFactory()
this.availableBuilds = BuildScriptUtil.runBuildScript(buildScriptFile.path) {
this.availableBuilds = new GroovyBuildScriptRunner().runBuildScript(null, null, []) { // TODO
configuratorFactory.get().accept(it)
}
logger.debug('after running buildScriptFile {}, builds: {}', buildScriptFile, this.availableBuilds)

View File

@ -4,7 +4,7 @@ import groovy.transform.BaseScript
import com.jessebrault.ssg.buildscript.BuildScriptBase
@BaseScript
final BuildScriptBase base = null
BuildScriptBase base
allBuilds {
siteSpec {