Skip to content

Commit 782edf2

Browse files
Merge pull request #51 from mduesterhoeft/extract-jsonschema
Extract json schema functionality into separate module
2 parents b4a0961 + 0671e28 commit 782edf2

File tree

13 files changed

+107
-59
lines changed

13 files changed

+107
-59
lines changed

build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,15 @@ allprojects {
5555
}
5656
}
5757

58+
59+
5860
subprojects {
5961

62+
val jacksonVersion by extra { "2.9.5" }
63+
val springBootVersion by extra { "2.0.5.RELEASE" }
64+
val springRestDocsVersion by extra { "2.0.2.RELEASE" }
65+
val junitVersion by extra { "5.3.1" }
66+
6067
tasks.withType<KotlinCompile> {
6168
kotlinOptions.jvmTarget = "1.8"
6269
}

restdocs-openapi-generator/build.gradle.kts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,22 @@ repositories {
1010
maven { url = uri("https://jitpack.io") }
1111
}
1212

13+
val junitVersion: String by extra
14+
1315
dependencies {
1416
compile(kotlin("stdlib-jdk8"))
1517

1618
compile(project(":restdocs-openapi-model"))
19+
compile(project(":restdocs-openapi-jsonschema"))
1720
compile("io.swagger:swagger-core:1.5.21")
1821
compile("com.fasterxml.jackson.core:jackson-databind:2.9.5")
1922
compile("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.5")
20-
compile("com.github.everit-org.json-schema:org.everit.json.schema:1.9.1")
23+
2124

2225
testImplementation("io.swagger:swagger-parser:1.0.36")
23-
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.2.0")
26+
testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
2427
testImplementation("org.assertj:assertj-core:3.10.0")
2528

26-
testImplementation("com.jayway.jsonpath:json-path:2.4.0")
27-
testImplementation("com.github.java-json-tools:json-schema-validator:2.2.10")
2829
}
2930

3031

restdocs-openapi-generator/src/main/kotlin/com/epages/restdocs/openapi/generator/OpenApi20Generator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.epages.restdocs.openapi.generator
22

3-
import com.epages.restdocs.openapi.generator.schema.JsonSchemaFromFieldDescriptorsGenerator
3+
import com.epages.restdocs.openapi.jsonschema.JsonSchemaFromFieldDescriptorsGenerator
44
import com.epages.restdocs.openapi.model.FieldDescriptor
55
import com.epages.restdocs.openapi.model.HTTPMethod
66
import com.epages.restdocs.openapi.model.HeaderDescriptor

restdocs-openapi-generator/src/test/kotlin/com/epages/restdocs/openapi/generator/schema/JsonFieldPathTest.kt

Lines changed: 0 additions & 24 deletions
This file was deleted.

restdocs-openapi-gradle-plugin/build.gradle.kts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ gradlePlugin {
2323
}
2424
}
2525

