Skip to content

Commit

Permalink
Configurations can be supplied via providers {asciidoctor#405)
Browse files Browse the repository at this point in the history
  • Loading branch information
ysb33r committed Jun 19, 2019
1 parent c87f0ad commit f75e674
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -501,19 +501,16 @@ class AbstractAsciidoctorTask extends DefaultTask {
FileCollection getConfigurations() {
FileCollection fc = asciidoctorj.configuration
FileCollection precompiledExtensions = findDependenciesInExtensions()
this.asciidocConfigurations.each {
if (it instanceof Configuration) {
fc = fc + (FileCollection) it
} else {
fc = fc + (FileCollection) (project.configurations.getByName(StringUtils.stringize(it)))
}
fc = this.asciidocConfigurations.inject(fc) { FileCollection base, Object next ->
base + fileCollectionFromConfiguration(next)
}
precompiledExtensions ? fc + precompiledExtensions : fc
}

/** Override any existing configurations except the ones available via the {@code asciidoctorj} task extension.
*
* @param configs
* @param configs Iterable list of items that can be a {@link Configuration}, {@code Provider<Configuration>}
* or anything that is convertible to a string.
*/
void setConfigurations(Iterable<Object> configs) {
this.asciidocConfigurations.clear()
Expand All @@ -522,17 +519,17 @@ class AbstractAsciidoctorTask extends DefaultTask {

/** Add additional configurations.
*
* @param configs Instances of {@link Configuration} or anything convertible to a string than can be used
* as a name of a runConfiguration.
* @param configs Iterable list of items that can be a {@link Configuration}, {@code Provider<Configuration>}
* or anything that is convertible to a string.
*/
void configurations(Iterable<Object> configs) {
this.asciidocConfigurations.addAll(configs)
}

/** Add additional configurations.
*
* @param configs Instances of {@link Configuration} or anything convertible to a string than can be used
* as a name of a runConfiguration.
* @param configs Instances of {@link Configuration}, {@code Provider<Configuration>}
* or anything that is convertible to a string.
*/
void configurations(Object... configs) {
this.asciidocConfigurations.addAll(configs)
Expand Down Expand Up @@ -644,13 +641,13 @@ class AbstractAsciidoctorTask extends DefaultTask {
* @return Executor configurations
*/
protected Map<String, ExecutorConfiguration> getExecutorConfigurations(
final File workingSourceDir,
final Set<File> sourceFiles
final File workingSourceDir,
final Set<File> sourceFiles
) {
configuredOutputOptions.backends.collectEntries { String activeBackend ->
[
"backend=${activeBackend}".toString(),
getExecutorConfigurationFor(activeBackend, workingSourceDir, sourceFiles)
"backend=${activeBackend}".toString(),
getExecutorConfigurationFor(activeBackend, workingSourceDir, sourceFiles)
]
}
}
Expand All @@ -666,30 +663,30 @@ class AbstractAsciidoctorTask extends DefaultTask {
*/
@SuppressWarnings('Instanceof')
protected ExecutorConfiguration getExecutorConfigurationFor(
final String backendName,
final File workingSourceDir,
final Set<File> sourceFiles
final String backendName,
final File workingSourceDir,
final Set<File> sourceFiles
) {
final List<String> crfb = this.copyResourcesForBackends
boolean copyResources = crfb != null && (crfb.empty || backendName in crfb)
new ExecutorConfiguration(
sourceDir: workingSourceDir,
sourceTree: sourceFiles,
outputDir: getOutputDirFor(backendName),
baseDir: getBaseDir(),
projectDir: project.projectDir,
rootDir: project.rootProject.projectDir,
options: evaluateProviders(options),
attributes: preparePreserialisedAttributes(workingSourceDir),
backendName: backendName,
logDocuments: logDocuments,
gemPath: gemPath,
fatalMessagePatterns: asciidoctorj.fatalWarnings,
asciidoctorExtensions: (asciidoctorJExtensions.findAll { !(it instanceof Dependency) }),
requires: requires,
copyResources: copyResources,
executorLogLevel: ExecutorUtils.getExecutorLogLevel(asciidoctorj.logLevel),
safeModeLevel: asciidoctorj.safeMode.level
sourceDir: workingSourceDir,
sourceTree: sourceFiles,
outputDir: getOutputDirFor(backendName),
baseDir: getBaseDir(),
projectDir: project.projectDir,
rootDir: project.rootProject.projectDir,
options: evaluateProviders(options),
attributes: preparePreserialisedAttributes(workingSourceDir),
backendName: backendName,
logDocuments: logDocuments,
gemPath: gemPath,
fatalMessagePatterns: asciidoctorj.fatalWarnings,
asciidoctorExtensions: (asciidoctorJExtensions.findAll { !(it instanceof Dependency) }),
requires: requires,
copyResources: copyResources,
executorLogLevel: ExecutorUtils.getExecutorLogLevel(asciidoctorj.logLevel),
safeModeLevel: asciidoctorj.safeMode.level
)
}

Expand All @@ -706,8 +703,8 @@ class AbstractAsciidoctorTask extends DefaultTask {
*/
protected Map<String, Object> getTaskSpecificDefaultAttributes(File workingSourceDir) {
Map<String, Object> attrs = [
includedir : (Object) workingSourceDir.absolutePath,
'gradle-project-name': (Object) project.name
includedir : (Object) workingSourceDir.absolutePath,
'gradle-project-name': (Object) project.name
]

if (project.version != null) {
Expand Down Expand Up @@ -799,7 +796,7 @@ class AbstractAsciidoctorTask extends DefaultTask {
*/
protected FileTree getSecondarySourceFileTreeFrom(File dir) {
project.fileTree(dir).
matching(this.secondarySourceDocumentPattern ?: defaultSecondarySourceDocumentPattern)
matching(this.secondarySourceDocumentPattern ?: defaultSecondarySourceDocumentPattern)
}

/** Get the output directory for a specific backend.
Expand Down Expand Up @@ -863,7 +860,7 @@ class AbstractAsciidoctorTask extends DefaultTask {
protected ProcessMode getFinalProcessMode() {
if (inProcess != JAVA_EXEC && GradleVersion.current() < GradleVersion.version(('4.3'))) {
logger.warn('Gradle API classpath leakage will cause issues with Gradle < 4.3. ' +
'Switching to JAVA_EXEC instead.')
'Switching to JAVA_EXEC instead.')
JAVA_EXEC
} else {
this.inProcess
Expand Down Expand Up @@ -910,8 +907,8 @@ class AbstractAsciidoctorTask extends DefaultTask {

if (sourceRoot != baseRoot || outputRoot != baseRoot) {
throw new AsciidoctorExecutionException('sourceDir, outputDir and baseDir needs to have the same root ' +
'filesystem for AsciidoctorJ to function correctly. ' + '' +
'This is typically caused on Winwdows where everything is not on the same drive letter.')
'filesystem for AsciidoctorJ to function correctly. ' + '' +
'This is typically caused on Winwdows where everything is not on the same drive letter.')
}
}

Expand All @@ -920,66 +917,66 @@ class AbstractAsciidoctorTask extends DefaultTask {
}

private Map<String, ExecutorConfiguration> runWithWorkers(
final File workingSourceDir, final Set<File> sourceFiles) {
final File workingSourceDir, final Set<File> sourceFiles) {
FileCollection asciidoctorClasspath = configurations
logger.info "Running AsciidoctorJ with workers. Classpath = ${asciidoctorClasspath.files}"

Map<String, ExecutorConfiguration> executorConfigurations = getExecutorConfigurations(
workingSourceDir,
sourceFiles
workingSourceDir,
sourceFiles
)

if (parallelMode) {
executorConfigurations.each { String configName, ExecutorConfiguration executorConfiguration ->
worker.submit(AsciidoctorJExecuter) { WorkerConfiguration config ->
configureWorker(
"Asciidoctor (task=${name}) conversion for ${configName}",
config,
asciidoctorClasspath,
new ExecutorConfigurationContainer(executorConfiguration)
"Asciidoctor (task=${name}) conversion for ${configName}",
config,
asciidoctorClasspath,
new ExecutorConfigurationContainer(executorConfiguration)
)
}
}
} else {
worker.submit(AsciidoctorJExecuter) { WorkerConfiguration config ->
configureWorker(
"Asciidoctor (task=${name}) conversions for ${executorConfigurations.keySet().join(', ')}",
config,
asciidoctorClasspath,
new ExecutorConfigurationContainer(executorConfigurations.values())
"Asciidoctor (task=${name}) conversions for ${executorConfigurations.keySet().join(', ')}",
config,
asciidoctorClasspath,
new ExecutorConfigurationContainer(executorConfigurations.values())
)
}
}
executorConfigurations
}

private void configureWorker(
final String displayName,
final WorkerConfiguration config,
final FileCollection asciidoctorClasspath,
final ExecutorConfigurationContainer ecContainer
final String displayName,
final WorkerConfiguration config,
final FileCollection asciidoctorClasspath,
final ExecutorConfigurationContainer ecContainer
) {
config.isolationMode = inProcess == IN_PROCESS ? CLASSLOADER : PROCESS
config.classpath = asciidoctorClasspath
config.displayName = displayName
config.params(
ecContainer
ecContainer
)
configureForkOptions(config.forkOptions)
}

private Map<String, ExecutorConfiguration> runWithJavaExec(
final File workingSourceDir,
final Set<File> sourceFiles
final File workingSourceDir,
final Set<File> sourceFiles
) {
FileCollection javaExecClasspath = JavaExecUtils.getJavaExecClasspath(
project,
configurations,
asciidoctorj.injectInternalGuavaJar
project,
configurations,
asciidoctorj.injectInternalGuavaJar
)
Map<String, ExecutorConfiguration> executorConfigurations = getExecutorConfigurations(
workingSourceDir,
sourceFiles
workingSourceDir,
sourceFiles
)
File execConfigurationData = JavaExecUtils.writeExecConfigurationData(this, executorConfigurations.values())

Expand All @@ -998,8 +995,8 @@ class AbstractAsciidoctorTask extends DefaultTask {
}
} catch (GradleException e) {
throw new AsciidoctorRemoteExecutionException(
'Remote Asciidoctor process failed to complete successfully',
e
'Remote Asciidoctor process failed to complete successfully',
e
)
}

Expand Down Expand Up @@ -1115,4 +1112,15 @@ class AbstractAsciidoctorTask extends DefaultTask {
it instanceof Closure
} as List<Closure>
}
}

private FileCollection fileCollectionFromConfiguration(Object c) {
switch (c) {
case Configuration:
return (FileCollection) c
case Provider:
return fileCollectionFromConfiguration(((Provider) c).get())
default:
(FileCollection) (project.configurations.getByName(StringUtils.stringize(c)))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@ package org.asciidoctor.gradle.jvm

import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.testfixtures.ProjectBuilder
import spock.lang.Issue
import spock.lang.Specification

import java.util.concurrent.Callable

/**
* Asciidoctor task specification
*
Expand Down Expand Up @@ -429,6 +433,25 @@ class AsciidoctorTaskSpec extends Specification {
task.attributeProviders != project.extensions.getByType(AsciidoctorJExtension).attributeProviders
}
@Issue('https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/405')
void 'Configuration that be set as a provider'() {
when:
project.allprojects {
configurations {
asciidoctorExample
}
}
AsciidoctorTask task = asciidoctorTask {
configurations = [project.provider( { project.configurations.asciidoctorExample } as Callable<Configuration>)]
}
task.getConfigurations()
then:
noExceptionThrown()
}
AsciidoctorTask asciidoctorTask(Closure cfg) {
project.tasks.create(name: ASCIIDOCTOR, type: AsciidoctorTask).configure cfg
}
Expand Down

0 comments on commit f75e674

Please sign in to comment.