Skip to content

Commit 5cd1f2b

Browse files
authored
Bump Develocity API spec version to 2025.2 (#507)
Bump spec version to 2025.2 and library version to 2025.2.0. Fix new case of bad enum member name mapping, while adding a test ensuring the library API contains no unfixed cases.
1 parent cb13592 commit 5cd1f2b

File tree

11 files changed

+433
-73
lines changed

11 files changed

+433
-73
lines changed

build-logic/src/functionalTest/kotlin/com/gabrielfeo/task/PostProcessGeneratedApiTest.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,49 @@ class PostProcessGeneratedApiTest {
180180
""".trimIndent(),
181181
)
182182

183+
/**
184+
* Fixes enum case names: mAVENEXTCLASSPATH -> mavenExtClasspath (gabrielfeo/develocity-api-kotlin#429).
185+
*
186+
* Occurs when API spec enum name is uppercase and generator enumPropertyNaming is camelCase.
187+
*/
188+
@Test
189+
fun mavenExtensionTypeEnumPostProcessing() = testPostProcessing(
190+
inputPath = "src/main/kotlin/com/gabrielfeo/develocity/api/model/MavenExtension.kt",
191+
inputContent = """
192+
/**
193+
* The extension application type. * `CORE` - A core extension, provided in the lib folder of the Maven installation. * `MAVEN_EXT_CLASSPATH` - A core extension provided via the -Dmaven.ext.class.path system property. * `LIB_EXT` - A core extension, provided in the lib/ext folder of the Maven installation. * `PROJECT` - A project extension, provided via a declaration in .mvn/extensions.xml in the Maven working directory. * `POM` - A build extension, provided via a declaration in the build section of the top level project pom.xml * `UNKNOWN` - An extension for which none of the other types match.
194+
*
195+
* Values: cORE,mAVENEXTCLASSPATH,lIBEXT,pROJECT,pOM,uNKNOWN
196+
*/
197+
@JsonClass(generateAdapter = false)
198+
enum class Type(val value: kotlin.String) {
199+
@Json(name = "CORE") cORE("CORE"),
200+
@Json(name = "MAVEN_EXT_CLASSPATH") mAVENEXTCLASSPATH("MAVEN_EXT_CLASSPATH"),
201+
@Json(name = "LIB_EXT") lIBEXT("LIB_EXT"),
202+
@Json(name = "PROJECT") pROJECT("PROJECT"),
203+
@Json(name = "POM") pOM("POM"),
204+
@Json(name = "UNKNOWN") uNKNOWN("UNKNOWN");
205+
}
206+
""".trimIndent(),
207+
outputPath = "src/main/kotlin/com/gabrielfeo/develocity/api/model/MavenExtension.kt",
208+
outputContent = """
209+
/**
210+
* The extension application type. * `CORE` - A core extension, provided in the lib folder of the Maven installation. * `MAVEN_EXT_CLASSPATH` - A core extension provided via the -Dmaven.ext.class.path system property. * `LIB_EXT` - A core extension, provided in the lib/ext folder of the Maven installation. * `PROJECT` - A project extension, provided via a declaration in .mvn/extensions.xml in the Maven working directory. * `POM` - A build extension, provided via a declaration in the build section of the top level project pom.xml * `UNKNOWN` - An extension for which none of the other types match.
211+
*
212+
* Values: core,mavenExtClasspath,libExt,project,pom,unknown
213+
*/
214+
@JsonClass(generateAdapter = false)
215+
enum class Type(val value: kotlin.String) {
216+
@Json(name = "CORE") core("CORE"),
217+
@Json(name = "MAVEN_EXT_CLASSPATH") mavenExtClasspath("MAVEN_EXT_CLASSPATH"),
218+
@Json(name = "LIB_EXT") libExt("LIB_EXT"),
219+
@Json(name = "PROJECT") project("PROJECT"),
220+
@Json(name = "POM") pom("POM"),
221+
@Json(name = "UNKNOWN") unknown("UNKNOWN");
222+
}
223+
""".trimIndent(),
224+
)
225+
183226
private fun testPostProcessing(
184227
inputPath: String,
185228
inputContent: String,

build-logic/src/main/kotlin/com/gabrielfeo/task/PostProcessGeneratedApi.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@ abstract class PostProcessGeneratedApi @Inject constructor(
5757
replaceAll("hIT", "hit", dir = srcDir, includes = file)
5858
replaceAll("mISS", "miss", dir = srcDir, includes = file)
5959
replaceAll("fAILED", "failed", dir = srcDir, includes = file)
60+
61+
// Fix mapping of MavenExtension.Type: lIBEXT -> core
62+
val mavenExtensionFile = "com/gabrielfeo/develocity/api/model/MavenExtension.kt"
63+
mapOf(
64+
"cORE" to "core",
65+
"mAVENEXTCLASSPATH" to "mavenExtClasspath",
66+
"lIBEXT" to "libExt",
67+
"pROJECT" to "project",
68+
"pOM" to "pom",
69+
"uNKNOWN" to "unknown",
70+
).forEach { (match, replace) ->
71+
replaceAll(match, replace, dir = srcDir, includes = mavenExtensionFile)
72+
}
6073
}
6174

6275
private fun replaceAll(

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
group=com.gabrielfeo
22
artifact=develocity-api-kotlin
3-
version=2025.1.0
4-
develocity.version=2025.1
3+
version=2025.2.0
4+
develocity.version=2025.2
55
repo.url=https://github.com/gabrielfeo/develocity-api-kotlin
66
org.gradle.parallel=true
77
org.gradle.jvmargs=-Xmx5g

library/api/library.api

Lines changed: 288 additions & 41 deletions
Large diffs are not rendered by default.

library/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ tasks.named("compileJava", JavaCompile::class) {
108108
targetCompatibility = JavaVersion.VERSION_11.majorVersion
109109
}
110110

111+
tasks.processIntegrationTestResources {
112+
dependsOn(tasks.apiCheck)
113+
from(project.layout.projectDirectory.dir("api/library.api"))
114+
}
115+
111116
tasks.named("compileKotlin", KotlinCompile::class) {
112117
compilerOptions {
113118
languageVersion = KotlinVersion.KOTLIN_1_8
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.gabrielfeo.develocity.api
2+
3+
import ch.qos.logback.classic.spi.ILoggingEvent
4+
import ch.qos.logback.core.AppenderBase
5+
import java.util.concurrent.CopyOnWriteArrayList
6+
7+
class InMemoryLogRecorder : AppenderBase<ILoggingEvent>() {
8+
9+
val logsByLoggerName: CopyOnWriteArrayList<Pair<String, String>> = CopyOnWriteArrayList()
10+
11+
override fun append(eventObject: ILoggingEvent) {
12+
with(eventObject) {
13+
logsByLoggerName.add(loggerName to formattedMessage)
14+
}
15+
}
16+
17+
fun clear() {
18+
logsByLoggerName.clear()
19+
}
20+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.gabrielfeo.develocity.api
2+
3+
import org.junit.jupiter.api.Assertions.assertTrue
4+
import org.junit.jupiter.api.Test
5+
import java.nio.file.Files
6+
import java.nio.file.Paths
7+
8+
class LibraryApiNamingTest {
9+
10+
/**
11+
* Tests against unfixed cases of the enum member naming bug in openapi-generator.
12+
* See PostProcessGeneratedApi.kt.
13+
*/
14+
@Test
15+
fun `all members are lower camel case`() {
16+
val libraryApi = readLibraryApi()
17+
val regex = Regex("""\b[a-z][A-Z]+\b""")
18+
val matches = regex.findAll(libraryApi).toList()
19+
assertTrue(matches.isEmpty(), "Lower camel case naming violations: ${matches.map { it.value }}")
20+
}
21+
22+
private fun readLibraryApi(): String {
23+
val resource = this::class.java.classLoader.getResource("library.api")
24+
requireNotNull(resource) { "library.api not found in test resources" }
25+
return Files.readAllLines(Paths.get(resource.toURI())).joinToString("\n")
26+
}
27+
}

library/src/integrationTest/kotlin/com/gabrielfeo/develocity/api/LoggingIntegrationTest.kt

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,35 @@
11
package com.gabrielfeo.develocity.api
22

3-
import ch.qos.logback.classic.Logger as LogbackLogger
43
import ch.qos.logback.classic.spi.ILoggingEvent
54
import ch.qos.logback.core.AppenderBase
6-
import ch.qos.logback.core.ConsoleAppender
75
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
6+
import ch.qos.logback.classic.LoggerContext as LogbackLoggerContext
87
import com.gabrielfeo.develocity.api.internal.*
98
import kotlinx.coroutines.test.runTest
109
import org.junit.jupiter.api.io.TempDir
1110
import org.slf4j.Logger
11+
import org.slf4j.Logger.ROOT_LOGGER_NAME
1212
import org.slf4j.LoggerFactory
1313
import java.io.File
1414
import kotlin.test.*
1515

1616
class LoggingIntegrationTest {
1717

18-
private class LogRecorder : AppenderBase<ILoggingEvent>() {
19-
val logsByLoggerName = mutableListOf<Pair<String, String>>()
20-
override fun append(eventObject: ILoggingEvent) {
21-
with(eventObject) {
22-
logsByLoggerName += (loggerName to formattedMessage)
23-
}
24-
}
25-
}
26-
2718
@TempDir
2819
lateinit var tempDir: File
2920

30-
private val recorder = LogRecorder()
21+
private val recorder: InMemoryLogRecorder by lazy {
22+
val lc = LoggerFactory.getILoggerFactory() as LogbackLoggerContext
23+
// The appender is attached to the com.gabrielfeo.develocity.api logger
24+
val logger = lc.getLogger("com.gabrielfeo.develocity")
25+
logger.getAppender("IN_MEMORY") as InMemoryLogRecorder
26+
}
3127

3228
private lateinit var api: DevelocityApi
3329

3430
@BeforeTest
3531
fun setup() {
36-
(LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as LogbackLogger).apply {
37-
detachAndStopAllAppenders()
38-
addAppender(recorder)
39-
addAppender(ConsoleAppender<ILoggingEvent>().apply {
40-
context = loggerContext
41-
encoder = PatternLayoutEncoder().apply {
42-
context = loggerContext
43-
pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
44-
start()
45-
}
46-
start()
47-
})
48-
}
32+
// Appender is configured via logback-test.xml; ensure it's started
4933
recorder.start()
5034
val mockWebServer = okhttp3.mockwebserver.MockWebServer()
5135
mockWebServer.enqueue(okhttp3.mockwebserver.MockResponse().setBody("[]"))
@@ -65,6 +49,10 @@ class LoggingIntegrationTest {
6549

6650
@AfterTest
6751
fun tearDown() {
52+
val lc = LoggerFactory.getILoggerFactory() as LogbackLoggerContext
53+
val logger = lc.getLogger("com.gabrielfeo.develocity")
54+
logger.detachAppender("IN_MEMORY")
55+
recorder.stop()
6856
api.shutdown()
6957
}
7058

library/src/integrationTest/kotlin/com/gabrielfeo/develocity/api/SmokeTest.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import kotlin.test.assertTrue
88
class SmokeTest {
99

1010
@Test
11-
fun testSuiteNotSensitiveToEnvironment() {
12-
assertTrue(RealEnv.asMap().isEmpty())
11+
fun testSuiteEnvironmentIsEmpty() {
12+
val vars = RealEnv.asMap().toMutableMap().entries.apply {
13+
// Added by either Gradle or JUnit that but irrelevant to library functionality
14+
removeAll { (k, _) -> k.endsWith("CF_USER_TEXT_ENCODING") }
15+
removeAll { (k, _) -> k.startsWith("JAVA_MAIN_CLASS") }
16+
}
17+
assertTrue(vars.isEmpty(), "Expected empty environment, found $vars")
1318
}
14-
}
19+
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
<configuration>
2-
<logger name="com.gabrielfeo.develocity" level="DEBUG"/>
2+
3+
<logger name="com.gabrielfeo.develocity" level="DEBUG">
4+
<appender-ref ref="IN_MEMORY" />
5+
</logger>
6+
37
<root level="INFO">
4-
<appender-ref ref="CONSOLE"/>
8+
<appender-ref ref="CONSOLE" />
59
</root>
10+
11+
<appender name="IN_MEMORY" class="com.gabrielfeo.develocity.api.InMemoryLogRecorder" />
12+
613
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
714
<encoder>
815
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
916
</encoder>
1017
</appender>
18+
1119
</configuration>

0 commit comments

Comments
 (0)