Skip to content

Commit d02cee4

Browse files
committed
use custom gradle dependencies block to configure processor dependencies
1 parent 451a4ef commit d02cee4

11 files changed

Lines changed: 113 additions & 117 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ gradlePlugin {
9595
create("processorPlugin") {
9696
id = "io.openapiprocessor.openapi-processor"
9797
displayName = "Gradle openapi-processor plugin"
98-
description = "plugin to run openapi-processor-*, e.g. openapi-processor-spring (requires gradle 7.2+)"
98+
description = "plugin to run openapi-processor-*, e.g. openapi-processor-spring (requires gradle 8.7+)"
9999
tags.set(listOf("openapi", "openapi-processor"))
100100
implementationClass = "io.openapiprocessor.gradle.OpenApiProcessorPlugin"
101101
}

src/main/kotlin/com/github/hauner/openapi/gradle/Processor.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
package com.github.hauner.openapi.gradle
77

8+
import org.gradle.api.model.ObjectFactory
9+
810
/**
911
* backward compatibility, replaced by [io.openapiprocessor.gradle.ProcessorBase]
1012
*/
1113
@Deprecated("backward compatibility.")
12-
class Processor(name: String): io.openapiprocessor.gradle.Processor(name)
14+
class Processor(name: String, objects: ObjectFactory): io.openapiprocessor.gradle.Processor(name, objects)

src/main/kotlin/io/openapiprocessor/gradle/OpenApiProcessorPlugin.kt

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import io.openapiprocessor.gradle.version.GitHubVersionCheck
1111
import io.openapiprocessor.gradle.version.GitHubVersionProvider
1212
import io.openapiprocessor.gradle.version.VersionCheck
1313
import org.gradle.api.Action
14+
import org.gradle.api.NamedDomainObjectProvider
1415
import org.gradle.api.Plugin
1516
import org.gradle.api.Project
16-
import org.gradle.api.artifacts.Dependency
17+
import org.gradle.api.artifacts.ResolvableConfiguration
18+
import org.gradle.util.GradleVersion
1719
import java.io.File
1820

1921
/**
@@ -36,7 +38,7 @@ class OpenApiProcessorPlugin: Plugin<Project> {
3638

3739
private fun addOpenApiProcessorRepository (project: Project) {
3840
val snapshots = project.findProperty ("openapi-processor-gradle.snapshots")
39-
if (snapshots == null || snapshots != "true") {
41+
if ((snapshots == null) || (snapshots != "true")) {
4042
project.logger.debug("openapi-processor: snapshot repository disabled")
4143
return
4244
}
@@ -65,16 +67,31 @@ class OpenApiProcessorPlugin: Plugin<Project> {
6567
/**
6668
* Create a 'process{ProcessorName}' task for each configured processor.
6769
*/
70+
@Suppress("UnstableApiUsage")
6871
fun createProcessingTasks(project: Project, extension: OpenApiProcessorExtension) {
6972
extension.processors.configureEach(
7073
object : Action<Processor> {
7174
override fun execute(processor: Processor) {
7275
val name = "process${processor.name.replaceFirstChar { it.uppercase() }}"
7376

77+
val scope = project.configurations.dependencyScope("${processor.name}Scope") {
78+
fromDependencyCollector(processor.dependencies.process)
79+
}
80+
81+
project.dependencies.add(
82+
scope.name,
83+
"io.openapiprocessor:openapi-processor-api:${Versions.api}")
84+
85+
val resolvable = project.configurations.resolvable("${processor.name}Classpath") {
86+
extendsFrom(scope.get())
87+
isCanBeResolved = true
88+
isCanBeConsumed = false
89+
}
90+
7491
project.tasks.register(
7592
name,
7693
OpenApiProcessorTask::class.java,
77-
createTaskBuilderAction(name, processor, extension)
94+
createTaskBuilderAction(processor, extension, resolvable)
7895
)
7996
}
8097
})
@@ -83,8 +100,12 @@ class OpenApiProcessorPlugin: Plugin<Project> {
83100
/**
84101
* Creates an Action that configures a 'process{ProcessorName}' task from its configuration.
85102
*/
86-
private fun createTaskBuilderAction(name: String, processor: Processor, extension: OpenApiProcessorExtension):
87-
Action<OpenApiProcessorTask> {
103+
@Suppress("UnstableApiUsage")
104+
private fun createTaskBuilderAction(
105+
processor: Processor,
106+
extension: OpenApiProcessorExtension,
107+
processorClasspath: NamedDomainObjectProvider<ResolvableConfiguration>
108+
): Action<OpenApiProcessorTask> {
88109

89110
return object: Action<OpenApiProcessorTask> {
90111
// copy common api path to openapi-processor props if not set
@@ -121,32 +142,12 @@ class OpenApiProcessorPlugin: Plugin<Project> {
121142
task.group = "openapi processor"
122143
task.description = "process openapi with openapi-processor-${processor.name}"
123144

124-
copyApiPath (task)
145+
copyApiPath(task)
125146
task.getApiDir().set(project.layout.projectDirectory.dir(getInputDirectory()))
126147
task.getTargetDir().set(project.layout.projectDirectory.dir(getOutputDirectory()))
127148
processor.getMapping()?.let { task.getMapping().set(project.file(it)) }
128149

129-
val handler = project.dependencies
130-
val dependencies = ArrayList<Dependency>()
131-
132-
if (processor.dependencies.isEmpty()) {
133-
task.logger.warn ("'${EXTENSION_NAME_DEFAULT}.${name}.processor' not set!")
134-
}
135-
136-
dependencies.add (handler.create("io.openapiprocessor:openapi-processor-api:${Versions.api}"))
137-
138-
processor.dependencies.forEach {
139-
dependencies.add (handler.create (it))
140-
}
141-
142-
val deps = dependencies.toTypedArray()
143-
val cfg = project.configurations.detachedConfiguration(*deps)
144-
145-
cfg.isCanBeResolved = true
146-
cfg.isCanBeConsumed = false
147-
cfg.isTransitive = true
148-
cfg.description = "the dependencies of the process${name.replaceFirstChar { it.uppercase() }} task."
149-
task.getDependencies().from (cfg)
150+
task.getDependencies().from(processorClasspath)
150151
}
151152
}
152153
}
@@ -157,11 +158,12 @@ class OpenApiProcessorPlugin: Plugin<Project> {
157158

158159
companion object {
159160
private fun isSupportedGradleVersion(project: Project): Boolean {
160-
val version: String = project.gradle.gradleVersion
161+
val currentVersion = GradleVersion.current()
162+
val minVersion = GradleVersion.version("8.7")
161163

162-
if (version < "7.0") {
163-
project.logger.error ("the current gradle version is $version")
164-
project.logger.error ("openapi-processor-gradle requires gradle 7.0+")
164+
if (currentVersion < minVersion) {
165+
project.logger.error ("the current gradle version is $currentVersion")
166+
project.logger.error ("openapi-processor-gradle requires gradle $minVersion+")
165167
return false
166168
}
167169

src/main/kotlin/io/openapiprocessor/gradle/Processor.kt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,49 @@
66
package io.openapiprocessor.gradle
77

88
import groovy.lang.GString
9+
import org.gradle.api.Action
10+
import org.gradle.api.artifacts.Dependency
11+
import org.gradle.api.artifacts.dsl.DependencyCollector
912
import org.gradle.api.file.Directory
13+
import org.gradle.api.file.FileCollection
1014
import org.gradle.api.file.RegularFile
15+
import org.gradle.api.model.ObjectFactory
1116
import org.gradle.api.provider.Provider
17+
import org.gradle.api.tasks.Nested
18+
import java.io.File
1219
import javax.inject.Inject
1320

1421
/**
1522
* represents an openapi-processor configured in [OpenApiProcessorExtension]
1623
*/
1724

18-
open class Processor @Inject constructor(configName: String): ProcessorBase() {
25+
open class Processor @Inject constructor(configName: String, val objects: ObjectFactory): ProcessorBase() {
1926

2027
companion object {
2128
const val API_PATH = "apiPath"
2229
const val TARGET_DIR = "targetDir"
2330
}
2431

32+
interface ProcessorDependencies {
33+
val process: DependencyCollector
34+
}
35+
2536
var name: String
2637
val config: String
2738
val other: MutableMap<String, Any> = mutableMapOf()
28-
val dependencies: MutableCollection<Any> = mutableListOf()
2939

3040
init {
3141
name = configName
3242
config = configName
3343
}
3444

45+
@get:Nested
46+
val dependencies: ProcessorDependencies = objects.newInstance(ProcessorDependencies::class.java)
47+
48+
fun dependencies(action: Action<in ProcessorDependencies>) {
49+
action.execute(dependencies)
50+
}
51+
3552
fun processorName(processorName: String) {
3653
this.name = processorName
3754
}
@@ -40,8 +57,17 @@ open class Processor @Inject constructor(configName: String): ProcessorBase() {
4057
this.name = processorName.toString()
4158
}
4259

60+
//@Deprecated("use dependencies { process(dependency) } instead")
4361
fun processor(dependency: Any) {
44-
dependencies.add(dependency)
62+
@Suppress("UNCHECKED_CAST")
63+
when (dependency) {
64+
is CharSequence -> dependencies.process.add(dependency)
65+
is File -> dependencies.process.add(objects.fileCollection().from(dependency))
66+
is FileCollection -> dependencies.process.add(dependency)
67+
is Dependency -> dependencies.process.add(dependency)
68+
is Provider<*> -> dependencies.process.add(dependency as Provider<out Dependency>)
69+
else -> dependencies.process.add(dependency.toString())
70+
}
4571
}
4672

4773
fun getTargetDir(): String {
@@ -77,7 +103,7 @@ open class Processor @Inject constructor(configName: String): ProcessorBase() {
77103
}
78104

79105
/**
80-
* allow to assign targetDir like
106+
* allow assigning targetDir like
81107
*
82108
* {@code targetDir = layout.buildDirectory.dir("openapi")}
83109
*

src/test/groovy/io/openapiprocessor/gradle/OpenApiProcessorExtensionSpec.groovy

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.openapiprocessor.gradle
77

88
import org.gradle.api.Project
9+
import org.gradle.api.artifacts.FileCollectionDependency
910
import org.gradle.testfixtures.ProjectBuilder
1011
import spock.lang.Specification
1112

@@ -50,21 +51,32 @@ class OpenApiProcessorExtensionSpec extends Specification {
5051
void "creates processor from string" () {
5152
when:
5253
ex.process("test", {
53-
processor("/a processor")
54+
processor("io.openapiprocessor:processor:1.0.0")
5455
})
5556

5657
then:
57-
ex.processors.getByName("test").dependencies.first() == "/a processor"
58+
def processor = ex.processors.getByName("test")
59+
def dependencies = processor.dependencies.process.dependencies.get()
60+
.collect {
61+
return "${it.group}:${it.name}:${it.version}" as String
62+
}
63+
64+
dependencies.first() == "io.openapiprocessor:processor:1.0.0"
5865
}
5966

6067
void "creates processor from file" () {
6168
when:
6269
ex.process("test") {
63-
processor(project.file("processor"))
70+
processor(project.file("processor.jar"))
6471
}
6572

6673
then:
67-
ex.processors.getByName("test").dependencies.first().name == "processor"
74+
def processor = ex.processors.getByName("test")
75+
def dependencies = processor.dependencies.process.dependencies.get()
76+
.collect {(it as FileCollectionDependency).files.files }
77+
.flatten() as List<File>
78+
79+
dependencies.first().name.endsWith("processor.jar")
6880
}
6981

7082
void "converts processor properties to map via process()/prop() methods" () {
@@ -118,4 +130,20 @@ class OpenApiProcessorExtensionSpec extends Specification {
118130
then:
119131
ex.api.get().asFile == project.file("src/api/openapi.yaml")
120132
}
133+
134+
void "add processor specific dependency"() {
135+
when:
136+
ex.process ("test") {
137+
dependencies {
138+
process("com.google.googlejavaformat:google-java-format:1.24.0")
139+
}
140+
}
141+
142+
then:
143+
def config = project.configurations.getByName("testScope")
144+
def dependencies = config.dependencies.collect { "${it.group}:${it.name}:${it.version}" as String }
145+
146+
dependencies.contains("io.openapiprocessor:openapi-processor-api:${Versions.api}" as String)
147+
dependencies.contains("com.google.googlejavaformat:google-java-format:1.24.0")
148+
}
121149
}

src/test/groovy/io/openapiprocessor/gradle/ProcessorSpec.groovy

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55

66
package io.openapiprocessor.gradle
77

8+
import org.gradle.api.Project
89
import org.gradle.testfixtures.ProjectBuilder
910
import spock.lang.Specification
1011

1112
@SuppressWarnings('ConfigurationAvoidance')
1213
class ProcessorSpec extends Specification {
1314

15+
Project project = ProjectBuilder.builder().build()
16+
1417
void "gets & sets named props" () {
15-
def processor = new Processor('test')
18+
def processor = new Processor('test', project.objects)
1619

1720
when:
1821
processor."${prop}" (value)
@@ -27,7 +30,7 @@ class ProcessorSpec extends Specification {
2730
}
2831

2932
void "maps unknown properties via methodMissing" () {
30-
def processor = new Processor('test')
33+
def processor = new Processor('test', project.objects)
3134

3235
when:
3336
processor.unknown ('foo')
@@ -37,7 +40,7 @@ class ProcessorSpec extends Specification {
3740
}
3841

3942
void "maps nested properties via methodMissing" () {
40-
def processor = new Processor('test')
43+
def processor = new Processor('test', project.objects)
4144

4245
when:
4346
processor.test {
@@ -57,7 +60,7 @@ class ProcessorSpec extends Specification {
5760
}
5861

5962
void "maps unknown properties via prop()" () {
60-
def processor = new Processor('test')
63+
def processor = new Processor('test', project.objects)
6164
6265
when:
6366
processor.prop ('foo', "any")
@@ -69,7 +72,7 @@ class ProcessorSpec extends Specification {
6972
}
7073
7174
void "maps nested properties via prop()" () {
72-
def processor = new Processor('test')
75+
def processor = new Processor('test', project.objects)
7376
7477
when:
7578
processor.prop("test", [
@@ -89,7 +92,6 @@ class ProcessorSpec extends Specification {
8992
}
9093
9194
void "accept targetDir when given as Directory" () {
92-
def project = ProjectBuilder.builder().build()
9395
project.pluginManager.apply(OpenApiProcessorPlugin)
9496
9597
when:
@@ -107,7 +109,6 @@ class ProcessorSpec extends Specification {
107109
}
108110
109111
void "accept targetDir when given as Provider<Directory>" () {
110-
def project = ProjectBuilder.builder().build()
111112
project.pluginManager.apply(OpenApiProcessorPlugin)
112113
113114
when:
@@ -125,7 +126,6 @@ class ProcessorSpec extends Specification {
125126
}
126127
127128
void "accept targetDir assignment with Provider<Directory>" () {
128-
def project = ProjectBuilder.builder().build()
129129
project.pluginManager.apply(OpenApiProcessorPlugin)
130130
131131
when:
@@ -143,7 +143,6 @@ class ProcessorSpec extends Specification {
143143
}
144144
145145
void "accept mapping property when given as RegularFile" () {
146-
def project = ProjectBuilder.builder().build()
147146
project.pluginManager.apply(OpenApiProcessorPlugin)
148147
149148
when:

src/testInt/groovy/io/openapiprocessor/gradle/GroovyDslSpec.groovy

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,6 @@ class GroovyDslSpec extends PluginSpec {
4747
['--stacktrace', 'processV1']
4848
}
4949

50-
@Unroll
51-
void "test groovy (method) dsl with with gradle 7 (#gradleVersion)" () {
52-
when:
53-
def result = build(gradleVersion)
54-
55-
then:
56-
result.task(':processV1').outcome == SUCCESS
57-
result.output.contains("processor v1 did run !")
58-
59-
where:
60-
gradleVersion << Gradle.VERSIONS_7
61-
.findAll { it.groovy }
62-
.collect { it.version }
63-
}
64-
6550
@Unroll
6651
void "test groovy (method) dsl with with gradle 8 (#gradleVersion)" () {
6752
when:

0 commit comments

Comments
 (0)