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.SiteSpec
import com.jessebrault.ssg.buildscript.delegates.BuildDelegate 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.Monoid
import com.jessebrault.ssg.util.Monoids import com.jessebrault.ssg.util.Monoids
import com.jessebrault.ssg.util.Zero 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 enter = MarkerFactory.getMarker('ENTER')
private static final Marker exit = MarkerFactory.getMarker('EXIT') 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( private static <T> T reduceResults(
Collection<BuildDelegate.Results> resultsCollection, Collection<BuildDelegate.Results> resultsCollection,
Zero<T> tZero, 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( private static Build toBuild(
Collection<BuildSpec> specs Collection<BuildSpec> specs
) { ) {
@ -59,15 +62,26 @@ final class BuildSpecUtil {
def siteSpecResult = reduceResults(allResults, SiteSpec.DEFAULT_MONOID) { acc, r -> def siteSpecResult = reduceResults(allResults, SiteSpec.DEFAULT_MONOID) { acc, r ->
r.getSiteSpecResult(acc, true, SiteSpec.DEFAULT_MONOID) r.getSiteSpecResult(acc, true, SiteSpec.DEFAULT_MONOID)
} }
def globalsResult = reduceResults(allResults, getGlobalsMonoid()) { acc, r -> def globalsResult = reduceResults(allResults, globalsMonoid) { acc, r ->
r.getGlobalsResult(acc, true, getGlobalsMonoid()) 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( new Build(
specs[0].name, specs[0].name,
outputDirFunctionResult, outputDirFunctionResult,
siteSpecResult, siteSpecResult,
globalsResult, globalsResult,
[] // TODO taskFactoriesResult
) )
} }

View File

@ -1,5 +1,7 @@
package com.jessebrault.ssg.task 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.Semigroup
import com.jessebrault.ssg.util.Semigroups import com.jessebrault.ssg.util.Semigroups
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
@ -17,7 +19,9 @@ import java.util.function.Supplier
@EqualsAndHashCode @EqualsAndHashCode
final class TaskFactorySpec<T extends TaskFactory> { 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) { static <T extends TaskFactory> TaskFactorySpec<T> concat(TaskFactorySpec<T> spec0, TaskFactorySpec<T> spec1) {
if (spec0.name != spec1.name) { 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) 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 String name
final Supplier<T> supplier final Supplier<T> supplier
final Collection<Consumer<T>> configurators 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) 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() {} 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.Build
import com.jessebrault.ssg.buildscript.BuildScriptBase import com.jessebrault.ssg.buildscript.BuildScriptBase
import com.jessebrault.ssg.buildscript.OutputDir 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.html.TextToHtmlTaskFactory
import com.jessebrault.ssg.provider.CollectionProviders
import com.jessebrault.ssg.template.TemplateTypes import com.jessebrault.ssg.template.TemplateTypes
import com.jessebrault.ssg.template.TemplatesProviders import com.jessebrault.ssg.template.TemplatesProviders
import com.jessebrault.ssg.text.TextTypes import com.jessebrault.ssg.text.TextTypes
import com.jessebrault.ssg.text.TextsProviders import com.jessebrault.ssg.text.TextsProviders
import com.jessebrault.ssg.util.ExtensionUtil
import com.jessebrault.ssg.util.Result
import groovy.transform.BaseScript import groovy.transform.BaseScript
@BaseScript @BaseScript
BuildScriptBase b BuildScriptBase b
final class Args {
File sourceDir
}
def args = args as Args
build(name: 'test') { build(name: 'test') {
outputDirFunction = { Build build -> new OutputDir(new File(args.sourceDir, 'build')) } outputDirFunction = { Build build -> new OutputDir(new File(args.sourceDir, 'build')) }
@ -22,27 +25,15 @@ build(name: 'test') {
textTypes << TextTypes.MARKDOWN textTypes << TextTypes.MARKDOWN
templateTypes << TemplateTypes.GSP templateTypes << TemplateTypes.GSP
} }
sources { base, types -> sources { base, types ->
texts TextsProviders.from(new File(args.sourceDir, 'texts'), types.textTypes) texts TextsProviders.from(new File(args.sourceDir, 'texts'), types.textTypes)
templates TemplatesProviders.from(new File(args.sourceDir, 'templates'), types.templateTypes) templates TemplatesProviders.from(new File(args.sourceDir, 'templates'), types.templateTypes)
} }
taskFactories { base, sources -> taskFactories { base, sources ->
register('textToHtml', TextToHtmlTaskFactory::new) { register('textToHtml', TextToHtmlTaskFactory::new) {
it.specProvider += CollectionProviders.fromSupplier { it.specProvider += TextToHtmlSpecProviders.from(sources)
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'))
}
}
} }
} }
} }

View File

@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals
final class FileAssertions { 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) { private static Map<String, Object> fileToMap(File file) {
[ [