From 2ce269bbdc69e6072d1ec9f69be8dd03050538b6 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:00:15 +0200 Subject: [PATCH] Changing Closures to various functional interfaces. --- ...faultBuildScriptConfiguratorFactory.groovy | 2 +- .../com/jessebrault/ssg/model/Models.groovy | 35 ++----------------- ...Model.groovy => SupplierBasedModel.groovy} | 8 +++-- .../ssg/page/PagesProviders.groovy | 20 ++++++----- .../ssg/part/PartsProviders.groovy | 20 ++++++----- .../AbstractCollectionProvider.groovy | 2 +- .../ssg/provider/AbstractProvider.groovy | 4 +-- .../ssg/provider/CollectionProviders.groovy | 20 +++++------ .../FileBasedCollectionProvider.groovy | 32 +++++++---------- .../jessebrault/ssg/provider/Providers.groovy | 6 ++-- ...=> SupplierBasedCollectionProvider.groovy} | 12 +++---- ...er.groovy => SupplierBasedProvider.groovy} | 12 +++---- .../ssg/template/TemplatesProviders.groovy | 20 ++++++----- .../ssg/text/TextsProviders.groovy | 20 ++++++----- .../jessebrault/ssg/util/ExtensionUtil.groovy | 6 ++-- 15 files changed, 100 insertions(+), 119 deletions(-) rename api/src/main/groovy/com/jessebrault/ssg/model/{ClosureBasedModel.groovy => SupplierBasedModel.groovy} (71%) rename api/src/main/groovy/com/jessebrault/ssg/provider/{ClosureBasedCollectionProvider.groovy => SupplierBasedCollectionProvider.groovy} (57%) rename api/src/main/groovy/com/jessebrault/ssg/provider/{ClosureBasedProvider.groovy => SupplierBasedProvider.groovy} (62%) diff --git a/api/src/main/groovy/com/jessebrault/ssg/buildscript/DefaultBuildScriptConfiguratorFactory.groovy b/api/src/main/groovy/com/jessebrault/ssg/buildscript/DefaultBuildScriptConfiguratorFactory.groovy index 144ac45..cf91c3c 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/buildscript/DefaultBuildScriptConfiguratorFactory.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/buildscript/DefaultBuildScriptConfiguratorFactory.groovy @@ -38,7 +38,7 @@ final class DefaultBuildScriptConfiguratorFactory implements BuildScriptConfigur taskFactories { sourceProviders -> register('textToHtml', TextToHtmlTaskFactory::new) { - it.specProvider += CollectionProviders.from { + it.specProvider += CollectionProviders.fromSupplier { def templates = sourceProviders.templatesProvider.provide() sourceProviders.textsProvider.provide().collect { def frontMatterResult = it.type.frontMatterGetter.get(it) diff --git a/api/src/main/groovy/com/jessebrault/ssg/model/Models.groovy b/api/src/main/groovy/com/jessebrault/ssg/model/Models.groovy index d503f55..e5997e9 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/model/Models.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/model/Models.groovy @@ -1,10 +1,6 @@ package com.jessebrault.ssg.model -import groovy.io.FileType -import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FromString - -import java.nio.file.Path +import java.util.function.Supplier final class Models { @@ -12,33 +8,8 @@ final class Models { new SimpleModel<>(name, t) } - static Model from(String name, Closure tClosure) { - new ClosureBasedModel<>(name, tClosure) - } - - /** - * Takes a directory and iterates recursively through all files present in the directory and sub-directories, - * supplying each File along with a String representing that File's path relative to the base Directory to the - * given Closure, which then returns a Model containing T, all of which are collected and then returned together. - * - * @param directory The base directory in which to search for Files to process. - * @param fileToModelClosure A Closure which receives two params: the File being processed, - * and a String representing the path of that File relative to the base directory. Must return - * a Model containing T. - * @return A Collection of Models containing Ts. - */ - static Collection> fromDirectory( - File directory, - @ClosureParams(value = FromString, options = ['java.io.File, java.lang.String']) - Closure> fileToModelClosure - ) { - final Collection> models = [] - def directoryPath = Path.of(directory.path) - directory.eachFileRecurse(FileType.FILES) { - def relativePath = directoryPath.relativize(Path.of(it.path)).toString() - models << fileToModelClosure(it, relativePath) - } - models + static Model fromSupplier(String name, Supplier tClosure) { + new SupplierBasedModel<>(name, tClosure) } private Models() {} diff --git a/api/src/main/groovy/com/jessebrault/ssg/model/ClosureBasedModel.groovy b/api/src/main/groovy/com/jessebrault/ssg/model/SupplierBasedModel.groovy similarity index 71% rename from api/src/main/groovy/com/jessebrault/ssg/model/ClosureBasedModel.groovy rename to api/src/main/groovy/com/jessebrault/ssg/model/SupplierBasedModel.groovy index d098dc9..3b6a9d1 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/model/ClosureBasedModel.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/model/SupplierBasedModel.groovy @@ -5,18 +5,20 @@ import groovy.transform.NullCheck import groovy.transform.PackageScope import groovy.transform.TupleConstructor +import java.util.function.Supplier + @PackageScope @TupleConstructor(includeFields = true, defaults = false) @NullCheck(includeGenerated = true) @EqualsAndHashCode(includeFields = true) -final class ClosureBasedModel implements Model { +final class SupplierBasedModel implements Model { final String name - private final Closure tClosure + private final Supplier supplier @Override T get() { - this.tClosure() + this.supplier.get() } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/PagesProviders.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/PagesProviders.groovy index c33eb80..9da7af5 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/page/PagesProviders.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/page/PagesProviders.groovy @@ -3,7 +3,6 @@ package com.jessebrault.ssg.page import com.jessebrault.ssg.provider.CollectionProvider import com.jessebrault.ssg.provider.CollectionProviders import com.jessebrault.ssg.util.ExtensionUtil -import com.jessebrault.ssg.util.PathUtil import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -12,14 +11,19 @@ final class PagesProviders { private static final Logger logger = LoggerFactory.getLogger(PagesProviders) static CollectionProvider from(File pagesDirectory, Collection pageTypes) { - CollectionProviders.from(pagesDirectory) { - def extension = ExtensionUtil.getExtension(it.path) - def pageType = pageTypes.find { it.ids.contains(extension) } - if (!pageType) { - logger.warn('there is no PageType for file {}; skipping', it) - null + CollectionProviders.fromDirectory(pagesDirectory) { file, relativePath -> + def extension = ExtensionUtil.getExtension(relativePath) + if (extension) { + def pageType = pageTypes.find { it.ids.contains(extension) } + if (!pageType) { + logger.debug('there is no PageType for file {}; skipping', file) + return null + } else { + return new Page(relativePath, pageType, file.getText()) + } } else { - new Page(PathUtil.relative(pagesDirectory.path, it.path), pageType, it.getText()) + logger.debug('there is no extension for file {}; skipping', file) + return null } } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/part/PartsProviders.groovy b/api/src/main/groovy/com/jessebrault/ssg/part/PartsProviders.groovy index 7220288..392aa27 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/part/PartsProviders.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/part/PartsProviders.groovy @@ -3,7 +3,6 @@ package com.jessebrault.ssg.part import com.jessebrault.ssg.provider.CollectionProvider import com.jessebrault.ssg.provider.CollectionProviders import com.jessebrault.ssg.util.ExtensionUtil -import com.jessebrault.ssg.util.PathUtil import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -12,14 +11,19 @@ final class PartsProviders { private static final Logger logger = LoggerFactory.getLogger(PartsProviders) static CollectionProvider of(File partsDir, Collection partTypes) { - CollectionProviders.from(partsDir) { - def extension = ExtensionUtil.getExtension(it.path) - def partType = partTypes.find { it.ids.contains(extension) } - if (!partType) { - logger.warn('there is no PartType for file {}; skipping', it) - null + CollectionProviders.fromDirectory(partsDir) { file, relativePath -> + def extension = ExtensionUtil.getExtension(relativePath) + if (extension) { + def partType = partTypes.find { it.ids.contains(extension) } + if (!partType) { + logger.debug('there is no PartType for file {}; skipping', file) + return null + } else { + return new Part(relativePath, partType, file.getText()) + } } else { - new Part(PathUtil.relative(partsDir.path, it.path), partType, it.getText()) + logger.debug('there is no extension for file {}; skipping', file) + return null } } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractCollectionProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractCollectionProvider.groovy index 0ccd4a5..215e08e 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractCollectionProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractCollectionProvider.groovy @@ -6,7 +6,7 @@ abstract class AbstractCollectionProvider implements CollectionProvider { CollectionProvider cp0, CollectionProvider cp1 ) { - ClosureBasedCollectionProvider.get { + SupplierBasedCollectionProvider.get { cp0.provide() + cp1.provide() } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy index b837033..2cf51e1 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy @@ -6,7 +6,7 @@ abstract class AbstractProvider implements Provider { Provider p0, Provider p1 ) { - ClosureBasedCollectionProvider.get { + SupplierBasedCollectionProvider.get { [p0.provide(), p1.provide()] } } @@ -18,7 +18,7 @@ abstract class AbstractProvider implements Provider { @Override CollectionProvider asType(Class collectionProviderClass) { - ClosureBasedCollectionProvider.get { + SupplierBasedCollectionProvider.get { [this.provide() as T] } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/CollectionProviders.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/CollectionProviders.groovy index fb5874d..882746e 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/CollectionProviders.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/CollectionProviders.groovy @@ -1,29 +1,29 @@ package com.jessebrault.ssg.provider -import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FromString import org.jetbrains.annotations.Nullable +import java.util.function.BiFunction +import java.util.function.Supplier + final class CollectionProviders { static CollectionProvider getEmpty() { new SimpleCollectionProvider<>([]) } - static CollectionProvider of(Collection ts) { + static CollectionProvider fromCollection(Collection ts) { new SimpleCollectionProvider(ts) } - static CollectionProvider from(Closure> closure) { - ClosureBasedCollectionProvider.get(closure) + static CollectionProvider fromSupplier(Supplier> supplier) { + new SupplierBasedCollectionProvider<>(supplier) } - static CollectionProvider from( - File dir, - @ClosureParams(value = FromString, options = 'java.io.File') - Closure<@Nullable T> fileToElementClosure + static CollectionProvider fromDirectory( + File baseDirectory, + BiFunction elementFunction ) { - new FileBasedCollectionProvider<>(dir, fileToElementClosure) + new FileBasedCollectionProvider<>(baseDirectory, elementFunction) } private CollectionProviders() {} diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/FileBasedCollectionProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/FileBasedCollectionProvider.groovy index dbede24..b5aa37a 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/FileBasedCollectionProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/FileBasedCollectionProvider.groovy @@ -1,43 +1,37 @@ package com.jessebrault.ssg.provider +import com.jessebrault.ssg.util.PathUtil import groovy.io.FileType import groovy.transform.EqualsAndHashCode import groovy.transform.NullCheck import groovy.transform.PackageScope -import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FromString +import groovy.transform.TupleConstructor import org.jetbrains.annotations.Nullable import org.slf4j.Logger import org.slf4j.LoggerFactory +import java.util.function.BiFunction + @PackageScope -@NullCheck +@TupleConstructor(includeFields = true, defaults = false) +@NullCheck(includeGenerated = true) @EqualsAndHashCode(includeFields = true) final class FileBasedCollectionProvider extends AbstractCollectionProvider { private static final Logger logger = LoggerFactory.getLogger(FileBasedCollectionProvider) - private final File dir - private final Closure<@Nullable T> fileToElementClosure - - FileBasedCollectionProvider( - File dir, - @ClosureParams(value = FromString, options = 'java.io.File') - Closure<@Nullable T> fileToElementClosure - ) { - this.dir = dir - this.fileToElementClosure = fileToElementClosure - } + private final File baseDirectory + private final BiFunction elementFunction @Override Collection provide() { - if (!this.dir.isDirectory()) { - logger.error('{} does not exist or is not a directory; returning empty collection', this.dir) + if (!this.baseDirectory.isDirectory()) { + logger.error('{} does not exist or is not a directory; returning empty collection', this.baseDirectory) [] } else { - def ts = [] - this.dir.eachFileRecurse(FileType.FILES) { - def t = this.fileToElementClosure(it) + final Collection ts = [] + this.baseDirectory.eachFileRecurse(FileType.FILES) { + def t = this.elementFunction.apply(it, PathUtil.relative(this.baseDirectory.path, it.path)) as T if (t) { ts << t } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy index 6393633..ecb875f 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy @@ -1,6 +1,6 @@ package com.jessebrault.ssg.provider -import org.codehaus.groovy.runtime.InvokerHelper +import java.util.function.Supplier final class Providers { @@ -8,8 +8,8 @@ final class Providers { new SimpleProvider<>(t) } - static Provider from(Closure closure) { - ClosureBasedProvider.of(closure) + static Provider fromSupplier(Supplier supplier) { + new SupplierBasedProvider<>(supplier) } static CollectionProvider concat(Provider ...providers) { diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedCollectionProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedCollectionProvider.groovy similarity index 57% rename from api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedCollectionProvider.groovy rename to api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedCollectionProvider.groovy index a3132c9..8cdbba9 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedCollectionProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedCollectionProvider.groovy @@ -5,21 +5,19 @@ import groovy.transform.NullCheck import groovy.transform.PackageScope import groovy.transform.TupleConstructor +import java.util.function.Supplier + @PackageScope @TupleConstructor(defaults = false, includeFields = true) @NullCheck(includeGenerated = true) @EqualsAndHashCode(includeFields = true) -final class ClosureBasedCollectionProvider extends AbstractCollectionProvider { +final class SupplierBasedCollectionProvider extends AbstractCollectionProvider { - static CollectionProvider get(Closure> closure) { - new ClosureBasedCollectionProvider<>(closure) - } - - private final Closure> closure + private final Supplier> supplier @Override Collection provide() { - this.closure() + this.supplier.get() } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy similarity index 62% rename from api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedProvider.groovy rename to api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy index 56c5a7c..c6629c5 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/ClosureBasedProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy @@ -5,21 +5,19 @@ import groovy.transform.NullCheck import groovy.transform.PackageScope import groovy.transform.TupleConstructor +import java.util.function.Supplier + @PackageScope @TupleConstructor(includeFields = true, defaults = false) @NullCheck(includeGenerated = true) @EqualsAndHashCode(includeFields = true) -final class ClosureBasedProvider extends AbstractProvider { +final class SupplierBasedProvider extends AbstractProvider { - static Provider of(Closure closure) { - new ClosureBasedProvider<>(closure) - } - - private final Closure closure + private final Supplier supplier @Override T provide() { - this.closure() + this.supplier.get() } } diff --git a/api/src/main/groovy/com/jessebrault/ssg/template/TemplatesProviders.groovy b/api/src/main/groovy/com/jessebrault/ssg/template/TemplatesProviders.groovy index 9f53283..af5d61c 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/template/TemplatesProviders.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/template/TemplatesProviders.groovy @@ -3,7 +3,6 @@ package com.jessebrault.ssg.template import com.jessebrault.ssg.provider.CollectionProvider import com.jessebrault.ssg.provider.CollectionProviders import com.jessebrault.ssg.util.ExtensionUtil -import com.jessebrault.ssg.util.PathUtil import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -12,14 +11,19 @@ final class TemplatesProviders { private static final Logger logger = LoggerFactory.getLogger(TemplatesProviders) static CollectionProvider