Skip to content

Commit 20ad167

Browse files
authored
Add module to wrap kotlin objects for validation (#197)
Resolves #194
1 parent 6ff166c commit 20ad167

File tree

14 files changed

+949
-3
lines changed

14 files changed

+949
-3
lines changed

.github/workflows/release.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ jobs:
5858
gradle-version: wrapper
5959
- name: Build and publish release
6060
run: >
61-
./gradlew --no-daemon --info :json-schema-validator:assemble
61+
./gradlew --no-daemon --info
62+
:json-schema-validator:assemble
63+
:json-schema-validator-objects:assemble
6264
publish closeAndReleaseStagingRepositories
6365
-Pversion=${{ needs.version.outputs.RELEASE_VERSION }}
6466
-x :benchmark:benchmark

.github/workflows/snapshot_release.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ on:
88
- 'build.gradle.kts'
99
- 'gradle.properties'
1010
- 'json-schema-validator/**'
11+
- 'json-schema-validator-objects/**'
1112
- 'gradle/**'
1213
- 'generator/**'
1314
- '.github/workflows/snapshot_release.yml'
@@ -54,6 +55,7 @@ jobs:
5455
--no-daemon
5556
--info
5657
:json-schema-validator:assemble
58+
:json-schema-validator-objects:assemble
5759
publish
5860
-x :benchmark:benchmark
5961
env:

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
kotlin.code.style=official
22
kotlin.js.compiler=ir
3-
org.gradle.jvmargs=-Xmx1G
3+
org.gradle.jvmargs=-Xmx1536M
44
org.gradle.java.installations.auto-download=false
55
org.gradle.daemon=false
66

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# JSON schema object wrapper
2+
3+
This module allows wrapping Kotlin objects (e.g. Map, List, primitives) to `AbstractElement` that can be validated by JSON schema.
4+
5+
## Usage
6+
7+
```kotlin
8+
val schema = JsonSchema.fromDefinition(/*schema*/)
9+
10+
val obj = mapOf(
11+
"a" to 42,
12+
"b" to listOf("test"),
13+
"c" to mapOf(
14+
"inner" to 42,
15+
),
16+
)
17+
18+
val result = schema.validate(wrapAsElement(obj), OutputCollector.flag())
19+
```
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
public final class io/github/optimumcode/json/schema/wrappers/objects/ObjectWrappers {
2+
public static final fun wrapAsElement (Ljava/lang/Object;)Lio/github/optimumcode/json/schema/model/AbstractElement;
3+
public static final fun wrapAsElement (Ljava/lang/Object;Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;)Lio/github/optimumcode/json/schema/model/AbstractElement;
4+
public static synthetic fun wrapAsElement$default (Ljava/lang/Object;Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/model/AbstractElement;
5+
}
6+
7+
public final class io/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration {
8+
public static final field Companion Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration$Companion;
9+
public static final fun create ()Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;
10+
public static final fun create (Lkotlin/jvm/functions/Function1;)Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;
11+
public final fun getAllowSets ()Z
12+
public final fun getByteArrayAsBase64String ()Z
13+
public final fun getCharAsCodepoint ()Z
14+
}
15+
16+
public final class io/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration$Companion {
17+
public final fun create ()Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;
18+
public final fun create (Lkotlin/jvm/functions/Function1;)Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;
19+
public static synthetic fun create$default (Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration$Companion;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/wrappers/objects/WrappingConfiguration;
20+
}
21+
22+
public final class io/github/optimumcode/json/schema/wrappers/objects/WrappingConfigurationBuilder {
23+
public final fun getAllowSets ()Z
24+
public final fun getByteArrayAsBase64String ()Z
25+
public final fun getCharAsCodepoint ()Z
26+
public final fun setAllowSets (Z)V
27+
public final fun setByteArrayAsBase64String (Z)V
28+
public final fun setCharAsCodepoint (Z)V
29+
}
30+
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
@file:OptIn(ExperimentalWasmDsl::class)
2+
3+
import io.gitlab.arturbosch.detekt.Detekt
4+
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
5+
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
6+
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
7+
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests
8+
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
9+
10+
plugins {
11+
alias(libs.plugins.kotlin.mutliplatform)
12+
alias(libs.plugins.kotlin.serialization)
13+
alias(libs.plugins.kotest.multiplatform)
14+
alias(libs.plugins.kover)
15+
alias(libs.plugins.detekt)
16+
alias(libs.plugins.ktlint)
17+
convention.publication
18+
}
19+
20+
kotlin {
21+
explicitApi()
22+
23+
@OptIn(ExperimentalKotlinGradlePluginApi::class)
24+
compilerOptions {
25+
freeCompilerArgs.add("-opt-in=io.github.optimumcode.json.schema.ExperimentalApi")
26+
}
27+
jvmToolchain(11)
28+
jvm {
29+
testRuns["test"].executionTask.configure {
30+
useJUnitPlatform()
31+
}
32+
}
33+
js(IR) {
34+
browser()
35+
generateTypeScriptDefinitions()
36+
nodejs()
37+
}
38+
wasmJs {
39+
// The wasmJsBrowserTest prints all executed tests as one unformatted string
40+
// Have not found a way to suppress printing all this into console
41+
browser()
42+
nodejs()
43+
}
44+
45+
applyDefaultHierarchyTemplate()
46+
47+
val macOsTargets =
48+
listOf<KotlinTarget>(
49+
macosX64(),
50+
macosArm64(),
51+
iosX64(),
52+
iosArm64(),
53+
iosSimulatorArm64(),
54+
)
55+
56+
val linuxTargets =
57+
listOf<KotlinTarget>(
58+
linuxX64(),
59+
linuxArm64(),
60+
)
61+
62+
val windowsTargets =
63+
listOf<KotlinTarget>(
64+
mingwX64(),
65+
)
66+
67+
sourceSets {
68+
commonMain {
69+
dependencies {
70+
api(projects.jsonSchemaValidator)
71+
}
72+
}
73+
74+
val noJsMain by creating {
75+
dependsOn(commonMain.get())
76+
}
77+
78+
jvmMain {
79+
dependsOn(noJsMain)
80+
}
81+
82+
wasmJsMain {
83+
dependsOn(noJsMain)
84+
}
85+
86+
nativeMain {
87+
dependsOn(noJsMain)
88+
}
89+
90+
commonTest {
91+
dependencies {
92+
implementation(libs.kotest.assertions.core)
93+
implementation(libs.kotest.framework.engine)
94+
implementation(kotlin("test-common"))
95+
implementation(kotlin("test-annotations-common"))
96+
}
97+
}
98+
jvmTest {
99+
dependencies {
100+
implementation(libs.kotest.runner.junit5)
101+
}
102+
}
103+
}
104+
105+
afterEvaluate {
106+
fun Task.dependsOnTargetTests(targets: List<KotlinTarget>) {
107+
targets.forEach {
108+
if (it is KotlinTargetWithTests<*, *>) {
109+
dependsOn(tasks.getByName("${it.name}Test"))
110+
}
111+
}
112+
}
113+
tasks.register("macOsAllTest") {
114+
group = "verification"
115+
description = "runs all tests for MacOS and IOS targets"
116+
dependsOnTargetTests(macOsTargets)
117+
}
118+
tasks.register("windowsAllTest") {
119+
group = "verification"
120+
description = "runs all tests for Windows targets"
121+
dependsOnTargetTests(windowsTargets)
122+
}
123+
tasks.register("linuxAllTest") {
124+
group = "verification"
125+
description = "runs all tests for Linux targets"
126+
dependsOnTargetTests(linuxTargets)
127+
dependsOn(tasks.getByName("jvmTest"))
128+
dependsOn(tasks.getByName("jsTest"))
129+
dependsOn(tasks.getByName("wasmJsTest"))
130+
}
131+
}
132+
}
133+
134+
ktlint {
135+
version.set(libs.versions.ktlint)
136+
reporters {
137+
reporter(ReporterType.HTML)
138+
}
139+
}
140+
141+
afterEvaluate {
142+
val detektAllTask by tasks.register("detektAll") {
143+
dependsOn(tasks.withType<Detekt>())
144+
}
145+
146+
tasks.named("check").configure {
147+
dependsOn(detektAllTask)
148+
}
149+
}

0 commit comments

Comments
 (0)