Skip to content
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
13 changes: 12 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,23 @@ language: java
jdk:
- oraclejdk8
sudo: false
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- "$HOME/.gradle"
- "$HOME/.gradle/caches/"
- "$HOME/.gradle/wrapper/"
install: true
script: "./gradlew clean build coveralls"
deploy:
provider: script
script: "./gradlew binTrayUpload"
on:
tags: true
env:
global:
- CI_NAME=travis-ci
- secure: nOkY2AcR5Z7hKKzi+zCzmzPk+xiRRrJjGliDJnHnEO7g+iJ8SmT+thHuMFcXqvjxJ006LbR3GPB8M8qgFXFDPEUDRPppShi3waOm1ddlM2iXh9kbCoROoioyRO+F07deH6ExibkLbu/xq3WwAAw7lx/ZP+buc2R2VCbV0nLKP9iE4nHQX8msLgmU1LjWf0Au1Pgl2eWXV0J4/ZJOvcVu9hvBf1Ow4C7BNb0KZmMjeT9uMK0hiGpb9VVbwedOWfsbaFmqmKYqVKS8UtNmG+HBjvZfajrIARKRPc9w9uEvfl4E1H/J7PJLy2kOrCOauj8LMu6DduSrWcg08T5VnH51cavSAsWWG1ImTgEsUBNpllc9r1XLhQCLQ1TWCgGmleqYjZ2ySvg0MQpFjTgXMZC+aDkjZjcEeq3BgrncAR/bcG4ByrZBWyoEXDxBwoMZnkryTxK07UUgXRXdjJUldJ5CQW9oSfd+oEXKJyqQGNt0ob3S0sRS5uhrKniK+6Mwzxf6vXeYvn2fVP5j3hocUz4XzDJQoDDmJi6D4BpwksqJ81CNOHpyeDIOhdXxvA/J8DMCK0Q7tTSbnSOxItaht56CSxqqLSGax3/4Nr+5QX9jpmdJ03HdpP+MOuIl6dZCmE4/w1IFaFEfhpETPlnWZHl1BsOt7omDeW7yCttDq3Y1mXU=
- secure: 4DTaXQyT0oj4GkmDYRT0goQ7B/wGAjLov9xRssyz7aEKZaZZS/y4YSZ7LEI57dZYLkwtekiR1zN6gLnB6XGTMh2MVRGZ1vzcwsR1HebyjFHf5+2YHXRKq/mJk4K4q6t9GtXKZYz3yDnXtn7S2NgkIhye0E1t2874kEPcIEhKClLIGKjCsVenx1ui4WxBMVFPyhAe5KKn73HFTZORzPtTzoYDM9akhZm+Ko0ObreJZdy/P9pHU+RGQjPFWRbjNlrBg1uiBhYOWPGXrOwKMxNnl2fNUilF0QHaDt0oYbeBJvXKgqqC90Qrb067+ynL5S567uesY16A0MtYDIYiDAt0ytSH4B5fjWpFR5WWU+X9uPTAzP4HTwNYfdOBnvtUrRUlYNdxWxwS7ZOzoMFKt7UHs/42VoJBURBBhP7g6qFIJb+OtdDk6iSpqsa/VSMaB59HsKkitB2ZDh7ohmWBu0wZ1iIN6hEYd94/HFWv4C6Fkntbxgv+kVETVNmeA6yLMvLF46Jg8a1s2XptCUFb5kQpgaitbEPnso8lAwXCPRQlj064Ctym8oPCi4hYZcWHm4sF1RYFVweVaa1+5wQI5go6dTgrQajYwRJU0WmtmYfb9pr/l5NeAk2tuYEnX/ILs6TB1by5qJUQzCnaF7YgERrG84t4lqByBGdZaIiFMRIVXCw=
- secure: iEfnO6ZvdyY2Sx0uDafjRgyqPsUueEZtvWumhSRQCBEpQ6MDQiWQTX3SGYtgdX61eShiqwVo3bnp3eeCCojUCtXHFM+sE+bk3NOMuocq4p1Q6uZrt1oe7nK8wYBPdl+5iema1UtSiYiAw6FGlAnDsDjvBkIa7vGpoGyToa68hzLjwNWMi6Jz9JPEoCwIIKSZn8J8gYbeKr1CMLkwpLZYfsh077mXRC22yH0jh7c6kQSfdUuW7a6fELQiQXgccp8qR11oJ5AI17prFa+4q09xCk4pbrhCHMXRrOHDfRLicXWN3qgF8rqETLLRGM1LPpwsgkoFqBEs93RT+3USpWs2H8sC5LgG3m76QP4stRekEmmlJJnIT9ohTt6SAWvrszoYYusTfJbVwQewKXQppshcUIubL7GqaJ0gaTgU7O3tX2o7lTi0dw27FcXV2KpSBSkNok1AZy9iWhGoeSWupi8APe37IwUHjPTiu3on07hbuRXQ/7qvVxujftwiDR3Tbb5AoG3tvtr5+Ru58Ie4PyhxuP1AYbUkgWxVx2MOBHeePHm59wfXIytKoSAGIi0uFwlCqBV926sJCbKwv0c2Kh5SkJvA/1TNTFYITgiiIL9DyxziXUzvsJAkO2ZyA8FLCpMM+WqMnB/M5jxrFzqFFfvhP5dSZSd3OkUO2bhHJuCS2BU=
221 changes: 155 additions & 66 deletions README.md

