diff --git a/lib/build.gradle.kts b/kompendium/build.gradle.kts similarity index 100% rename from lib/build.gradle.kts rename to kompendium/build.gradle.kts diff --git a/lib/src/main/kotlin/kompendium/Library.kt b/kompendium/src/main/kotlin/kompendium/Library.kt similarity index 66% rename from lib/src/main/kotlin/kompendium/Library.kt rename to kompendium/src/main/kotlin/kompendium/Library.kt index 1cfe7701c..6eefd3560 100644 --- a/lib/src/main/kotlin/kompendium/Library.kt +++ b/kompendium/src/main/kotlin/kompendium/Library.kt @@ -4,7 +4,7 @@ package kompendium class Library { - fun someLibraryMethod(): Boolean { - return true + fun someLibraryMethod(): String { + return "Heya" } } diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/Kompendium.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/Kompendium.kt new file mode 100644 index 000000000..c0ff31312 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/Kompendium.kt @@ -0,0 +1,8 @@ +package org.leafygreens.kompendium + +import java.net.URI +import org.leafygreens.kompendium.models.OpenApiSpec + +class Kompendium { + val spec = OpenApiSpec() +} diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpec.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpec.kt new file mode 100644 index 000000000..79762f081 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpec.kt @@ -0,0 +1,12 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpec( + val openapi: String = "3.0.3", + val info: OpenApiSpecInfo? = null, + val servers: List = emptyList(), // TODO Needs to default to server object with url of `/` + val paths: Map = emptyMap(), + val components: OpenApiSpecComponents? = null, + val security: Map = emptyMap(), // todo needs to reference objects in the components -> security scheme 🤔 + val tags: List = emptyList(), + val externalDocs: OpenApiSpecExternalDocumentation? = null +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecComponents.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecComponents.kt new file mode 100644 index 000000000..ec6967eff --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecComponents.kt @@ -0,0 +1,6 @@ +package org.leafygreens.kompendium.models + +// TODO I *think* the only thing I need here is the security https://swagger.io/specification/#components-object +data class OpenApiSpecComponents( + val securitySchemes: Map +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecExternalDocumentation.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecExternalDocumentation.kt new file mode 100644 index 000000000..baaf1b8b8 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecExternalDocumentation.kt @@ -0,0 +1,8 @@ +package org.leafygreens.kompendium.models + +import java.net.URI + +data class OpenApiSpecExternalDocumentation( + val url: URI, + val description: String? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfo.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfo.kt new file mode 100644 index 000000000..5987b3dc2 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfo.kt @@ -0,0 +1,12 @@ +package org.leafygreens.kompendium.models + +import java.net.URI + +data class OpenApiSpecInfo( + val title: String, + val version: String, + val description: String?, + val termsOfService: URI?, + val contact: OpenApiSpecInfoContact?, + val license: OpenApiSpecInfoLicense? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoContact.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoContact.kt new file mode 100644 index 000000000..c8d57eea5 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoContact.kt @@ -0,0 +1,9 @@ +package org.leafygreens.kompendium.models + +import java.net.URI + +data class OpenApiSpecInfoContact( + val name: String, + val url: URI?, + val email: String? // TODO Enforce email +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoLicense.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoLicense.kt new file mode 100644 index 000000000..f4ca67142 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecInfoLicense.kt @@ -0,0 +1,8 @@ +package org.leafygreens.kompendium.models + +import java.net.URI + +data class OpenApiSpecInfoLicense( + val name: String, + val url: URI? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecLink.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecLink.kt new file mode 100644 index 000000000..95f1ee16e --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecLink.kt @@ -0,0 +1,10 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecLink( + val operationRef: String?, // todo mutually exclusive with operationId + val operationId: String?, + val parameters: Map, // todo sheesh https://swagger.io/specification/#link-object + val requestBody: String, // todo same + val description: String?, + val server: OpenApiSpecServer? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecMediaType.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecMediaType.kt new file mode 100644 index 000000000..2d09bdb1c --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecMediaType.kt @@ -0,0 +1,9 @@ +package org.leafygreens.kompendium.models + +// TODO Oof -> https://swagger.io/specification/#media-type-object +data class OpenApiSpecMediaType( + val schema: String, // TODO sheesh -> https://swagger.io/specification/#schema-object needs to be referencable + val example: String, // TODO Enforce type? then serialize? + val examples: Map, // needs to be mutually exclusive with example + val encoding: Map // todo encoding object -> https://swagger.io/specification/#encoding-object +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlow.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlow.kt new file mode 100644 index 000000000..abe261689 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlow.kt @@ -0,0 +1,10 @@ +package org.leafygreens.kompendium.models + +import java.net.URI + +data class OpenApiSpecOAuthFlow( + val authorizationUrl: URI, + val tokenUrl: URI, + val refreshUrl: URI, + val scopes: Map +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlows.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlows.kt new file mode 100644 index 000000000..9e380a20a --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecOAuthFlows.kt @@ -0,0 +1,5 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecOAuthFlows( + val implicit: OpenApiSpecOAuthFlow?, +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItem.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItem.kt new file mode 100644 index 000000000..da9e9bc58 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItem.kt @@ -0,0 +1,17 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecPathItem( + val `$ref`: String?, // TODO Maybe drop this? + val summary: String?, + val description: String?, + val get: OpenApiSpecPathItemOperation?, + val put: OpenApiSpecPathItemOperation?, + val post: OpenApiSpecPathItemOperation?, + val delete: OpenApiSpecPathItemOperation?, + val options: OpenApiSpecPathItemOperation?, + val head: OpenApiSpecPathItemOperation?, + val patch: OpenApiSpecPathItemOperation?, + val trace: OpenApiSpecPathItemOperation?, + val servers: List = emptyList(), + val parameters: List = emptyList() +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItemOperation.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItemOperation.kt new file mode 100644 index 000000000..f56606d09 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecPathItemOperation.kt @@ -0,0 +1,16 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecPathItemOperation( + val tags: Set = emptySet(), + val summary: String?, + val description: String?, + val externalDocs: OpenApiSpecExternalDocumentation?, + val operationId: String?, + val parameters: List = emptyList(), + val requestBody: OpenApiSpecReferencable, + val responses: Map, // TODO How to enforce `default` requirement + val callbacks: Map, + val deprecated: Boolean = false, + val security: Map, // todo needs to reference objects in the security scheme 🤔 + val servers: List +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecReferencable.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecReferencable.kt new file mode 100644 index 000000000..18131c8d2 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecReferencable.kt @@ -0,0 +1,31 @@ +package org.leafygreens.kompendium.models + +sealed class OpenApiSpecReferencable + +class OpenApiSpecReferenceObject(val `$ref`: String) : OpenApiSpecReferencable() + +data class OpenApiSpecCallback( + val todo: String // todo fuck me -> https://swagger.io/specification/#callback-object +) : OpenApiSpecReferencable() + +data class OpenApiSpecResponse( + val description: String, + val headers: Map, + val content: Map, + val links: Map +) : OpenApiSpecReferencable() + +data class OpenApiSpecHeader( + val name: String, + val description: String?, + val externalDocs: OpenApiSpecExternalDocumentation? +) : OpenApiSpecReferencable() + +data class OpenApiSpecParameter( + val name: String, + val `in`: String, // TODO Enum? "query", "header", "path" or "cookie" + val description: String?, + val required: Boolean = true, + val deprecated: Boolean = false, + val allowEmptyValue: Boolean = false +) : OpenApiSpecReferencable() diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecRequest.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecRequest.kt new file mode 100644 index 000000000..f2721ed1b --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecRequest.kt @@ -0,0 +1,7 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecRequest( + val description: String?, + val content: Map, + val required: Boolean = false +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecSecuritySchema.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecSecuritySchema.kt new file mode 100644 index 000000000..85588b3b7 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecSecuritySchema.kt @@ -0,0 +1,12 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecSecuritySchema( + val type: String, // TODO Enum? "apiKey", "http", "oauth2", "openIdConnect" + val name: String, + val `in`: String, + val scheme: String, + val flows: OpenApiSpecOAuthFlows, + val bearerFormat: String?, + val description: String?, +) + diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServer.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServer.kt new file mode 100644 index 000000000..6b544448d --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServer.kt @@ -0,0 +1,7 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecServer( + val url: String, + val description: String?, + var variables: Map? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServerVariable.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServerVariable.kt new file mode 100644 index 000000000..b50d219e5 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecServerVariable.kt @@ -0,0 +1,7 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecServerVariable( + val `enum`: Set, // todo enforce not empty + val default: String, + val description: String? +) diff --git a/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecTag.kt b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecTag.kt new file mode 100644 index 000000000..97a779c02 --- /dev/null +++ b/kompendium/src/main/kotlin/org/leafygreens/kompendium/models/OpenApiSpecTag.kt @@ -0,0 +1,7 @@ +package org.leafygreens.kompendium.models + +data class OpenApiSpecTag( + val name: String, + val description: String?, + val externalDocs: OpenApiSpecExternalDocumentation? +) diff --git a/lib/src/test/kotlin/kompendium/LibraryTest.kt b/kompendium/src/test/kotlin/kompendium/LibraryTest.kt similarity index 64% rename from lib/src/test/kotlin/kompendium/LibraryTest.kt rename to kompendium/src/test/kotlin/kompendium/LibraryTest.kt index 13d57fc37..f732fe90f 100644 --- a/lib/src/test/kotlin/kompendium/LibraryTest.kt +++ b/kompendium/src/test/kotlin/kompendium/LibraryTest.kt @@ -4,11 +4,12 @@ package kompendium import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.assertTrue class LibraryTest { @Test fun testSomeLibraryMethod() { val classUnderTest = Library() - assertTrue(classUnderTest.someLibraryMethod(), "someLibraryMethod should return 'true'") + assertEquals(classUnderTest.someLibraryMethod(), "Heya", "someLibraryMethod should return 'true'") } } diff --git a/playground/build.gradle.kts b/playground/build.gradle.kts index 060835038..cf01277fd 100644 --- a/playground/build.gradle.kts +++ b/playground/build.gradle.kts @@ -6,7 +6,7 @@ dependencies { implementation(platform("org.jetbrains.kotlin:kotlin-bom")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - implementation(projects.lib) + implementation(projects.kompendium) implementation(libs.bundles.ktor) implementation(libs.bundles.logging) diff --git a/playground/src/main/kotlin/org/leafygreens/kompendium/playground/Main.kt b/playground/src/main/kotlin/org/leafygreens/kompendium/playground/Main.kt index 733a8cfd7..66128ac96 100644 --- a/playground/src/main/kotlin/org/leafygreens/kompendium/playground/Main.kt +++ b/playground/src/main/kotlin/org/leafygreens/kompendium/playground/Main.kt @@ -8,6 +8,7 @@ import io.ktor.routing.route import io.ktor.routing.routing import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty +import kompendium.Library fun main() { embeddedServer( @@ -21,7 +22,7 @@ fun Application.mainModule() { routing { route("/") { get { - call.respondText("hi") + call.respondText(Library().someLibraryMethod()) } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2d14f8cde..59b961c85 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ -rootProject.name = "kompendium" -include("lib") +rootProject.name = "root" +include("kompendium") include("playground") // Feature Previews