Skip to content

Commit 37f52e7

Browse files
authored
jetbrains: Split generated output over multiple files (#830)
Single generated file exceeded IDE default limits for code completion functionality Resolve by splitting generated metric objects by namespace
1 parent a31df46 commit 37f52e7

File tree

19 files changed

+343
-249
lines changed

19 files changed

+343
-249
lines changed

telemetry/jetbrains/src/main/kotlin/software/aws/toolkits/telemetry/generator/TelemetryGenerator.kt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,27 @@ fun generateTelemetryFromFiles(
6666
metric.copy(metadata = metric.metadata + commonMetadata)
6767
}
6868

69+
val indent = " ".repeat(4)
6970
// make sure the output directory exists before writing to it
7071
outputFolder.mkdirs()
71-
FileSpec.builder(PACKAGE_NAME, "TelemetryDefinitions")
72-
.indent(" ".repeat(4))
72+
FileSpec.builder(PACKAGE_NAME, "TelemetryEnums")
73+
.indent(indent)
7374
.generateHeader()
7475
.generateTelemetryEnumTypes(telemetry.types)
75-
.generateTelemetryObjects(metricsWithCommonMetadata)
7676
.build()
7777
.writeTo(outputFolder)
78+
79+
// Namespaced metrics
80+
metricsWithCommonMetadata.groupBy { it.namespace() }
81+
.toSortedMap()
82+
.forEach { (namespace, metrics) ->
83+
FileSpec.builder(PACKAGE_NAME, namespace.capitalize() + "Telemetry")
84+
.indent(indent)
85+
.generateHeader()
86+
.generateNamespaces(namespace, metrics)
87+
.build()
88+
.writeTo(outputFolder)
89+
}
7890
}
7991

