Giter Site home page Giter Site logo

int128 / gradle-swagger-generator-plugin Goto Github PK

View Code? Open in Web Editor NEW
299.0 13.0 66.0 8.59 MB

Gradle plugin for OpenAPI YAML validation, code generation and API document publishing

License: Apache License 2.0

Groovy 92.14% HTML 7.86%
gradle-plugin swagger-codegen swagger-ui redoc swagger openapi groovy

gradle-swagger-generator-plugin's Introduction

Gradle Swagger Generator Plugin build Gradle Status

Table of content

Introduction

This is a Gradle plugin for the following tasks:

See also the following examples:

Code Generation

Create a project with the following build script.

plugins {
  id 'org.hidetake.swagger.generator' version '2.19.2'
}

repositories {
  mavenCentral()
}

dependencies {
  swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.34'             // Swagger Codegen V2
  swaggerCodegen 'io.swagger.codegen.v3:swagger-codegen-cli:3.0.47'  // or Swagger Codegen V3
  swaggerCodegen 'org.openapitools:openapi-generator-cli:3.3.4'     // or OpenAPI Generator
}

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
    }
  }
}

The task generates source code into build/swagger-code-petstore.

% ./gradlew generateSwaggerCode
:resolveSwaggerTemplate NO-SOURCE
:generateSwaggerCodePetstore
:generateSwaggerCode NO-SOURCE

Document Generation

Swagger UI

Create a project with the following build script.

plugins {
  id 'org.hidetake.swagger.generator' version '2.19.2'
}

repositories {
  mavenCentral()
}

dependencies {
  swaggerUI 'org.webjars:swagger-ui:3.52.5'
}

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
  }
}

The task generates an API document as build/swagger-ui-petstore.

% ./gradlew generateSwaggerUI
:generateSwaggerUIPetstore
:generateSwaggerUI NO-SOURCE

ReDoc

Create a project with the following build script.

plugins {
  id 'org.hidetake.swagger.generator' version '2.19.2'
}

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
  }
}

The task generates an API document as build/redoc-petstore.

% ./gradlew generateReDoc
:generateReDocPetstore
:generateReDoc NO-SOURCE

HTML

Create a project with the following build script.

plugins {
  id 'org.hidetake.swagger.generator' version '2.19.2'
}

repositories {
  mavenCentral()
}

dependencies {
  swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.34'             // Swagger Codegen V2
  swaggerCodegen 'io.swagger.codegen.v3:swagger-codegen-cli:3.0.47'  // or Swagger Codegen V3
}

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'html'  // html or html2
    }
  }
}

The task generates a static HTML into build/swagger-code-petstore.

% ./gradlew generateSwaggerCode
:resolveSwaggerTemplate NO-SOURCE
:generateSwaggerCodePetstore
:generateSwaggerCode NO-SOURCE

Recipes

See the example projects in acceptance-test.

Use configuration file

We can use a JSON configuration file as follows:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
      configFile = file('config.json')
    }
  }
}

config.json depends on the language and framework. For example,

{
  "library": "spring-mvc",
  "modelPackage": "example.model",
  "apiPackage": "example.api",
  "invokerPackage": "example"
}

Run the task with Help postfix to show available JSON configuration.

% ./gradlew generateSwaggerCodePetstoreHelp
:generateSwaggerCodePetstoreHelp
=== Available raw options
NAME
        swagger-codegen-cli generate - Generate code with chosen lang

SYNOPSIS
        swagger-codegen-cli generate
                [(-a <authorization> | --auth <authorization>)]
...

=== Available JSON configuration for language spring:

CONFIG OPTIONS
	sortParamsByRequiredFlag
...

Build generated code

It is recommended to generate code into an ephemeral directory (e.g. build) and exclude it from a Git repository. We can compile generated code as follows:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
      configFile = file('config.json')
    }
  }
}

// Configure compile task dependency and source
compileJava.dependsOn swaggerSources.petstore.code
sourceSets.main.java.srcDir "${swaggerSources.petstore.code.outputDir}/src/main/java"
sourceSets.main.resources.srcDir "${swaggerSources.petstore.code.outputDir}/src/main/resources"

See also the following examples:

Validate YAML before code generation

It is recommended to validate an OpenAPI YAML before code generation in order to avoid invalid code generated.

If you use OpenAPI Generator as generator, YAML validation is embeding.

We can validate a YAML as follows:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
      configFile = file('config.json')
      // Validate YAML before code generation. for Swagger Codegen V2 / V3
      dependsOn validation
    }
  }
}

Selective generation

We can control output of code generation. At default everything is generated but only models and APIs are generated in the following:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
      configFile = file('config.json')
      // Generate only models and controllers
      components = ['models', 'apis']
    }
  }
}

components property accepts a list of strings or map.

// generates only models
components = ['models']
components = [models: true]

// generate only User and Pet models
components = [models: ['User', 'Pet']]
components = [models: 'User,Pet']

// generate only APIs (without tests)
components = [apis: true, apiTests: false]
components = [apis: true, apiTests: null]

See selective generation section for details.

Use custom template

We can use a custom template for the code generation as follows:

// build.gradle
swaggerSources {
  inputFile = file('petstore.yaml')
  petstore {
    language = 'spring'
    // Path to the template directory
    templateDir = file('templates/spring-mvc')
  }
}

See also the following examples:

Use custom generator class

We can use a custom generator class for the code generation as follows:

// build.gradle
swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      // FQCN of the custom generator class
      language = 'CustomGenerator'
    }
  }
}

dependencies {
  swaggerCodegen project('generators')
}

swaggerSources*.code*.dependsOn 'generators:jar'
// generators/build.gradle (child project)
dependencies {
  implementation 'io.swagger:swagger-codegen-cli:2.4.24'
}
// generators/src/main/groovy/CustomGenerator.groovy
import io.swagger.codegen.languages.SpringCodegen

class CustomGenerator extends SpringCodegen {
}

See also the following examples:

Externalize template or generator class

In some large use case, we can release a template or generator to an external repository and use them from projects.

// build.gradle
repositories {
  // Use external repository for the template and the generator class
  maven {
    url 'https://example.com/nexus-or-artifactory'
  }
  mavenCentral()
}

dependencies {
  swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.34'
  // Add dependency for the template
  swaggerTemplate 'com.example:swagger-templates:1.0.0'
  // Add dependency for the generator class
  swaggerCodegen 'com.example:swagger-generators:1.0.0'
}

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'spring'
      // The plugin automatically extracts template JAR into below destination
      templateDir = file("${resolveSwaggerTemplate.destinationDir}/spring-mvc")
    }
  }
}

See also the following examples:

Use multiple sources

We can handle multiple sources in a project as follows:

// build.gradle
swaggerSources {
    petstoreV1 {
        inputFile = file('v1-petstore.yaml')
        code {
            language = 'spring'
            configFile = file('v1-config.json')
        }
    }
    petstoreV2 {
        inputFile = file('v2-petstore.yaml')
        code {
            language = 'spring'
            configFile = file('v2-config.json')
        }
    }
}

