Skip to content

Commit 65e42a1

Browse files
authored
[plugin] support query file directory in Gradle extension (#914)
Adds ability to specify custom query file directory (previously we had to explicitly provide a list of query files). ```kotlin graphql { client { endpoint = "http://localhost:8080/graphql" package = "com.example" queryFileDirectory = "${project.projectDir}/src/main/resources/queries" } } ```
1 parent 23a291c commit 65e42a1

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

docs/plugins/gradle-plugin.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ graphql {
102102
headers = mapOf("X-Custom-Header" to "Custom-Header-Value")
103103
// Target package name to be used for generated classes.
104104
packageName = "com.example.generated"
105-
// Optional list of query files to be processed, if not specified will default to all query files under src/main/resources.
105+
// Custom directory containing query files, defaults to src/main/resources
106+
queryFileDirectory = "${project.projectDir}/src/main/resources/queries"
107+
// Optional list of query files to be processed, takes precedence over queryFileDirectory
106108
queryFiles = listOf(file("${project.projectDir}/src/main/resources/queries/MyQuery.graphql"))
107109
// GraphQL server SDL endpoint that will be used to download schema. Alternatively you can run introspection query against `endpoint`.
108110
sdlEndpoint = "http://localhost:8080/sdl"
@@ -134,7 +136,9 @@ graphql {
134136
headers = ["X-Custom-Header" : "My-Custom-Header-Value"]
135137
// Target package name to be used for generated classes.
136138
packageName = "com.example.generated"
137-
// Optional list of query files to be processed, if not specified will default to all query files under src/main/resources.
139+
// Custom directory containing query files, defaults to src/main/resources
140+
queryFileDirectory = "${project.projectDir}/src/main/resources/queries"
141+
// Optional list of query files to be processed, takes precedence over queryFileDirectory
138142
queryFiles = [file("${project.projectDir}/src/main/resources/queries/MyQuery.graphql")]
139143
// GraphQL server SDL endpoint that will be used to download schema. Alternatively you can run introspection query against `endpoint`.
140144
sdlEndpoint = "http://localhost:8080/sdl"

plugins/graphql-kotlin-gradle-plugin/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ graphql {
3939
headers = mapOf("X-Custom-Header" to "Custom-Header-Value")
4040
// Target package name to be used for generated classes.
4141
packageName = "com.example.generated"
42-
// Optional list of query files to be processed, if not specified will default to all query files under src/main/resources.
42+
// Custom directory containing query files, defaults to src/main/resources
43+
queryFileDirectory = "${project.projectDir}/src/main/resources/queries"
44+
// Optional list of query files to be processed, takes precedence over queryFileDirectory
4345
queryFiles = listOf(file("${project.projectDir}/src/main/resources/queries/MyQuery.graphql"))
4446
// GraphQL server SDL endpoint that will be used to download schema. Alternatively you can run introspection query against `endpoint`.
4547
sdlEndpoint = "http://localhost:8080/sdl"

plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/GraphQLGradlePlugin.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class GraphQLGradlePlugin : Plugin<Project> {
6161
generateClientTask.packageName.convention(project.provider { extension.clientExtension.packageName })
6262
generateClientTask.allowDeprecatedFields.convention(project.provider { extension.clientExtension.allowDeprecatedFields })
6363
generateClientTask.converters.convention(extension.clientExtension.converters)
64+
val queryFileDirectory = extension.clientExtension.queryFileDirectory
65+
if (queryFileDirectory != null) {
66+
generateClientTask.queryFileDirectory.convention(queryFileDirectory)
67+
}
6468
generateClientTask.queryFiles.setFrom(extension.clientExtension.queryFiles)
6569
generateClientTask.clientType.convention(extension.clientExtension.clientType)
6670

plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/GraphQLPluginExtension.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ open class GraphQLPluginClientExtension {
5757
var converters: Map<String, ScalarConverterMapping> = emptyMap()
5858
/** List of query files to be processed. */
5959
var queryFiles: List<File> = emptyList()
60+
/** Directory containing GraphQL query files. */
61+
var queryFileDirectory: String? = null
6062
/** Type of GraphQL client implementation to generate. */
6163
var clientType: GraphQLClientType = GraphQLClientType.DEFAULT
6264

plugins/graphql-kotlin-gradle-plugin/src/test/kotlin/com/expediagroup/graphql/plugin/gradle/GraphQLGradlePluginIT.kt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,48 @@ class GraphQLGradlePluginIT : GraphQLGradlePluginAbstractIT() {
261261
assertTrue(File(testProjectDirectory, "build/generated/source/graphql/main/com/example/generated/DeprecatedQuery.kt").exists())
262262
assertEquals(TaskOutcome.SUCCESS, buildResult.task(":run")?.outcome)
263263
}
264+
265+
@Test
266+
@Tag("kts")
267+
fun `apply the plugin extension to generate client using custom directory (kts)`(@TempDir tempDir: Path) {
268+
val testProjectDirectory = tempDir.toFile()
269+
val buildFileContents =
270+
"""
271+
application {
272+
applicationDefaultJvmArgs = listOf("-DgraphQLEndpoint=${wireMockServer.baseUrl()}/graphql")
273+
mainClassName = "com.example.ApplicationKt"
274+
}
275+
276+
graphql {
277+
client {
278+
sdlEndpoint = "${wireMockServer.baseUrl()}/sdl"
279+
packageName = "com.example.generated"
280+
281+
// optional
282+
allowDeprecatedFields = true
283+
queryFileDirectory = "${'$'}{project.projectDir}/src/main/resources/queries"
284+
}
285+
}
286+
""".trimIndent()
287+
testProjectDirectory.generateBuildFile(buildFileContents)
288+
testProjectDirectory.createTestFile("JUnitQuery.graphql", "src/main/resources/queries")
289+
.writeText(testQuery)
290+
testProjectDirectory.createTestFile("DeprecatedQuery.graphql", "src/main/resources/queries")
291+
.writeText(loadResource("mocks/DeprecatedQuery.graphql"))
292+
testProjectDirectory.createTestFile("Application.kt", "src/main/kotlin/com/example")
293+
.writeText(loadTemplate("Application", mapOf("customScalarsEnabled" to false)))
294+
295+
val buildResult = GradleRunner.create()
296+
.withProjectDir(testProjectDirectory)
297+
.withPluginClasspath()
298+
.withArguments("build", "run")
299+
.build()
300+
301+
assertEquals(TaskOutcome.SUCCESS, buildResult.task(":$DOWNLOAD_SDL_TASK_NAME")?.outcome)
302+
assertEquals(TaskOutcome.SUCCESS, buildResult.task(":$GENERATE_CLIENT_TASK_NAME")?.outcome)
303+
assertTrue(File(testProjectDirectory, "build/schema.graphql").exists())
304+
assertTrue(File(testProjectDirectory, "build/generated/source/graphql/main/com/example/generated/JUnitQuery.kt").exists())
305+
assertTrue(File(testProjectDirectory, "build/generated/source/graphql/main/com/example/generated/DeprecatedQuery.kt").exists())
306+
assertEquals(TaskOutcome.SUCCESS, buildResult.task(":run")?.outcome)
307+
}
264308
}

0 commit comments

Comments
 (0)