Creating source sets and configurations.

This commit is contained in:
JesseBrault0709 2024-05-16 15:28:05 +02:00
parent bc1d545297
commit e34bb38350
8 changed files with 196 additions and 26 deletions

View File

@ -2,7 +2,7 @@ package com.jessebrault.ssg.view
import groowt.view.StandardGStringTemplateView import groowt.view.StandardGStringTemplateView
class GStringPageView extends StandardGStringTemplateView implements PageView { abstract class GStringPageView extends StandardGStringTemplateView implements PageView {
String pageTitle String pageTitle
String url String url

View File

@ -1,12 +1,36 @@
package com.jessebrault.ssg.view package com.jessebrault.ssg.view
import groowt.view.component.AbstractViewComponent
import groowt.view.component.ComponentTemplate
import groowt.view.component.compiler.ComponentTemplateCompileUnit
import groowt.view.component.compiler.source.ComponentTemplateSource
import groowt.view.web.BaseWebViewComponent import groowt.view.web.BaseWebViewComponent
class WvcPageView extends BaseWebViewComponent implements PageView, WithHtmlHelpers { import java.util.function.Function
abstract class WvcPageView extends BaseWebViewComponent implements PageView, WithHtmlHelpers {
String pageTitle String pageTitle
String url String url
WvcPageView(ComponentTemplate template) {
super(template)
}
WvcPageView(Class<? extends ComponentTemplate> templateClass) {
super(templateClass)
}
WvcPageView(
Function<? super Class<? extends AbstractViewComponent>, ComponentTemplateCompileUnit> compileUnitFunction
) {
super(compileUnitFunction)
}
WvcPageView(ComponentTemplateSource source) {
super(source)
}
WvcPageView(Object source) { WvcPageView(Object source) {
super(source) super(source)
} }

View File

@ -3,21 +3,29 @@ package com.jessebrault.ssg.gradle;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.Dependency;
import org.gradle.api.plugins.GroovyPlugin;
import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.Delete; import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.*;
import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.compile.GroovyCompile;
import org.gradle.api.tasks.compile.JavaCompile;
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry; import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class SsgGradlePlugin implements Plugin<Project> { public class SsgGradlePlugin implements Plugin<Project> {
public static final String TASK_GROUP = "ssg"; public static final String TASK_GROUP = "ssg";
public static final String COMPONENTS_SOURCE_SET = "components";
public static final String PAGES_SOURCE_SET = "pages";
public static final String SSG_SOURCE_SET = "ssg";
private final ToolingModelBuilderRegistry toolingModelBuilderRegistry; private final ToolingModelBuilderRegistry toolingModelBuilderRegistry;
@ -26,34 +34,136 @@ public class SsgGradlePlugin implements Plugin<Project> {
this.toolingModelBuilderRegistry = toolingModelBuilderRegistry; this.toolingModelBuilderRegistry = toolingModelBuilderRegistry;
} }
protected void configureRepositories(Project project) {
// add tooling api repository because ssg-cli depends on it
project.getRepositories().maven(mavenRepository -> {
mavenRepository.setName("gradleToolingApiRepository");
mavenRepository.setUrl("https://repo.gradle.org/gradle/libs-releases");
});
}
protected void configureToolingModelBuilders() { protected void configureToolingModelBuilders() {
this.toolingModelBuilderRegistry.register(new SsgBuildModelBuilder()); this.toolingModelBuilderRegistry.register(new SsgBuildModelBuilder());
} }
protected void configureSsgCliDependency(Project project) { protected Configuration createSsgApiConfiguration(Project project) {
final var ssgCliConfiguration = project.getConfigurations().getByName("ssgCli"); final Configuration ssgApiConfiguration = project.getConfigurations().create("ssgApi");
final Dependency ssgCliDependency = project.getDependencies().create("com.jessebrault.ssg:ssg-cli:0.4.0"); ssgApiConfiguration.setCanBeConsumed(false);
ssgCliConfiguration.getDependencies().add(ssgCliDependency); ssgApiConfiguration.setCanBeResolved(true); // N.B.: Only a dependency container
ssgApiConfiguration.setVisible(false);
return ssgApiConfiguration;
} }
@Override protected Configuration createSsgCliConfiguration(Project project, Configuration ssgApiConfiguration) {
public void apply(Project project) {
// apply at least java plugin
project.getPlugins().apply(JavaPlugin.class);
// add tooling api repository because ssg-cli depends on it
project.getRepositories().maven(mavenRepository -> {
mavenRepository.setName("gradle-tooling-api-repository");
mavenRepository.setUrl("https://repo.gradle.org/gradle/libs-releases");
});
this.configureToolingModelBuilders();
final Configuration ssgCliConfiguration = project.getConfigurations().create("ssgCli"); final Configuration ssgCliConfiguration = project.getConfigurations().create("ssgCli");
ssgCliConfiguration.setCanBeConsumed(false); ssgCliConfiguration.setCanBeConsumed(false);
ssgCliConfiguration.setCanBeResolved(true); ssgCliConfiguration.setCanBeResolved(true);
ssgCliConfiguration.setVisible(false); ssgCliConfiguration.setVisible(false);
ssgCliConfiguration.extendsFrom(ssgApiConfiguration);
return ssgCliConfiguration;
}
protected void createDomainSourceSet(Project project, SourceSetContainer sourceSets, String name) {
sourceSets.create(name, sourceSet -> {
// first, register the dirs
// java
sourceSet.getJava().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 -> {
groovyCompile.source(name + File.separator + "groovy");
});
});
}
protected void createSsgSourceSet(SourceSetContainer sourceSets) {
sourceSets.create(SSG_SOURCE_SET, sourceSet -> {
// groovy only
sourceSet.getExtensions().getByType(GroovySourceDirectorySet.class).setSrcDirs(List.of(SSG_SOURCE_SET));
// resources live right next to build scripts, if needed
sourceSet.getResources().setSrcDirs(List.of(SSG_SOURCE_SET));
// disable java
sourceSet.getJava().setSrcDirs(List.of());
});
}
protected void configureSourceSets(Project project) {
final var javaExtension = project.getExtensions().getByType(JavaPluginExtension.class);
final var sourceSets = javaExtension.getSourceSets();
this.createDomainSourceSet(project, sourceSets, PAGES_SOURCE_SET);
this.createDomainSourceSet(project, sourceSets, COMPONENTS_SOURCE_SET);
this.createSsgSourceSet(sourceSets);
}
// protected void configureCompileSsgGroovyTask(Project project) {
// project.getTasks().named("compileSsgGroovy", GroovyCompile.class, groovyCompile -> {
// final File dotSsg = project.getLayout().getProjectDirectory().dir(".ssg").getAsFile();
// if (!dotSsg.exists()) {
// //noinspection ResultOfMethodCallIgnored
// dotSsg.mkdirs();
// }
//
// final File compileConfigurationScript = new File(dotSsg, "compileSsgGroovy.groovy");
// if (!compileConfigurationScript.exists()) {
// try (final OutputStream outputStream = new FileOutputStream(compileConfigurationScript)) {
// outputStream.write("""
// configuration.scriptBaseClass = 'com.jessebrault.ssg.buildscript.BuildScriptBase'
// """.stripIndent().trim().getBytes());
// } catch (IOException ioException) {
// throw new RuntimeException(ioException);
// }
// }
//
// groovyCompile.getGroovyOptions().setConfigurationScript(compileConfigurationScript);
// });
// }
protected void configureSourceSetConfigurations(Project project, Configuration ssgApiConfiguration) {
final ConfigurationContainer configurations = project.getConfigurations();
final Configuration implementation = configurations.getByName("implementation");
implementation.extendsFrom(ssgApiConfiguration);
final Set<Configuration> subConfigurations = new HashSet<>();
subConfigurations.add(configurations.getByName("ssgImplementation"));
subConfigurations.add(configurations.getByName("pagesImplementation"));
subConfigurations.add(configurations.getByName("componentsImplementation"));
subConfigurations.forEach(subConfiguration -> subConfiguration.extendsFrom(implementation));
}
protected void configureSsgDependencies(
Project project,
Configuration ssgApiConfiguration,
Configuration ssgCliConfiguration
) {
final Dependency ssgApi = project.getDependencies().create("com.jessebrault.ssg:ssg-api:0.4.0");
final Dependency ssgCli = project.getDependencies().create("com.jessebrault.ssg:ssg-cli:0.4.0");
ssgApiConfiguration.getDependencies().add(ssgApi);
ssgCliConfiguration.getDependencies().add(ssgCli);
}
@Override
public void apply(Project project) {
// apply the java and groovy plugins
project.getPlugins().apply(JavaPlugin.class);
project.getPlugins().apply(GroovyPlugin.class);
this.configureRepositories(project);
this.configureToolingModelBuilders();
this.configureSourceSets(project);
// this.configureCompileSsgGroovyTask(project);
// configurations
final Configuration ssgApiConfiguration = this.createSsgApiConfiguration(project);
final Configuration ssgCliConfiguration = this.createSsgCliConfiguration(project, ssgApiConfiguration);
this.configureSourceSetConfigurations(project, ssgApiConfiguration);
// Tasks
final TaskContainer tasks = project.getTasks(); final TaskContainer tasks = project.getTasks();
final TaskProvider<SsgBinScriptTask> binScriptTaskTaskProvider = tasks.register( final TaskProvider<SsgBinScriptTask> binScriptTaskTaskProvider = tasks.register(
@ -68,12 +178,13 @@ public class SsgGradlePlugin implements Plugin<Project> {
} }
); );
tasks.register("cleanBin", Delete.class, deleteTask -> { tasks.register("cleanSsg", Delete.class, deleteTask -> {
deleteTask.setDelete(binScriptTaskTaskProvider.map(SsgBinScriptTask::getBinDir)); deleteTask.delete(binScriptTaskTaskProvider.map(SsgBinScriptTask::getBinDir));
deleteTask.delete(".ssg");
deleteTask.setGroup(TASK_GROUP); deleteTask.setGroup(TASK_GROUP);
}); });
project.afterEvaluate(this::configureSsgCliDependency); project.afterEvaluate(p -> this.configureSsgDependencies(p, ssgApiConfiguration, ssgCliConfiguration));
} }
} }

View File

@ -1 +1,2 @@
bin bin
.ssg

View File

@ -2,6 +2,10 @@ plugins {
id 'com.jessebrault.ssg' version '0.4.0' id 'com.jessebrault.ssg' version '0.4.0'
} }
dependencies {
implementation 'org.apache.groovy:groovy:4.0.21'
}
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()

View File

@ -0,0 +1,19 @@
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'
}
}

View File

@ -0,0 +1,5 @@
$pageTitle
Hello, World!
$url

View File

@ -1,3 +1,9 @@
import com.jessebrault.ssg.buildscript.BuildScriptBase
import groovy.transform.BaseScript
@BaseScript
BuildScriptBase base
build { build {
siteName 'My Test Site' siteName 'My Test Site'
baseUrl 'https://hello.com' baseUrl 'https://hello.com'