TaskFactories result is now included in BuildSpecUtil.toBuild. All tests passing.
This commit is contained in:
parent
594ed8ba7d
commit
5eaa32f536
@ -2,6 +2,8 @@ package com.jessebrault.ssg.buildscript
|
||||
|
||||
import com.jessebrault.ssg.SiteSpec
|
||||
import com.jessebrault.ssg.buildscript.delegates.BuildDelegate
|
||||
import com.jessebrault.ssg.task.TaskFactory
|
||||
import com.jessebrault.ssg.task.TaskFactorySpec
|
||||
import com.jessebrault.ssg.util.Monoid
|
||||
import com.jessebrault.ssg.util.Monoids
|
||||
import com.jessebrault.ssg.util.Zero
|
||||
@ -19,6 +21,13 @@ final class BuildSpecUtil {
|
||||
private static final Marker enter = MarkerFactory.getMarker('ENTER')
|
||||
private static final Marker exit = MarkerFactory.getMarker('EXIT')
|
||||
|
||||
private static final Monoid<Map<String, Object>> globalsMonoid = Monoids.of([:]) { m0, m1 ->
|
||||
m0 + m1
|
||||
}
|
||||
|
||||
private static final Monoid<Collection<TaskFactorySpec<TaskFactory>>> taskFactoriesMonoid =
|
||||
Monoids.getMergeCollectionMonoid(TaskFactorySpec.SAME_NAME_AND_SUPPLIER_EQ, TaskFactorySpec.DEFAULT_SEMIGROUP)
|
||||
|
||||
private static <T> T reduceResults(
|
||||
Collection<BuildDelegate.Results> resultsCollection,
|
||||
Zero<T> tZero,
|
||||
@ -40,12 +49,6 @@ final class BuildSpecUtil {
|
||||
}
|
||||
}
|
||||
|
||||
private static Monoid<Map<String, Object>> getGlobalsMonoid() {
|
||||
Monoids.of([:]) { m0, m1 ->
|
||||
m0 + m1
|
||||
}
|
||||
}
|
||||
|
||||
private static Build toBuild(
|
||||
Collection<BuildSpec> specs
|
||||
) {
|
||||
@ -59,15 +62,26 @@ final class BuildSpecUtil {
|
||||
def siteSpecResult = reduceResults(allResults, SiteSpec.DEFAULT_MONOID) { acc, r ->
|
||||
r.getSiteSpecResult(acc, true, SiteSpec.DEFAULT_MONOID)
|
||||
}
|
||||
def globalsResult = reduceResults(allResults, getGlobalsMonoid()) { acc, r ->
|
||||
r.getGlobalsResult(acc, true, getGlobalsMonoid())
|
||||
def globalsResult = reduceResults(allResults, globalsMonoid) { acc, r ->
|
||||
r.getGlobalsResult(acc, true, globalsMonoid)
|
||||
}
|
||||
|
||||
def typesResult = reduceResults(allResults, TypesContainer.DEFAULT_MONOID) { acc, r ->
|
||||
r.getTypesResult(acc, true, TypesContainer.DEFAULT_MONOID)
|
||||
}
|
||||
def sourcesResult = reduceResults(allResults, SourceProviders.DEFAULT_MONOID) { acc, r ->
|
||||
r.getSourcesResult(acc, true, SourceProviders.DEFAULT_MONOID, typesResult)
|
||||
}
|
||||
def taskFactoriesResult = reduceResults(allResults, taskFactoriesMonoid) { acc, r ->
|
||||
r.getTaskFactoriesResult(acc, true, taskFactoriesMonoid, sourcesResult)
|
||||
}
|
||||
|
||||
new Build(
|
||||
specs[0].name,
|
||||
outputDirFunctionResult,
|
||||
siteSpecResult,
|
||||
globalsResult,
|
||||
[] // TODO
|
||||
taskFactoriesResult
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.jessebrault.ssg.task
|
||||
|
||||
import com.jessebrault.ssg.util.Eq
|
||||
import com.jessebrault.ssg.util.Eqs
|
||||
import com.jessebrault.ssg.util.Semigroup
|
||||
import com.jessebrault.ssg.util.Semigroups
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
@ -17,7 +19,9 @@ import java.util.function.Supplier
|
||||
@EqualsAndHashCode
|
||||
final class TaskFactorySpec<T extends TaskFactory> {
|
||||
|
||||
static Semigroup<TaskFactorySpec<TaskFactory>> DEFAULT_SEMIGROUP = Semigroups.of(TaskFactorySpec::concat)
|
||||
static final Semigroup<TaskFactorySpec<TaskFactory>> DEFAULT_SEMIGROUP = Semigroups.of(TaskFactorySpec::concat)
|
||||
|
||||
static final Eq<TaskFactorySpec<TaskFactory>> SAME_NAME_AND_SUPPLIER_EQ = Eqs.of(TaskFactorySpec::areSame)
|
||||
|
||||
static <T extends TaskFactory> TaskFactorySpec<T> concat(TaskFactorySpec<T> spec0, TaskFactorySpec<T> spec1) {
|
||||
if (spec0.name != spec1.name) {
|
||||
@ -29,6 +33,10 @@ final class TaskFactorySpec<T extends TaskFactory> {
|
||||
new TaskFactorySpec(spec0.name, spec0.supplier, spec0.configurators + spec1.configurators)
|
||||
}
|
||||
|
||||
static boolean areSame(TaskFactorySpec<TaskFactory> spec0, TaskFactorySpec<TaskFactory> spec1) {
|
||||
spec0.name == spec1.name && spec0.supplier == spec1.supplier
|
||||
}
|
||||
|
||||
final String name
|
||||
final Supplier<T> supplier
|
||||
final Collection<Consumer<T>> configurators
|
||||
|
7
api/src/main/groovy/com/jessebrault/ssg/util/Eq.groovy
Normal file
7
api/src/main/groovy/com/jessebrault/ssg/util/Eq.groovy
Normal file
@ -0,0 +1,7 @@
|
||||
package com.jessebrault.ssg.util
|
||||
|
||||
import java.util.function.BiPredicate
|
||||
|
||||
interface Eq<T> {
|
||||
BiPredicate<T, T> getAreEqual()
|
||||
}
|
11
api/src/main/groovy/com/jessebrault/ssg/util/Eqs.groovy
Normal file
11
api/src/main/groovy/com/jessebrault/ssg/util/Eqs.groovy
Normal file
@ -0,0 +1,11 @@
|
||||
package com.jessebrault.ssg.util
|
||||
|
||||
import java.util.function.BiPredicate
|
||||
|
||||
final class Eqs {
|
||||
|
||||
static <T> Eq<T> of(BiPredicate<T, T> areEqual) {
|
||||
new SimpleEq<>(areEqual)
|
||||
}
|
||||
|
||||
}
|
@ -11,6 +11,23 @@ final class Monoids {
|
||||
new SimpleMonoid<>(zero, concat)
|
||||
}
|
||||
|
||||
static <T> Monoid<Collection<T>> getMergeCollectionMonoid(Eq<T> tEq, Semigroup<T> tSemigroup) {
|
||||
new SimpleMonoid<>([], { Collection<T> c0, Collection<T> c1 ->
|
||||
def r = [] as Collection<T>
|
||||
r.addAll(c0)
|
||||
c1.each { T t ->
|
||||
def sameT = r.find { tEq.areEqual.test(it, t) }
|
||||
if (sameT != null) {
|
||||
r.remove(sameT)
|
||||
r << tSemigroup.concat.apply(sameT, t)
|
||||
} else {
|
||||
r << t
|
||||
}
|
||||
}
|
||||
r
|
||||
})
|
||||
}
|
||||
|
||||
private Monoids() {}
|
||||
|
||||
}
|
||||
|
16
api/src/main/groovy/com/jessebrault/ssg/util/SimpleEq.groovy
Normal file
16
api/src/main/groovy/com/jessebrault/ssg/util/SimpleEq.groovy
Normal file
@ -0,0 +1,16 @@
|
||||
package com.jessebrault.ssg.util
|
||||
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.NullCheck
|
||||
import groovy.transform.PackageScope
|
||||
import groovy.transform.TupleConstructor
|
||||
|
||||
import java.util.function.BiPredicate
|
||||
|
||||
@PackageScope
|
||||
@TupleConstructor(defaults = false)
|
||||
@NullCheck(includeGenerated = true)
|
||||
@EqualsAndHashCode
|
||||
final class SimpleEq<T> implements Eq<T> {
|
||||
final BiPredicate<T, T> areEqual
|
||||
}
|
@ -1,20 +1,23 @@
|
||||
import com.jessebrault.ssg.buildscript.Build
|
||||
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
||||
import com.jessebrault.ssg.buildscript.OutputDir
|
||||
import com.jessebrault.ssg.html.TextToHtmlSpec
|
||||
import com.jessebrault.ssg.html.TextToHtmlSpecProviders
|
||||
import com.jessebrault.ssg.html.TextToHtmlTaskFactory
|
||||
import com.jessebrault.ssg.provider.CollectionProviders
|
||||
import com.jessebrault.ssg.template.TemplateTypes
|
||||
import com.jessebrault.ssg.template.TemplatesProviders
|
||||
import com.jessebrault.ssg.text.TextTypes
|
||||
import com.jessebrault.ssg.text.TextsProviders
|
||||
import com.jessebrault.ssg.util.ExtensionUtil
|
||||
import com.jessebrault.ssg.util.Result
|
||||
import groovy.transform.BaseScript
|
||||
|
||||
@BaseScript
|
||||
BuildScriptBase b
|
||||
|
||||
final class Args {
|
||||
File sourceDir
|
||||
}
|
||||
|
||||
def args = args as Args
|
||||
|
||||
build(name: 'test') {
|
||||
outputDirFunction = { Build build -> new OutputDir(new File(args.sourceDir, 'build')) }
|
||||
|
||||
@ -22,27 +25,15 @@ build(name: 'test') {
|
||||
textTypes << TextTypes.MARKDOWN
|
||||
templateTypes << TemplateTypes.GSP
|
||||
}
|
||||
|
||||
sources { base, types ->
|
||||
texts TextsProviders.from(new File(args.sourceDir, 'texts'), types.textTypes)
|
||||
templates TemplatesProviders.from(new File(args.sourceDir, 'templates'), types.templateTypes)
|
||||
}
|
||||
|
||||
taskFactories { base, sources ->
|
||||
register('textToHtml', TextToHtmlTaskFactory::new) {
|
||||
it.specProvider += CollectionProviders.fromSupplier {
|
||||
def templates = sources.templatesProvider.provide()
|
||||
return sources.textsProvider.provide().collect {
|
||||
def frontMatterResult = it.type.frontMatterGetter.get(it)
|
||||
if (frontMatterResult.hasDiagnostics()) {
|
||||
return Result.ofDiagnostics(frontMatterResult.diagnostics)
|
||||
}
|
||||
def desiredTemplate = frontMatterResult.get().get('template')
|
||||
def template = templates.find { it.path == desiredTemplate }
|
||||
if (template == null) {
|
||||
throw new IllegalArgumentException('template is null')
|
||||
}
|
||||
return Result.of(new TextToHtmlSpec(it, template, ExtensionUtil.stripExtension(it.path) + '.html'))
|
||||
}
|
||||
}
|
||||
it.specProvider += TextToHtmlSpecProviders.from(sources)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals
|
||||
|
||||
final class FileAssertions {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ResourceUtil)
|
||||
private static final Logger logger = LoggerFactory.getLogger(FileAssertions)
|
||||
|
||||
private static Map<String, Object> fileToMap(File file) {
|
||||
[
|
||||
|
Loading…
Reference in New Issue
Block a user