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.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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
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)
|
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() {}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
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.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'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
[
|
[
|
||||||
|
Loading…
Reference in New Issue
Block a user