compileJava.dependsOn swaggerSources.petstoreV1.code, swaggerSources.petstoreV2.code
sourceSets.main.java.srcDirs "${swaggerSources.petstoreV1.code.outputDir}/src/main/java", "${swaggerSources.petstoreV2.code.outputDir}/src/main/java"
sourceSets.main.resources.srcDirs "${swaggerSources.petstoreV1.code.outputDir}/src/main/resources", "${swaggerSources.petstoreV2.code.outputDir}/src/main/resources"

See also the following examples:

Switch version of Swagger Codegen

We can use multiple versions of Swagger Codegen as follows:

// build.gradle
configurations {
    swaggerCodegenV2
    swaggerCodegenV3
}

dependencies {
    swaggerCodegenV2 'io.swagger:swagger-codegen-cli:2.4.24'
    swaggerCodegenV3 'io.swagger.codegen.v3:swagger-codegen-cli:3.0.30'
}

swaggerSources {
    petstoreV2 {
        inputFile = file('v2-petstore.yaml')
        code {
            language = 'spring'
            configuration = configurations.swaggerCodegenV2
        }
    }
    petstoreV3 {
        inputFile = file('v3-petstore.yaml')
        code {
            language = 'spring'
            configuration = configurations.swaggerCodegenV3
        }
    }
}

See also the following examples:

Configure Swagger UI

We can configure Swagger UI by overwriting the default index.html as follows:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    ui {
      doLast {
        copy {
          from 'index.html'
          into outputDir
        }
      }
    }
  }
}

You can create an index.html from the Swagger UI official one. It must satisfy the followings:

  • Put <script src="./swagger-spec.js"> in order to load a Swagger spec. The plugin exports the Swagger spec as swagger-spec.js file while generation.
  • Set spec: window.swaggerSpec in SwaggerUIBundle() parameters.
  • Set validatorUrl: null in SwaggerUIBundle() parameters in order to turn off the validator badge.

See also the following examples:

Compatibility

Swagger Codegen v3 and Java 16+

To use Swagger Codegen v3 on Java 16 or later, you need to set jvmArgs as follows:

swaggerSources {
  petstore {
    inputFile = file('petstore.yaml')
    code {
      language = 'html'
      jvmArgs = ['--add-opens=java.base/java.util=ALL-UNNAMED'] // for Swagger Codegen v3 on Java 16+
    }
  }
}

See #221 for details.

Settings

The plugin adds validateSwagger, generateSwaggerCode, generateSwaggerUI and GenerateReDoc tasks. A task will be skipped if no input file is given.

Task type ValidateSwagger

The task accepts below properties.

Key Type Value Default value
inputFile File Swagger spec file. Mandatory
reportFile File File to write validation report. $buildDir/tmp/validateSwagger/report.yaml

It depends on the following JSON schema:

Task type GenerateSwaggerCode

The task accepts below properties.

Key Type Value Default value
language String Language to generate. Mandatory
inputFile File Swagger spec file. Mandatory
outputDir File Directory to write generated files. $buildDir/swagger-code
wipeOutputDir Boolean Wipe the outputDir before generation. true
library String Library type. None
configFile File JSON configuration file. None
templateDir File Directory containing the template. None
components List or Map Components to generate that is a list of models, apis and supportingFiles. All components
additionalProperties Map of String, String Additional properties. None
rawOptions List of Strings Raw command line options for Swagger Codegen None
configuration String or Configuration Configuration for Swagger Codegen configurations.swaggerCodegen
jvmArgs List of Strings Arguments passed to jvm None

Task type GenerateSwaggerUI

The task accepts below properties.

Key Type Value Default value
inputFile File Swagger spec file. Mandatory
outputDir File Directory to write Swagger UI files. $buildDir/swagger-ui
wipeOutputDir Boolean Wipe the outputDir before generation. true

Note that options and header are no longer supported since 2.10.0. See the Migration Guide for details.

Task type GenerateReDoc

The task accepts below properties.

Key Type Value Default value
inputFile File Swagger spec file. Mandatory
outputDir File Directory to write ReDoc files. $buildDir/swagger-redoc
wipeOutputDir Boolean Wipe the outputDir before generation. true
scriptSrc String URL to ReDoc JavaScript. //rebilly.github.io/ReDoc/releases/latest/redoc.min.js
title String HTML title. ReDoc - $filename
options Map of Strings ReDoc tag attributes. Empty map

Contributions

This is an open source software licensed under the Apache License Version 2.0. Feel free to open issues or pull requests.

CI requires the following variables.

Environment Variable Purpose
$GRADLE_PUBLISH_KEY Publish the plugin to Gradle Plugins
$GRADLE_PUBLISH_SECRET Publish the plugin to Gradle Plugins

gradle-swagger-generator-plugin's People

Contributors

akashagarwal7 avatar asauray avatar britter avatar chasup avatar chkpnt avatar cmagnuson avatar int128 avatar pbthorste avatar renovate[bot] avatar shawnaukstak avatar svanacker avatar tatekan avatar theosotr avatar yuki-teraoka avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gradle-swagger-generator-plugin's Issues

Externalized Templates Failing: Expected configuration ':swaggerTemplate' to contain exactly one file, however, it contains 2 files.

Build Failing When Using Externalized Templates

I've externalized templates into another project, deployed to an Artifactory server. When I try to build I see the following error:

Could not determine the dependencies of task ':resolveSwaggerTemplate'.
> Expected configuration ':swaggerTemplate' to contain exactly one file, however, it contains 2 files.

Based on my testing deploying to Maven local, it appears to be an issue with the presence of a .jar and pom.xml file. When I manually deleted the pom.xml resolveSwaggerTemplate worked file. I think it has something to do with https://github.com/int128/gradle-swagger-generator-plugin/blob/master/src/main/groovy/org/hidetake/gradle/swagger/generator/ResolveSwaggerTemplate.groovy#L15 and it's use of singleFile

To Reproduce:
Publish a jar containing templates to Maven local, then use mavenlocal() to include that repository. Add the jar as a dependency using swaggerTemplate and the build will fail.

Expected behaviour:
The jar containing templates should be extracted to the build directory.

Environment

Plugin version: 2.15.1
Swagger Codegen version: 2.4.0
Gradle version: 3.5.1
Java version: 1.8.0-121
OS: 10.12.6 (Sierra)

Stacktrace

10:53:15 AM: Executing tasks 'clean build --stacktrace'...

Applying default Java plugins
Download http://my.artifactory/artifactory/local-gradle/foo/swagger-codegen-templates/1.1.0/swagger-codegen-templates-1.1.0.jar

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':resolveSwaggerTemplate'.
> Expected configuration ':swaggerTemplate' to contain exactly one file, however, it contains 2 files.

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.GradleException: Could not determine the dependencies of task ':resolveSwaggerTemplate'.
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.resolve(CachingTaskDependencyResolveContext.java:67)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:55)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.addToTaskGraph(DefaultTaskExecutionPlan.java:139)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.addTasks(DefaultTaskGraphExecuter.java:101)
	at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:47)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
	at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
	at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36)
	at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraphAction.execute(DefaultGradleLauncher.java:220)
	at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraphAction.execute(DefaultGradleLauncher.java:217)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:158)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:112)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:95)
	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:66)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:88)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
