diff --git a/.github/workflows/generate-dokka.yml b/.github/workflows/generate-dokka.yml new file mode 100644 index 00000000..b66cd518 --- /dev/null +++ b/.github/workflows/generate-dokka.yml @@ -0,0 +1,52 @@ +name: Generate Dokka + +on: + release: + types: [released] + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +jobs: + generate-dokka: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: set up JDK 11 + uses: actions/setup-java@v3 + with: + distribution: "adopt" + java-version: "11" + + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Generate docs with dokka + run: make generateDokka + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ${{ github.workspace }}/build/dokka/htmlMultiModule + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/Makefile b/Makefile index bfa8392b..3fe37ff8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all clean compile dryRelease checkFormat checkApi buildAppleSamples format stop +.PHONY: all clean compile dryRelease checkFormat checkApi buildAppleSamples generateDokka detekt format stop all: stop clean compile @@ -11,6 +11,14 @@ clean: dryRelease: ./gradlew publishToMavenLocal --no-daemon --no-parallel +# Run detekt +detekt: + ./gradlew detekt + +# Generate Dokka +generateDokka: + ./gradlew dokkaHtmlMultiModule + # Check API checkApi: ./gradlew apiCheck @@ -40,7 +48,7 @@ buildAppleSamples: # Build all targets, run tests and checks api -compile: checkApi buildProject buildAppleSamples +compile: checkApi detekt buildProject buildAppleSamples # We stop gradle at the end to make sure the cache folders # don't contain any lock files and are free to be cached. diff --git a/build.gradle.kts b/build.gradle.kts index 6b2b4039..5ecb83b0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,13 @@ import com.diffplug.spotless.LineEnding import com.vanniktech.maven.publish.MavenPublishPlugin import com.vanniktech.maven.publish.MavenPublishPluginExtension +import io.gitlab.arturbosch.detekt.Detekt plugins { id(Config.gradleMavenPublishPlugin).version(Config.gradleMavenPublishPluginVersion) id(Config.QualityPlugins.spotless).version(Config.QualityPlugins.spotlessVersion) + id(Config.QualityPlugins.detekt).version(Config.QualityPlugins.detektVersion) + id(Config.dokka).version(Config.dokkaVersion) kotlin(Config.multiplatform).version(Config.kotlinVersion).apply(false) kotlin(Config.cocoapods).version(Config.kotlinVersion).apply(false) id(Config.jetpackCompose).version(Config.composeVersion).apply(false) @@ -52,6 +55,12 @@ subprojects { } } +subprojects { + if (project.name.contains("sentry-kotlin-multiplatform")) { + apply(plugin = Config.dokka) + } +} + spotless { lineEndings = LineEnding.UNIX @@ -64,3 +73,39 @@ spotless { ktlint() } } + +val detektConfigFilePath = "$rootDir/config/detekt/detekt.yml" +val detektBaselineFilePath = "$rootDir/config/detekt/baseline.xml" + +detekt { + buildUponDefaultConfig = true + config = files(detektConfigFilePath) + baseline = file(detektBaselineFilePath) +} + +fun SourceTask.detektExcludes() { + exclude("**/build/**") + exclude("**/*.kts") + exclude("**/buildSrc/**") + exclude("**/*Test*/**") + exclude("**/resources/**") + exclude("**/sentry-samples/**") +} + +tasks.withType().configureEach { + reports { + html.required.set(true) + } + setSource(files(project.projectDir)) + detektExcludes() +} + +/** Task for generating a Detekt baseline.xml */ +val detektProjectBaseline by tasks.registering(io.gitlab.arturbosch.detekt.DetektCreateBaselineTask::class) { + buildUponDefaultConfig.set(true) + setSource(files(rootDir)) + config.setFrom(files(detektConfigFilePath)) + baseline.set(file(detektBaselineFilePath)) + include("**/*.kt") + detektExcludes() +} diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 709af9a9..26d9dbe2 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -10,6 +10,8 @@ object Config { val gradleMavenPublishPlugin = "com.vanniktech.maven.publish" val androidGradle = "com.android.library" val kotlinSerializationPlugin = "plugin.serialization" + val dokka = "org.jetbrains.dokka" + val dokkaVersion = "1.8.10" object BuildPlugins { val buildConfig = "com.codingfeline.buildkonfig" @@ -19,6 +21,8 @@ object Config { object QualityPlugins { val spotless = "com.diffplug.spotless" val spotlessVersion = "6.11.0" + val detekt = "io.gitlab.arturbosch.detekt" + val detektVersion = "1.22.0" val binaryCompatibility = "org.jetbrains.kotlinx.binary-compatibility-validator" val binaryCompatibilityVersion = "0.13.1" } diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml new file mode 100644 index 00000000..fb608a17 --- /dev/null +++ b/config/detekt/baseline.xml @@ -0,0 +1,11 @@ + + + + + SwallowedException:CocoaScopeProvider.kt$CocoaScopeProvider$e: Throwable + SwallowedException:SentryLevel.kt$SentryLevel.Companion$throwable: Throwable + TooGenericExceptionCaught:CocoaScopeProvider.kt$CocoaScopeProvider$e: Throwable + TooGenericExceptionCaught:SentryLevel.kt$SentryLevel.Companion$throwable: Throwable + TooGenericExceptionThrown:SentryKMP.kt$Sentry$throw RuntimeException("Uncaught Exception from Kotlin Multiplatform.") + + diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml new file mode 100644 index 00000000..88821d96 --- /dev/null +++ b/config/detekt/detekt.yml @@ -0,0 +1,26 @@ +comments: + UndocumentedPublicClass: + active: true + includes: "**/commonMain/**" + UndocumentedPublicProperty: + active: true + includes: "**/commonMain/**" +style: + UnnecessaryAbstractClass: + active: false + ForbiddenComment: + active: false + UnusedPrivateMember: + excludes: + - "**/Attachment.kt" +complexity: + TooManyFunctions: + excludes: [ + "**/SentryKMP.kt", + "**/SentryBridge.kt", + "**/CocoaScopeProvider.kt", + "**/Scope.kt", + "**/JvmScopeProvider.kt", + "**/Breadcrumb.kt", + ] + diff --git a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api index 83951123..2107b08d 100644 --- a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api @@ -45,34 +45,7 @@ public final class io/sentry/kotlin/multiplatform/HttpStatusCodeRange { public final class io/sentry/kotlin/multiplatform/HttpStatusCodeRange$Companion { } -public final class io/sentry/kotlin/multiplatform/Scope : io/sentry/kotlin/multiplatform/ScopeProvider { - public fun (Lio/sentry/kotlin/multiplatform/ScopeProvider;)V - public fun addAttachment (Lio/sentry/kotlin/multiplatform/Attachment;)V - public fun addBreadcrumb (Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb;)V - public fun clear ()V - public fun clearAttachments ()V - public fun clearBreadcrumbs ()V - public fun getContexts ()Ljava/util/Map; - public fun getLevel ()Lio/sentry/kotlin/multiplatform/SentryLevel; - public fun getTags ()Ljava/util/Map; - public fun getUser ()Lio/sentry/kotlin/multiplatform/protocol/User; - public fun removeContext (Ljava/lang/String;)V - public fun removeExtra (Ljava/lang/String;)V - public fun removeTag (Ljava/lang/String;)V - public fun setContext (Ljava/lang/String;C)V - public fun setContext (Ljava/lang/String;Ljava/lang/Number;)V - public fun setContext (Ljava/lang/String;Ljava/lang/Object;)V - public fun setContext (Ljava/lang/String;Ljava/lang/String;)V - public fun setContext (Ljava/lang/String;Ljava/util/Collection;)V - public fun setContext (Ljava/lang/String;Z)V - public fun setContext (Ljava/lang/String;[Ljava/lang/Object;)V - public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V - public fun setLevel (Lio/sentry/kotlin/multiplatform/SentryLevel;)V - public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setUser (Lio/sentry/kotlin/multiplatform/protocol/User;)V -} - -public abstract interface class io/sentry/kotlin/multiplatform/ScopeProvider { +public abstract interface class io/sentry/kotlin/multiplatform/Scope { public abstract fun addAttachment (Lio/sentry/kotlin/multiplatform/Attachment;)V public abstract fun addBreadcrumb (Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb;)V public abstract fun clear ()V diff --git a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api index a4322941..3ee9b135 100644 --- a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api @@ -42,34 +42,7 @@ public final class io/sentry/kotlin/multiplatform/HttpStatusCodeRange { public final class io/sentry/kotlin/multiplatform/HttpStatusCodeRange$Companion { } -public final class io/sentry/kotlin/multiplatform/Scope : io/sentry/kotlin/multiplatform/ScopeProvider { - public fun (Lio/sentry/kotlin/multiplatform/ScopeProvider;)V - public fun addAttachment (Lio/sentry/kotlin/multiplatform/Attachment;)V - public fun addBreadcrumb (Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb;)V - public fun clear ()V - public fun clearAttachments ()V - public fun clearBreadcrumbs ()V - public fun getContexts ()Ljava/util/Map; - public fun getLevel ()Lio/sentry/kotlin/multiplatform/SentryLevel; - public fun getTags ()Ljava/util/Map; - public fun getUser ()Lio/sentry/kotlin/multiplatform/protocol/User; - public fun removeContext (Ljava/lang/String;)V - public fun removeExtra (Ljava/lang/String;)V - public fun removeTag (Ljava/lang/String;)V - public fun setContext (Ljava/lang/String;C)V - public fun setContext (Ljava/lang/String;Ljava/lang/Number;)V - public fun setContext (Ljava/lang/String;Ljava/lang/Object;)V - public fun setContext (Ljava/lang/String;Ljava/lang/String;)V - public fun setContext (Ljava/lang/String;Ljava/util/Collection;)V - public fun setContext (Ljava/lang/String;Z)V - public fun setContext (Ljava/lang/String;[Ljava/lang/Object;)V - public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V - public fun setLevel (Lio/sentry/kotlin/multiplatform/SentryLevel;)V - public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setUser (Lio/sentry/kotlin/multiplatform/protocol/User;)V -} - -public abstract interface class io/sentry/kotlin/multiplatform/ScopeProvider { +public abstract interface class io/sentry/kotlin/multiplatform/Scope { public abstract fun addAttachment (Lio/sentry/kotlin/multiplatform/Attachment;)V public abstract fun addBreadcrumb (Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb;)V public abstract fun clear ()V diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/CocoaScopeProvider.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/CocoaScopeProvider.kt index 36b5d6c9..f7906086 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/CocoaScopeProvider.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/CocoaScopeProvider.kt @@ -10,7 +10,7 @@ import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.User import Scope.Sentry.SentryScope as PrivateCocoaScope -internal class CocoaScopeProvider(private val scope: CocoaScope) : ScopeProvider { +internal class CocoaScopeProvider(private val scope: CocoaScope) : Scope { /* This bridge exposes private Cocoa SDK API to fetch internal properties such as user, level, etc. diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index e6257944..3a7cd87d 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -42,7 +42,10 @@ internal actual object SentryBridge { } actual fun captureException(throwable: Throwable, scopeCallback: ScopeCallback): SentryId { - val cocoaSentryId = SentrySDK.captureException(throwable.asNSException(true), configureScopeCallback(scopeCallback)) + val cocoaSentryId = SentrySDK.captureException( + throwable.asNSException(true), + configureScopeCallback(scopeCallback) + ) return SentryId(cocoaSentryId.toString()) } @@ -72,8 +75,7 @@ internal actual object SentryBridge { CocoaScopeProvider(it) } cocoaScopeProvider?.let { - val scope = Scope(it) - scopeCallback.invoke(scope) + scopeCallback.invoke(it) } } } diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/NSException.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/NSException.kt index 8808f442..3ea684d8 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/NSException.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/NSException.kt @@ -25,7 +25,7 @@ import kotlin.reflect.KClass * If [appendCausedBy] is `true` then the name, message and stack trace * of the [causes][Throwable.cause] will be appended, else causes are ignored. */ -public fun Throwable.asNSException(appendCausedBy: Boolean = false): NSException { +internal fun Throwable.asNSException(appendCausedBy: Boolean = false): NSException { val returnAddresses = getFilteredStackTraceAddresses().let { addresses -> if (!appendCausedBy) return@let addresses addresses.toMutableList().apply { diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/SentryUnhandledExceptions.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/SentryUnhandledExceptions.kt index d4b0e078..6fded3c5 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/SentryUnhandledExceptions.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/nsexception/SentryUnhandledExceptions.kt @@ -42,7 +42,7 @@ import platform.Foundation.NSNumber * Drops the Kotlin crash that follows an unhandled Kotlin exception except our custom SentryEvent. */ internal fun dropKotlinCrashEvent(event: SentryEvent?): SentryEvent? { - return event?.takeUnless { it.isCrashEvent && (it.tags?.containsKey(kotlinCrashedTag) ?: false) } + return event?.takeUnless { it.isCrashEvent && (it.tags?.containsKey(KOTLIN_CRASH_TAG) ?: false) } } /** @@ -57,14 +57,14 @@ internal fun setSentryUnhandledExceptionHook(): Unit = wrapUnhandledExceptionHoo // https://github.com/getsentry/sentry-cocoa/blob/678172142ac1d10f5ed7978f69d16ab03e801057/Sources/Sentry/SentryClient.m#L409 SentrySDK.storeEnvelope(envelope) SentrySDK.configureScope { scope -> - scope?.setTagValue(kotlinCrashedTag, kotlinCrashedTag) + scope?.setTagValue(KOTLIN_CRASH_TAG, KOTLIN_CRASH_TAG) } } /** * Tag used to mark the Kotlin termination crash. */ -internal const val kotlinCrashedTag = "nsexceptionkt.kotlin_crashed" +internal const val KOTLIN_CRASH_TAG = "nsexceptionkt.kotlin_crashed" /** * Converts `this` [Throwable] to a [SentryEnvelope]. diff --git a/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt b/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt index 1e71ab25..bb9aac47 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt @@ -5,7 +5,6 @@ import cocoapods.Sentry.SentryScope as CocoaScope actual abstract class BaseSentryScopeTest { actual fun initializeScope(): Scope { val cocoaScope = CocoaScope() - val cocoaScopeProvider = CocoaScopeProvider(cocoaScope) - return Scope(cocoaScopeProvider) + return CocoaScopeProvider(cocoaScope) } } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/JvmScopeProvider.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/JvmScopeProvider.kt index 7874d4a8..8f32b633 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/JvmScopeProvider.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/JvmScopeProvider.kt @@ -8,7 +8,7 @@ import io.sentry.kotlin.multiplatform.extensions.toKmpUser import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.User -internal class JvmScopeProvider(private val scope: JvmScope) : ScopeProvider { +internal class JvmScopeProvider(private val scope: JvmScope) : Scope { override var level: SentryLevel? set(value) { diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index 15913c06..e26dde05 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -64,8 +64,7 @@ internal actual object SentryBridge { private fun configureScopeCallback(scopeCallback: ScopeCallback): (JvmScope) -> Unit { return { val jvmScopeProvider = JvmScopeProvider(it) - val scope = Scope(jvmScopeProvider) - scopeCallback.invoke(scope) + scopeCallback.invoke(jvmScopeProvider) } } } diff --git a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt index 28c631e8..37431deb 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryScopeTest.kt @@ -5,7 +5,6 @@ import io.sentry.SentryOptions actual abstract class BaseSentryScopeTest { actual fun initializeScope(): Scope { val jvmScope = JvmScope(SentryOptions()) - val jvmScopeProvider = JvmScopeProvider(jvmScope) - return Scope(jvmScopeProvider) + return JvmScopeProvider(jvmScope) } } diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Attachment.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Attachment.kt index b72a9d63..e38013bd 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Attachment.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Attachment.kt @@ -1,5 +1,6 @@ package io.sentry.kotlin.multiplatform +/** An attachment to be sent along with the event. */ public expect class Attachment { /** The bytes of the attachment. */ diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/HttpStatusCodeRange.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/HttpStatusCodeRange.kt index b96a889c..76694a97 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/HttpStatusCodeRange.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/HttpStatusCodeRange.kt @@ -4,7 +4,10 @@ package io.sentry.kotlin.multiplatform * The Http status code range. Example for a range: 400 to 499, 500 to 599, 400 to 599 The range is * inclusive so the min and max is considered part of the range. * - * Example for a single status code 400, 500 + * Example for a single status code 400, 500. + * + * @property min the min status code of the range + * @property max the max status code of the range */ public data class HttpStatusCodeRange(val min: Int = DEFAULT_MIN, val max: Int = DEFAULT_MAX) { @@ -15,7 +18,10 @@ public data class HttpStatusCodeRange(val min: Int = DEFAULT_MIN, val max: Int = } public companion object { + /** The default min status code of the range. */ public const val DEFAULT_MIN: Int = 500 + + /** The default max status code of the range. */ public const val DEFAULT_MAX: Int = 599 } } diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Scope.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Scope.kt index 43261eaf..86d54037 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Scope.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/Scope.kt @@ -4,17 +4,15 @@ import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.User /** - * Scope data to be sent with the event + * The Scope holds useful information that should be sent along with the event. + * For instance contexts or breadcrumbs are stored on the scope. * - * Different platforms have specific providers. - * - JVM: [JvmScopeProvider](io.sentry.kotlin.multiplatform.JvmScopeProvider) - * - Cocoa: [CocoaScopeProvider](io.sentry.kotlin.multiplatform.CocoaScopeProvider) - * - * @constructor ScopeProvider that holds the Scope's data + * Users should not need to implement this interface instead the Scope should be provided by the SDK. + * Different platforms have specific scope providers that are used internally: + * - For JVM: [io.sentry.kotlin.multiplatform.JvmScopeProvider] + * - For Cocoa: [io.sentry.kotlin.multiplatform.CocoaScopeProvider] */ -public class Scope constructor(private val scope: ScopeProvider) : ScopeProvider by scope - -public interface ScopeProvider { +public interface Scope { /** * Returns the scope's tags diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBaseEvent.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBaseEvent.kt index 0012ebc0..10741a4b 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBaseEvent.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBaseEvent.kt @@ -5,7 +5,10 @@ import io.sentry.kotlin.multiplatform.protocol.SentryId import io.sentry.kotlin.multiplatform.protocol.User /** Base class for all Sentry events. */ -public abstract class SentryBaseEvent(public open var eventId: SentryId = SentryId.EMPTY_ID) { +public abstract class SentryBaseEvent( + /** The Sentry event ID. */ + public open var eventId: SentryId = SentryId.EMPTY_ID +) { /** The event release. */ public open var release: String? = null diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt index 3f7cbc08..549ed698 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt @@ -10,9 +10,10 @@ import kotlin.native.HiddenFromObjC public typealias ScopeCallback = (Scope) -> Unit public typealias OptionsConfiguration = (SentryOptions) -> Unit +/** The context used for Android initialization. */ public expect abstract class Context -/** Sentry Kotlin Multiplatform SDK API entry point */ +/** Sentry Kotlin Multiplatform SDK API entry point. */ public object Sentry { /** diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryLevel.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryLevel.kt index a6b3e6e1..c07d0b47 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryLevel.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryLevel.kt @@ -8,6 +8,7 @@ internal object SentryLevelNumConstants { const val FATAL_LEVEL = 5 } +/** The level of the event similar to logging levels. */ public enum class SentryLevel(private val value: Int) { DEBUG(SentryLevelNumConstants.DEBUG_LEVEL), INFO(SentryLevelNumConstants.INFO_LEVEL), diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt index 547f45a7..55b66f83 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt @@ -3,6 +3,11 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SdkVersion +private const val DEFAULT_MAX_BREADCRUMBS = 100 +private const val DEFAULT_MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024L +private const val DEFAULT_SESSION_INTERVAL_MILLIS = 30000L + +/** Sentry options that can be used to configure the SDK. */ public open class SentryOptions { /** @@ -47,7 +52,7 @@ public open class SentryOptions { * The session tracking interval in millis. This is the interval to end a session if the App goes * to the background. */ - public var sessionTrackingIntervalMillis: Long = 30000 + public var sessionTrackingIntervalMillis: Long = DEFAULT_SESSION_INTERVAL_MILLIS /** * Enables/Disables capturing screenshots before an error. @@ -65,10 +70,10 @@ public open class SentryOptions { public var sdk: SdkVersion? = null /** This variable controls the total amount of breadcrumbs that should be captured. Default is 100. */ - public var maxBreadcrumbs: Int = 100 + public var maxBreadcrumbs: Int = DEFAULT_MAX_BREADCRUMBS /** This variable controls the max attachment size in bytes */ - public var maxAttachmentSize: Long = 20 * 1024 * 1024 + public var maxAttachmentSize: Long = DEFAULT_MAX_ATTACHMENT_SIZE /** * Enables or disables the attach view hierarchy feature when an error happened. @@ -86,6 +91,7 @@ public open class SentryOptions { /** * A list of HTTP status code ranges indicating which client errors should be captured as errors. + * * By default, only HTTP client errors with a response code between 500 and 599 are captured as errors. * * Available on Apple. @@ -93,7 +99,9 @@ public open class SentryOptions { public var failedRequestStatusCodes: List = listOf(HttpStatusCodeRange()) /** - * A list of HTTP request targets indicating which client errors should be captured as errors with either regex or a plain string. + * A list of HTTP request targets indicating which client errors should be captured as errors with + * either regex or a plain string. + * * By default, HTTP client errors from every target (.* regular expression) are automatically captured. * * Available on Apple. diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Breadcrumb.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Breadcrumb.kt index a32bccf3..71d95e80 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Breadcrumb.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Breadcrumb.kt @@ -2,7 +2,12 @@ package io.sentry.kotlin.multiplatform.protocol import io.sentry.kotlin.multiplatform.SentryLevel -public data class Breadcrumb constructor( +/** + * A single breadcrumb. + * + * Breadcrumbs are used to create a trail of events that happened prior to an issue. + */ +public data class Breadcrumb( /** The breadcrumb's level */ var level: SentryLevel? = null, diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Message.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Message.kt index 8c8939fa..37d525e5 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Message.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/Message.kt @@ -1,7 +1,20 @@ package io.sentry.kotlin.multiplatform.protocol +/** A log entry message. */ public data class Message( + /** + * The log message. + * It must not exceed 8192 characters. Longer messages will be truncated. + */ public var message: String? = null, + /** + * Parameters to be interpolated into the log message. This can be an array of positional + * parameters as well as a mapping of named arguments to their values. + */ public var params: List? = null, + /** + * The formatted message. If `message` and `params` are given, Sentry will attempt to backfill + * `formatted` if empty. + */ public var formatted: String? = null ) diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SdkVersion.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SdkVersion.kt index ab397cfb..c28381d4 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SdkVersion.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SdkVersion.kt @@ -19,7 +19,10 @@ public data class SdkVersion( } } +/** Describes which native SDK packages are used. */ public data class Package( + /** The name of the package. */ val name: String, + /** The version of the package. */ val version: String ) diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryException.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryException.kt index 8226a462..af3db193 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryException.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryException.kt @@ -1,8 +1,18 @@ package io.sentry.kotlin.multiplatform.protocol +/** + * A single exception. + * + * Multiple values inside of a [io.sentry.kotlin.multiplatform.SentryEvent] represent chained + * exceptions and should be sorted oldest to newest. + */ public data class SentryException( + /** The exception type. */ val type: String? = null, + /** Human readable display value. */ val value: String? = null, + /** The optional module, or package which the exception type lives in. */ val module: String? = null, + /** An optional value that refers to a thread. */ val threadId: Long? = null ) diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryId.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryId.kt index a7b03933..1db521a5 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryId.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/SentryId.kt @@ -1,7 +1,9 @@ package io.sentry.kotlin.multiplatform.protocol +/** The Sentry event ID */ public expect class SentryId(sentryIdString: String) { public companion object { + /** Returns a new empty SentryId */ public val EMPTY_ID: SentryId } override fun toString(): String diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/User.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/User.kt index e6dd939a..0927dfd9 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/User.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/User.kt @@ -1,5 +1,6 @@ package io.sentry.kotlin.multiplatform.protocol +/** Information about the user who triggered an event. */ public data class User( /** The user's email */ var email: String? = null, diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/UserFeedback.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/UserFeedback.kt index b7dac07d..9569a03e 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/UserFeedback.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/protocol/UserFeedback.kt @@ -1,7 +1,10 @@ package io.sentry.kotlin.multiplatform.protocol -public data class UserFeedback(val sentryId: SentryId) { - +/** UserFeedback adds additional information about what happened to an event. */ +public data class UserFeedback( + /** The Sentry event ID */ + val sentryId: SentryId +) { /** The user's name */ var name: String? = null diff --git a/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.kt b/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.kt index 48e6e840..836d200e 100644 --- a/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.kt +++ b/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.kt @@ -3,11 +3,11 @@ package io.sentry.kotlin.multiplatform import io.sentry.Sentry import io.sentry.kotlin.multiplatform.extensions.toJvmSentryOptionsCallback -// The context is unused here and only implemented to satisfy the expect -public actual abstract class Context - internal actual fun initSentry(context: Context?, configuration: OptionsConfiguration) { val options = SentryOptions() configuration.invoke(options) Sentry.init(options.toJvmSentryOptionsCallback()) } + +// The context is unused here and only implemented to satisfy the expect +public actual abstract class Context