Working on GroovyBuildScriptRunner tests.
This commit is contained in:
parent
f5f5bf9f6c
commit
7ec9107165
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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, [])
|
||||
}
|
||||
|
||||
}
|
@ -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() {}
|
||||
|
||||
}
|
@ -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()
|
||||
}
|
||||
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
@ -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'
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
</Console>
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="debug">
|
||||
<Root level="trace">
|
||||
<AppenderRef ref="standard" />
|
||||
</Root>
|
||||
</Loggers>
|
||||
|
@ -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)
|
||||
|
@ -4,7 +4,7 @@ import groovy.transform.BaseScript
|
||||
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
||||
|
||||
@BaseScript
|
||||
final BuildScriptBase base = null
|
||||
BuildScriptBase base
|
||||
|
||||
allBuilds {
|
||||
siteSpec {
|
||||
|
Loading…
Reference in New Issue
Block a user