Caused by: java.lang.IllegalStateException: Expected configuration ':swaggerTemplate' to contain exactly one file, however, it contains 2 files.
	at org.gradle.api.internal.file.AbstractFileCollection.getSingleFile(AbstractFileCollection.java:62)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getSingleFile(Unknown Source)
	at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:213)
	at org.gradle.internal.metaobject.BeanDynamicObject.getProperty(BeanDynamicObject.java:156)
	at org.gradle.internal.metaobject.CompositeDynamicObject.getProperty(CompositeDynamicObject.java:55)
	at org.gradle.internal.metaobject.AbstractDynamicObject.getProperty(AbstractDynamicObject.java:60)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getProperty(Unknown Source)
	at org.hidetake.gradle.swagger.generator.ResolveSwaggerTemplate$_closure1.doCall(ResolveSwaggerTemplate.groovy:15)
	at org.hidetake.gradle.swagger.generator.ResolveSwaggerTemplate$_closure1.doCall(ResolveSwaggerTemplate.groovy)
	at org.gradle.api.internal.file.collections.BuildDependenciesOnlyFileCollectionResolveContext.add(BuildDependenciesOnlyFileCollectionResolveContext.java:66)
	at org.gradle.api.internal.file.collections.BuildDependenciesOnlyFileCollectionResolveContext.add(BuildDependenciesOnlyFileCollectionResolveContext.java:79)
	at org.gradle.api.internal.file.collections.BuildDependenciesOnlyFileCollectionResolveContext.add(BuildDependenciesOnlyFileCollectionResolveContext.java:79)
	at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection.visitContents(DefaultConfigurableFileCollection.java:91)
	at org.gradle.api.internal.file.CompositeFileCollection.visitDependencies(CompositeFileCollection.java:166)
	at org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection.visitDependencies(DefaultConfigurableFileCollection.java:97)
	at org.gradle.api.internal.file.CompositeFileCollection$1.visitDependencies(CompositeFileCollection.java:116)
	at org.gradle.api.internal.file.CompositeFileTree$FilteredFileTree.visitDependencies(CompositeFileTree.java:122)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:88)
	at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:202)
	at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:112)
	at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:64)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.doResolve(CachingTaskDependencyResolveContext.java:76)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.resolve(CachingTaskDependencyResolveContext.java:65)
	... 65 more


BUILD FAILED

Total time: 1.026 secs
Expected configuration ':swaggerTemplate' to contain exactly one file, however, it contains 2 files.
10:53:16 AM: Tasks execution finished 'clean build --stacktrace'.

Support url for inputFile

Describe the feature

swagger-codegen-cli allows to pass an url for input file specifications and can generate over that. Swagger maven codegen plugin supports the same so as open api plugin.

Why do you want the feature?

This will bring feature parity and is very useful in generating client directly from public definition urls.

gradle generateSwaggerCode task failed

> Executing task: gradle generateSwaggerCode --stacktrace <

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'xx-client'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not resolve gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.12.0.
     Required by:
         project :
      > Could not resolve gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.12.0.
         > Could not get resource 'https://plugins.gradle.org/m2/gradle/plugin/org/hidetake/gradle-swagger-generator-plugin/2.12.0/gradle-swagger-generator-plugin-2.12.0.pom'.
            > Could not GET 'https://plugins.gradle.org/m2/gradle/plugin/org/hidetake/gradle-swagger-generator-plugin/2.12.0/gradle-swagger-generator-plugin-2.12.0.pom'.
               > This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server (plugins.gradle.org)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'xx-client'.
        at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:79)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:73)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:54)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:107)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
        at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
        at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:60)
        at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
        at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all artifacts for configuration ':classpath'.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:1054)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1700(DefaultConfiguration.java:123)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.ensureResolved(DefaultConfiguration.java:1489)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.getArtifacts(DefaultConfiguration.java:1461)
        at org.gradle.composite.internal.CompositeBuildClassPathInitializer.execute(CompositeBuildClassPathInitializer.java:45)
        at org.gradle.composite.internal.CompositeBuildClassPathInitializer.execute(CompositeBuildClassPathInitializer.java:32)
        at org.gradle.api.internal.initialization.DefaultScriptClassPathResolver.resolveClassPath(DefaultScriptClassPathResolver.java:37)
        at org.gradle.api.internal.initialization.DefaultScriptHandler.getScriptClassPath(DefaultScriptHandler.java:74)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.defineScriptHandlerClassScope(DefaultPluginRequestApplicator.java:204)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:82)
        at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:186)
        at org.gradle.configuration.BuildOperationScriptPlugin$1$1.run(BuildOperationScriptPlugin.java:69)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:66)
        at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:63)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:48)
        at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:63)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:41)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
        at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:105)
        ... 85 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.12.0.
Required by:
    project :
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolveModule(RepositoryChainComponentMetaDataResolver.java:103)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolve(RepositoryChainComponentMetaDataResolver.java:63)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ComponentMetaDataResolverChain.resolve(ComponentResolversChain.java:94)
        at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModuleResolver.resolve(ClientModuleResolver.java:62)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.ComponentState.resolve(ComponentState.java:208)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.ComponentState.resolve(ComponentState.java:196)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.ComponentState.getMetadata(ComponentState.java:152)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:156)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.attachToTargetConfigurations(EdgeState.java:112)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:315)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:202)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:155)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:126)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:123)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:167)
        at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:89)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:533)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getSelectedArtifacts(DefaultConfiguration.java:1037)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.access$3100(DefaultConfiguration.java:971)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationArtifactCollection.ensureResolved(DefaultConfiguration.java:1483)
        ... 107 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve gradle.plugin.org.hidetake:gradle-swagger-generator-plugin:2.12.0.
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:141)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.process(ComponentMetaDataResolveState.java:75)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.resolve(ComponentMetaDataResolveState.java:63)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.findBestMatch(RepositoryChainComponentMetaDataResolver.java:138)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.findBestMatch(RepositoryChainComponentMetaDataResolver.java:119)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolveModule(RepositoryChainComponentMetaDataResolver.java:92)
        ... 135 more
Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://plugins.gradle.org/m2/gradle/plugin/org/hidetake/gradle-swagger-generator-plugin/2.12.0/gradle-swagger-generator-plugin-2.12.0.pom'.
        at org.gradle.internal.resource.ResourceExceptions.failure(ResourceExceptions.java:74)
        at org.gradle.internal.resource.ResourceExceptions.getFailed(ResourceExceptions.java:57)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.copyToCache(DefaultCacheAwareExternalResourceAccessor.java:201)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.access$300(DefaultCacheAwareExternalResourceAccessor.java:54)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:89)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:81)
        at org.gradle.cache.internal.ProducerGuard$AdaptiveProducerGuard.guardByKey(ProducerGuard.java:97)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.getResource(DefaultCacheAwareExternalResourceAccessor.java:81)
        at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.downloadByCoords(DefaultExternalResourceArtifactResolver.java:133)
        at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.downloadStaticResource(DefaultExternalResourceArtifactResolver.java:97)
        at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceArtifactResolver.resolveArtifact(DefaultExternalResourceArtifactResolver.java:64)
        at org.gradle.api.internal.artifacts.repositories.metadata.AbstractRepositoryMetadataSource.parseMetaDataFromArtifact(AbstractRepositoryMetadataSource.java:69)
        at org.gradle.api.internal.artifacts.repositories.metadata.AbstractRepositoryMetadataSource.create(AbstractRepositoryMetadataSource.java:59)
        at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver.resolveStaticDependency(ExternalResourceResolver.java:244)
        at org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver.doResolveComponentMetaData(MavenResolver.java:127)
        at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver$RemoteRepositoryAccess.resolveComponentMetaData(ExternalResourceResolver.java:445)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$ResolveAndCacheRepositoryAccess.resolveComponentMetaData(CachingModuleComponentRepository.java:378)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:138)
        ... 140 more
