Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add the ability to pretty print DokkaConfiguration #2872

Merged
merged 3 commits into from
Feb 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions core/api/core.api
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
public final class org/jetbrains/dokka/ConfigurationKt {
public final class org/jetbrains/dokka/ConfigurationJsonUtilsKt {
public static final fun DokkaConfigurationImpl (Ljava/lang/String;)Lorg/jetbrains/dokka/DokkaConfigurationImpl;
public static final fun GlobalDokkaConfiguration (Ljava/lang/String;)Lorg/jetbrains/dokka/GlobalDokkaConfiguration;
public static final fun toCompactJsonString (Lorg/jetbrains/dokka/DokkaConfiguration;)Ljava/lang/String;
public static final fun toCompactJsonString (Lorg/jetbrains/dokka/plugability/ConfigurableBlock;)Ljava/lang/String;
public static final fun toJsonString (Lorg/jetbrains/dokka/DokkaConfiguration;)Ljava/lang/String;
public static final fun toJsonString (Lorg/jetbrains/dokka/plugability/ConfigurableBlock;)Ljava/lang/String;
public static final fun toPrettyJsonString (Lorg/jetbrains/dokka/DokkaConfiguration;)Ljava/lang/String;
public static final fun toPrettyJsonString (Lorg/jetbrains/dokka/plugability/ConfigurableBlock;)Ljava/lang/String;
}

public final class org/jetbrains/dokka/ConfigurationKt {
public static final fun ExternalDocumentationLink (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/dokka/ExternalDocumentationLinkImpl;
public static final fun ExternalDocumentationLink (Ljava/net/URL;Ljava/net/URL;)Lorg/jetbrains/dokka/ExternalDocumentationLinkImpl;
public static synthetic fun ExternalDocumentationLink$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/ExternalDocumentationLinkImpl;
public static synthetic fun ExternalDocumentationLink$default (Ljava/net/URL;Ljava/net/URL;ILjava/lang/Object;)Lorg/jetbrains/dokka/ExternalDocumentationLinkImpl;
public static final fun GlobalDokkaConfiguration (Ljava/lang/String;)Lorg/jetbrains/dokka/GlobalDokkaConfiguration;
public static final fun apply (Lorg/jetbrains/dokka/DokkaConfiguration;Lorg/jetbrains/dokka/GlobalDokkaConfiguration;)Lorg/jetbrains/dokka/DokkaConfiguration;
public static final fun build (Ljava/lang/Iterable;)Ljava/util/List;
public static final fun toJsonString (Lorg/jetbrains/dokka/DokkaConfiguration;)Ljava/lang/String;
public static final fun toJsonString (Lorg/jetbrains/dokka/plugability/ConfigurableBlock;)Ljava/lang/String;
Comment on lines -7 to -11
Copy link
Member Author

@IgnatBeresnev IgnatBeresnev Feb 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The functions have been moved to another file, but within the same package, so source compatibility should be preserved

}

public final class org/jetbrains/dokka/CoreExtensions {
Expand Down
50 changes: 50 additions & 0 deletions core/src/main/kotlin/ConfigurationJsonUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.jetbrains.dokka

import org.jetbrains.dokka.plugability.ConfigurableBlock
import org.jetbrains.dokka.utilities.parseJson
import org.jetbrains.dokka.utilities.serializeAsCompactJson
import org.jetbrains.dokka.utilities.serializeAsPrettyJson

fun DokkaConfigurationImpl(json: String): DokkaConfigurationImpl = parseJson(json)

fun GlobalDokkaConfiguration(json: String): GlobalDokkaConfiguration = parseJson(json)

@Deprecated("Renamed to better distinguish between compact/pretty prints", ReplaceWith("this.toCompactJsonString()"))
fun DokkaConfiguration.toJsonString(): String = this.toCompactJsonString()

@Deprecated("Renamed to better distinguish between compact/pretty prints", ReplaceWith("this.toCompactJsonString()"))
fun <T : ConfigurableBlock> T.toJsonString(): String = this.toCompactJsonString()

/**
* Serializes [DokkaConfiguration] as a machine-readable and compact JSON string.
*
* The returned string is not very human friendly as it will be difficult to parse by eyes due to it
* being compact and in one line. If you want to show the output to a human being, see [toPrettyJsonString].
*/
fun DokkaConfiguration.toCompactJsonString(): String = serializeAsCompactJson(this)

/**
* Serializes [DokkaConfiguration] as a human-readable (pretty printed) JSON string.
*
* The returned string will have excessive line breaks and indents, which might not be
* desirable when passing this value between API consumers/producers. If you want
* a machine-readable and compact json string, see [toCompactJsonString].
*/
fun DokkaConfiguration.toPrettyJsonString(): String = serializeAsPrettyJson(this)

/**
* Serializes a [ConfigurableBlock] as a machine-readable and compact JSON string.
*
* The returned string is not very human friendly as it will be difficult to parse by eyes due to it
* being compact and in one line. If you want to show the output to a human being, see [toPrettyJsonString].
*/
fun <T : ConfigurableBlock> T.toCompactJsonString(): String = serializeAsCompactJson(this)
IgnatBeresnev marked this conversation as resolved.
Show resolved Hide resolved

/**
* Serializes a [ConfigurableBlock] as a human-readable (pretty printed) JSON string.
*
* The returned string will have excessive line breaks and indents, which might not be
* desirable when passing this value between API consumers/producers. If you want
* a machine-readable and compact json string, see [toCompactJsonString].
*/
fun <T : ConfigurableBlock> T.toPrettyJsonString(): String = serializeAsCompactJson(this)
10 changes: 0 additions & 10 deletions core/src/main/kotlin/configuration.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

package org.jetbrains.dokka

import org.jetbrains.dokka.plugability.ConfigurableBlock
import org.jetbrains.dokka.utilities.cast
import org.jetbrains.dokka.utilities.parseJson
import org.jetbrains.dokka.utilities.toJsonString
import java.io.File
import java.io.Serializable
import java.net.URL
Expand Down Expand Up @@ -95,8 +92,6 @@ data class DokkaSourceSetID(
}
}

fun DokkaConfigurationImpl(json: String): DokkaConfigurationImpl = parseJson(json)

/**
* Global options can be configured and applied to all packages and modules at once, overwriting package configuration.
*
Expand All @@ -111,8 +106,6 @@ data class GlobalDokkaConfiguration(
val sourceLinks: List<SourceLinkDefinitionImpl>?
)

fun GlobalDokkaConfiguration(json: String): GlobalDokkaConfiguration = parseJson(json)

fun DokkaConfiguration.apply(globals: GlobalDokkaConfiguration): DokkaConfiguration = this.apply {
sourceSets.forEach {
it.perPackageOptions.cast<MutableList<DokkaConfiguration.PackageOptions>>().addAll(globals.perPackageOptions ?: emptyList())
Expand All @@ -127,9 +120,6 @@ fun DokkaConfiguration.apply(globals: GlobalDokkaConfiguration): DokkaConfigurat
}
}

fun DokkaConfiguration.toJsonString(): String = toJsonString(this)
fun <T : ConfigurableBlock> T.toJsonString(): String = toJsonString(this)

interface DokkaConfiguration : Serializable {
val moduleName: String
val moduleVersion: String?
Expand Down
15 changes: 14 additions & 1 deletion core/src/main/kotlin/utilities/json.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,21 @@ internal class TypeReference<T> private constructor(
}
}

// not used anywhere since at least 1.7.20, but might still be referenced in previously compiled
// inline functions. should be safe to remove after a few major releases.
@PublishedApi
internal fun toJsonString(value: Any): String = objectMapper.writeValueAsString(value)
@Deprecated(
"Left for previously compiled public inline classes, not for use",
ReplaceWith("serializeAsCompactJson(value)"),
level = DeprecationLevel.ERROR
)
internal fun toJsonString(value: Any): String = serializeAsCompactJson(value)

internal fun serializeAsCompactJson(value: Any): String =
objectMapper.writeValueAsString(value)

internal fun serializeAsPrettyJson(value: Any): String =
objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(value)

@PublishedApi
internal inline fun <reified T : Any> parseJson(json: String): T = parseJson(json, TypeReference())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class DokkaConfigurationJsonTest {
)
)

val jsonString = configuration.toJsonString()
val jsonString = configuration.toCompactJsonString()
val parsedConfiguration = DokkaConfigurationImpl(jsonString)
assertEquals(configuration, parsedConfiguration)
}
Expand Down
57 changes: 57 additions & 0 deletions core/src/test/kotlin/utilities/JsonKtTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package utilities

import org.jetbrains.dokka.utilities.serializeAsCompactJson
import org.jetbrains.dokka.utilities.serializeAsPrettyJson
import kotlin.test.assertEquals
import kotlin.test.Test

class JsonTest {

@Test
fun `should serialize an object as compact json`() {
val testObject = SimpleTestDataClass(
someString = "Foo",
someInt = 42,
someDouble = 42.0
)

val actual = serializeAsCompactJson(testObject)
val expected = "{\"someString\":\"Foo\",\"someInt\":42,\"someIntWithDefaultValue\":42,\"someDouble\":42.0}"

assertEquals(expected, actual)
}

@Test
fun `should serialize an object as pretty json`() {
val testObject = SimpleTestDataClass(
someString = "Foo",
someInt = 42,
someDouble = 42.0
)

val actual = serializeAsPrettyJson(testObject)

val expected = """
{
"someString" : "Foo",
"someInt" : 42,
"someIntWithDefaultValue" : 42,
"someDouble" : 42.0
}""".trimIndent().withSystemLineSeparator()

assertEquals(expected, actual)
}

/**
* If the expected output was generated on Linux, but the tests are run under Windows,
* the test might fail when comparing the strings due to different separators.
*/
private fun String.withSystemLineSeparator(): String = this.replace("\n", System.lineSeparator())
}

data class SimpleTestDataClass(
val someString: String,
val someInt: Int,
val someIntWithDefaultValue: Int = 42,
val someDouble: Double
)
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ abstract class AbstractDokkaTask : DefaultTask() {
val pluginConfiguration = PluginConfigurationImpl(
fqPluginName = P::class.qualifiedName!!,
serializationFormat = DokkaConfiguration.SerializationFormat.JSON,
values = instance.toJsonString()
values = instance.toCompactJsonString()
)
pluginsConfiguration.add(pluginConfiguration)
}
Expand All @@ -200,7 +200,7 @@ abstract class AbstractDokkaTask : DefaultTask() {
@TaskAction
internal open fun generateDocumentation() {
DokkaBootstrap(runtime, DokkaBootstrapImpl::class).apply {
configure(buildDokkaConfiguration().toJsonString(), createProxyLogger())
configure(buildDokkaConfiguration().toCompactJsonString(), createProxyLogger())
/**
* Run in a new thread to avoid memory leaks that are related to ThreadLocal (that keeps `URLCLassLoader`)
* Currently, all `ThreadLocal`s leaking are in the compiler/IDE codebase.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package org.jetbrains.dokka.gradle

import org.gradle.kotlin.dsl.withType
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.DokkaConfigurationImpl
import org.jetbrains.dokka.PluginConfigurationImpl
import org.jetbrains.dokka.toJsonString
import org.jetbrains.dokka.*
import java.io.File
import java.net.URL
import kotlin.test.Test
Expand Down Expand Up @@ -50,7 +47,7 @@ class DokkaConfigurationJsonTest {
}

val sourceConfiguration = dokkaTask.buildDokkaConfiguration()
val configurationJson = sourceConfiguration.toJsonString()
val configurationJson = sourceConfiguration.toCompactJsonString()
val parsedConfiguration = DokkaConfigurationImpl(configurationJson)

assertEquals(sourceConfiguration, parsedConfiguration)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import org.gradle.kotlin.dsl.withType
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.PluginConfigurationImpl
import org.jetbrains.dokka.toJsonString
import org.junit.Rule
import org.junit.rules.TemporaryFolder
import java.io.File
Expand Down