8092
private fun FileSpec.Builder.generateHeader(): FileSpec.Builder {
@@ -144,14 +156,6 @@ private fun FileSpec.Builder.generateTelemetryEnumType(item: TelemetryMetricType
144156
return this
145157
}
146158

147-
private fun FileSpec.Builder.generateTelemetryObjects(schema: List<MetricSchema>): FileSpec.Builder {
148-
schema.groupBy { it.namespace() }
149-
.toSortedMap()
150-
.forEach { (namespace, metrics) -> generateNamespaces(namespace, metrics) }
151-
152-
return this
153-
}
154-
155159
private fun FileSpec.Builder.generateNamespaces(namespace: String, metrics: List<MetricSchema>): FileSpec.Builder {
156160
val telemetryObject = TypeSpec.objectBuilder("${namespace.toTypeFormat()}Telemetry")
157161

telemetry/jetbrains/src/test/kotlin/software/aws/toolkits/telemetry/generator/GeneratorTest.kt

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,28 @@
33

44
package software.aws.toolkits.telemetry.generator
55

6+
import java.io.File
7+
import java.nio.file.Files
8+
import java.nio.file.Paths
9+
import kotlin.io.path.isRegularFile
10+
import kotlin.io.path.readText
11+
import kotlin.io.path.toPath
612
import org.assertj.core.api.Assertions.assertThat
713
import org.assertj.core.api.Assertions.assertThatThrownBy
814
import org.junit.Rule
915
import org.junit.Test
1016
import org.junit.rules.TemporaryFolder
11-
import java.io.File
12-
import java.nio.file.Files
13-
import java.nio.file.Paths
17+
import org.junit.rules.TestName
1418

1519
class GeneratorTest {
1620
@JvmField
1721
@Rule
1822
val folder = TemporaryFolder()
1923

24+
@Rule
25+
@JvmField
26+
val testName = TestName()
27+
2028
@Test
2129
fun generateFailsWhenValidationFails() {
2230
assertThatThrownBy {
@@ -26,51 +34,67 @@ class GeneratorTest {
2634

2735
@Test
2836
fun generateWithGlobalMetadata() {
29-
testGenerator(defaultDefinitionsFile = "/testGlobalMetadataInput.json", expectedOutputFile = "/testGlobalMetadataOutput")
37+
testGenerator()
3038
}
3139

3240
@Test
3341
fun generatesWithNormalInput() {
34-
testGenerator(defaultDefinitionsFile = "/testGeneratorInput.json", expectedOutputFile = "/testGeneratorOutput")
42+
testGenerator()
3543
}
3644

3745
@Test
3846
fun resultGeneratesTwoFunctions() {
39-
testGenerator(defaultDefinitionsFile = "/testResultInput.json", expectedOutputFile = "/testResultOutput")
47+
testGenerator()
4048
}
4149

4250
@Test
4351
fun generateOverrides() {
44-
testGenerator(defaultDefinitionsFile = "/testResultInput.json", definitionsOverrides = listOf("/testOverrideInput.json"), expectedOutputFile = "/testOverrideOutput")
52+
testGenerator(definitionsFile = "/resultGeneratesTwoFunctions/input.json", definitionsOverrides = listOf("/generateOverrides/overrideInput.json"))
4553
}
4654

4755
@Test
4856
fun longEnum() {
49-
testGenerator(defaultDefinitionsFile = "/testLongEnumInput.json", expectedOutputFile = "/testLongEnumOutput")
57+
testGenerator()
5058
}
5159

5260
@Test
5361
fun generateGeneratesWithDefaultDefinitions() {
5462
generateTelemetryFromFiles(inputFiles = listOf(), outputFolder = folder.root)
55-
val outputFile = Paths.get(folder.root.absolutePath, "software", "aws", "toolkits", "telemetry", "TelemetryDefinitions.kt")
56-
assertThat(Files.exists(outputFile)).isTrue
63+
val outputFile = Paths.get(folder.root.absolutePath, "software", "aws", "toolkits", "telemetry")
64+
assertThat(Files.walk(outputFile).toList()).isNotEmpty
5765
}
5866

5967
// inputPath and outputPath must be in test resources
60-
private fun testGenerator(defaultDefinitionsFile: String, definitionsOverrides: List<String> = listOf(), expectedOutputFile: String) {
68+
private fun testGenerator(definitionsFile: String? = null, definitionsOverrides: List<String> = listOf()) {
69+
val methodName = testName.methodName
6170
generateTelemetryFromFiles(
62-
defaultDefinitions = listOf(this.javaClass.getResourceAsStream(defaultDefinitionsFile).use { it.bufferedReader().readText() }),
71+
defaultDefinitions = listOf(this.javaClass.getResourceAsStream(definitionsFile ?: "/$methodName/input.json").use { it.bufferedReader().readText() }),
6372
inputFiles = definitionsOverrides.map { File(javaClass.getResource(it).toURI()) },
6473
outputFolder = folder.root
6574
)
6675

67-
val outputFile = Paths.get(folder.root.absolutePath, "software", "aws", "toolkits", "telemetry", "TelemetryDefinitions.kt")
68-
assertThat(outputFile).exists()
76+
val outputRoot = Paths.get(folder.root.absolutePath)
77+
val outputFiles = Files.walk(outputRoot).filter { it.isRegularFile() }.toList()
78+
val expectedRoot = this.javaClass.getResource("/$methodName").toURI().toPath().resolve("output")
79+
val expectedFiles = Files.walk(expectedRoot).filter { it.isRegularFile() }.toList()
6980

70-
val expected = this.javaClass.getResourceAsStream(expectedOutputFile).use {
71-
it.bufferedReader().readText()
81+
if (expectedFiles.isEmpty()) {
82+
// for dev convenience, populate the test files and consider it a pass
83+
val root = Paths.get("src", "test", "resources", methodName, "output")
84+
outputFiles.forEach {
85+
val dest = root.resolve(outputRoot.relativize(it))
86+
Files.createDirectories(dest.parent)
87+
Files.copy(it, dest)
88+
}
89+
return
7290
}
7391

74-
assertThat(outputFile.toFile().readText()).isEqualTo(expected)
92+
assertThat(outputFiles.map { outputRoot.relativize(it) })
93+
.containsExactlyInAnyOrder(*expectedFiles.map { expectedRoot.relativize(it) }.toTypedArray())
94+
95+
outputFiles.forEach {
96+
val relPath = outputRoot.relativize(it)
97+
assertThat(it.readText()).isEqualTo(expectedRoot.resolve(relPath).readText())
98+
}
7599
}
76100
}

telemetry/jetbrains/src/test/resources/generateOverrides/input.json

Whitespace-only changes.

telemetry/jetbrains/src/test/resources/testOverrideOutput renamed to telemetry/jetbrains/src/test/resources/generateOverrides/output/software/aws/toolkits/telemetry/MetadataTelemetry.kt

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,12 @@ import com.intellij.openapi.project.Project
99
import java.time.Instant
1010
import kotlin.Boolean
1111
import kotlin.Double
12-
import kotlin.String
1312
import kotlin.Suppress
1413
import software.amazon.awssdk.services.toolkittelemetry.model.Unit
1514
import software.aws.toolkits.core.ConnectionSettings
1615
import software.aws.toolkits.jetbrains.services.telemetry.MetricEventMetadata
1716
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
1817

19-
/**
20-
* The result of the operation
21-
*/
22-
public enum class Result(
23-
private val `value`: String,
24-
) {
25-
Succeeded("Succeeded"),
26-
Unknown("unknown"),
27-
;
28-
29-
override fun toString(): String = value
30-
31-
public companion object {
32-
public fun from(type: String): Result = values().firstOrNull { it.value == type } ?: Unknown
33-
}
34-
}
35-
3618
public object MetadataTelemetry {
3719
/**
3820
* It does not actually have a result, yep
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
// THIS FILE IS GENERATED! DO NOT EDIT BY HAND!
4+
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
5+
6+
package software.aws.toolkits.telemetry
7+
8+
import kotlin.String
9+
import kotlin.Suppress
10+
11+
/**
12+
* The result of the operation
13+
*/
14+
public enum class Result(
15+
private val `value`: String,
16+
) {
17+
Succeeded("Succeeded"),
18+
Unknown("unknown"),
19+
;
20+
21+
override fun toString(): String = value
22+
23+
public companion object {
24+
public fun from(type: String): Result = values().firstOrNull { it.value == type } ?: Unknown
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
// THIS FILE IS GENERATED! DO NOT EDIT BY HAND!
4+
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
5+
6+
package software.aws.toolkits.telemetry
7+
8+
import kotlin.String
9+
import kotlin.Suppress
10+
11+
/**
12+
* The result of the operation
13+
*/
14+
public enum class Result(
15+
private val `value`: String,
16+
) {
17+
Succeeded("Succeeded"),
18+
Failed("Failed"),
19+
Cancelled("Cancelled"),
20+
Unknown("unknown"),
21+
;
22+
23+
override fun toString(): String = value
24+
25+
public companion object {
26+
public fun from(type: String): Result = values().firstOrNull { it.value == type } ?: Unknown
27+
}
28+
}

telemetry/jetbrains/src/test/resources/testGlobalMetadataOutput renamed to telemetry/jetbrains/src/test/resources/generateWithGlobalMetadata/output/software/aws/toolkits/telemetry/TestTelemetry.kt

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,6 @@ import software.aws.toolkits.core.ConnectionSettings
1616
import software.aws.toolkits.jetbrains.services.telemetry.MetricEventMetadata
1717
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
1818

19-
/**
20-
* The result of the operation
21-
*/
22-
public enum class Result(
23-
private val `value`: String,
24-
) {
25-
Succeeded("Succeeded"),
26-
Failed("Failed"),
27-
Cancelled("Cancelled"),
28-
Unknown("unknown"),
29-
;
30-
31-
override fun toString(): String = value
32-
33-
public companion object {
34-
public fun from(type: String): Result = values().firstOrNull { it.value == type } ?: Unknown
35-
}
36-
}
37-
3819
public object TestTelemetry {
3920
/**
4021
* Testing metric with global metadata fields

0 commit comments

Comments
 (0)