Caused by: org.gradle.internal.resource.transport.http.HttpRequestException: Could not GET 'https://plugins.gradle.org/m2/gradle/plugin/org/hidetake/gradle-swagger-generator-plugin/2.12.0/gradle-swagger-generator-plugin-2.12.0.pom'.
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:96)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performRawGet(HttpClientHelper.java:80)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performGet(HttpClientHelper.java:84)
        at org.gradle.internal.resource.transport.http.HttpResourceAccessor.openResource(HttpResourceAccessor.java:43)
        at org.gradle.internal.resource.transport.http.HttpResourceAccessor.openResource(HttpResourceAccessor.java:29)
        at org.gradle.internal.resource.transfer.DefaultExternalResourceConnector.openResource(DefaultExternalResourceConnector.java:56)
        at org.gradle.internal.resource.transfer.ProgressLoggingExternalResourceAccessor.openResource(ProgressLoggingExternalResourceAccessor.java:37)
        at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.withContentIfPresent(AccessorBackedExternalResource.java:130)
        at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$11.call(BuildOperationFiringExternalResourceDecorator.java:237)
        at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$11.call(BuildOperationFiringExternalResourceDecorator.java:229)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:314)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:304)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:100)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator.withContentIfPresent(BuildOperationFiringExternalResourceDecorator.java:229)
        at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.copyToCache(DefaultCacheAwareExternalResourceAccessor.java:199)
        ... 155 more
Caused by: java.net.UnknownHostException: This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server (plugins.gradle.org)
        at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performHttpRequest(HttpClientHelper.java:148)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performHttpRequest(HttpClientHelper.java:126)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.executeGetOrHead(HttpClientHelper.java:103)
        at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:94)
        ... 171 more


* Get more help at https://help.gradle.org

BUILD FAILED in 1s

What is config.json?

README doesn't say anything about config.json. We should add a basic example.

Incompatible with Gradle 6

Describe the bug

Execution failed for task ':acceptance-test:validatePlugins'.
> Plugin validation failed. See https://docs.gradle.org/6.0.1/userguide/more_about_tasks.html#sec:task_input_output_annotations for more information on how to annotate task properties.
   > Warning: Type 'GenerateReDoc': property 'inputFile' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
   > Warning: Type 'GenerateReDoc': property 'wipeOutputDir' @Input properties with primitive type 'boolean' cannot be @Optional.
   > Warning: Type 'GenerateSwaggerCode': property 'adaptorFactory' is not annotated with an input or output annotation.
   > Warning: Type 'GenerateSwaggerCode': property 'configFile' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
   > Warning: Type 'GenerateSwaggerCode': property 'inputFile' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
   > Warning: Type 'GenerateSwaggerCode': property 'templateDir' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
   > Warning: Type 'GenerateSwaggerCode': property 'wipeOutputDir' @Input properties with primitive type 'boolean' cannot be @Optional.
   > Warning: Type 'GenerateSwaggerCodeHelp': property 'adaptorFactory' is not annotated with an input or output annotation.
   > Warning: Type 'GenerateSwaggerUI': property 'inputFile' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
   > Warning: Type 'GenerateSwaggerUI': property 'wipeOutputDir' @Input properties with primitive type 'boolean' cannot be @Optional.
   > Warning: Type 'ValidateSwagger': property 'inputFile' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.

To Reproduce:
https://circleci.com/gh/int128/gradle-swagger-generator-plugin/317

Expected behavior:
It should work on Gradle 6.

Environment

Plugin version: latest
Swagger Codegen version: latest
Gradle version: 6.0.1
Java version: 8
OS: Linux

TODOs

Build errors

  • Type GenerateReDoc:
    • property inputFile is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
    • property wipeOutputDir @Input properties with primitive type boolean cannot be @Optional.
  • Type GenerateSwaggerCode:
    • property adaptorFactory is not annotated with an input or output annotation.
    • property configFile is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
    • property inputFile is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
    • property templateDir is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
    • property wipeOutputDir @Input properties with primitive type boolean cannot be @Optional.
  • Type GenerateSwaggerCodeHelp:
    • property adaptorFactory is not annotated with an input or output annotation.
  • Type GenerateSwaggerUI:
    • property inputFile is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.
    • property wipeOutputDir @Input properties with primitive type boolean cannot be @Optional.
  • Type ValidateSwagger:
    • property inputFile is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE.

Warnings

Option to choose between V2 and V3

Hi,

it would be nice if one could have an option which code generator version to use.

E.g. if one has a very big project and multiple Yaml definitions it would be nice to define which code gen version to use for which yaml definition.

The main reason for this is that the OpenAPI specification breaks some specs of the old Swagger 2.0.
UUID is not supported anymore, as one example.

If I try to generate these old definitions with V3 then my old already deployed APIs will break.

Thanks in advance,
Jรผrgen

Publish code jar for this project

We've been using your swagger codegen plugin for a couple of weeks now and have been pretty happy with it.
We want to wrap your plugin in a custom plugin of our own in order to bundle multiple tasks together. For this, we need to build and publish the code as a jar file in a central repo.
For now, we've been building the project code locally and have been publishing to a local repo and have been able to make it work.

Would it be possible for you to publish the jar to a central repo like Maven Central or Bintray?

Documentation for customizing redoc

Describe the feature

There are no example for using redoc with custom options like specific version

Why do you want the feature?

I spent a lot of time to read the code to understand how this plugin works

How to generate server stub and skip Controller/Impl generation?

I want to generate my spring server stub from a yaml into build/swagger-code-petstore then I can write my own Controller/Implementation in src/main/java/explame.api

But I'm unable to skip the PetApiController generation. Tried this, but still generating all ApiController's files

  "additionalProperties": {
    "ignore-file-override": ".swagger-codegen-ignore"
  }