26+
val jacksonVersion: String by extra
27+
val junitVersion: String by extra
28+
2629
dependencies {
2730
compileOnly(gradleKotlinDsl())
2831

@@ -31,10 +34,10 @@ dependencies {
3134

3235
implementation(project(":restdocs-openapi-model"))
3336
implementation(project(":restdocs-openapi-generator"))
34-
implementation("com.fasterxml.jackson.core:jackson-databind:2.9.5")
35-
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.5")
37+
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
38+
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")
3639

37-
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.2.0")
40+
testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
3841
testImplementation("org.assertj:assertj-core:3.10.0")
3942

4043
testImplementation("com.jayway.jsonpath:json-path:2.4.0")
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2+
3+
plugins {
4+
kotlin("jvm")
5+
}
6+
7+
repositories {
8+
mavenCentral()
9+
jcenter()
10+
maven { url = uri("https://jitpack.io") }
11+
}
12+
13+
val jacksonVersion: String by extra
14+
val junitVersion: String by extra
15+
16+
dependencies {
17+
compile(kotlin("stdlib-jdk8"))
18+
compile(project(":restdocs-openapi-model"))
19+
compile("com.github.everit-org.json-schema:org.everit.json.schema:1.9.1")
20+
compile("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
21+
compile("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")
22+
23+
testCompile("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
24+
testCompile("com.github.java-json-tools:json-schema-validator:2.2.10")
25+
testCompile("com.jayway.jsonpath:json-path:2.4.0")
26+
testCompile("org.assertj:assertj-core:3.10.0")
27+
testCompile("javax.validation:validation-api:2.0.1.Final")
28+
29+
}
30+
31+
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.epages.restdocs.openapi.generator.schema
1+
package com.epages.restdocs.openapi.jsonschema
22

33
internal object ConstraintResolver {
44

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.epages.restdocs.openapi.generator.schema
1+
package com.epages.restdocs.openapi.jsonschema
22

33
import java.util.ArrayList
44
import java.util.regex.Pattern
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package com.epages.restdocs.openapi.generator.schema
1+
package com.epages.restdocs.openapi.jsonschema
22

3-
import com.epages.restdocs.openapi.generator.schema.ConstraintResolver.isRequired
4-
import com.epages.restdocs.openapi.generator.schema.ConstraintResolver.maxLengthString
5-
import com.epages.restdocs.openapi.generator.schema.ConstraintResolver.minLengthString
3+
import com.epages.restdocs.openapi.jsonschema.ConstraintResolver.isRequired
4+
import com.epages.restdocs.openapi.jsonschema.ConstraintResolver.maxLengthString
5+
import com.epages.restdocs.openapi.jsonschema.ConstraintResolver.minLengthString
66
import com.fasterxml.jackson.databind.SerializationFeature
77
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
88
import org.everit.json.schema.ArraySchema
@@ -20,11 +20,11 @@ import java.util.ArrayList
2020
import java.util.Collections.emptyList
2121
import java.util.function.Predicate
2222

23-
internal class JsonSchemaFromFieldDescriptorsGenerator {
23+
class JsonSchemaFromFieldDescriptorsGenerator {
2424

25-
internal fun generateSchema(fieldDescriptors: List<com.epages.restdocs.openapi.model.FieldDescriptor>, title: String? = null): String {
25+
fun generateSchema(fieldDescriptors: List<com.epages.restdocs.openapi.model.FieldDescriptor>, title: String? = null): String {
2626
val jsonFieldPaths = reduceFieldDescriptors(fieldDescriptors)
27-
.map { com.epages.restdocs.openapi.generator.schema.JsonFieldPath.compile(it) }
27+
.map { JsonFieldPath.compile(it) }
2828

2929
val schema = traverse(emptyList(), jsonFieldPaths, ObjectSchema.builder().title(title) as ObjectSchema.Builder)
3030

@@ -48,7 +48,7 @@ internal class JsonSchemaFromFieldDescriptorsGenerator {
4848
}
4949
}
5050

51-
private fun unWrapRootArray(jsonFieldPaths: List<com.epages.restdocs.openapi.generator.schema.JsonFieldPath>, schema: Schema): Schema {
51+
private fun unWrapRootArray(jsonFieldPaths: List<JsonFieldPath>, schema: Schema): Schema {
5252
if (schema is ObjectSchema) {
5353
val groups = groupFieldsByFirstRemainingPathSegment(emptyList(), jsonFieldPaths)
5454
if (groups.keys.size == 1 && groups.keys.contains("[]")) {
@@ -68,7 +68,7 @@ internal class JsonSchemaFromFieldDescriptorsGenerator {
6868

6969
private fun traverse(
7070
traversedSegments: List<String>,
71-
jsonFieldPaths: List<com.epages.restdocs.openapi.generator.schema.JsonFieldPath>,
71+
jsonFieldPaths: List<JsonFieldPath>,
7272
builder: ObjectSchema.Builder
7373
): Schema {
7474

@@ -102,30 +102,30 @@ internal class JsonSchemaFromFieldDescriptorsGenerator {
102102
return builder.build()
103103
}
104104

105-
private fun isDirectMatch(traversedSegments: List<String>): Predicate<com.epages.restdocs.openapi.generator.schema.JsonFieldPath> {
105+
private fun isDirectMatch(traversedSegments: List<String>): Predicate<JsonFieldPath> {
106106
// we have a direct match when there are no remaining segments or when the only following element is an array
107107
return Predicate { jsonFieldPath ->
108108
val remainingSegments = jsonFieldPath.remainingSegments(traversedSegments)
109-
remainingSegments.isEmpty() || remainingSegments.size == 1 && com.epages.restdocs.openapi.generator.schema.JsonFieldPath.isArraySegment(remainingSegments[0])
109+
remainingSegments.isEmpty() || remainingSegments.size == 1 && JsonFieldPath.isArraySegment(remainingSegments[0])
110110
}
111111
}
112112

113113
private fun groupFieldsByFirstRemainingPathSegment(
114114
traversedSegments: List<String>,
115-
jsonFieldPaths: List<com.epages.restdocs.openapi.generator.schema.JsonFieldPath>
116-
): Map<String, List<com.epages.restdocs.openapi.generator.schema.JsonFieldPath>> {
115+
jsonFieldPaths: List<JsonFieldPath>
116+
): Map<String, List<JsonFieldPath>> {
117117
return jsonFieldPaths.groupBy { it.remainingSegments(traversedSegments)[0] }
118118
}
119119

120120
private fun processRemainingSegments(
121121
builder: ObjectSchema.Builder,
122122
propertyName: String,
123123
traversedSegments: MutableList<String>,
124-
fields: List<com.epages.restdocs.openapi.generator.schema.JsonFieldPath>,
124+
fields: List<JsonFieldPath>,
125125
description: String?
126126
) {
127127
val remainingSegments = fields[0].remainingSegments(traversedSegments)
128-
if (remainingSegments.isNotEmpty() && com.epages.restdocs.openapi.generator.schema.JsonFieldPath.isArraySegment(remainingSegments[0])) {
128+
if (remainingSegments.isNotEmpty() && JsonFieldPath.isArraySegment(remainingSegments[0])) {
129129
traversedSegments.add(remainingSegments[0])
130130
builder.addPropertySchema(
131131
propertyName, ArraySchema.builder()
@@ -221,7 +221,7 @@ internal class JsonSchemaFromFieldDescriptorsGenerator {
221221
else -> throw IllegalArgumentException("unknown field type $type")
222222
}
223223

224-
fun equalsOnPathAndType(f: JsonSchemaFromFieldDescriptorsGenerator.FieldDescriptorWithSchemaType): Boolean =
224+
fun equalsOnPathAndType(f: FieldDescriptorWithSchemaType): Boolean =
225225
(this.path == f.path &&
226226
this.type == f.type)
227227

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.epages.restdocs.openapi.jsonschema
2+
3+
import com.epages.restdocs.openapi.jsonschema.JsonFieldPath.Companion.compile
4+
import org.assertj.core.api.BDDAssertions.then
5+
import org.junit.jupiter.api.Test
6+
import java.util.Collections.emptyList
7+
8+
class JsonFieldPathTest {
9+
10+
@Test
11+
fun should_get_remaining_segments() {
12+
with(compile(
13+
JsonSchemaFromFieldDescriptorsGenerator.FieldDescriptorWithSchemaType("a.b.c", "", "", false, false,
14+
com.epages.restdocs.openapi.model.Attributes()
15+
))) {
16+
then(remainingSegments(listOf("a"))).contains("b", "c")
17+
then(remainingSegments(listOf("a", "b"))).contains("c")
18+
then(remainingSegments(listOf("a", "b", "c"))).isEmpty()
19+
then(remainingSegments(listOf("d", "e", "c"))).contains("a", "b", "c")
20+
then(remainingSegments(emptyList())).contains("a", "b", "c")
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)