Large diffs are not rendered by default.

32 changes: 25 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import com.jfrog.bintray.gradle.BintrayExtension
import com.jfrog.bintray.gradle.BintrayExtension.PackageConfig
import com.jfrog.bintray.gradle.tasks.BintrayUploadTask
import org.gradle.internal.impldep.org.eclipse.jgit.lib.ObjectChecker.tag
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.kt3k.gradle.plugin.CoverallsPluginExtension
Expand All @@ -9,12 +12,13 @@ import org.gradle.api.tasks.bundling.Jar

plugins {
java
kotlin("jvm") version "1.2.60" apply false
kotlin("jvm") version "1.2.51" apply false
id("pl.allegro.tech.build.axion-release") version "1.9.2"
jacoco
`maven-publish`
id("org.jmailen.kotlinter") version "1.17.0" apply false
id("com.github.kt3k.coveralls") version "2.8.2"
id("com.jfrog.bintray") version "1.8.4" apply false
}

repositories {
Expand Down Expand Up @@ -52,6 +56,7 @@ allprojects {
apply(plugin = "jacoco")
apply(plugin = "maven-publish")
apply(plugin = "org.jmailen.kotlinter")

}
}

Expand All @@ -76,6 +81,7 @@ subprojects {
}

if (!isSampleProject()) {

tasks.withType<JacocoReport> {
dependsOn("test")
reports {
Expand All @@ -86,23 +92,35 @@ subprojects {

val sourcesJar by tasks.creating(Jar::class) {
classifier = "sources"
from(sourceSets["main"].allSource)
from(java.sourceSets["main"].allSource)
}

publishing {
publications {
register("mavenJava", MavenPublication::class) {
(publications) {
"mavenJava"(MavenPublication::class) {
from(components["java"])
artifact(sourcesJar)
}
}
}
apply(plugin = "com.jfrog.bintray")
configure<BintrayExtension> {
user = project.findProperty("bintrayUser") as String? ?: System.getenv("BINTRAY_USER")
key = project.findProperty("bintrayApiKey") as String? ?: System.getenv("BINTRAY_API_KEY")
publish = true
setPublications("mavenJava")
pkg(closureOf<PackageConfig> {
repo = "maven"
name = "restdocs-api-spec"
userOrg = "epages"
})
}
}
}

//coverall multi module plugin configuration starts here
configure<CoverallsPluginExtension> {
sourceDirs = nonSampleProjects.flatMap { it.sourceSets["main"].allSource.srcDirs }.filter { it.exists() }.map { it.path }
sourceDirs = nonSampleProjects.flatMap { it.java.sourceSets["main"].allSource.srcDirs }.filter { it.exists() }.map { it.path }
jacocoReportPath = "$buildDir/reports/jacoco/jacocoRootReport/jacocoRootReport.xml"
}

Expand All @@ -122,8 +140,8 @@ tasks {
description = "Generates an aggregate report from all subprojects"
group = "Coverage reports"
dependsOn(jacocoMerge)
sourceDirectories = files(nonSampleProjects.flatMap { it.sourceSets["main"].allSource.srcDirs.filter { it.exists() } } )
classDirectories = files(nonSampleProjects.flatMap { it.sourceSets["main"].output } )
sourceDirectories = files(nonSampleProjects.flatMap { it.java.sourceSets["main"].allSource.srcDirs.filter { it.exists() } } )
classDirectories = files(nonSampleProjects.flatMap { it.java.sourceSets["main"].output } )
executionData(jacocoMerge.destinationFile)
reports {
html.isEnabled = true
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ plugins {
}

gradlePlugin {
plugins {
register("com.epages.restdocs-openapi") {
id = "com.epages.restdocs-openapi"
implementationClass = "com.epages.restdocs.openapi.gradle.RestdocsOpenApiPlugin"
(plugins) {
"com.epages.restdocs-api-spec" {
id = "com.epages.restdocs-api-spec"
implementationClass = "com.epages.restdocs.apispec.gradle.RestdocsApiSpecPlugin"
}
}
}
Expand All @@ -32,12 +32,13 @@ dependencies {
compile(kotlin("gradle-plugin"))
compile(kotlin("stdlib-jdk8"))

implementation(project(":restdocs-openapi-model"))
implementation(project(":restdocs-openapi-generator"))
implementation(project(":restdocs-api-spec-openapi-generator"))
implementation(project(":restdocs-api-spec-openapi3-generator"))
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")

testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
testImplementation("org.junit-pioneer:junit-pioneer:0.2.2")
testImplementation("org.assertj:assertj-core:3.10.0")

testImplementation("com.jayway.jsonpath:json-path:2.4.0")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.epages.restdocs.apispec.gradle

import org.gradle.api.Project

abstract class ApiSpecExtension(protected val project: Project) {

abstract var outputDirectory: String

var snippetsDirectory = "build/generated-snippets"

abstract var outputFileNamePrefix: String

var separatePublicApi: Boolean = false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.epages.restdocs.apispec.gradle

import com.epages.restdocs.apispec.model.ResourceModel
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import java.io.File

abstract class ApiSpecTask : DefaultTask() {

@Input
var separatePublicApi: Boolean = false

@Input
lateinit var outputDirectory: String

@Input
lateinit var snippetsDirectory: String

@Input
lateinit var outputFileNamePrefix: String

private val outputDirectoryFile
get() = project.file(outputDirectory)

private val snippetsDirectoryFile
get() = project.file(snippetsDirectory)

private val objectMapper = jacksonObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

open fun applyExtension(extension: ApiSpecExtension) {
outputDirectory = extension.outputDirectory
snippetsDirectory = extension.snippetsDirectory
outputFileNamePrefix = extension.outputFileNamePrefix
separatePublicApi = extension.separatePublicApi
}

@TaskAction
fun aggregateResourceModels() {

val resourceModels = snippetsDirectoryFile.walkTopDown()
.filter { it.name == "resource.json" }
.map { objectMapper.readValue<ResourceModel>(it.readText()) }
.toList()

writeSpecificationFile(outputFileNamePrefix, generateSpecification(resourceModels))

if (separatePublicApi) {
val content = generateSpecification(resourceModels.filterNot { it.privateResource })
writeSpecificationFile("$outputFileNamePrefix-public", content)
}
}

private fun writeSpecificationFile(outputFilenamePrefix: String, content: String) {
outputDirectoryFile.mkdir()
File(outputDirectoryFile, "$outputFilenamePrefix.${outputFileExtension()}").writeText(content)
}

protected abstract fun outputFileExtension(): String

protected abstract fun generateSpecification(resourceModels: List<ResourceModel>): String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.epages.restdocs.apispec.gradle

import com.epages.restdocs.apispec.model.ResourceModel
import com.epages.restdocs.apispec.openapi3.OpenApi3Generator
import io.swagger.v3.oas.models.servers.Server
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional

open class OpenApi3Task : OpenApiBaseTask() {

@Input
@Optional
var servers: List<Server> = listOf()

fun applyExtension(extension: OpenApi3Extension) {
super.applyExtension(extension)
servers = extension.servers
}

override fun generateSpecification(resourceModels: List<ResourceModel>): String {
return OpenApi3Generator.generateAndSerialize(
resources = resourceModels,
servers = servers,
title = title,
version = apiVersion,
oauth2SecuritySchemeDefinition = oauth2SecuritySchemeDefinition,
format = format
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.epages.restdocs.apispec.gradle

import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional

abstract class OpenApiBaseTask : ApiSpecTask() {
@Input
@Optional
lateinit var title: String

@Input
@Optional
lateinit var apiVersion: String

@Input
@Optional
lateinit var format: String

@Input @Optional
var oauth2SecuritySchemeDefinition: PluginOauth2Configuration? = null

override fun outputFileExtension() = format

fun applyExtension(extension: OpenApiBaseExtension) {
super.applyExtension(extension)
format = extension.format
oauth2SecuritySchemeDefinition = extension.oauth2SecuritySchemeDefinition
title = extension.title
apiVersion = extension.version
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.epages.restdocs.apispec.gradle

import com.epages.restdocs.apispec.model.Oauth2Configuration
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.kotlin.readValue
import groovy.lang.Closure
import io.swagger.v3.oas.models.servers.Server
import org.gradle.api.Project
import java.io.File

abstract class OpenApiBaseExtension(project: Project) : ApiSpecExtension(project) {
override var outputDirectory = "build/openapi"

private val objectMapper = ObjectMapper(YAMLFactory())

var title = "API documentation"
var version = project.version as? String ?: "1.0.0"

var format = "json"

var oauth2SecuritySchemeDefinition: PluginOauth2Configuration? = null

fun setOauth2SecuritySchemeDefinition(closure: Closure<PluginOauth2Configuration>) {
oauth2SecuritySchemeDefinition = project.configure(PluginOauth2Configuration(), closure) as PluginOauth2Configuration
with(oauth2SecuritySchemeDefinition!!) {
if (scopeDescriptionsPropertiesFile != null) {
scopes = scopeDescriptionSource(project.file(scopeDescriptionsPropertiesFile!!))
}
}
}

private fun scopeDescriptionSource(scopeDescriptionsPropertiesFile: File): Map<String, String> {
return scopeDescriptionsPropertiesFile.let { objectMapper.readValue<Map<String, String>>(it) } ?: emptyMap()
}
}

class PluginOauth2Configuration(
var scopeDescriptionsPropertiesFile: String? = null
) : Oauth2Configuration()

open class OpenApiExtension(project: Project) : OpenApiBaseExtension(project) {

override var outputFileNamePrefix = "openapi"

var host: String = "localhost"
var basePath: String? = null
var schemes: Array<String> = arrayOf("http")

companion object {
const val name = "openapi"
}
}

open class OpenApi3Extension(project: Project) : OpenApiBaseExtension(project) {

override var outputFileNamePrefix = "openapi3"

private var _servers: List<Server> = mutableListOf(Server().apply { url = "http://localhost" })

val servers
get() = _servers

fun setServer(serverAction: Closure<Server>) {
_servers = listOf(project.configure(Server(), serverAction) as Server)
}

fun setServer(serverUrl: String) {
_servers = listOf(Server().apply { url = serverUrl })
}

fun setServers(serversActions: List<Closure<Server>>) {
_servers = serversActions.map { project.configure(Server(), it) as Server }
}

companion object {
const val name = "openapi3"
}
}
Loading