.swagger-codegen-ignore

*ApiController.java

Am I missing something? or if there is any workaround?

Error when UI is generated for two sources

Describe the bug

Gives following error when two or more sources are used under swaggerSources while generating UI. It works well for single source.

Caused by:
org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method copy() for arguments [build_f1ze0druuyrt748fg165ca1g2$_run_closure2$_closure18$_closure24$_closure25$_closure26@511a0d5d] on task ':generateSwaggerUISource2' of type org.hidetake.gradle.swagger.generator.GenerateSwaggerUI.

To Reproduce:

Use following code, then generate UI

swaggerSources {
  source1 {
    inputFile = file(<Yaml full path>)
    code {
      language = 'spring'
      configFile = file(<config full path>)
      components = ['models', 'apis']
      dependsOn validation
    }
    ui {
      doLast {
        copy {
          from "index.html"
          into outputDir
        }
      }
    }
  } 
  source2 {
    inputFile = file(<Yaml2 fullpath>)
    code {
      language = 'spring'
      configFile = file(<config2 full path>)
      components = ['apis']
      dependsOn validation
    }
    ui {
      doLast {
        copy {
          from "index.html"
          into outputDir
        }
      }
    }
  }
}

Expected behavior:

Should generate working UI for both sources.

Environment

Plugin version:
2.10.0 (tested with latest 2.18.1 also)
Swagger Codegen version: 2.3.1
Gradle version: 4.5.1
Java version: 1.8
OS: Windows 10

Enum properties not recognized

Describe the bug

Generate java or kotlin code with enum properties in body does not generate enums in code or html.

To Reproduce:
Use a swagger file with a property like:

                            "device_type": {
                                "enum": [
                                    0,
                                    1,
                                    2,
                                    65535
                                ],
                                "type": "integer"
                            },

Expected behavior:
enum class generated (or documented for html language)

Actual behaviour:
no enum classes or enum variables.
Tested by modifying the templates and all the xxxEnum mustache variables are off or empty.
Tested via html , java, kotlin generators.

Note: the swagger-io property displays the enum values , but it is comming from the embedded .js files which includes the original swagger.
Appears to be a problem in the codegen core parser

Environment

Plugin version: 2.16.0
Swagger Codegen version: 2.4.0
Gradle version: 5.1
Java version: 1.8
OS:linux

unable to configure host when building swagger UI

im using swagger ui 2.2.10
generated code tried to do this:

// Overwrite options
$.each(
{
  "url" : "",
  "validatorUrl" : null,
  "host" : "localhost"
},
function (key, value) { window.swaggerUi.setOption(key, value) }
);

