Migrate docs to spring-asciidoctor-backends
- Use io.spring.asciidoctor.backends:spring-asciidoctor-backends:0.0.5 - As this relates to anon repo access, use ge conventions from public repos and fix some other used repos. - Backport #722 - Fixes #724
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022 the original author or authors.
|
* Copyright 2022-2023 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -16,18 +16,14 @@
|
|||||||
package org.springframework.shell.gradle;
|
package org.springframework.shell.gradle;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URI;
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider;
|
import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider;
|
||||||
import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask;
|
import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask;
|
||||||
|
import org.asciidoctor.gradle.jvm.AsciidoctorJExtension;
|
||||||
import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin;
|
import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin;
|
||||||
import org.asciidoctor.gradle.jvm.AsciidoctorTask;
|
import org.asciidoctor.gradle.jvm.AsciidoctorTask;
|
||||||
import org.gradle.api.Action;
|
import org.gradle.api.Action;
|
||||||
@@ -38,17 +34,18 @@ import org.gradle.api.plugins.JavaLibraryPlugin;
|
|||||||
import org.gradle.api.plugins.JavaPlugin;
|
import org.gradle.api.plugins.JavaPlugin;
|
||||||
import org.gradle.api.plugins.PluginManager;
|
import org.gradle.api.plugins.PluginManager;
|
||||||
import org.gradle.api.publish.tasks.GenerateModuleMetadata;
|
import org.gradle.api.publish.tasks.GenerateModuleMetadata;
|
||||||
import org.gradle.api.artifacts.Configuration;
|
import org.gradle.api.tasks.PathSensitivity;
|
||||||
import org.gradle.api.artifacts.dsl.RepositoryHandler;
|
|
||||||
import org.gradle.api.file.CopySpec;
|
|
||||||
import org.gradle.api.file.FileTree;
|
|
||||||
import org.gradle.api.tasks.Sync;
|
import org.gradle.api.tasks.Sync;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Janne Valkealahti
|
* @author Janne Valkealahti
|
||||||
*/
|
*/
|
||||||
class DocsPlugin implements Plugin<Project> {
|
class DocsPlugin implements Plugin<Project> {
|
||||||
|
|
||||||
|
private static final String ASCIIDOCTORJ_VERSION = "2.4.3";
|
||||||
|
private static final String EXTENSIONS_CONFIGURATION_NAME = "asciidoctorExtensions";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void apply(Project project) {
|
public void apply(Project project) {
|
||||||
PluginManager pluginManager = project.getPluginManager();
|
PluginManager pluginManager = project.getPluginManager();
|
||||||
@@ -63,133 +60,83 @@ class DocsPlugin implements Plugin<Project> {
|
|||||||
task.enforcedPlatform(":spring-shell-management");
|
task.enforcedPlatform(":spring-shell-management");
|
||||||
});
|
});
|
||||||
|
|
||||||
configureAdocPlugins(project, dependencyVersions);
|
project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> {
|
||||||
|
// makeAllWarningsFatal(project);
|
||||||
|
upgradeAsciidoctorJVersion(project);
|
||||||
|
createAsciidoctorExtensionsConfiguration(project);
|
||||||
|
project.getTasks()
|
||||||
|
.withType(AbstractAsciidoctorTask.class,
|
||||||
|
(asciidoctorTask) -> configureAsciidoctorTask(project, asciidoctorTask, dependencyVersions));
|
||||||
|
});
|
||||||
project.getTasks().withType(GenerateModuleMetadata.class, metadata -> {
|
project.getTasks().withType(GenerateModuleMetadata.class, metadata -> {
|
||||||
metadata.setEnabled(false);
|
metadata.setEnabled(false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureAdocPlugins(Project project, ExtractVersionConstraints dependencyVersions) {
|
private void upgradeAsciidoctorJVersion(Project project) {
|
||||||
project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> {
|
project.getExtensions().getByType(AsciidoctorJExtension.class).setVersion(ASCIIDOCTORJ_VERSION);
|
||||||
createDefaultAsciidoctorRepository(project);
|
}
|
||||||
makeAllWarningsFatal(project);
|
|
||||||
Sync unzipResources = createUnzipDocumentationResourcesTask(project);
|
private void createAsciidoctorExtensionsConfiguration(Project project) {
|
||||||
Sync snippetsResources = createSnippetsResourcesTask(project);
|
project.getConfigurations().create(EXTENSIONS_CONFIGURATION_NAME, (configuration) -> {
|
||||||
project.getTasks().withType(AbstractAsciidoctorTask.class, (asciidoctorTask) -> {
|
configuration.getDependencies()
|
||||||
asciidoctorTask.dependsOn(dependencyVersions);
|
.add(project.getDependencies()
|
||||||
asciidoctorTask.dependsOn(unzipResources);
|
.create("io.spring.asciidoctor.backends:spring-asciidoctor-backends:0.0.5"));
|
||||||
asciidoctorTask.dependsOn(snippetsResources);
|
|
||||||
// configureExtensions(project, asciidoctorTask);
|
|
||||||
configureCommonAttributes(project, asciidoctorTask);
|
|
||||||
configureOptions(asciidoctorTask);
|
|
||||||
asciidoctorTask.sourceDir("src/main/asciidoc");
|
|
||||||
asciidoctorTask.baseDirFollowsSourceDir();
|
|
||||||
asciidoctorTask.useIntermediateWorkDir();
|
|
||||||
asciidoctorTask.resources(new Action<CopySpec>() {
|
|
||||||
@Override
|
|
||||||
public void execute(CopySpec resourcesSpec) {
|
|
||||||
resourcesSpec.from(unzipResources);
|
|
||||||
// resourcesSpec.from(snippetsResources);
|
|
||||||
resourcesSpec.from(snippetsResources, copySpec -> {
|
|
||||||
copySpec.include("docs/*");
|
|
||||||
});
|
|
||||||
resourcesSpec.from(asciidoctorTask.getSourceDir(), new Action<CopySpec>() {
|
|
||||||
@Override
|
|
||||||
public void execute(CopySpec resourcesSrcDirSpec) {
|
|
||||||
// https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/523
|
|
||||||
// For now copy the entire sourceDir over so that include files are
|
|
||||||
// available in the intermediateWorkDir
|
|
||||||
resourcesSrcDirSpec.include("images/*");
|
|
||||||
resourcesSrcDirSpec.include("code/*");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (asciidoctorTask instanceof AsciidoctorTask) {
|
|
||||||
configureHtmlOnlyAttributes(project, asciidoctorTask, dependencyVersions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDefaultAsciidoctorRepository(Project project) {
|
private void configureAsciidoctorTask(Project project, AbstractAsciidoctorTask asciidoctorTask, ExtractVersionConstraints dependencyVersions) {
|
||||||
project.getGradle().afterProject(new Action<Project>() {
|
asciidoctorTask.configurations(EXTENSIONS_CONFIGURATION_NAME);
|
||||||
@Override
|
configureCommonAttributes(project, asciidoctorTask, dependencyVersions);
|
||||||
public void execute(Project project) {
|
configureOptions(asciidoctorTask);
|
||||||
RepositoryHandler repositories = project.getRepositories();
|
asciidoctorTask.baseDirFollowsSourceDir();
|
||||||
if (repositories.isEmpty()) {
|
createSyncDocumentationSourceTask(project, asciidoctorTask, dependencyVersions);
|
||||||
repositories.mavenCentral();
|
if (asciidoctorTask instanceof AsciidoctorTask task) {
|
||||||
repositories.maven(repo -> {
|
task.outputOptions((outputOptions) -> outputOptions.backends("spring-html"));
|
||||||
repo.setUrl(URI.create("https://repo.spring.io/release"));
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void makeAllWarningsFatal(Project project) {
|
|
||||||
// project.getExtensions().getByType(AsciidoctorJExtension.class).fatalWarnings(".*");
|
|
||||||
}
|
|
||||||
|
|
||||||
// private void configureExtensions(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
|
||||||
// Configuration extensionsConfiguration = project.getConfigurations().maybeCreate("asciidoctorExtensions");
|
|
||||||
// extensionsConfiguration.defaultDependencies(new Action<DependencySet>() {
|
|
||||||
// @Override
|
|
||||||
// public void execute(DependencySet dependencies) {
|
|
||||||
// dependencies.add(project.getDependencies().create("io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.4.2.RELEASE"));
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// asciidoctorTask.configurations(extensionsConfiguration);
|
|
||||||
// }
|
|
||||||
|
|
||||||
private Sync createSnippetsResourcesTask(Project project) {
|
|
||||||
Sync sync = project.getTasks().create("snippetResources", Sync.class, s -> {
|
|
||||||
s.from(new File(project.getRootProject().getRootDir(), "spring-shell-docs/src/test/java/org/springframework/shell"), spec -> {
|
|
||||||
spec.include("docs/*");
|
|
||||||
});
|
|
||||||
File destination = new File(project.getBuildDir(), "docs/snippets");
|
|
||||||
s.into(destination);
|
|
||||||
});
|
|
||||||
return sync;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Sync createUnzipDocumentationResourcesTask(Project project) {
|
|
||||||
Configuration documentationResources = project.getConfigurations().maybeCreate("documentationResources");
|
|
||||||
documentationResources.getDependencies()
|
|
||||||
.add(project.getDependencies().create("io.spring.docresources:spring-doc-resources:0.2.5"));
|
|
||||||
Sync unzipResources = project.getTasks().create("unzipDocumentationResources",
|
|
||||||
Sync.class, new Action<Sync>() {
|
|
||||||
@Override
|
|
||||||
public void execute(Sync sync) {
|
|
||||||
sync.dependsOn(documentationResources);
|
|
||||||
sync.from(new Callable<List<FileTree>>() {
|
|
||||||
@Override
|
|
||||||
public List<FileTree> call() throws Exception {
|
|
||||||
List<FileTree> result = new ArrayList<>();
|
|
||||||
documentationResources.getAsFileTree().forEach(new Consumer<File>() {
|
|
||||||
@Override
|
|
||||||
public void accept(File file) {
|
|
||||||
result.add(project.zipTree(file));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
File destination = new File(project.getBuildDir(), "docs/resources");
|
|
||||||
sync.into(project.relativePath(destination));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return unzipResources;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) {
|
private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) {
|
||||||
asciidoctorTask.options(Collections.singletonMap("doctype", "book"));
|
asciidoctorTask.options(Collections.singletonMap("doctype", "book"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureHtmlOnlyAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask,
|
private Sync createSyncDocumentationSourceTask(Project project, AbstractAsciidoctorTask asciidoctorTask, ExtractVersionConstraints dependencyVersions) {
|
||||||
ExtractVersionConstraints dependencyVersions) {
|
Sync syncDocumentationSource = project.getTasks()
|
||||||
|
.create("syncDocumentationSourceFor" + StringUtils.capitalize(asciidoctorTask.getName()), Sync.class);
|
||||||
|
syncDocumentationSource.preserve(filter -> {
|
||||||
|
filter.include("**/*");
|
||||||
|
});
|
||||||
|
File syncedSource = new File(project.getBuildDir(), "docs/src/" + asciidoctorTask.getName());
|
||||||
|
syncDocumentationSource.setDestinationDir(syncedSource);
|
||||||
|
syncDocumentationSource.from("src/main/");
|
||||||
|
asciidoctorTask.dependsOn(syncDocumentationSource);
|
||||||
|
asciidoctorTask.dependsOn(dependencyVersions);
|
||||||
|
Sync snippetsResources = createSnippetsResourcesTask(project);
|
||||||
|
asciidoctorTask.dependsOn(snippetsResources);
|
||||||
|
asciidoctorTask.getInputs()
|
||||||
|
.dir(syncedSource)
|
||||||
|
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||||
|
.withPropertyName("synced source");
|
||||||
|
asciidoctorTask.setSourceDir(project.relativePath(new File(syncedSource, "asciidoc/")));
|
||||||
|
return syncDocumentationSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Sync createSnippetsResourcesTask(Project project) {
|
||||||
|
Sync sync = project.getTasks().create("snippetResources", Sync.class, s -> {
|
||||||
|
s.from(new File(project.getRootProject().getRootDir(), "spring-shell-docs/src/test/java/org/springframework/shell"), spec -> {
|
||||||
|
spec.include("docs/*");
|
||||||
|
});
|
||||||
|
s.preserve(filter -> {
|
||||||
|
filter.include("**/*");
|
||||||
|
});
|
||||||
|
File destination = new File(project.getBuildDir(), "docs/src/asciidoctor/asciidoc");
|
||||||
|
s.into(destination);
|
||||||
|
});
|
||||||
|
return sync;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureCommonAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask,
|
||||||
|
ExtractVersionConstraints dependencyVersions) {
|
||||||
asciidoctorTask.doFirst(new Action<Task>() {
|
asciidoctorTask.doFirst(new Action<Task>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -209,13 +156,15 @@ class DocsPlugin implements Plugin<Project> {
|
|||||||
|
|
||||||
Map<String, Object> attributes = new HashMap<>();
|
Map<String, Object> attributes = new HashMap<>();
|
||||||
attributes.put("toc", "left");
|
attributes.put("toc", "left");
|
||||||
attributes.put("source-highlighter", "highlight.js");
|
|
||||||
attributes.put("highlightjsdir", "js/highlight");
|
|
||||||
attributes.put("highlightjs-theme", "github");
|
|
||||||
attributes.put("linkcss", true);
|
|
||||||
attributes.put("icons", "font");
|
attributes.put("icons", "font");
|
||||||
attributes.put("stylesheet", "css/spring.css");
|
attributes.put("idprefix", "");
|
||||||
|
attributes.put("idseparator", "-");
|
||||||
|
attributes.put("docinfo", "shared");
|
||||||
|
attributes.put("sectanchors", "");
|
||||||
|
attributes.put("sectnums", "");
|
||||||
|
attributes.put("today-year", LocalDate.now().getYear());
|
||||||
attributes.put("snippets", "docs");
|
attributes.put("snippets", "docs");
|
||||||
|
|
||||||
asciidoctorTask.getAttributeProviders().add(new AsciidoctorAttributeProvider() {
|
asciidoctorTask.getAttributeProviders().add(new AsciidoctorAttributeProvider() {
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getAttributes() {
|
public Map<String, Object> getAttributes() {
|
||||||
@@ -229,18 +178,4 @@ class DocsPlugin implements Plugin<Project> {
|
|||||||
});
|
});
|
||||||
asciidoctorTask.attributes(attributes);
|
asciidoctorTask.attributes(attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureCommonAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
|
||||||
Map<String, Object> attributes = new HashMap<>();
|
|
||||||
// attributes.put("attribute-missing", "warn");
|
|
||||||
attributes.put("icons", "font");
|
|
||||||
attributes.put("idprefix", "");
|
|
||||||
attributes.put("idseparator", "-");
|
|
||||||
attributes.put("docinfo", "shared");
|
|
||||||
attributes.put("sectanchors", "");
|
|
||||||
attributes.put("sectnums", "");
|
|
||||||
attributes.put("today-year", LocalDate.now().getYear());
|
|
||||||
asciidoctorTask.attributes(attributes);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ jlineVersion=3.21.0
|
|||||||
st4Version=4.3.1
|
st4Version=4.3.1
|
||||||
jimfsVersion=1.2
|
jimfsVersion=1.2
|
||||||
gradleEnterpriseVersion=3.10.3
|
gradleEnterpriseVersion=3.10.3
|
||||||
springGeConventionsVersion=0.0.11
|
springGeConventionsVersion=0.0.13
|
||||||
findbugsVersion=3.0.2
|
findbugsVersion=3.0.2
|
||||||
org.gradle.caching=true
|
org.gradle.caching=true
|
||||||
|
|||||||
Reference in New Issue
Block a user