Raise the minimum supported version of AsciidoctorJ to 3.0

Closes gh-957
This commit is contained in:
Andy Wilkinson
2025-01-30 16:28:44 +00:00
parent 85ebc4eb86
commit 0b103fdc0e
9 changed files with 118 additions and 37 deletions

View File

@@ -78,6 +78,7 @@ If you want to use `WebTestClient` or REST Assured rather than MockMvc, add a de
<4> Add `spring-restdocs-asciidoctor` as a dependency of the Asciidoctor plugin.
This will automatically configure the `snippets` attribute for use in your `.adoc` files to point to `target/generated-snippets`.
It will also allow you to use the `operation` block macro.
It requires AsciidoctorJ 3.0.
[source,indent=0,subs="verbatim,attributes",role="secondary"]
.Gradle
@@ -114,6 +115,7 @@ It will also allow you to use the `operation` block macro.
<3> Add a dependency on `spring-restdocs-asciidoctor` in the `asciidoctorExt` configuration.
This will automatically configure the `snippets` attribute for use in your `.adoc` files to point to `build/generated-snippets`.
It will also allow you to use the `operation` block macro.
It requires AsciidoctorJ 3.0.
<4> Add a dependency on `spring-restdocs-mockmvc` in the `testImplementation` configuration.
If you want to use `WebTestClient` or REST Assured rather than MockMvc, add a dependency on `spring-restdocs-webtestclient` or `spring-restdocs-restassured` respectively instead.
<5> Configure a `snippetsDir` property that defines the output location for generated snippets.

View File

@@ -28,6 +28,7 @@ This section covers how to include Asciidoc snippets.
You can use a macro named `operation` to import all or some of the snippets that have been generated for a specific operation.
It is made available by including `spring-restdocs-asciidoctor` in your project's <<getting-started-build-configuration, build configuration>>.
`spring-restdocs-asciidoctor` requires AsciidoctorJ 3.0.
The target of the macro is the name of the operation.
In its simplest form, you can use the macro to include all of the snippets for an operation, as shown in the following example:

View File

@@ -1,7 +1,6 @@
plugins {
id "java-library"
id "maven-publish"
id "io.spring.compatibility-test" version "0.0.3"
}
description = "Spring REST Docs Asciidoctor Extension"
@@ -20,11 +19,3 @@ dependencies {
testRuntimeOnly("org.asciidoctor:asciidoctorj-pdf")
}
compatibilityTest {
dependency("AsciidoctorJ") { asciidoctorj ->
asciidoctorj.groupId = "org.asciidoctor"
asciidoctorj.artifactId = "asciidoctorj"
asciidoctorj.versions = ["3.0.0"]
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2014-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.restdocs.asciidoctor;
import org.asciidoctor.ast.Document;
import org.asciidoctor.extension.Preprocessor;
import org.asciidoctor.extension.PreprocessorReader;
import org.asciidoctor.extension.Reader;
/**
* {@link Preprocessor} that sets defaults for REST Docs-related {@link Document}
* attributes.
*
* @author Andy Wilkinson
*/
final class DefaultAttributesPreprocessor extends Preprocessor {
private final SnippetsDirectoryResolver snippetsDirectoryResolver = new SnippetsDirectoryResolver();
@Override
public Reader process(Document document, PreprocessorReader reader) {
document.setAttribute("snippets", this.snippetsDirectoryResolver.getSnippetsDirectory(document.getAttributes()),
false);
return reader;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2024 the original author or authors.
* Copyright 2014-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,9 +28,7 @@ public final class RestDocsExtensionRegistry implements ExtensionRegistry {
@Override
public void register(Asciidoctor asciidoctor) {
asciidoctor.rubyExtensionRegistry()
.loadClass(RestDocsExtensionRegistry.class.getResourceAsStream("/extensions/default_attributes.rb"))
.preprocessor("DefaultAttributes");
asciidoctor.javaExtensionRegistry().preprocessor(new DefaultAttributesPreprocessor());
asciidoctor.rubyExtensionRegistry()
.loadClass(RestDocsExtensionRegistry.class.getResourceAsStream("/extensions/operation_block_macro.rb"))
.blockMacro("operation", "OperationBlockMacro");

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2024 the original author or authors.
* Copyright 2014-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,14 +29,9 @@ import java.util.function.Supplier;
*
* @author Andy Wilkinson
*/
public class SnippetsDirectoryResolver {
class SnippetsDirectoryResolver {
/**
* Returns the snippets directory derived from the given {@code attributes}.
* @param attributes the attributes
* @return the snippets directory
*/
public File getSnippetsDirectory(Map<String, Object> attributes) {
File getSnippetsDirectory(Map<String, Object> attributes) {
if (System.getProperty("maven.home") != null) {
return getMavenSnippetsDirectory(attributes);
}

View File

@@ -1,14 +0,0 @@
require 'asciidoctor/extensions'
require 'java'
class DefaultAttributes < Asciidoctor::Extensions::Preprocessor
def process(document, reader)
resolver = org.springframework.restdocs.asciidoctor.SnippetsDirectoryResolver.new()
attributes = document.attributes
attributes["snippets"] = resolver.getSnippetsDirectory(attributes) unless attributes.has_key?("snippets")
false
end
end

View File

@@ -0,0 +1,67 @@
/*
* Copyright 2014-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.restdocs.asciidoctor;
import java.io.File;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Attributes;
import org.asciidoctor.Options;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link DefaultAttributesPreprocessor}.
*
* @author Andy Wilkinson
*/
public class DefaultAttributesPreprocessorTests {
@Test
public void snippetsAttributeIsSet() {
String converted = createAsciidoctor().convert("{snippets}", createOptions("projectdir=../../.."));
assertThat(converted).contains("build" + File.separatorChar + "generated-snippets");
}
@Test
public void snippetsAttributeFromConvertArgumentIsNotOverridden() {
String converted = createAsciidoctor().convert("{snippets}",
createOptions("snippets=custom projectdir=../../.."));
assertThat(converted).contains("custom");
}
@Test
public void snippetsAttributeFromDocumentPreambleIsNotOverridden() {
String converted = createAsciidoctor().convert(":snippets: custom\n{snippets}",
createOptions("projectdir=../../.."));
assertThat(converted).contains("custom");
}
private Options createOptions(String attributes) {
Options options = Options.builder().build();
options.setAttributes(Attributes.builder().arguments(attributes).build());
return options;
}
private Asciidoctor createAsciidoctor() {
Asciidoctor asciidoctor = Asciidoctor.Factory.create();
asciidoctor.javaExtensionRegistry().preprocessor(new DefaultAttributesPreprocessor());
return asciidoctor;
}
}

View File

@@ -15,8 +15,8 @@ dependencies {
api("org.apache.pdfbox:pdfbox:2.0.27")
api("org.apache.tomcat.embed:tomcat-embed-core:11.0.2")
api("org.apache.tomcat.embed:tomcat-embed-el:11.0.2")
api("org.asciidoctor:asciidoctorj:2.5.7")
api("org.asciidoctor:asciidoctorj-pdf:2.3.3")
api("org.asciidoctor:asciidoctorj:3.0.0")
api("org.asciidoctor:asciidoctorj-pdf:2.3.19")
api("org.assertj:assertj-core:3.23.1")
api("org.hamcrest:hamcrest-core:1.3")
api("org.hamcrest:hamcrest-library:1.3")