but looks like the correct API would be by using window.swaggerUi.api (see swagger-api/swagger-js#532).

specifically in my case the following expression worked:

window.swaggerUi.api.setHost("overriddenHostName")

Request: Support YAML inheritance

An API spec that contains inheritance, using <<, is wrongly reported by validation as invalid. The YAML parser should resolve these before validation is attempted.

HTML Generation Documentation

I'm using version 2.11.0 and am trying to generate static HTML. I see the documentation in your README for how to build the ReDoc or the Swagger UI, but there is nothing about static HTML. I see in the main Swagger Codegen docs that it is possible by passing -l html as command line args, but I don't see a way to do it with this plugin.

Java code generated isn't in outputDir but in outputDir/src/main/java

With the following config:

swaggerSources {
	myProject {
		inputFile = file('swagger-api.json')
		code {
			language = 'spring'
			configFile = file('config.json')
			components = ['models']
			outputDir = file("$buildDir/swagger-code-myProject")
		}
	}
}

Generated files are not going to $buildDir/swagger-code-myProject as expected, but instead to $buildDir/swagger-code-myProject/src/main/java.

As such you cannot specify swaggerSources.livestreaming.code.outputDir as a valid input file for subsequent code handling.

Custom generator no longer seems to work

We are trying to migrate from 2.11.0 to 2.15.1 and found that the custom code generator logic no longer seems to work as expected (using a 2.x based custom generator). Currently in 2.15.1 its returning:

Can't load config class with name net.test.build.HotelsSpringCodegen Available: ada (continues to list supported codeGen config strings.

Plugin wipes directory if outputDir = file('.')

When generating swagger code for a project, if the output directory is the current directory, the plugin (or something) deletes everything (including hidden directories).

plugin version: id "org.hidetake.swagger.generator" version "2.1.2"

generateSwaggerCode {
	language = 'java'
	inputFile = file('swagger-api/v1')
	configFile = file('config.json')
	outputDir = file('.')
}

Add more options

Swagger-codegen has a lot of options.
It would be nice if we could use them

        swagger-codegen-cli generate
                [(-a <authorization> | --auth <authorization>)]
                [--additional-properties <additional properties>...]
                [--api-package <api package>] [--artifact-id <artifact id>]
                [--artifact-version <artifact version>]
                [(-c <configuration file> | --config <configuration file>)]
                [-D <system properties>...] [--git-repo-id <git repo id>]
                [--git-user-id <git user id>] [--group-id <group id>]
                [--http-user-agent <http user agent>]
                (-i <spec file> | --input-spec <spec file>)
                [--ignore-file-override <ignore file override location>]
                [--import-mappings <import mappings>...]
                [--instantiation-types <instantiation types>...]
                [--invoker-package <invoker package>]
                (-l <language> | --lang <language>)
                [--language-specific-primitives <language specific primitives>...]
                [--library <library>] [--model-name-prefix <model name prefix>]
                [--model-name-suffix <model name suffix>]
                [--model-package <model package>]
                [(-o <output directory> | --output <output directory>)]
                [--release-note <release note>] [--remove-operation-id-prefix]
                [--reserved-words-mappings <reserved word mappings>...]
                [(-s | --skip-overwrite)]
                [(-t <template directory> | --template-dir <template directory>)]
                [--type-mappings <type mappings>...] [(-v | --verbose)]

I suggest using an additionnal Map<String, String> otherOptions to place them into the task. Then merge it within the buildOptions()

Boilerplate should be done by the plugin, not by the user

Using the plugin requires the following boilerplate set up:

compileJava.dependsOn swaggerSources.wiremock.code
sourceSets.main.java.srcDir "${swaggerSources.wiremock.code.outputDir}/src/main/java"
sourceSets.main.resources.srcDir "${swaggerSources.wiremock.code.outputDir}/src/main/resources"

idea {
    module {
        sourceDirs += file("${swaggerSources.wiremock.code.outputDir}/src/main/java")
        sourceDirs += file("${swaggerSources.wiremock.code.outputDir}/src/main/resources")
        generatedSourceDirs += file("${swaggerSources.wiremock.code.outputDir}")
    }
}

A good-natured Gradle plugin should do the above in the plugin code. See this discussion in the Gradle forum on a similar issue.

Environment

Plugin version: 2.15.1
Swagger Codegen version: 2.3.1
Gradle version: 4.10.2

Error when generating with 2.4.0-SNAPSHOT

I'm getting this error when generating with the latest 2.4.0-SNAPSHOT

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':generateSwaggerCodeZoneapi'.
> com.fasterxml.jackson.databind.ObjectMapper.addMixIn(Ljava/lang/Class;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/ObjectMapper;

Generation with 2.3.1 works fine, but 2.4.0 (and 3.0.0) produces the same error.

I am using version 2.11.0 of the plugin, gradle version 4.1.

No suchmethod while using the plugin java 8

Below is the config

swaggerSources {
cemProfile {
inputFile = file('src/main/resources/swagger/domain-openapi.yaml')
code {
language = 'spring'
configFile = file('src/main/resources/swagger/domain-openapi.json')
}
}

}

Client dependency
swaggerCodegen 'io.swagger:swagger-codegen-cli:2.3.1'

When ran the command

gradle --stacktrace generateSwaggerCode

:generateSwaggerCodeCemProfile FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':generateSwaggerCodeCemProfile'.

com.google.common.collect.ImmutableList.copyOf([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;

Caused by :
java.lang.NoSuchMethodError: com.google.common.collect.ImmutableList.copyOf([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;

Checked the dependencies in the project and none of the projects refers to guava.

JDK 1.8_152
Gradle 2.1.2

Cannot fully change outputDir

Im using the generateSwaggerCode command. Instead of generating the models in the build directory, I want them generated in src/gen/java/com/cb/models

So i have changed build.gradle:

swaggerSources { petstore { inputFile = file('petstore.yaml') code { language = 'java' components = ['models'] configFile = file('config.json') outputDir = file('src/gen/java/') } } }

And config.json is:

{ "dateLibrary": "java8", "hideGenerationTimestamp": true, "modelPackage": "com.cb.models" }

However, the models end up at src/gen/java/src/main/java/com/cb/Pet.java

I cannot figure out how to get rid of src/main/java in the path. Can this be done?

Options for the components parameter

I have started to use this plugin and I was wondering what are the valid options for the components configuration parameter. Here is the configuration that I am currently using:

swaggerSources {
    encounter_service {
        inputFile = file('./src/swagger/encounter-service.json')
        code {
            language = 'java'
            library = 'vertx'
            configFile = file('./src/swagger/swagger-codegen-config.json')
            components = ['models', 'apis']
            dependsOn validation
        }
    }
}

and config:

{
  "library": "vertx",
  "dateLibrary": "java8",
  "hideGenerationTimestamp": true,
  "modelPackage": "com.intelerad.cloudris.encounterservice.model",
  "apiPackage": "com.intelerad.cloudris.encounterservice.api",
  "invokerPackage": "com.intelerad.cloudris.encounterservice"
}

This configuration generates the code as I expect, the only issue is that it does not include the classes:
ApiClient, Pair, Configuration and ApiException. It's not clear to me what additional components I should include in order to have those classes generated. If I don't include a components configuration those classes are indeed generated, but so is all the project scaffolding (build.gradle, pom.xml, etc...) which I do not require.

Redoc generated page should have a customizable title

Describe the feature

When I generate my documentation site with redoc, I want a custom header.title

Why do you want the feature?

My api users don't know what is Redoc and I don't like this unmutable title starting with 'Redoc'

Thanks a lot for this usefull plugin !

How to use a custom generator?

According to the docs (for the swagger-codegen-cli tool), the -l flag can take a classname on the classpath. So, in my generateSwaggerCode task I have specified something like:

generateSwaggerCode {
    language = 'CustomClientCodeGen'
    inputFile = file("${projectDir}/swagger/example.yml")
    configFile = file("${projectDir}/swagger/example.json")
}

I notice you are passing that directly to the -l option. However, this does not work:

Can't load config class with name CustomClientCodeGen

Any thoughts? I will need to take a closer look at your code later today.

"components" can be filenames

With current configuration I can't specify files to be generated by swagger, like:

 <supportingFiles>ApiClient.java,ApiException.java,Configuration.java,JSON.java,Pair.java,StringUtil.java,TypeRef.java,ApiKeyAuth.java,Authentication.java,HttpBasicAuth.java,OAuth.java,OAuthFlow.java</supportingFiles>

"compenents" is restricted to ['apis', 'models', 'supportingFiles']

How to make ref files changes invalidate cache when running GenerateSwaggerCode?

Question

I'm running GenerateSwaggerCode task on input yaml that contains multiple $refs. With such a setup, gradle doesn't pick up referenced files as input files for the task. Hence, it caches the task output and doesn't rerun the task on content changes in any of the referenced files.

What's the correct approach to both keep using gradle cache and rerun generation on ref changes?

As a workaround, I've added the directory which contains the referenced files as templateDir. So now my codegen task definition looks like that:

devCodegen {
  inputFile = file("${projectDir}/src/main/swagger/schema/api.yml")
    code {
      language = "java"
      outputDir = file("${buildDir}/swagger/codegen/api")
      additionalProperties = [...]
      wipeOutputDir = false
      templateDir = file("${projectDir}/src/main/swagger/schema")
    }
  }

Environment

Plugin version: 2.15.0
Swagger Codegen version: 2.2.3
Gradle version: 5.1.1
Java version: 8
OS: OSX

Shared definitions rawOptions --import-mappings option.

Hello,

Thanks for this plugin! I am looking for a solution share objects across multiple spec. files.
One of the options, is to refer from the spec file with a $ref to an object, which is generated elsewhere.

I use the rawOptions param [2], but get an error [1]. It must be a stupid thing, any idea?
Regards Christophe

[1] Error

Execution failed for task ':player-auth:player-auth-experience-spec:generateSwaggerCodeExperience'.

Found unexpected parameters: [--import-mappings ErrorCode=nl.nederlandseloterij.gateway.shared.model.ErrorCode]

[2] Config for swaggerSource.

swaggerSources {
    experience {
        inputFile = file('src/main/resources/player-auth-experience-api-spec.yml')
        code {
            language = 'spring'
            templateDir = file(templateDirPath)
            configFile = file(codegenFile)
            components = [models: true]
            rawOptions = ['--import-mappings ErrorCode=nl.nederlandseloterij.gateway.shared.model.ErrorCode']
        }
    }
}

[3] snippet from yml file.

 code:
        $ref: "#/definitions/ErrorCode"

Configurable collapse mode for swagger UI

Describe the feature

Introduce new configuration option to choose collapse mode of generated swagger UI documentation.

The template of swagger UI itself allows easily to define default collapsing behavior over "docExpansion" property in SwaggerUIBundle definition.

See:

docExpansion: 'full', // expand by default

Swagger UI documentation defines "docExpansion" with three available modes "none", "list", "full". All three defines default view on page load and all make sense for different use-cases.
See https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md#display

Currently, only fixed value with "full" value is possible to be generated using gradle-swagger-generator-plugin.

Why do you want the feature?

It would be really useful to have this option, because there are some use-cases especially for larger projects (with several tags defined) where default behavior of everything expanded is super-annoying for readers. It all the time leads for reader to manually collapse all UI elements and then start using the documentation.

Anyone who wants to workaround this issue can do same trick as me: generate HTML documentation using gradle plugin and then post-process the output by another script. The script does an easy work, replace "docExpansion" value with the one you need in a file index.html. The workaround is a bit fragile and hacky, but works up to this point.

Why I get a metaspace error during my gradle build?

Describe the bug

I sometimes get a metaspace error during my gradle build.

In my gradle configuration, I am using swagger code-gen to generate a lot of classes (~40). I guess that's probably where the problem comes from.

Here is an extract from the build.gradle file

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("io.swagger:swagger-annotations:1.5.10")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("org.springframework.boot:spring-boot-configuration-processor")

    implementation("org.threeten:threetenbp:1.3.8")
    implementation("com.github.joschi.jackson:jackson-datatype-threetenbp:2.6.4")
    implementation("io.springfox:springfox-swagger2:2.9.2")
    implementation("javax.xml.bind:jaxb-api:2.3.1")

    swaggerCodegen("io.swagger.codegen.v3:swagger-codegen-cli:3.0.0")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

tasks.jar {
    enabled = true
}

swaggerSources {
    doe1 {
        inputFile = file('src/main/resources/wiremock/gfc/yaml/doe-1.yaml')
        code {
            language = 'spring'
            components = ['models']
            additionalProperties = ["modelPackage": "io.swagger.model.doe1", "invokerPackage": "io.swagger.model"]
        }
    }
    doe2 {
        inputFile = file('src/main/resources/wiremock/gfc/yaml/doe-2.yaml')
        code {
            language = 'spring'
            components = ['models']
            additionalProperties = ["modelPackage": "io.swagger.model.doe2", "invokerPackage": "io.swagger.model"]
        }
    }
    ...

    doe40 {
        inputFile = file('src/main/resources/wiremock/gfc/yaml/doe-40.yaml')
        code {
            language = 'spring'
            components = ['models']
            additionalProperties = ["modelPackage": "io.swagger.model.doe3", "invokerPackage": "io.swagger.model"]
        }
    }
}


compileJava.dependsOn swaggerSources.doe1.code, swaggerSources.doe2.code, ....., swaggerSources.doe40.code
sourceSets.main.java.srcDirs "${swaggerSources.doe1.code.outputDir}/src/main/java", "${swaggerSources.doe2.code.outputDir}/src/main/java", ..., "${swaggerSources.doe40.code.outputDir}/src/main/java"
sourceSets.main.resources.srcDirs "${swaggerSources.doe1.code.outputDir}/src/main/resources", "${swaggerSources.doe2.code.outputDir}/src/main/resources", ..., "${swaggerSources.doe40.code.outputDir}/src/main/resources"

Environment

Swagger Codegen version: 2.3.1
Gradle version: 5.1
Java version: 1.11
OS: win

validateSwagger exception

Describe the bug

The validateSwagger Gradle task fails due to exception:

org.yaml.snakeyaml.events.MappingStartEvent.<init>(Ljava/lang/String;Ljava/lang/String;ZLorg/yaml/snakeyaml/error/Mark;Lorg/yaml/snakeyaml/error/Mark;Ljava/lang/Boolean;)V

To Reproduce:

  1. Create new directory

  2. Run gradle init

  3. Download https://github.com/int128/gradle-swagger-generator-plugin/blob/master/acceptance-test/examples/openapi-v2-petstore.yaml into directory

  4. Update build.gradle

plugins {
  id 'org.hidetake.swagger.generator' version '2.18.1'
}

validateSwagger {
    inputFile = file('openapi-v2-petstore.yaml')
}
  1. run gradlew validateSwagger

Expected behavior:

Validates swagger spec

Environment

Plugin version: 2.18.1
Gradle version: 5.4.1
Java version:
openjdk version "1.8.0_172"
OpenJDK Runtime Environment (Zulu 8.30.0.1-win64) (build 1.8.0_172-b01)
OpenJDK 64-Bit Server VM (Zulu 8.30.0.1-win64) (build 25.172-b01, mixed mode)

OS: Windows 10

How to make it less verbose during the build?

Hi,

Nice plugin. Congrats!

Is is possible to make it less verbose? I see a bunch of the following logs during the gradle build:

[Daemon worker Thread 5] INFO io.swagger.codegen.AbstractGenerator - writing file ...
[Daemon worker Thread 5] WARN io.swagger.codegen.DefaultCodegen - Empty operationId found for path: ...

I tried to pass the verbose=false property in different places (plugin config, additionalProperties param and in the configFile) but none of them removes the logs above.

Is it possible to disable these logs?

Thank you.

Empty generated schema

I am using org.hidetake.swagger.generator v. 2.15.0 and swagger-codegen-cli v. 3.0.0 (as swaggerCodegen in my gradle dependencies). (gradle v. 4.10.2, java 1.8.0 and linux 4.15) I also have:

swaggerSources {
  siaServer {
    inputFile = file('docs/openapi.yaml')
    code { language = 'html2' }
  }
}

But when I execute ./gradlew generateSwaggerCode the generated html2 output has empty schemas (apis are shown fine). Using the very same yaml file and the online swagger editor, the generated html2 shows my defined schemas. What am I missing?

unable to access swaggerUi documentation from the endpoint

Describe the bug

To Reproduce: I have the plugin setup like this

def swaggerSourceFile = "$projectDir/api/api.yaml"
def openAPIFolder = "$buildDir/generated"

swaggerSources {
  api {
    inputFile = file("$swaggerSourceFile")
    
    code {
      language = 'spring'
      configFile = file("$projectDir/api/config.json")
      outputDir = file("$openAPIFolder")
    }
    
  }
}




compileJava.dependsOn swaggerSources.api.code
compileJava.dependsOn generateSwaggerUI
sourceSets.main.java.srcDir "${swaggerSources.api.code.outputDir}/api"
sourceSets.main.resources.srcDir "${swaggerSources.api.code.outputDir}/api"


but I'm unable to view the documentation from the endpoint. I have tested

localhost:8080/swagger-ui-api/index.html
localhost:8080/index.html

Expected behavior:

I would like to see the documentation served to the frontend

Environment

Plugin version: 2.18.1
Swagger Codegen version: v3 / cli 3.0.5
Gradle version: 5.4
Java version: 11
OS: MacOs

Get java.lang.NoSuchMethodError: org.joda.time.DateTime.now()Lorg/joda/time/DateTime when trying to generate code with gradle-swagger-generator-plugin

Hi,

I have a swagger OpenAPI YAML file and I want to generate Java using the plugin.

This is my config.json

{
  "useRxJava2": true,
  "java8": false,
  "library": "retrofit2",
  "dateLibrary": "joda",
  "hideGenerationTimestamp": true,
  "modelPackage": "backend.model",
  "apiPackage": "backend.api",
  "invokerPackage": "backend"
}

and this is my build.gradle

plugins {
    id 'java'
    id 'org.hidetake.swagger.generator' version '2.8.0'
}

repositories {
    jcenter()
}

dependencies {
    // Add dependency for Swagger Codegen CLI
    swaggerCodegen 'io.swagger:swagger-codegen-cli:2.2.3'
    compile 'io.swagger:swagger-annotations:1.5.10'
    compile "joda-time:joda-time:$jodaTimeVersion"
}

swaggerSources {
    backend {
        inputFile = file('api.yaml')
        code {
            language = 'java'
            configFile = file('config.json')
            components = ['models', 'apis']
        }
    }
}

compileJava.dependsOn swaggerSources.keycore.code
sourceSets.main.java.srcDir swaggerSources.keycore.code.outputDir

When I try to generate the code via gradle:

./gradlew clean generateSwaggerCodeBackend

I receive the following exception during build:

:swagger-java-client:resolveSwaggerTemplate UP-TO-DATE
:swagger-java-client:generateSwaggerCodeBackend FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':backend-swagger-java-client:generateSwaggerCodeBackend'.
> org.joda.time.DateTime.now()Lorg/joda/time/DateTime;

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':keycore-swagger-java-client:generateSwaggerCodeKeycore'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
        at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196)
        at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
        at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: java.lang.NoSuchMethodError: org.joda.time.DateTime.now()Lorg/joda/time/DateTime;
        at io.swagger.codegen.DefaultGenerator.configureGeneratorProperties(DefaultGenerator.java:136)
        at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:687)
        at io.swagger.codegen.cmd.Generate.run(Generate.java:285)
        at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:35)
        at org.hidetake.gradle.swagger.generator.SwaggerCodegenExecutor.execute(SwaggerCodegenExecutor.groovy:76)
        at org.hidetake.gradle.swagger.generator.SwaggerCodegenExecutor$execute$0.call(Unknown Source)
        at org.hidetake.gradle.swagger.generator.GenerateSwaggerCode.exec(GenerateSwaggerCode.groovy:53)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:632)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:615)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
        ... 70 more


BUILD FAILED

Basically it is pointing me to an

Caused by: java.lang.NoSuchMethodError: org.joda.time.DateTime.now()Lorg/joda/time/DateTime;

But I have no idea, how to fix this. I tried several options of adding joda-time to the dependencies section, but non of them worked:

compile "joda-time:joda-time:$jodaTimeVersion"
swaggerCodegen "joda-time:joda-time:$jodaTimeVersion"

I also asked this question on SO for your reference:
https://stackoverflow.com/questions/46907653/get-java-lang-nosuchmethoderror-org-joda-time-datetime-nowlorg-joda-time-date

Thank you for your help!

support apiKey security scheme

I have classes annotated with @SecuritySecheme but I don't seem to be able to get a client generated that supports authentication. Am I missing something or is this not supported?

@Securityscheme(type= SecuritySchemeType.APIKEY, in = SecuritySchemeIn.COOKIE, name = "JSESSIONID")

Open API 3.0

Does the plugin support pOpen API 3.0?

I tried using the petstore example and the validation fails.

Unicode support

Is it possible to generate swagger-spec.js in UTF-8 encoding ? It seems to be encoded in CP1252. My source OpenAPI YAML is UTF-8 encoded and contains special unicode characters that are displayed incorrectly in Swagger UI.

gradle-swagger-generator-plugin bug at relative path

I'm using gradle-swagger-generator-plugin for generate client code.

This is my api.yml file .

items/{itemId}:
                get:
                    operationId: getItems
                    responses:
                        '200':
                            description: OK
                            content:
                                application/json:
                                    schema:
                                        $ref: 'definitions/items.yml#/schemas/ItemDTO'

and ItemDTO like following .

    ItemDTO:
            title: ItemDTO
            type: object
            properties:
                name:
                    type: string
                description:
                    type: string
                size:
                    $ref: 'base.yml#/enum/Size'
                options:
                    type: array
                    items:
                        $ref: '#/components/OptionDTO'

ItemsApi, ItemDTO were made well.
But problem was occured in ItemDTO.
ItemDTO that generated by this plugin has this reference

    class ItemDTO{
        BaseYmlComponentsSize size;
        List<ComponentsOptionDTO> options;
    }

What is that.......
Size, OptionDTO wasn't referenced using their own name.
Even they weren't generated as well.
What I did it wrong?

Is there a way to shorten multiple similar blocks of configuration?

Hello,

thank you for your work put into the plugin development.

I would like to ask if there is a way (enabled by this plugin explicitly or maybe by using some Groovy magic) to shorten multiple similar blocks of configuration into one.

Let's say that i have swaggerSources configured like below:

swaggerSources {
    source1 {
        inputFile = file('file1')
        code {
            language = 'spring'
            additionalProperties = [
                    'modelPackage': 'model1'
            ]
        }
    }

    source2 {
        inputFile = file('file2')
        code {
            language = 'spring'
            additionalProperties = [
                    'modelPackage': 'model2'
            ]
        }
    }

    // x - 2 source configurations...
}

As you can see, there are multiple almost identical sources which are varying only in inputFile and modelPackage. Do you think there is a way to shorten it from declaring x almost identical sources into one parametrized?

Generate Code not in build or target Directory

Hi, I would like to generate the source codes in a separate directory rather than build or target directory. Is it possible in this plugin? So far, I was not able to generate it at all in a different directory other than the target.

generateSwaggerUIXXX does not support $ref tag to reference the local files

I am using the following index.yml file:

swagger: '2.0'
info:
  version: 0.0.0
  title: Simple API
paths:
  /foo:
    $ref: 'foo.yml'
  /bar:
    get:
      responses:
        200:
          description: OK
          schema:
            $ref: '#/definitions/User'
definitions:
  User:
    type: object
    properties:
      name:
        type: string

In build.gradle I have:

swaggerSources {
  test1 {
    inputFile = file('docs/api/index.yml')
    ui {
      options.docExpansion = 'full'
    }
  }
}

I placed foo.yml along with the index.yml file. Now when I run the generateSwaggerUITest1 task, only bar API shows up in the UI. On the console I see the following error:

Failed to load file:///<local path>/test1/build/swagger-ui-test1/foo.yml: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
Request.end @ index.js:164
SuperagentHttpClient.execute @ operation.js:930
SwaggerHttp.execute @ operation.js:754
(anonymous) @ index.js:100
setTimeout (async)
waitForUnlock @ index.js:89
(anonymous) @ index.js:104
Resolver.resolve @ index.js:117
(anonymous) @ operation.js:120
setTimeout (async)
SwaggerClient.build @ operation.js:119
SwaggerClient.initialize @ operation.js:41
module.exports @ model.js:13
load @ index.js:164
(anonymous) @ index.html:125
k @ jquery-1.8.0.min.js:2
fireWith @ jquery-1.8.0.min.js:2
ready @ jquery-1.8.0.min.js:2
D @ jquery-1.8.0.min.js:2
index.js:47 failed url: foo.yml

Am I missing something here or is it really a bug?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.