From 30e463f1cf9b9d4dcab9099f18164bed9b567e87 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Thu, 16 May 2024 17:45:20 +0200 Subject: [PATCH] Successfully building a dist from a simple page. --- .../ssg/DefaultStaticSiteGenerator.groovy | 12 ++++++- .../com/jessebrault/ssg/view/PageView.groovy | 3 ++ .../ssg/view/WithHtmlHelpers.groovy | 2 +- .../ssg/AbstractBuildCommand.groovy | 3 ++ ...ldModel.java => DefaultSsgBuildModel.java} | 2 +- .../ssg/gradle/SsgBuildModelBuilder.java | 12 ++++++- .../ssg/gradle/SsgGradlePlugin.java | 32 +++++++++++++++++-- test-ssg-project/.gitignore | 2 ++ .../groovy/com/jessebrault/Biography.groovy | 19 ----------- .../com/jessebrault/site/Biography.groovy | 22 +++++++++++++ .../jessebrault/site/BiographyTemplate.wvc | 4 +++ .../wvc/com/jessebrault/BiographyTemplate.wvc | 5 --- .../jessebrault/site/BiographyTemplate.wvc | 7 ++++ 13 files changed, 95 insertions(+), 30 deletions(-) rename ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/{DeafultSsgBuildModel.java => DefaultSsgBuildModel.java} (88%) delete mode 100644 test-ssg-project/pages/groovy/com/jessebrault/Biography.groovy create mode 100644 test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy create mode 100644 test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc delete mode 100644 test-ssg-project/pages/wvc/com/jessebrault/BiographyTemplate.wvc create mode 100644 test-ssg-project/pages/wvc/com/jessebrault/site/BiographyTemplate.wvc diff --git a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy index 337a6be..e822e48 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy @@ -12,8 +12,12 @@ import com.jessebrault.ssg.page.PageSpec import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.util.Diagnostic import com.jessebrault.ssg.view.PageView +import com.jessebrault.ssg.view.WvcPageView import groovy.transform.TupleConstructor import groowt.util.di.RegistryObjectFactory +import groowt.view.component.ViewComponent +import groowt.view.component.context.DefaultComponentContext +import groowt.view.web.DefaultWebViewComponentContext import io.github.classgraph.ClassGraph import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -128,7 +132,6 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator { .addClassLoader(groovyClassLoader) basePackages.each { classgraph.acceptPackages(it) } - def pages = [] as Set try (def scanResult = classgraph.scan()) { @@ -187,6 +190,13 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator { return } + // Prepare for rendering + pageView.pageTitle = it.name + pageView.url = buildSpec.baseUrl.get() + it.path + if (pageView instanceof WvcPageView) { + pageView.context = new DefaultWebViewComponentContext() + } + // Render the page def sw = new StringWriter() try { diff --git a/api/src/main/groovy/com/jessebrault/ssg/view/PageView.groovy b/api/src/main/groovy/com/jessebrault/ssg/view/PageView.groovy index d84f940..858e7cc 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/view/PageView.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/view/PageView.groovy @@ -4,5 +4,8 @@ import groowt.view.View interface PageView extends View { String getPageTitle() + void setPageTitle(String pageTitle) + String getUrl() + void setUrl(String url) } diff --git a/api/src/main/groovy/com/jessebrault/ssg/view/WithHtmlHelpers.groovy b/api/src/main/groovy/com/jessebrault/ssg/view/WithHtmlHelpers.groovy index 649e246..7fc350f 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/view/WithHtmlHelpers.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/view/WithHtmlHelpers.groovy @@ -7,7 +7,7 @@ trait WithHtmlHelpers { String prettyFormat(String html) { Jsoup.parse(html).with { outputSettings().prettyPrint(true) - toString() + it.toString() } } diff --git a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy index 7927bee..84ee46f 100644 --- a/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy +++ b/cli/src/main/groovy/com/jessebrault/ssg/AbstractBuildCommand.groovy @@ -93,6 +93,9 @@ abstract class AbstractBuildCommand extends AbstractSubCommand { groovyClassLoader.addURL(URLUtil.ofJarFile(classpathElement)) } } + + projectConnection.newBuild().forTasks('ssgJars').run() + projectConnection.close() } this.libDirs.each { libDir -> diff --git a/ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DeafultSsgBuildModel.java b/ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DefaultSsgBuildModel.java similarity index 88% rename from ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DeafultSsgBuildModel.java rename to ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DefaultSsgBuildModel.java index 7ff6dd2..9e27c00 100644 --- a/ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DeafultSsgBuildModel.java +++ b/ssg-gradle-model/src/main/java/com/jessebrault/ssg/gradle/DefaultSsgBuildModel.java @@ -5,7 +5,7 @@ import java.io.Serializable; import java.util.HashSet; import java.util.Set; -public class DeafultSsgBuildModel implements SsgBuildModel, Serializable { +public class DefaultSsgBuildModel implements SsgBuildModel, Serializable { private final Set buildOutputLibs = new HashSet<>(); private final Set runtimeClasspath = new HashSet<>(); diff --git a/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgBuildModelBuilder.java b/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgBuildModelBuilder.java index fc3048c..03b0e58 100644 --- a/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgBuildModelBuilder.java +++ b/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgBuildModelBuilder.java @@ -3,10 +3,13 @@ package com.jessebrault.ssg.gradle; import org.gradle.api.Project; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.TaskCollection; import org.gradle.jvm.tasks.Jar; import org.gradle.tooling.provider.model.ToolingModelBuilder; import org.jetbrains.annotations.NotNull; +import java.util.stream.Collectors; + public class SsgBuildModelBuilder implements ToolingModelBuilder { @Override @@ -16,7 +19,7 @@ public class SsgBuildModelBuilder implements ToolingModelBuilder { @Override public @NotNull Object buildAll(@NotNull String modelName, @NotNull Project project) { - final SsgBuildModel ssgBuildModel = new DeafultSsgBuildModel(); + final SsgBuildModel ssgBuildModel = new DefaultSsgBuildModel(); final JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class); final SourceSet mainSourceSet = javaPluginExtension.getSourceSets().getByName("main"); @@ -25,6 +28,13 @@ public class SsgBuildModelBuilder implements ToolingModelBuilder { .get(); ssgBuildModel.getBuildOutputLibs().addAll(jarTask.getOutputs().getFiles().getFiles()); + final TaskCollection allJarTasks = project.getTasks().withType(Jar.class); + ssgBuildModel.getBuildOutputLibs().addAll( + allJarTasks.stream() + .flatMap(jar -> jar.getOutputs().getFiles().getFiles().stream()) + .collect(Collectors.toSet()) + ); + ssgBuildModel.getRuntimeClasspath().addAll(mainSourceSet.getRuntimeClasspath().getFiles()); return ssgBuildModel; diff --git a/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgGradlePlugin.java b/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgGradlePlugin.java index 161db02..b0d8c06 100644 --- a/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgGradlePlugin.java +++ b/ssg-gradle-plugin/src/main/java/com/jessebrault/ssg/gradle/SsgGradlePlugin.java @@ -9,6 +9,7 @@ import org.gradle.api.plugins.GroovyPlugin; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.*; +import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.compile.GroovyCompile; import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry; @@ -67,16 +68,39 @@ public class SsgGradlePlugin implements Plugin { sourceSets.create(name, sourceSet -> { // first, register the dirs // java - sourceSet.getJava().setSrcDirs(List.of(name + File.separator + "java")); + final var javaSourceDirectorySet = sourceSet.getJava(); + javaSourceDirectorySet.setSrcDirs(List.of(name + File.separator + "java")); + // groovy final var groovySourceDirectorySet = sourceSet.getExtensions().getByType(GroovySourceDirectorySet.class); groovySourceDirectorySet.setSrcDirs(List.of(name + File.separator + "groovy")); + // resources sourceSet.getResources().setSrcDirs(List.of(name + File.separator + "resources")); - project.getTasks().withType(GroovyCompile.class).configureEach(groovyCompile -> { + // second, configure the relevant compile tasks + project.getTasks().named(sourceSet.getCompileJavaTaskName(), JavaCompile.class, javaCompile -> { + javaCompile.source(name + File.separator + "java"); + }); + project.getTasks().named(sourceSet.getCompileTaskName("groovy"), GroovyCompile.class, groovyCompile -> { groovyCompile.source(name + File.separator + "groovy"); }); + + // third, we need a jar task which knows where stuff is + final TaskProvider jarTaskProvider = project.getTasks().register( + sourceSet.getJarTaskName(), + Jar.class, + jarTask -> { + // jarTask.from(javaSourceDirectorySet.getClassesDirectory()); + jarTask.from(groovySourceDirectorySet.getClassesDirectory()); + jarTask.from(sourceSet.getResources()); + jarTask.getArchiveBaseName().set(project.getName() + "-" + name); + } + ); + + project.getTasks().named("ssgJars", ssgJarsTask -> { + ssgJarsTask.dependsOn(jarTaskProvider); + }); }); } @@ -153,6 +177,10 @@ public class SsgGradlePlugin implements Plugin { project.getPlugins().apply(JavaPlugin.class); project.getPlugins().apply(GroovyPlugin.class); + // create our ssgJars task, which is just a holder for source set jar tasks + project.getTasks().register("ssgJars"); + + // configure the repositories, tooling models, and source sets this.configureRepositories(project); this.configureToolingModelBuilders(); this.configureSourceSets(project); diff --git a/test-ssg-project/.gitignore b/test-ssg-project/.gitignore index 4c4a3df..e1eb798 100644 --- a/test-ssg-project/.gitignore +++ b/test-ssg-project/.gitignore @@ -1,2 +1,4 @@ bin .ssg +testBuild +dist diff --git a/test-ssg-project/pages/groovy/com/jessebrault/Biography.groovy b/test-ssg-project/pages/groovy/com/jessebrault/Biography.groovy deleted file mode 100644 index a59e743..0000000 --- a/test-ssg-project/pages/groovy/com/jessebrault/Biography.groovy +++ /dev/null @@ -1,19 +0,0 @@ -package com.jessebrault - -import com.jessebrault.ssg.view.WvcPageView -import jakarta.inject.Inject -import jakarta.inject.Named - -class Biography extends WvcPageView { - - final String pageTitle - final String url - - @Inject - Biography(@Named('siteTitle') String siteTitle, @Named('baseUrl') String baseUrl) { - super(Biography.getResource('BiographyTemplate.wvc')) - this.pageTitle = siteTitle + ': Biography' - this.url = baseUrl + '/biography' - } - -} diff --git a/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy new file mode 100644 index 0000000..230a319 --- /dev/null +++ b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy @@ -0,0 +1,22 @@ +package com.jessebrault.site + +import com.jessebrault.ssg.page.PageSpec +import com.jessebrault.ssg.view.WvcPageView +import jakarta.inject.Inject + +@PageSpec(name = 'Biography', path = '/biography') +class Biography extends WvcPageView { + + @Inject + Biography() { + super(Biography.getResource('BiographyTemplate.wvc')) + println 'Hello from Biography!' + } + + @Override + void renderTo(Writer out) throws IOException { + println "Rendering: $pageTitle..." + super.renderTo(out) + } + +} diff --git a/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc new file mode 100644 index 0000000..bd5fc32 --- /dev/null +++ b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc @@ -0,0 +1,4 @@ +--- +package com.jessebrault.site +--- +Hello, World! diff --git a/test-ssg-project/pages/wvc/com/jessebrault/BiographyTemplate.wvc b/test-ssg-project/pages/wvc/com/jessebrault/BiographyTemplate.wvc deleted file mode 100644 index 8de2583..0000000 --- a/test-ssg-project/pages/wvc/com/jessebrault/BiographyTemplate.wvc +++ /dev/null @@ -1,5 +0,0 @@ -$pageTitle - -Hello, World! - -$url diff --git a/test-ssg-project/pages/wvc/com/jessebrault/site/BiographyTemplate.wvc b/test-ssg-project/pages/wvc/com/jessebrault/site/BiographyTemplate.wvc new file mode 100644 index 0000000..268a309 --- /dev/null +++ b/test-ssg-project/pages/wvc/com/jessebrault/site/BiographyTemplate.wvc @@ -0,0 +1,7 @@ +--- +package com.jessebrault.site +--- +$pageTitle +$url + +Hello, World!