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.Build.AllBuilds
|
||||||
import com.jessebrault.ssg.buildscript.dsl.AllBuildsDelegate
|
import com.jessebrault.ssg.buildscript.dsl.AllBuildsDelegate
|
||||||
import com.jessebrault.ssg.buildscript.dsl.BuildDelegate
|
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 {
|
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<AllBuildsDelegate> allBuildsDelegates = []
|
||||||
private final Collection<BuildDelegate> buildDelegates = []
|
private final Collection<BuildDelegate> buildDelegates = []
|
||||||
|
|
||||||
@ -17,7 +25,9 @@ abstract class BuildScriptBase extends Script {
|
|||||||
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
|
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
|
||||||
Closure<?> buildClosure
|
Closure<?> buildClosure
|
||||||
) {
|
) {
|
||||||
|
logger.trace(enter, 'buildClosure: {}', buildClosure)
|
||||||
this.build('build' + this.currentBuildNumber, buildClosure)
|
this.build('build' + this.currentBuildNumber, buildClosure)
|
||||||
|
logger.trace(exit, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
void build(
|
void build(
|
||||||
@ -25,6 +35,7 @@ abstract class BuildScriptBase extends Script {
|
|||||||
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
|
@DelegatesTo(value = BuildDelegate, strategy = Closure.DELEGATE_FIRST)
|
||||||
Closure<?> buildClosure
|
Closure<?> buildClosure
|
||||||
) {
|
) {
|
||||||
|
logger.trace(enter, 'name: {}, buildClosure: {}', name, buildClosure)
|
||||||
def d = new BuildDelegate().tap {
|
def d = new BuildDelegate().tap {
|
||||||
it.name = name
|
it.name = name
|
||||||
}
|
}
|
||||||
@ -33,29 +44,35 @@ abstract class BuildScriptBase extends Script {
|
|||||||
buildClosure()
|
buildClosure()
|
||||||
this.buildDelegates << d
|
this.buildDelegates << d
|
||||||
this.currentBuildNumber++
|
this.currentBuildNumber++
|
||||||
|
logger.trace(exit, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
void allBuilds(
|
void allBuilds(
|
||||||
@DelegatesTo(value = AllBuildsDelegate, strategy = Closure.DELEGATE_FIRST)
|
@DelegatesTo(value = AllBuildsDelegate, strategy = Closure.DELEGATE_FIRST)
|
||||||
Closure<?> allBuildsClosure
|
Closure<?> allBuildsClosure
|
||||||
) {
|
) {
|
||||||
|
logger.trace(enter, 'allBuildsClosure: {}', allBuildsClosure)
|
||||||
def d = new AllBuildsDelegate()
|
def d = new AllBuildsDelegate()
|
||||||
allBuildsClosure.setDelegate(d)
|
allBuildsClosure.setDelegate(d)
|
||||||
allBuildsClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
|
allBuildsClosure.setResolveStrategy(Closure.DELEGATE_FIRST)
|
||||||
allBuildsClosure()
|
allBuildsClosure()
|
||||||
this.allBuildsDelegates << d
|
this.allBuildsDelegates << d
|
||||||
|
logger.trace(exit, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<Build> getBuilds() {
|
Collection<Build> getBuilds() {
|
||||||
|
logger.trace(enter, '')
|
||||||
def allBuilds = this.defaultAllBuilds
|
def allBuilds = this.defaultAllBuilds
|
||||||
this.allBuildsDelegates.each {
|
this.allBuildsDelegates.each {
|
||||||
allBuilds += it.getResult()
|
allBuilds += it.getResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
def baseBuild = Build.from(allBuilds)
|
def baseBuild = Build.from(allBuilds)
|
||||||
this.buildDelegates.collect {
|
def result = this.buildDelegates.collect {
|
||||||
baseBuild + it.getResult()
|
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>
|
</Console>
|
||||||
</Appenders>
|
</Appenders>
|
||||||
<Loggers>
|
<Loggers>
|
||||||
<Root level="debug">
|
<Root level="trace">
|
||||||
<AppenderRef ref="standard" />
|
<AppenderRef ref="standard" />
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.jessebrault.ssg
|
package com.jessebrault.ssg
|
||||||
|
|
||||||
import com.jessebrault.ssg.buildscript.Build
|
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.buildscript.DefaultBuildScriptConfiguratorFactory
|
||||||
import com.jessebrault.ssg.util.Diagnostic
|
import com.jessebrault.ssg.util.Diagnostic
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
@ -21,6 +21,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
|
|||||||
)
|
)
|
||||||
protected Collection<String> requestedBuilds = ['default']
|
protected Collection<String> requestedBuilds = ['default']
|
||||||
|
|
||||||
|
// TODO: fix URLs for script, etc.
|
||||||
@CommandLine.Option(
|
@CommandLine.Option(
|
||||||
names = ['-s', '--script', '--buildScript'],
|
names = ['-s', '--script', '--buildScript'],
|
||||||
description = 'The build script file to execute.',
|
description = 'The build script file to execute.',
|
||||||
@ -33,7 +34,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
|
|||||||
if (buildScriptFile.exists()) {
|
if (buildScriptFile.exists()) {
|
||||||
logger.info('found buildScriptFile: {}', buildScriptFile)
|
logger.info('found buildScriptFile: {}', buildScriptFile)
|
||||||
def configuratorFactory = new DefaultBuildScriptConfiguratorFactory()
|
def configuratorFactory = new DefaultBuildScriptConfiguratorFactory()
|
||||||
this.availableBuilds = BuildScriptUtil.runBuildScript(buildScriptFile.path) {
|
this.availableBuilds = new GroovyBuildScriptRunner().runBuildScript(null, null, []) { // TODO
|
||||||
configuratorFactory.get().accept(it)
|
configuratorFactory.get().accept(it)
|
||||||
}
|
}
|
||||||
logger.debug('after running buildScriptFile {}, builds: {}', buildScriptFile, this.availableBuilds)
|
logger.debug('after running buildScriptFile {}, builds: {}', buildScriptFile, this.availableBuilds)
|
||||||
|
@ -4,7 +4,7 @@ import groovy.transform.BaseScript
|
|||||||
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
||||||
|
|
||||||
@BaseScript
|
@BaseScript
|
||||||
final BuildScriptBase base = null
|
BuildScriptBase base
|
||||||
|
|
||||||
allBuilds {
|
allBuilds {
|
||||||
siteSpec {
|
siteSpec {
|
||||||
|
Loading…
Reference in New Issue
Block a user