TaskFactories result is now included in BuildSpecUtil.toBuild. All tests passing.

This commit is contained in:
JesseBrault0709 2023-05-14 22:07:29 +02:00
parent 594ed8ba7d
commit 5eaa32f536
8 changed files with 94 additions and 30 deletions

View File

@ -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
)
}

View File

@ -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

View File

@ -0,0 +1,7 @@
package com.jessebrault.ssg.util
import java.util.function.BiPredicate
interface Eq<T> {
BiPredicate<T, T> getAreEqual()
}

View 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)
}
}

View File

@ -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() {}
}

View 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
}

View File

@ -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)
}
}
}

View File

@ -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) {
[