forked from loafle/openapi-generator-original
Merge remote-tracking branch 'origin/6.0.x'
This commit is contained in:
commit
0e1164ff6b
12
.github/.test/samples.json
vendored
12
.github/.test/samples.json
vendored
@ -145,12 +145,6 @@
|
|||||||
"Documentation: Cwiki"
|
"Documentation: Cwiki"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"input": "dart-jaguar-petstore.sh",
|
|
||||||
"matches": [
|
|
||||||
"Client: Dart"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "dart-dio-petstore.sh",
|
"input": "dart-dio-petstore.sh",
|
||||||
"matches": [
|
"matches": [
|
||||||
@ -223,12 +217,6 @@
|
|||||||
"Server: Scala"
|
"Server: Scala"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"input": "flash-petstore.sh",
|
|
||||||
"matches": [
|
|
||||||
"Client: Flash/ActionScript"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "go-gin-petstore-server.sh",
|
"input": "go-gin-petstore-server.sh",
|
||||||
"matches": [
|
"matches": [
|
||||||
|
3
.github/auto-labeler.yml
vendored
3
.github/auto-labeler.yml
vendored
@ -62,9 +62,6 @@ labels:
|
|||||||
- '\s*?-[gl] erlang(-.*)?-client\s*?'
|
- '\s*?-[gl] erlang(-.*)?-client\s*?'
|
||||||
- '\s*?\[erlang-proper\]\s*?'
|
- '\s*?\[erlang-proper\]\s*?'
|
||||||
- '\s*?-[gl] erlang-proper\s*?'
|
- '\s*?-[gl] erlang-proper\s*?'
|
||||||
'Client: Flash/ActionScript':
|
|
||||||
- '\s*?\[flash\]\s*?'
|
|
||||||
- '\s*?-[gl] flash(?!-)\b'
|
|
||||||
'Client: Go':
|
'Client: Go':
|
||||||
- '\s*?\[go\]\s*?'
|
- '\s*?\[go\]\s*?'
|
||||||
- '\s*?-[gl] go(?!-)\b'
|
- '\s*?-[gl] go(?!-)\b'
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -245,9 +245,6 @@ samples/server/petstore/erlang-server/rebar.lock
|
|||||||
**/dart*/**/pubspec.lock
|
**/dart*/**/pubspec.lock
|
||||||
# Dart dio
|
# Dart dio
|
||||||
**/dart*/**/*.g.dart
|
**/dart*/**/*.g.dart
|
||||||
# Dart jaguar
|
|
||||||
**/dart*/**/*.jser.dart
|
|
||||||
**/dart*/**/*.jretro.dart
|
|
||||||
|
|
||||||
# JS
|
# JS
|
||||||
samples/client/petstore/javascript-es6/package-lock.json
|
samples/client/petstore/javascript-es6/package-lock.json
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
generatorName: flash
|
|
||||||
outputDir: samples/client/petstore/flash
|
|
||||||
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
|
|
||||||
templateDir: modules/openapi-generator/src/main/resources/flash
|
|
||||||
additionalProperties:
|
|
||||||
invokerPackage: org.openapitools
|
|
||||||
packageName: org.openapitools
|
|
@ -24,13 +24,11 @@ The following generators are available:
|
|||||||
* [dart](generators/dart.md)
|
* [dart](generators/dart.md)
|
||||||
* [dart-dio](generators/dart-dio.md)
|
* [dart-dio](generators/dart-dio.md)
|
||||||
* [dart-dio-next (experimental)](generators/dart-dio-next.md)
|
* [dart-dio-next (experimental)](generators/dart-dio-next.md)
|
||||||
* [dart-jaguar (deprecated)](generators/dart-jaguar.md)
|
|
||||||
* [eiffel](generators/eiffel.md)
|
* [eiffel](generators/eiffel.md)
|
||||||
* [elixir](generators/elixir.md)
|
* [elixir](generators/elixir.md)
|
||||||
* [elm](generators/elm.md)
|
* [elm](generators/elm.md)
|
||||||
* [erlang-client](generators/erlang-client.md)
|
* [erlang-client](generators/erlang-client.md)
|
||||||
* [erlang-proper](generators/erlang-proper.md)
|
* [erlang-proper](generators/erlang-proper.md)
|
||||||
* [flash-deprecated (deprecated)](generators/flash-deprecated.md)
|
|
||||||
* [go](generators/go.md)
|
* [go](generators/go.md)
|
||||||
* [go-deprecated (deprecated)](generators/go-deprecated.md)
|
* [go-deprecated (deprecated)](generators/go-deprecated.md)
|
||||||
* [groovy](generators/groovy.md)
|
* [groovy](generators/groovy.md)
|
||||||
@ -67,7 +65,6 @@ The following generators are available:
|
|||||||
* [swift5](generators/swift5.md)
|
* [swift5](generators/swift5.md)
|
||||||
* [typescript (experimental)](generators/typescript.md)
|
* [typescript (experimental)](generators/typescript.md)
|
||||||
* [typescript-angular](generators/typescript-angular.md)
|
* [typescript-angular](generators/typescript-angular.md)
|
||||||
* [typescript-angularjs-deprecated (deprecated)](generators/typescript-angularjs-deprecated.md)
|
|
||||||
* [typescript-aurelia](generators/typescript-aurelia.md)
|
* [typescript-aurelia](generators/typescript-aurelia.md)
|
||||||
* [typescript-axios](generators/typescript-axios.md)
|
* [typescript-axios](generators/typescript-axios.md)
|
||||||
* [typescript-fetch](generators/typescript-fetch.md)
|
* [typescript-fetch](generators/typescript-fetch.md)
|
||||||
@ -113,14 +110,12 @@ The following generators are available:
|
|||||||
* [jaxrs-resteasy-eap](generators/jaxrs-resteasy-eap.md)
|
* [jaxrs-resteasy-eap](generators/jaxrs-resteasy-eap.md)
|
||||||
* [jaxrs-spec](generators/jaxrs-spec.md)
|
* [jaxrs-spec](generators/jaxrs-spec.md)
|
||||||
* [kotlin-server](generators/kotlin-server.md)
|
* [kotlin-server](generators/kotlin-server.md)
|
||||||
* [kotlin-server-deprecated (deprecated)](generators/kotlin-server-deprecated.md)
|
|
||||||
* [kotlin-spring](generators/kotlin-spring.md)
|
* [kotlin-spring](generators/kotlin-spring.md)
|
||||||
* [kotlin-vertx (beta)](generators/kotlin-vertx.md)
|
* [kotlin-vertx (beta)](generators/kotlin-vertx.md)
|
||||||
* [nodejs-express-server (beta)](generators/nodejs-express-server.md)
|
* [nodejs-express-server (beta)](generators/nodejs-express-server.md)
|
||||||
* [php-laravel](generators/php-laravel.md)
|
* [php-laravel](generators/php-laravel.md)
|
||||||
* [php-lumen](generators/php-lumen.md)
|
* [php-lumen](generators/php-lumen.md)
|
||||||
* [php-mezzio-ph](generators/php-mezzio-ph.md)
|
* [php-mezzio-ph](generators/php-mezzio-ph.md)
|
||||||
* [php-silex-deprecated (deprecated)](generators/php-silex-deprecated.md)
|
|
||||||
* [php-slim-deprecated (deprecated)](generators/php-slim-deprecated.md)
|
* [php-slim-deprecated (deprecated)](generators/php-slim-deprecated.md)
|
||||||
* [php-slim4](generators/php-slim4.md)
|
* [php-slim4](generators/php-slim4.md)
|
||||||
* [php-symfony](generators/php-symfony.md)
|
* [php-symfony](generators/php-symfony.md)
|
||||||
|
@ -15,13 +15,11 @@ The following generators are available:
|
|||||||
* [csharp-netcore](csharp-netcore.md)
|
* [csharp-netcore](csharp-netcore.md)
|
||||||
* [dart](dart.md)
|
* [dart](dart.md)
|
||||||
* [dart-dio](dart-dio.md)
|
* [dart-dio](dart-dio.md)
|
||||||
* [dart-jaguar](dart-jaguar.md)
|
|
||||||
* [eiffel](eiffel.md)
|
* [eiffel](eiffel.md)
|
||||||
* [elixir](elixir.md)
|
* [elixir](elixir.md)
|
||||||
* [elm](elm.md)
|
* [elm](elm.md)
|
||||||
* [erlang-client](erlang-client.md)
|
* [erlang-client](erlang-client.md)
|
||||||
* [erlang-proper](erlang-proper.md)
|
* [erlang-proper](erlang-proper.md)
|
||||||
* [flash](flash.md)
|
|
||||||
* [go](go.md)
|
* [go](go.md)
|
||||||
* [go-experimental (experimental)](go-experimental.md)
|
* [go-experimental (experimental)](go-experimental.md)
|
||||||
* [groovy](groovy.md)
|
* [groovy](groovy.md)
|
||||||
@ -92,7 +90,6 @@ The following generators are available:
|
|||||||
* [jaxrs-resteasy-eap](jaxrs-resteasy-eap.md)
|
* [jaxrs-resteasy-eap](jaxrs-resteasy-eap.md)
|
||||||
* [jaxrs-spec](jaxrs-spec.md)
|
* [jaxrs-spec](jaxrs-spec.md)
|
||||||
* [kotlin-server](kotlin-server.md)
|
* [kotlin-server](kotlin-server.md)
|
||||||
* [kotlin-server-deprecated](kotlin-server-deprecated.md)
|
|
||||||
* [kotlin-spring](kotlin-spring.md)
|
* [kotlin-spring](kotlin-spring.md)
|
||||||
* [kotlin-vertx (beta)](kotlin-vertx.md)
|
* [kotlin-vertx (beta)](kotlin-vertx.md)
|
||||||
* [nodejs-express-server (beta)](nodejs-express-server.md)
|
* [nodejs-express-server (beta)](nodejs-express-server.md)
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# RELEASE_VERSION
|
# RELEASE_VERSION
|
||||||
openApiGeneratorVersion=5.4.0
|
openApiGeneratorVersion=6.0.0-SNAPSHOT
|
||||||
# /RELEASE_VERSION
|
# /RELEASE_VERSION
|
||||||
|
|
||||||
# BEGIN placeholders
|
# BEGIN placeholders
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<groupId>org.openapitools</groupId>
|
<groupId>org.openapitools</groupId>
|
||||||
<artifactId>openapi-generator-project</artifactId>
|
<artifactId>openapi-generator-project</artifactId>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<relativePath>../..</relativePath>
|
<relativePath>../..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
@ -64,7 +64,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
|
|||||||
public String defaultValue;
|
public String defaultValue;
|
||||||
public String arrayModelType;
|
public String arrayModelType;
|
||||||
public boolean isAlias; // Is this effectively an alias of another simple type
|
public boolean isAlias; // Is this effectively an alias of another simple type
|
||||||
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isDecimal, isShort, isUnboundedInteger, isBoolean;
|
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isDecimal, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;
|
||||||
private boolean additionalPropertiesIsAnyType;
|
private boolean additionalPropertiesIsAnyType;
|
||||||
public List<CodegenProperty> vars = new ArrayList<>(); // all properties (without parent's properties)
|
public List<CodegenProperty> vars = new ArrayList<>(); // all properties (without parent's properties)
|
||||||
public List<CodegenProperty> allVars = new ArrayList<>(); // all properties (with parent's properties)
|
public List<CodegenProperty> allVars = new ArrayList<>(); // all properties (with parent's properties)
|
||||||
@ -637,6 +637,14 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
|
|||||||
this.isUnboundedInteger = isUnboundedInteger;
|
this.isUnboundedInteger = isUnboundedInteger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsPrimitiveType() { return isPrimitiveType; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIsPrimitiveType(boolean isPrimitiveType) {
|
||||||
|
this.isPrimitiveType = isPrimitiveType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CodegenProperty getAdditionalProperties() { return additionalProperties; }
|
public CodegenProperty getAdditionalProperties() { return additionalProperties; }
|
||||||
|
|
||||||
|
@ -623,6 +623,14 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
|
|||||||
this.isUnboundedInteger = isUnboundedInteger;
|
this.isUnboundedInteger = isUnboundedInteger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsPrimitiveType() { return isPrimitiveType; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIsPrimitiveType(boolean isPrimitiveType) {
|
||||||
|
this.isPrimitiveType = isPrimitiveType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CodegenProperty getAdditionalProperties() { return additionalProperties; }
|
public CodegenProperty getAdditionalProperties() { return additionalProperties; }
|
||||||
|
|
||||||
|
@ -536,6 +536,14 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
|
|||||||
this.isUnboundedInteger = isUnboundedInteger;
|
this.isUnboundedInteger = isUnboundedInteger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsPrimitiveType() { return isPrimitiveType; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIsPrimitiveType(boolean isPrimitiveType) {
|
||||||
|
this.isPrimitiveType = isPrimitiveType;
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, Object> getVendorExtensions() {
|
public Map<String, Object> getVendorExtensions() {
|
||||||
return vendorExtensions;
|
return vendorExtensions;
|
||||||
}
|
}
|
||||||
|
@ -371,6 +371,14 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
|
|||||||
this.isUnboundedInteger = isUnboundedInteger;
|
this.isUnboundedInteger = isUnboundedInteger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsPrimitiveType() { return primitiveType; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIsPrimitiveType(boolean isPrimitiveType) {
|
||||||
|
this.primitiveType = isPrimitiveType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setIsModel(boolean isModel) {
|
public void setIsModel(boolean isModel) {
|
||||||
this.isModel = isModel;
|
this.isModel = isModel;
|
||||||
|
@ -99,6 +99,10 @@ public interface IJsonSchemaValidationProperties {
|
|||||||
|
|
||||||
void setIsUnboundedInteger(boolean isUnboundedInteger);
|
void setIsUnboundedInteger(boolean isUnboundedInteger);
|
||||||
|
|
||||||
|
boolean getIsPrimitiveType();
|
||||||
|
|
||||||
|
void setIsPrimitiveType(boolean isPrimitiveType);
|
||||||
|
|
||||||
CodegenProperty getAdditionalProperties();
|
CodegenProperty getAdditionalProperties();
|
||||||
|
|
||||||
void setAdditionalProperties(CodegenProperty additionalProperties);
|
void setAdditionalProperties(CodegenProperty additionalProperties);
|
||||||
|
@ -281,6 +281,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
|||||||
// {{sourceFolder}}
|
// {{sourceFolder}}
|
||||||
if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) {
|
if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) {
|
||||||
setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER));
|
setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER));
|
||||||
|
|
||||||
|
// TODO: Move to its own option when a parameter for 'testFolder' is added.
|
||||||
|
setTestFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER));
|
||||||
} else {
|
} else {
|
||||||
additionalProperties.put(CodegenConstants.SOURCE_FOLDER, this.sourceFolder);
|
additionalProperties.put(CodegenConstants.SOURCE_FOLDER, this.sourceFolder);
|
||||||
}
|
}
|
||||||
@ -1152,6 +1155,10 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
|||||||
this.sourceFolder = sourceFolder;
|
this.sourceFolder = sourceFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTestFolder(String testFolder) {
|
||||||
|
this.testFolder = testFolder;
|
||||||
|
}
|
||||||
|
|
||||||
public String getInterfacePrefix() {
|
public String getInterfacePrefix() {
|
||||||
return interfacePrefix;
|
return interfacePrefix;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package org.openapitools.codegen.languages;
|
package org.openapitools.codegen.languages;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import io.swagger.v3.oas.models.Operation;
|
import io.swagger.v3.oas.models.Operation;
|
||||||
import io.swagger.v3.oas.models.media.ArraySchema;
|
import io.swagger.v3.oas.models.media.ArraySchema;
|
||||||
import io.swagger.v3.oas.models.media.Schema;
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
@ -112,12 +114,13 @@ public abstract class AbstractDartCodegen extends DefaultCodegen {
|
|||||||
setReservedWordsLowerCase(reservedWordsList);
|
setReservedWordsLowerCase(reservedWordsList);
|
||||||
|
|
||||||
// These types return isPrimitive=true in templates
|
// These types return isPrimitive=true in templates
|
||||||
languageSpecificPrimitives = new HashSet<>(5);
|
languageSpecificPrimitives = Sets.newHashSet(
|
||||||
languageSpecificPrimitives.add("String");
|
"String",
|
||||||
languageSpecificPrimitives.add("bool");
|
"bool",
|
||||||
languageSpecificPrimitives.add("int");
|
"int",
|
||||||
languageSpecificPrimitives.add("num");
|
"num",
|
||||||
languageSpecificPrimitives.add("double");
|
"double"
|
||||||
|
);
|
||||||
|
|
||||||
typeMapping = new HashMap<>();
|
typeMapping = new HashMap<>();
|
||||||
typeMapping.put("Array", "List");
|
typeMapping.put("Array", "List");
|
||||||
@ -148,17 +151,18 @@ public abstract class AbstractDartCodegen extends DefaultCodegen {
|
|||||||
typeMapping.put("AnyType", "Object");
|
typeMapping.put("AnyType", "Object");
|
||||||
|
|
||||||
// Data types of the above values which are automatically imported
|
// Data types of the above values which are automatically imported
|
||||||
defaultIncludes = new HashSet<>();
|
defaultIncludes = Sets.newHashSet(
|
||||||
defaultIncludes.add("String");
|
"String",
|
||||||
defaultIncludes.add("bool");
|
"bool",
|
||||||
defaultIncludes.add("int");
|
"int",
|
||||||
defaultIncludes.add("num");
|
"num",
|
||||||
defaultIncludes.add("double");
|
"double",
|
||||||
defaultIncludes.add("List");
|
"List",
|
||||||
defaultIncludes.add("Set");
|
"Set",
|
||||||
defaultIncludes.add("Map");
|
"Map",
|
||||||
defaultIncludes.add("DateTime");
|
"DateTime",
|
||||||
defaultIncludes.add("Object");
|
"Object"
|
||||||
|
);
|
||||||
|
|
||||||
imports.put("String", "dart:core");
|
imports.put("String", "dart:core");
|
||||||
imports.put("bool", "dart:core");
|
imports.put("bool", "dart:core");
|
||||||
|
@ -36,6 +36,7 @@ public class DartClientCodegen extends AbstractDartCodegen {
|
|||||||
|
|
||||||
public DartClientCodegen() {
|
public DartClientCodegen() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
final CliOption serializationLibrary = CliOption.newString(CodegenConstants.SERIALIZATION_LIBRARY,
|
final CliOption serializationLibrary = CliOption.newString(CodegenConstants.SERIALIZATION_LIBRARY,
|
||||||
"Specify serialization library");
|
"Specify serialization library");
|
||||||
serializationLibrary.setDefault(SERIALIZATION_LIBRARY_NATIVE);
|
serializationLibrary.setDefault(SERIALIZATION_LIBRARY_NATIVE);
|
||||||
|
@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
|
||||||
* Copyright 2018 SmartBear Software
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.openapitools.codegen.languages;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.models.media.Schema;
|
|
||||||
import org.openapitools.codegen.CodegenParameter;
|
|
||||||
import org.openapitools.codegen.SupportingFile;
|
|
||||||
import org.openapitools.codegen.meta.GeneratorMetadata;
|
|
||||||
import org.openapitools.codegen.meta.Stability;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class TypeScriptAngularJsClientCodegen extends AbstractTypeScriptClientCodegen {
|
|
||||||
|
|
||||||
public TypeScriptAngularJsClientCodegen() {
|
|
||||||
super();
|
|
||||||
outputFolder = "generated-code/typescript-angularjs";
|
|
||||||
modelTemplateFiles.put("model.mustache", ".ts");
|
|
||||||
apiTemplateFiles.put("api.mustache", ".ts");
|
|
||||||
embeddedTemplateDir = templateDir = "typescript-angularjs";
|
|
||||||
apiPackage = "api";
|
|
||||||
modelPackage = "model";
|
|
||||||
|
|
||||||
removeOption(NPM_NAME);
|
|
||||||
removeOption(NPM_VERSION);
|
|
||||||
removeOption(SNAPSHOT);
|
|
||||||
|
|
||||||
generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
|
|
||||||
.stability(Stability.DEPRECATED)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "typescript-angularjs-deprecated";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHelp() {
|
|
||||||
return "Generates a TypeScript AngularJS client library. This generator has been deprecated and will be removed in the future release.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void processOpts() {
|
|
||||||
super.processOpts();
|
|
||||||
|
|
||||||
supportingFiles.add(new SupportingFile("models.mustache", modelPackage().replace('.', File.separatorChar), "models.ts"));
|
|
||||||
supportingFiles.add(new SupportingFile("apis.mustache", apiPackage().replace('.', File.separatorChar), "api.ts"));
|
|
||||||
supportingFiles.add(new SupportingFile("index.mustache", getIndexDirectory(), "index.ts"));
|
|
||||||
supportingFiles.add(new SupportingFile("api.module.mustache", getIndexDirectory(), "api.module.ts"));
|
|
||||||
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
|
|
||||||
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSchemaType(Schema p) {
|
|
||||||
String openAPIType = super.getSchemaType(p);
|
|
||||||
if (isLanguagePrimitive(openAPIType) || isLanguageGenericType(openAPIType)) {
|
|
||||||
return openAPIType;
|
|
||||||
}
|
|
||||||
return addModelPrefix(openAPIType);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeDeclaration(String name) {
|
|
||||||
return addModelPrefix(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postProcessParameter(CodegenParameter parameter) {
|
|
||||||
super.postProcessParameter(parameter);
|
|
||||||
// parameter.dataType = addModelPrefix(parameter.dataType);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getIndexDirectory() {
|
|
||||||
String indexPackage = modelPackage.substring(0, Math.max(0, modelPackage.lastIndexOf('.')));
|
|
||||||
return indexPackage.replace('.', File.separatorChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String addModelPrefix(String openAPIType) {
|
|
||||||
String type = null;
|
|
||||||
if (typeMapping.containsKey(openAPIType)) {
|
|
||||||
type = typeMapping.get(openAPIType);
|
|
||||||
} else {
|
|
||||||
type = openAPIType;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isLanguagePrimitive(type) && !isLanguageGenericType(type)) {
|
|
||||||
type = "models." + openAPIType;
|
|
||||||
}
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isLanguagePrimitive(String type) {
|
|
||||||
return languageSpecificPrimitives.contains(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isLanguageGenericType(String type) {
|
|
||||||
for (String genericType : languageGenericTypes) {
|
|
||||||
if (type.startsWith(genericType + "<")) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -39,7 +39,7 @@ public class ServerConfiguration {
|
|||||||
if (variables != null && variables.containsKey(name)) {
|
if (variables != null && variables.containsKey(name)) {
|
||||||
value = variables.get(name);
|
value = variables.get(name);
|
||||||
if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) {
|
if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) {
|
||||||
throw new RuntimeException("The variable " + name + " in the server URL has invalid value " + value + ".");
|
throw new IllegalArgumentException("The variable " + name + " in the server URL has invalid value " + value + ".");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url = url.replaceAll("\\{" + name + "\\}", value);
|
url = url.replaceAll("\\{" + name + "\\}", value);
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
|
|
||||||
package {{invokerPackage}}.auth;
|
package {{invokerPackage}}.auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OAuth flows that are supported by this client
|
||||||
|
*/
|
||||||
{{>generatedAnnotation}}
|
{{>generatedAnnotation}}
|
||||||
public enum OAuthFlow {
|
public enum OAuthFlow {
|
||||||
accessCode, //called authorizationCode in OpenAPI 3.0
|
ACCESS_CODE, //called authorizationCode in OpenAPI 3.0
|
||||||
implicit,
|
IMPLICIT,
|
||||||
password,
|
PASSWORD,
|
||||||
application //called clientCredentials in OpenAPI 3.0
|
APPLICATION //called clientCredentials in OpenAPI 3.0
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public class ApiClient {
|
|||||||
auth = new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{#isKeyInQuery}}"query"{{/isKeyInQuery}}{{#isKeyInCookie}}"cookie"{{/isKeyInCookie}}, "{{keyParamName}}");
|
auth = new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{#isKeyInQuery}}"query"{{/isKeyInQuery}}{{#isKeyInCookie}}"cookie"{{/isKeyInCookie}}, "{{keyParamName}}");
|
||||||
{{/isApiKey}}
|
{{/isApiKey}}
|
||||||
{{#isOAuth}}
|
{{#isOAuth}}
|
||||||
auth = buildOauthRequestInterceptor(OAuthFlow.{{flow}}, "{{authorizationUrl}}", "{{tokenUrl}}", "{{#scopes}}{{scope}}{{^-last}}, {{/-last}}{{/scopes}}");
|
auth = buildOauthRequestInterceptor(OAuthFlow.{{#lambda.uppercase}}{{#lambda.snakecase}}{{flow}}{{/lambda.snakecase}}{{/lambda.uppercase}}, "{{authorizationUrl}}", "{{tokenUrl}}", "{{#scopes}}{{scope}}{{^-last}}, {{/-last}}{{/scopes}}");
|
||||||
{{/isOAuth}}
|
{{/isOAuth}}
|
||||||
} else {{/authMethods}}{
|
} else {{/authMethods}}{
|
||||||
throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names");
|
throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names");
|
||||||
@ -179,9 +179,9 @@ public class ApiClient {
|
|||||||
{{#hasOAuthMethods}}
|
{{#hasOAuthMethods}}
|
||||||
private RequestInterceptor buildOauthRequestInterceptor(OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) {
|
private RequestInterceptor buildOauthRequestInterceptor(OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) {
|
||||||
switch (flow) {
|
switch (flow) {
|
||||||
case password:
|
case PASSWORD:
|
||||||
return new OauthPasswordGrant(tokenUrl, scopes);
|
return new OauthPasswordGrant(tokenUrl, scopes);
|
||||||
case application:
|
case APPLICATION:
|
||||||
return new OauthClientCredentialsGrant(authorizationUrl, tokenUrl, scopes);
|
return new OauthClientCredentialsGrant(authorizationUrl, tokenUrl, scopes);
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Oauth flow \"" + flow + "\" is not implemented");
|
throw new RuntimeException("Oauth flow \"" + flow + "\" is not implemented");
|
||||||
|
@ -21,7 +21,7 @@ public class OauthClientCredentialsGrant extends OAuth {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected OAuthFlow getFlow() {
|
protected OAuthFlow getFlow() {
|
||||||
return OAuthFlow.application;
|
return OAuthFlow.APPLICATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +24,7 @@ public class OauthPasswordGrant extends OAuth {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected OAuthFlow getFlow() {
|
protected OAuthFlow getFlow() {
|
||||||
return OAuthFlow.password;
|
return OAuthFlow.PASSWORD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,7 +26,7 @@ public class OAuth implements Authentication {
|
|||||||
|
|
||||||
private String tokenUrl;
|
private String tokenUrl;
|
||||||
private String absoluteTokenUrl;
|
private String absoluteTokenUrl;
|
||||||
private OAuthFlow flow = OAuthFlow.application;
|
private OAuthFlow flow = OAuthFlow.APPLICATION;
|
||||||
private OAuth20Service service;
|
private OAuth20Service service;
|
||||||
private DefaultApi20 authApi;
|
private DefaultApi20 authApi;
|
||||||
private String scope;
|
private String scope;
|
||||||
@ -103,18 +103,18 @@ public class OAuth implements Authentication {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
switch (flow) {
|
switch (flow) {
|
||||||
case password:
|
case PASSWORD:
|
||||||
if (username != null && password != null) {
|
if (username != null && password != null) {
|
||||||
accessToken = service.getAccessTokenPasswordGrant(username, password, scope);
|
accessToken = service.getAccessTokenPasswordGrant(username, password, scope);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case accessCode:
|
case ACCESS_CODE:
|
||||||
if (code != null) {
|
if (code != null) {
|
||||||
accessToken = service.getAccessToken(code);
|
accessToken = service.getAccessToken(code);
|
||||||
code = null;
|
code = null;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case application:
|
case APPLICATION:
|
||||||
accessToken = service.getAccessTokenClientCredentialsGrant(scope);
|
accessToken = service.getAccessTokenClientCredentialsGrant(scope);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -159,14 +159,14 @@ public class OAuth implements Authentication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public OAuth usePasswordFlow(String username, String password) {
|
public OAuth usePasswordFlow(String username, String password) {
|
||||||
this.flow = OAuthFlow.password;
|
this.flow = OAuthFlow.PASSWORD;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OAuth useAuthorizationCodeFlow(String code) {
|
public OAuth useAuthorizationCodeFlow(String code) {
|
||||||
this.flow = OAuthFlow.accessCode;
|
this.flow = OAuthFlow.ACCESS_CODE;
|
||||||
this.code = code;
|
this.code = code;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
package {{invokerPackage}}.auth;
|
package {{invokerPackage}}.auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OAuth flows that are supported by this client
|
||||||
|
*/
|
||||||
public enum OAuthFlow {
|
public enum OAuthFlow {
|
||||||
accessCode, implicit, password, application
|
ACCESS_CODE,
|
||||||
|
IMPLICIT,
|
||||||
|
PASSWORD,
|
||||||
|
APPLICATION
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ public class ApiClient {
|
|||||||
throw new IllegalArgumentException("OAuth2 token URL must be an absolute URL");
|
throw new IllegalArgumentException("OAuth2 token URL must be an absolute URL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RetryingOAuth retryingOAuth = new RetryingOAuth(tokenUrl, clientId, OAuthFlow.{{flow}}, clientSecret, parameters);
|
RetryingOAuth retryingOAuth = new RetryingOAuth(tokenUrl, clientId, OAuthFlow.{{#lambda.uppercase}}{{#lambda.snakecase}}{{flow}}{{/lambda.snakecase}}{{/lambda.uppercase}}, clientSecret, parameters);
|
||||||
authentications.put(
|
authentications.put(
|
||||||
"{{name}}",
|
"{{name}}",
|
||||||
retryingOAuth
|
retryingOAuth
|
||||||
|
@ -79,16 +79,16 @@ public class RetryingOAuth extends OAuth implements Interceptor {
|
|||||||
*/
|
*/
|
||||||
public void setFlow(OAuthFlow flow) {
|
public void setFlow(OAuthFlow flow) {
|
||||||
switch(flow) {
|
switch(flow) {
|
||||||
case accessCode:
|
case ACCESS_CODE:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
||||||
break;
|
break;
|
||||||
case implicit:
|
case IMPLICIT:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.IMPLICIT);
|
tokenRequestBuilder.setGrantType(GrantType.IMPLICIT);
|
||||||
break;
|
break;
|
||||||
case password:
|
case PASSWORD:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
||||||
break;
|
break;
|
||||||
case application:
|
case APPLICATION:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -197,7 +197,7 @@ public class ApiClient {
|
|||||||
throw new IllegalArgumentException("OAuth2 token URL must be an absolute URL");
|
throw new IllegalArgumentException("OAuth2 token URL must be an absolute URL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RetryingOAuth retryingOAuth = new RetryingOAuth(tokenUrl, clientId, OAuthFlow.{{flow}}, clientSecret, parameters);
|
RetryingOAuth retryingOAuth = new RetryingOAuth(tokenUrl, clientId, OAuthFlow.{{#lambda.uppercase}}{{#lambda.snakecase}}{{flow}}{{/lambda.snakecase}}{{/lambda.uppercase}}, clientSecret, parameters);
|
||||||
authentications.put(
|
authentications.put(
|
||||||
"{{name}}",
|
"{{name}}",
|
||||||
retryingOAuth
|
retryingOAuth
|
||||||
|
@ -65,16 +65,16 @@ public class RetryingOAuth extends OAuth implements Interceptor {
|
|||||||
|
|
||||||
public void setFlow(OAuthFlow flow) {
|
public void setFlow(OAuthFlow flow) {
|
||||||
switch(flow) {
|
switch(flow) {
|
||||||
case accessCode:
|
case ACCESS_CODE:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
||||||
break;
|
break;
|
||||||
case implicit:
|
case IMPLICIT:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.IMPLICIT);
|
tokenRequestBuilder.setGrantType(GrantType.IMPLICIT);
|
||||||
break;
|
break;
|
||||||
case password:
|
case PASSWORD:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
||||||
break;
|
break;
|
||||||
case application:
|
case APPLICATION:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -54,14 +54,14 @@ public class OAuth implements Interceptor {
|
|||||||
|
|
||||||
public void setFlow(OAuthFlow flow) {
|
public void setFlow(OAuthFlow flow) {
|
||||||
switch(flow) {
|
switch(flow) {
|
||||||
case accessCode:
|
case ACCESS_CODE:
|
||||||
case implicit:
|
case IMPLICIT:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
||||||
break;
|
break;
|
||||||
case password:
|
case PASSWORD:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
||||||
break;
|
break;
|
||||||
case application:
|
case APPLICATION:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -82,7 +82,7 @@ public class ApiClient {
|
|||||||
auth = new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{#isKeyInQuery}}"query"{{/isKeyInQuery}}{{#isKeyInCookie}}"cookie"{{/isKeyInCookie}}, "{{keyParamName}}");
|
auth = new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{#isKeyInQuery}}"query"{{/isKeyInQuery}}{{#isKeyInCookie}}"cookie"{{/isKeyInCookie}}, "{{keyParamName}}");
|
||||||
{{/isApiKey}}
|
{{/isApiKey}}
|
||||||
{{#isOAuth}}
|
{{#isOAuth}}
|
||||||
auth = new OAuth(OAuthFlow.{{flow}}, "{{authorizationUrl}}", "{{tokenUrl}}", "{{#scopes}}{{scope}}{{^-last}}, {{/-last}}{{/scopes}}");
|
auth = new OAuth(OAuthFlow.{{#lambda.uppercase}}{{#lambda.snakecase}}{{flow}}{{/lambda.snakecase}}{{/lambda.uppercase}}, "{{authorizationUrl}}", "{{tokenUrl}}", "{{#scopes}}{{scope}}{{^-last}}, {{/-last}}{{/scopes}}");
|
||||||
{{/isOAuth}}
|
{{/isOAuth}}
|
||||||
} else {{/authMethods}}{
|
} else {{/authMethods}}{
|
||||||
throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names");
|
throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names");
|
||||||
|
@ -54,14 +54,14 @@ public class OAuth implements Interceptor {
|
|||||||
|
|
||||||
public void setFlow(OAuthFlow flow) {
|
public void setFlow(OAuthFlow flow) {
|
||||||
switch(flow) {
|
switch(flow) {
|
||||||
case accessCode:
|
case ACCESS_CODE:
|
||||||
case implicit:
|
case IMPLICIT:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE);
|
||||||
break;
|
break;
|
||||||
case password:
|
case PASSWORD:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
tokenRequestBuilder.setGrantType(GrantType.PASSWORD);
|
||||||
break;
|
break;
|
||||||
case application:
|
case APPLICATION:
|
||||||
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -27,14 +27,12 @@ org.openapitools.codegen.languages.CsharpNetcoreFunctionsServerCodegen
|
|||||||
org.openapitools.codegen.languages.DartClientCodegen
|
org.openapitools.codegen.languages.DartClientCodegen
|
||||||
org.openapitools.codegen.languages.DartDioClientCodegen
|
org.openapitools.codegen.languages.DartDioClientCodegen
|
||||||
org.openapitools.codegen.languages.DartDioNextClientCodegen
|
org.openapitools.codegen.languages.DartDioNextClientCodegen
|
||||||
org.openapitools.codegen.languages.DartJaguarClientCodegen
|
|
||||||
org.openapitools.codegen.languages.EiffelClientCodegen
|
org.openapitools.codegen.languages.EiffelClientCodegen
|
||||||
org.openapitools.codegen.languages.ElixirClientCodegen
|
org.openapitools.codegen.languages.ElixirClientCodegen
|
||||||
org.openapitools.codegen.languages.ElmClientCodegen
|
org.openapitools.codegen.languages.ElmClientCodegen
|
||||||
org.openapitools.codegen.languages.ErlangClientCodegen
|
org.openapitools.codegen.languages.ErlangClientCodegen
|
||||||
org.openapitools.codegen.languages.ErlangProperCodegen
|
org.openapitools.codegen.languages.ErlangProperCodegen
|
||||||
org.openapitools.codegen.languages.ErlangServerCodegen
|
org.openapitools.codegen.languages.ErlangServerCodegen
|
||||||
org.openapitools.codegen.languages.FlashClientCodegen
|
|
||||||
org.openapitools.codegen.languages.FsharpFunctionsServerCodegen
|
org.openapitools.codegen.languages.FsharpFunctionsServerCodegen
|
||||||
org.openapitools.codegen.languages.FsharpGiraffeServerCodegen
|
org.openapitools.codegen.languages.FsharpGiraffeServerCodegen
|
||||||
org.openapitools.codegen.languages.GoClientCodegen
|
org.openapitools.codegen.languages.GoClientCodegen
|
||||||
@ -47,7 +45,6 @@ org.openapitools.codegen.languages.GraphQLNodeJSExpressServerCodegen
|
|||||||
org.openapitools.codegen.languages.GroovyClientCodegen
|
org.openapitools.codegen.languages.GroovyClientCodegen
|
||||||
org.openapitools.codegen.languages.KotlinClientCodegen
|
org.openapitools.codegen.languages.KotlinClientCodegen
|
||||||
org.openapitools.codegen.languages.KotlinServerCodegen
|
org.openapitools.codegen.languages.KotlinServerCodegen
|
||||||
org.openapitools.codegen.languages.KotlinServerDeprecatedCodegen
|
|
||||||
org.openapitools.codegen.languages.KotlinSpringServerCodegen
|
org.openapitools.codegen.languages.KotlinSpringServerCodegen
|
||||||
org.openapitools.codegen.languages.KotlinVertxServerCodegen
|
org.openapitools.codegen.languages.KotlinVertxServerCodegen
|
||||||
org.openapitools.codegen.languages.KtormSchemaCodegen
|
org.openapitools.codegen.languages.KtormSchemaCodegen
|
||||||
@ -95,7 +92,6 @@ org.openapitools.codegen.languages.PhpLaravelServerCodegen
|
|||||||
org.openapitools.codegen.languages.PhpLumenServerCodegen
|
org.openapitools.codegen.languages.PhpLumenServerCodegen
|
||||||
org.openapitools.codegen.languages.PhpSlimServerCodegen
|
org.openapitools.codegen.languages.PhpSlimServerCodegen
|
||||||
org.openapitools.codegen.languages.PhpSlim4ServerCodegen
|
org.openapitools.codegen.languages.PhpSlim4ServerCodegen
|
||||||
org.openapitools.codegen.languages.PhpSilexServerCodegen
|
|
||||||
org.openapitools.codegen.languages.PhpSymfonyServerCodegen
|
org.openapitools.codegen.languages.PhpSymfonyServerCodegen
|
||||||
org.openapitools.codegen.languages.PhpMezzioPathHandlerServerCodegen
|
org.openapitools.codegen.languages.PhpMezzioPathHandlerServerCodegen
|
||||||
org.openapitools.codegen.languages.PhpDataTransferClientCodegen
|
org.openapitools.codegen.languages.PhpDataTransferClientCodegen
|
||||||
@ -131,7 +127,6 @@ org.openapitools.codegen.languages.StaticHtml2Generator
|
|||||||
org.openapitools.codegen.languages.Swift5ClientCodegen
|
org.openapitools.codegen.languages.Swift5ClientCodegen
|
||||||
org.openapitools.codegen.languages.TypeScriptClientCodegen
|
org.openapitools.codegen.languages.TypeScriptClientCodegen
|
||||||
org.openapitools.codegen.languages.TypeScriptAngularClientCodegen
|
org.openapitools.codegen.languages.TypeScriptAngularClientCodegen
|
||||||
org.openapitools.codegen.languages.TypeScriptAngularJsClientCodegen
|
|
||||||
org.openapitools.codegen.languages.TypeScriptAureliaClientCodegen
|
org.openapitools.codegen.languages.TypeScriptAureliaClientCodegen
|
||||||
org.openapitools.codegen.languages.TypeScriptAxiosClientCodegen
|
org.openapitools.codegen.languages.TypeScriptAxiosClientCodegen
|
||||||
org.openapitools.codegen.languages.TypeScriptFetchClientCodegen
|
org.openapitools.codegen.languages.TypeScriptFetchClientCodegen
|
||||||
|
@ -1,141 +0,0 @@
|
|||||||
# {{pubName}}
|
|
||||||
{{#appDescriptionWithNewLines}}
|
|
||||||
{{{.}}}
|
|
||||||
{{/appDescriptionWithNewLines}}
|
|
||||||
|
|
||||||
This Dart package is automatically generated by the [Open API Codegen](https://github.com/OpenAPITools/openapi-generator) project:
|
|
||||||
|
|
||||||
- API version: {{appVersion}}
|
|
||||||
{{#artifactVersion}}
|
|
||||||
- Package version: {{.}}
|
|
||||||
{{/artifactVersion}}
|
|
||||||
{{^hideGenerationTimestamp}}
|
|
||||||
- Build date: {{generatedDate}}
|
|
||||||
{{/hideGenerationTimestamp}}
|
|
||||||
- Build package: {{generatorClass}}
|
|
||||||
{{#infoUrl}}
|
|
||||||
For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
|
|
||||||
{{/infoUrl}}
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
Dart 2 or later OR Flutter 0.7.0 or later.
|
|
||||||
|
|
||||||
Once your code is generated, you need to run the build_runner command to let Jaguar implement your API:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
flutter packages pub run build_runner build
|
|
||||||
or
|
|
||||||
pub run build_runner build
|
|
||||||
```
|
|
||||||
|
|
||||||
## Installation & Usage
|
|
||||||
|
|
||||||
### Github
|
|
||||||
If this Dart package is published to Github, please include the following in pubspec.yaml
|
|
||||||
```
|
|
||||||
name: {{pubName}}
|
|
||||||
version: {{pubVersion}}
|
|
||||||
description: {{pubDescription}}
|
|
||||||
dependencies:
|
|
||||||
{{pubName}}:
|
|
||||||
git: https://{{gitHost}}/{{gitUserId}}/{{gitRepoId}}.git
|
|
||||||
version: 'any'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Local
|
|
||||||
To use the package in your local drive, please include the following in pubspec.yaml
|
|
||||||
```
|
|
||||||
dependencies:
|
|
||||||
{{pubName}}:
|
|
||||||
path: /path/to/{{pubName}}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tests
|
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
Please follow the [installation procedure](#installation--usage) and then run the following:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
{{#apiInfo}}{{#apis}}{{#-first}}{{#operations}}{{#operation}}{{#-first}}
|
|
||||||
{{#hasAuthMethods}}
|
|
||||||
{{#authMethods}}
|
|
||||||
{{#isBasic}}
|
|
||||||
// TODO Configure HTTP basic authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.username = 'YOUR_USERNAME';
|
|
||||||
//{{pubName}}.api.Configuration.password = 'YOUR_PASSWORD';
|
|
||||||
{{/isBasic}}
|
|
||||||
{{#isApiKey}}
|
|
||||||
// TODO Configure API key authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.apiKey{'{{{keyParamName}}}'} = 'YOUR_API_KEY';
|
|
||||||
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
|
|
||||||
//{{pubName}}.api.Configuration.apiKeyPrefix{'{{{keyParamName}}}'} = "Bearer";
|
|
||||||
{{/isApiKey}}
|
|
||||||
{{#isOAuth}}
|
|
||||||
// TODO Configure OAuth2 access token for authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN';
|
|
||||||
{{/isOAuth}}
|
|
||||||
{{/authMethods}}
|
|
||||||
{{/hasAuthMethods}}
|
|
||||||
|
|
||||||
final jaguarApiGen = {{clientName}}();
|
|
||||||
var api_instance = jaguarApiGen.get{{classname}}();
|
|
||||||
{{#allParams}}
|
|
||||||
var {{paramName}} = {{#isArray}}[{{/isArray}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isArray}}]{{/isArray}}; // {{{dataType}}} | {{{description}}}
|
|
||||||
{{/allParams}}
|
|
||||||
|
|
||||||
try {
|
|
||||||
{{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
|
|
||||||
{{#returnType}}
|
|
||||||
print(result);
|
|
||||||
{{/returnType}}
|
|
||||||
} catch (e) {
|
|
||||||
print("Exception when calling {{classname}}->{{operationId}}: $e\n");
|
|
||||||
}
|
|
||||||
{{/-first}}{{/operation}}{{/operations}}{{/-first}}{{/apis}}{{/apiInfo}}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation for API Endpoints
|
|
||||||
|
|
||||||
All URIs are relative to *{{basePath}}*
|
|
||||||
|
|
||||||
Class | Method | HTTP request | Description
|
|
||||||
------------ | ------------- | ------------- | -------------
|
|
||||||
{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**]({{apiDocPath}}/{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{summary}}
|
|
||||||
{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
|
|
||||||
|
|
||||||
## Documentation For Models
|
|
||||||
|
|
||||||
{{#models}}{{#model}} - [{{{classname}}}]({{modelDocPath}}/{{{classname}}}.md)
|
|
||||||
{{/model}}{{/models}}
|
|
||||||
|
|
||||||
## Documentation For Authorization
|
|
||||||
|
|
||||||
{{^authMethods}} All endpoints do not require authorization.
|
|
||||||
{{/authMethods}}{{#authMethods}}{{#last}} Authentication schemes defined for the API:{{/last}}{{/authMethods}}
|
|
||||||
{{#authMethods}}## {{{name}}}
|
|
||||||
|
|
||||||
{{#isApiKey}}- **Type**: API key
|
|
||||||
- **API key parameter name**: {{{keyParamName}}}
|
|
||||||
- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}
|
|
||||||
{{/isApiKey}}
|
|
||||||
{{#isBasic}}- **Type**: HTTP basic authentication
|
|
||||||
{{/isBasic}}
|
|
||||||
{{#isOAuth}}- **Type**: OAuth
|
|
||||||
- **Flow**: {{{flow}}}
|
|
||||||
- **Authorization URL**: {{{authorizationUrl}}}
|
|
||||||
- **Scopes**: {{^scopes}}N/A{{/scopes}}
|
|
||||||
{{#scopes}} - **{{{scope}}}**: {{{description}}}
|
|
||||||
{{/scopes}}
|
|
||||||
{{/isOAuth}}
|
|
||||||
|
|
||||||
{{/authMethods}}
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
{{#apiInfo}}{{#apis}}{{#-last}}{{infoEmail}}
|
|
||||||
{{/-last}}{{/apis}}{{/apiInfo}}
|
|
@ -1 +0,0 @@
|
|||||||
analyzer:
|
|
@ -1,78 +0,0 @@
|
|||||||
import 'package:jaguar_retrofit/annotations/annotations.dart';
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
import 'package:jaguar_serializer/jaguar_serializer.dart';
|
|
||||||
import 'package:jaguar_mimetype/jaguar_mimetype.dart';
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
{{#operations}}
|
|
||||||
{{#modelImports}}import 'package:{{pubName}}/model/{{.}}{{#protoFormat}}.pb{{/protoFormat}}.dart';
|
|
||||||
{{/modelImports}}
|
|
||||||
{{#fullImports}}import '{{.}}';
|
|
||||||
{{/fullImports}}
|
|
||||||
|
|
||||||
part '{{classFilename}}.jretro.dart';
|
|
||||||
|
|
||||||
@GenApiClient()
|
|
||||||
class {{classname}} extends ApiClient with _${{classname}}Client {
|
|
||||||
final Route base;
|
|
||||||
final Map<String, CodecRepo> converters;
|
|
||||||
final Duration timeout;
|
|
||||||
|
|
||||||
{{classname}}({this.base, this.converters, this.timeout = const Duration(minutes: 2)});
|
|
||||||
|
|
||||||
{{#operation}}
|
|
||||||
/// {{summary}}
|
|
||||||
///
|
|
||||||
/// {{notes}}
|
|
||||||
@{{httpMethod}}Req(path: "{{path}}"{{#hasAuthMethods}}, metadata: {"auth": [{{#authMethods}} {"type": "{{type}}", "name": "{{name}}"{{#isApiKey}}, "keyName": "{{keyParamName}}", "where": "{{#isKeyInQuery}}query{{/isKeyInQuery}}{{#isKeyInHeader}}header{{/isKeyInHeader}}"{{/isApiKey}} }{{^-last}}, {{/-last}}{{/authMethods}}]}{{/hasAuthMethods}})
|
|
||||||
Future<{{{returnType}}}{{^returnType}}void{{/returnType}}> {{nickname}}(
|
|
||||||
{{#pathParams}}
|
|
||||||
@PathParam("{{baseName}}") {{dataType}} {{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/pathParams}}
|
|
||||||
{{#headerParams}}
|
|
||||||
{{#-first}}{{#hasPathParams}},{{/hasPathParams}}{{/-first}}
|
|
||||||
@Header("{{baseName}}") {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/headerParams}}
|
|
||||||
{{#queryParams}}
|
|
||||||
{{#-first}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/-first}}
|
|
||||||
@QueryParam("{{baseName}}") {{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/queryParams}}
|
|
||||||
{{#vendorExtensions}}
|
|
||||||
{{#formParams}}
|
|
||||||
{{#-first}}{{#hasQueryParams}},{{/hasQueryParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/-first}}
|
|
||||||
{{#x-is-json}}@AsJson() {{/x-is-json}}{{#x-is-form}}@AsFormField() {{/x-is-form}}{{#x-is-multipart}}@AsMultipartField() {{/x-is-multipart}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/formParams}}
|
|
||||||
{{#bodyParam}}
|
|
||||||
{{#hasFormParams}},{{/hasFormParams}}{{^hasFormParams}}{{#hasQueryParams}},{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}}
|
|
||||||
{{^x-is-proto}}{{^x-is-json}}{{^x-is-form}}{{^x-is-multipart}}@AsBody(){{/x-is-multipart}}{{/x-is-form}}{{/x-is-json}}{{/x-is-proto}} {{#x-is-proto}}@Serialized(MimeTypes.binary) {{/x-is-proto}}{{#x-is-json}}@AsJson() {{/x-is-json}}{{#x-is-form}}@AsForm() {{/x-is-form}}{{#x-is-multipart}}@AsMultipart() {{/x-is-multipart}}{{{dataType}}} {{paramName}}
|
|
||||||
{{/bodyParam}}
|
|
||||||
{{/vendorExtensions}}
|
|
||||||
) {
|
|
||||||
return super.{{nickname}}(
|
|
||||||
{{#pathParams}}
|
|
||||||
{{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/pathParams}}
|
|
||||||
{{#headerParams}}
|
|
||||||
{{#-first}}{{#hasPathParams}},{{/hasPathParams}}{{/-first}}
|
|
||||||
{{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/headerParams}}
|
|
||||||
{{#queryParams}}
|
|
||||||
{{#-first}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/-first}}
|
|
||||||
{{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/queryParams}}
|
|
||||||
|
|
||||||
{{#formParams}}
|
|
||||||
{{#-first}}{{#hasQueryParams}},{{/hasQueryParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/-first}}
|
|
||||||
{{paramName}}{{^-last}}, {{/-last}}
|
|
||||||
{{/formParams}}
|
|
||||||
{{#bodyParam}}
|
|
||||||
{{#hasFormParams}},{{/hasFormParams}}{{^hasFormParams}}{{#hasQueryParams}},{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}}
|
|
||||||
{{paramName}}
|
|
||||||
{{/bodyParam}}
|
|
||||||
).timeout(timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
{{/operation}}
|
|
||||||
|
|
||||||
}
|
|
||||||
{{/operations}}
|
|
@ -1,86 +0,0 @@
|
|||||||
# {{pubName}}.api.{{classname}}{{#description}}
|
|
||||||
{{.}}{{/description}}
|
|
||||||
|
|
||||||
## Load the API package
|
|
||||||
```dart
|
|
||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
```
|
|
||||||
|
|
||||||
All URIs are relative to *{{basePath}}*
|
|
||||||
|
|
||||||
Method | HTTP request | Description
|
|
||||||
------------- | ------------- | -------------
|
|
||||||
{{#operations}}{{#operation}}[**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{summary}}
|
|
||||||
{{/operation}}{{/operations}}
|
|
||||||
|
|
||||||
{{#operations}}
|
|
||||||
{{#operation}}
|
|
||||||
# **{{{operationId}}}**
|
|
||||||
> {{#returnType}}{{{.}}} {{/returnType}}{{{operationId}}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}})
|
|
||||||
|
|
||||||
{{{summary}}}{{#notes}}
|
|
||||||
|
|
||||||
{{{.}}}{{/notes}}
|
|
||||||
|
|
||||||
### Example
|
|
||||||
```dart
|
|
||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
{{#hasAuthMethods}}
|
|
||||||
{{#authMethods}}
|
|
||||||
{{#isBasic}}
|
|
||||||
// TODO Configure HTTP basic authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.username = 'YOUR_USERNAME';
|
|
||||||
//{{pubName}}.api.Configuration.password = 'YOUR_PASSWORD';
|
|
||||||
{{/isBasic}}
|
|
||||||
{{#isApiKey}}
|
|
||||||
// TODO Configure API key authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.apiKey{'{{{keyParamName}}}'} = 'YOUR_API_KEY';
|
|
||||||
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
|
|
||||||
//{{pubName}}.api.Configuration.apiKeyPrefix{'{{{keyParamName}}}'} = "Bearer";
|
|
||||||
{{/isApiKey}}
|
|
||||||
{{#isOAuth}}
|
|
||||||
// TODO Configure OAuth2 access token for authorization: {{{name}}}
|
|
||||||
//{{pubName}}.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN';
|
|
||||||
{{/isOAuth}}
|
|
||||||
{{/authMethods}}
|
|
||||||
{{/hasAuthMethods}}
|
|
||||||
|
|
||||||
var api_instance = new {{classname}}();
|
|
||||||
{{#allParams}}
|
|
||||||
var {{paramName}} = {{#isArray}}[{{/isArray}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isArray}}]{{/isArray}}; // {{{dataType}}} | {{{description}}}
|
|
||||||
{{/allParams}}
|
|
||||||
|
|
||||||
try {
|
|
||||||
{{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
|
|
||||||
{{#returnType}}
|
|
||||||
print(result);
|
|
||||||
{{/returnType}}
|
|
||||||
} catch (e) {
|
|
||||||
print("Exception when calling {{classname}}->{{operationId}}: $e\n");
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Parameters
|
|
||||||
{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}
|
|
||||||
Name | Type | Description | Notes
|
|
||||||
------------- | ------------- | ------------- | -------------{{/-last}}{{/allParams}}
|
|
||||||
{{#allParams}} **{{paramName}}** | {{#isFile}}**{{dataType}}**{{/isFile}}{{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{^isFile}}[**{{dataType}}**]({{baseType}}.md){{/isFile}}{{/isPrimitiveType}}| {{description}} | {{^required}}[optional] {{/required}}{{#defaultValue}}[default to {{.}}]{{/defaultValue}}
|
|
||||||
{{/allParams}}
|
|
||||||
|
|
||||||
### Return type
|
|
||||||
|
|
||||||
{{#returnType}}{{#returnTypeIsPrimitive}}**{{{returnType}}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}[**{{{returnType}}}**]({{returnBaseType}}.md){{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void (empty response body){{/returnType}}
|
|
||||||
|
|
||||||
### Authorization
|
|
||||||
|
|
||||||
{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{{name}}}](../README.md#{{{name}}}){{^-last}}, {{/-last}}{{/authMethods}}
|
|
||||||
|
|
||||||
### HTTP request headers
|
|
||||||
|
|
||||||
- **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}
|
|
||||||
- **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}
|
|
||||||
|
|
||||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
|
||||||
|
|
||||||
{{/operation}}
|
|
||||||
{{/operations}}
|
|
@ -1,28 +0,0 @@
|
|||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
import 'package:test/test.dart';
|
|
||||||
|
|
||||||
{{#operations}}
|
|
||||||
|
|
||||||
/// tests for {{classname}}
|
|
||||||
void main() {
|
|
||||||
var instance = new {{classname}}();
|
|
||||||
|
|
||||||
group('tests for {{classname}}', () {
|
|
||||||
{{#operation}}
|
|
||||||
{{#summary}}
|
|
||||||
// {{{.}}}
|
|
||||||
//
|
|
||||||
{{/summary}}
|
|
||||||
{{#notes}}
|
|
||||||
// {{{.}}}
|
|
||||||
//
|
|
||||||
{{/notes}}
|
|
||||||
//{{#returnType}}Future<{{{.}}}> {{/returnType}}{{^returnType}}Future {{/returnType}}{{operationId}}({{#allParams}}{{#required}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async
|
|
||||||
test('test {{operationId}}', () async {
|
|
||||||
// TODO
|
|
||||||
});
|
|
||||||
|
|
||||||
{{/operation}}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
{{/operations}}
|
|
@ -1,100 +0,0 @@
|
|||||||
library {{pubName}}.api;
|
|
||||||
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:jaguar_serializer/jaguar_serializer.dart';
|
|
||||||
{{#protoFormat}}
|
|
||||||
import 'package:jaguar_serializer_protobuf/proto_repo.dart';
|
|
||||||
{{/protoFormat}}
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
import 'package:{{pubName}}/auth/api_key_auth.dart';
|
|
||||||
import 'package:{{pubName}}/auth/basic_auth.dart';
|
|
||||||
import 'package:{{pubName}}/auth/oauth.dart';
|
|
||||||
import 'package:jaguar_mimetype/jaguar_mimetype.dart';
|
|
||||||
|
|
||||||
{{#apiInfo}}{{#apis}}import 'package:{{pubName}}/api/{{classFilename}}.dart';
|
|
||||||
{{/apis}}{{/apiInfo}}
|
|
||||||
{{#models}}{{#model}}import 'package:{{pubName}}/model/{{classFilename}}{{#protoFormat}}.pb{{/protoFormat}}.dart';
|
|
||||||
{{/model}}{{/models}}
|
|
||||||
|
|
||||||
|
|
||||||
{{#jsonFormat}}
|
|
||||||
final _jsonJaguarRepo = JsonRepo()
|
|
||||||
{{#models}}{{#model}}{{^isEnum}}..add({{classname}}Serializer()){{/isEnum}}
|
|
||||||
{{/model}}{{/models}};
|
|
||||||
final Map<String, CodecRepo> defaultConverters = {
|
|
||||||
MimeTypes.json: _jsonJaguarRepo,
|
|
||||||
};
|
|
||||||
{{/jsonFormat}}
|
|
||||||
|
|
||||||
{{#protoFormat}}
|
|
||||||
final _protoJaguarRepo = ProtoCodecRepo()
|
|
||||||
{{#models}}{{#model}}..add((data) => {{classname}}.fromBuffer(List<int>.from(data)))
|
|
||||||
{{/model}}{{/models}};
|
|
||||||
final _jsonJaguarRepo = ProtoCodecRepo(isJsonFormatEnabled: true)
|
|
||||||
{{#models}}{{#model}}..add((data) => {{classname}}.fromBuffer(List<int>.from(data)))
|
|
||||||
{{/model}}{{/models}};
|
|
||||||
final Map<String, CodecRepo> defaultConverters = {
|
|
||||||
MimeTypes.json: _jsonJaguarRepo,
|
|
||||||
MimeTypes.binary: _protoJaguarRepo,
|
|
||||||
};
|
|
||||||
{{/protoFormat}}
|
|
||||||
|
|
||||||
|
|
||||||
final _defaultInterceptors = [OAuthInterceptor(), BasicAuthInterceptor(), ApiKeyAuthInterceptor()];
|
|
||||||
|
|
||||||
class {{clientName}} {
|
|
||||||
List<Interceptor> interceptors;
|
|
||||||
String basePath = "{{basePath}}";
|
|
||||||
Route _baseRoute;
|
|
||||||
final Duration timeout;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add custom global interceptors, put overrideInterceptors to true to set your interceptors only (auth interceptors will not be added)
|
|
||||||
*/
|
|
||||||
{{clientName}}({List<Interceptor> interceptors, bool overrideInterceptors = false, String baseUrl, this.timeout = const Duration(minutes: 2)}) {
|
|
||||||
_baseRoute = Route(baseUrl ?? basePath).withClient(globalClient ?? http.Client());
|
|
||||||
if(interceptors == null) {
|
|
||||||
this.interceptors = _defaultInterceptors;
|
|
||||||
}
|
|
||||||
else if(overrideInterceptors){
|
|
||||||
this.interceptors = interceptors;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.interceptors = List.from(_defaultInterceptors)..addAll(interceptors);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.interceptors.forEach((interceptor) {
|
|
||||||
_baseRoute.before(interceptor.before);
|
|
||||||
_baseRoute.after(interceptor.after);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setOAuthToken(String name, String token) {
|
|
||||||
(_defaultInterceptors[0] as OAuthInterceptor).tokens[name] = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBasicAuth(String name, String username, String password) {
|
|
||||||
(_defaultInterceptors[1] as BasicAuthInterceptor).authInfo[name] = BasicAuthInfo(username, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setApiKey(String name, String apiKey) {
|
|
||||||
(_defaultInterceptors[2] as ApiKeyAuthInterceptor).apiKeys[name] = apiKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
{{#apiInfo}}{{#apis}}
|
|
||||||
/**
|
|
||||||
* Get {{classname}} instance, base route and serializer can be overridden by a given but be careful,
|
|
||||||
* by doing that all interceptors will not be executed
|
|
||||||
*/
|
|
||||||
{{classname}} get{{classname}}({Route base, Map<String, CodecRepo> converters}) {
|
|
||||||
if(base == null) {
|
|
||||||
base = _baseRoute;
|
|
||||||
}
|
|
||||||
if(converters == null) {
|
|
||||||
converters = defaultConverters;
|
|
||||||
}
|
|
||||||
return {{classname}}(base: base, converters: converters, timeout: timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
{{/apis}}{{/apiInfo}}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'package:{{pubName}}/auth/auth.dart';
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
|
|
||||||
class ApiKeyAuthInterceptor extends AuthInterceptor {
|
|
||||||
Map<String, String> apiKeys = {};
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr<void> before(RouteBase route) {
|
|
||||||
final authInfo = getAuthInfo(route, "apiKey");
|
|
||||||
for (var info in authInfo) {
|
|
||||||
final authName = info["name"];
|
|
||||||
final authKeyName = info["keyName"];
|
|
||||||
final authWhere = info["where"];
|
|
||||||
final apiKey = apiKeys[authName];
|
|
||||||
if(apiKey != null) {
|
|
||||||
if(authWhere == 'query'){
|
|
||||||
route.query(authKeyName, apiKey);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
route.header(authKeyName, apiKey);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.before(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr after(StringResponse response) {
|
|
||||||
return Future.value(response);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
|
|
||||||
abstract class AuthInterceptor extends Interceptor {
|
|
||||||
/*
|
|
||||||
* Get auth information on given route for the given type
|
|
||||||
* Can return null if type is not present on auth data or if route doesn't need authentication
|
|
||||||
*/
|
|
||||||
List<Map<String, dynamic>> getAuthInfo(RouteBase route, String type) {
|
|
||||||
if (route.metadataMap.containsKey("auth")) {
|
|
||||||
final auth = route.metadataMap["auth"];
|
|
||||||
List<Map<String, dynamic>> results = [];
|
|
||||||
for (var info in auth) {
|
|
||||||
if(info["type"] == type) {
|
|
||||||
results.add(info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'package:{{pubName}}/auth/auth.dart';
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
|
|
||||||
class BasicAuthInfo {
|
|
||||||
final String username;
|
|
||||||
final String password;
|
|
||||||
|
|
||||||
const BasicAuthInfo(this.username, this.password);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class BasicAuthInterceptor extends AuthInterceptor {
|
|
||||||
Map<String, BasicAuthInfo> authInfo = {};
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr<void> before(RouteBase route) {
|
|
||||||
final metadataAuthInfo = getAuthInfo(route, "basic");
|
|
||||||
for (var info in metadataAuthInfo) {
|
|
||||||
final authName = info["name"];
|
|
||||||
final basicAuthInfo = authInfo[authName];
|
|
||||||
if(basicAuthInfo != null) {
|
|
||||||
route.basicAuth(basicAuthInfo.username, basicAuthInfo.password);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.before(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr after(StringResponse response) {
|
|
||||||
return Future.value(response);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'package:{{pubName}}/auth/auth.dart';
|
|
||||||
import 'package:jaguar_retrofit/jaguar_retrofit.dart';
|
|
||||||
|
|
||||||
class OAuthInterceptor extends AuthInterceptor {
|
|
||||||
Map<String, String> tokens = {};
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr<void> before(RouteBase route) {
|
|
||||||
final authInfo = getAuthInfo(route, "oauth");
|
|
||||||
for (var info in authInfo) {
|
|
||||||
final token = tokens[info["name"]];
|
|
||||||
if(token != null) {
|
|
||||||
route.header("Authorization", "Bearer ${token}");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.before(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr after(StringResponse response) {
|
|
||||||
return Future.value(response);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
{{#protoFormat}}
|
|
||||||
message {{classname}} {
|
|
||||||
{{#vars}}
|
|
||||||
{{#vendorExtensions}}{{{x-proto-type}}} {{name}} = {{x-index}}{{/vendorExtensions}};
|
|
||||||
{{/vars}}
|
|
||||||
}
|
|
||||||
{{/protoFormat}}
|
|
||||||
{{#jsonFormat}}
|
|
||||||
part '{{classFilename}}.jser.dart';
|
|
||||||
|
|
||||||
class {{classname}} {
|
|
||||||
{{#vars}}{{#description}} /* {{{.}}} */{{/description}}
|
|
||||||
@Alias('{{{baseName}}}', isNullable:{{#isNullable}} true{{/isNullable}}{{^isNullable}} false{{/isNullable}},{{#allowableValues}}
|
|
||||||
{{^enumVars.empty}}{{^isString}}{{! isString because inline enums are not handled for now }}
|
|
||||||
processor: const {{{datatype}}}FieldProcessor(),
|
|
||||||
{{/isString}}{{/enumVars.empty}}
|
|
||||||
{{/allowableValues}}
|
|
||||||
)
|
|
||||||
final {{{datatype}}} {{name}};
|
|
||||||
{{#allowableValues}}{{#min}} // range from {{min}} to {{max}}{{/min}}//{{^min}}enum {{name}}Enum { {{#values}} {{.}}, {{/values}} };{{/min}}{{/allowableValues}}{{/vars}}
|
|
||||||
|
|
||||||
{{classname}}(
|
|
||||||
{{#vars}}{{^defaultValue}}{{#required}} this.{{name}}, {{/required}}{{/defaultValue}}{{/vars}}
|
|
||||||
|
|
||||||
{{#vendorExtensions}}{{#x-has-vars}}{
|
|
||||||
{{#vars}}{{^required}} this.{{name}}{{#defaultValue}} = {{{defaultValue}}}{{^-last}}, {{/-last}} {{/defaultValue}}{{/required}}
|
|
||||||
{{#required}} {{#defaultValue}}this.{{name}} = {{{defaultValue}}}{{^-last}}, {{/-last}} {{/defaultValue}}{{/required}}{{/vars}}
|
|
||||||
}{{/x-has-vars}}{{/vendorExtensions}}
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
return '{{classname}}[{{#vars}}{{name}}=${{name}}, {{/vars}}]';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@GenSerializer(nullableFields: {{nullableFields}})
|
|
||||||
class {{classname}}Serializer extends Serializer<{{classname}}> with _${{classname}}Serializer {
|
|
||||||
|
|
||||||
}
|
|
||||||
{{/jsonFormat}}
|
|
@ -1,37 +0,0 @@
|
|||||||
|
|
||||||
{{#jsonFormat}}
|
|
||||||
class {{classname}} {
|
|
||||||
/// The underlying value of this enum member.
|
|
||||||
final {{dataType}} value;
|
|
||||||
|
|
||||||
const {{classname}}._internal(this.value);
|
|
||||||
|
|
||||||
{{#allowableValues}}
|
|
||||||
{{#enumVars}}
|
|
||||||
{{#description}}
|
|
||||||
/// {{.}}
|
|
||||||
{{/description}}
|
|
||||||
static const {{classname}} {{{name}}} = const {{classname}}._internal({{{value}}});
|
|
||||||
{{/enumVars}}
|
|
||||||
{{/allowableValues}}
|
|
||||||
}
|
|
||||||
|
|
||||||
class {{classname}}FieldProcessor implements FieldProcessor<{{classname}}, {{dataType}}> {
|
|
||||||
const {{classname}}FieldProcessor();
|
|
||||||
|
|
||||||
{{classname}} deserialize({{dataType}} data) {
|
|
||||||
switch (data) {
|
|
||||||
{{#allowableValues}}
|
|
||||||
{{#enumVars}}
|
|
||||||
case {{{value}}}: return {{classname}}.{{{name}}};
|
|
||||||
{{/enumVars}}
|
|
||||||
{{/allowableValues}}
|
|
||||||
default: throw('Unknown enum value to decode: $data');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{{dataType}} serialize({{classname}} item) {
|
|
||||||
return item.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{{/jsonFormat}}
|
|
@ -1,57 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
|
|
||||||
#
|
|
||||||
# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
|
|
||||||
|
|
||||||
git_user_id=$1
|
|
||||||
git_repo_id=$2
|
|
||||||
release_note=$3
|
|
||||||
git_host=$4
|
|
||||||
|
|
||||||
if [ "$git_host" = "" ]; then
|
|
||||||
git_host="{{{gitHost}}}"
|
|
||||||
echo "[INFO] No command line input provided. Set \$git_host to $git_host"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$git_user_id" = "" ]; then
|
|
||||||
git_user_id="{{{gitUserId}}}"
|
|
||||||
echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$git_repo_id" = "" ]; then
|
|
||||||
git_repo_id="{{{gitRepoId}}}"
|
|
||||||
echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$release_note" = "" ]; then
|
|
||||||
release_note="{{{releaseNote}}}"
|
|
||||||
echo "[INFO] No command line input provided. Set \$release_note to $release_note"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Initialize the local directory as a Git repository
|
|
||||||
git init
|
|
||||||
|
|
||||||
# Adds the files in the local repository and stages them for commit.
|
|
||||||
git add .
|
|
||||||
|
|
||||||
# Commits the tracked changes and prepares them to be pushed to a remote repository.
|
|
||||||
git commit -m "$release_note"
|
|
||||||
|
|
||||||
# Sets the new remote
|
|
||||||
git_remote=$(git remote)
|
|
||||||
if [ "$git_remote" = "" ]; then # git remote not defined
|
|
||||||
|
|
||||||
if [ "$GIT_TOKEN" = "" ]; then
|
|
||||||
echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
|
|
||||||
git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
|
|
||||||
else
|
|
||||||
git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
git pull origin master
|
|
||||||
|
|
||||||
# Pushes (Forces) the changes in the local repository up to the remote repository
|
|
||||||
echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
|
|
||||||
git push origin master 2>&1 | grep -v 'To https'
|
|
@ -1,27 +0,0 @@
|
|||||||
# See https://www.dartlang.org/tools/private-files.html
|
|
||||||
|
|
||||||
# Files and directories created by pub
|
|
||||||
.buildlog
|
|
||||||
.packages
|
|
||||||
.project
|
|
||||||
.pub/
|
|
||||||
build/
|
|
||||||
**/packages/
|
|
||||||
|
|
||||||
# Files created by dart2js
|
|
||||||
# (Most Dart developers will use pub build to compile Dart, use/modify these
|
|
||||||
# rules if you intend to use dart2js directly
|
|
||||||
# Convention is to use extension '.dart.js' for Dart compiled to Javascript to
|
|
||||||
# differentiate from explicit Javascript files)
|
|
||||||
*.dart.js
|
|
||||||
*.part.js
|
|
||||||
*.js.deps
|
|
||||||
*.js.map
|
|
||||||
*.info.json
|
|
||||||
|
|
||||||
# Directory created by dartdoc
|
|
||||||
doc/api/
|
|
||||||
|
|
||||||
# Don't commit pubspec lock file
|
|
||||||
# (Library packages only! Remove pattern if developing an application package)
|
|
||||||
pubspec.lock
|
|
@ -1,12 +0,0 @@
|
|||||||
{{#jsonFormat}}import 'package:jaguar_serializer/jaguar_serializer.dart';{{/jsonFormat}}
|
|
||||||
{{#protoFormat}}syntax = "proto3";{{/protoFormat}}
|
|
||||||
|
|
||||||
{{#models}}
|
|
||||||
{{#model}}
|
|
||||||
{{#imports}}
|
|
||||||
{{#jsonFormat}}import 'package:{{pubName}}/model/{{.}}.dart';{{/jsonFormat}}
|
|
||||||
{{#protoFormat}}import "{{.}}.proto";{{/protoFormat}}
|
|
||||||
{{/imports}}
|
|
||||||
{{#isEnum}}{{>enum}}{{/isEnum}}{{^isEnum}}{{>class}}{{/isEnum}}
|
|
||||||
{{/model}}
|
|
||||||
{{/models}}
|
|
@ -1,26 +0,0 @@
|
|||||||
{{#models}}
|
|
||||||
{{#model}}
|
|
||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
import 'package:test/test.dart';
|
|
||||||
|
|
||||||
// tests for {{classname}}
|
|
||||||
void main() {
|
|
||||||
var instance = new {{classname}}();
|
|
||||||
|
|
||||||
group('test {{classname}}', () {
|
|
||||||
{{#vars}}
|
|
||||||
{{#description}}
|
|
||||||
// {{{.}}}
|
|
||||||
{{/description}}
|
|
||||||
// {{{dataType}}} {{name}}{{#defaultValue}} (default value: {{{.}}}){{/defaultValue}}
|
|
||||||
test('to test the property `{{name}}`', () async {
|
|
||||||
// TODO
|
|
||||||
});
|
|
||||||
|
|
||||||
{{/vars}}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
{{/model}}
|
|
||||||
{{/models}}
|
|
@ -1,16 +0,0 @@
|
|||||||
{{#models}}{{#model}}# {{pubName}}.model.{{classname}}
|
|
||||||
|
|
||||||
## Load the model package
|
|
||||||
```dart
|
|
||||||
import 'package:{{pubName}}/api.dart';
|
|
||||||
```
|
|
||||||
|
|
||||||
## Properties
|
|
||||||
Name | Type | Description | Notes
|
|
||||||
------------ | ------------- | ------------- | -------------
|
|
||||||
{{#vars}}**{{name}}** | {{#isPrimitiveType}}**{{datatype}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{datatype}}**]({{complexType}}.md){{/isPrimitiveType}} | {{description}} | {{^required}}[optional] {{/required}}{{#isReadOnly}}[readonly] {{/isReadOnly}}{{#defaultValue}}[default to {{.}}]{{/defaultValue}}
|
|
||||||
{{/vars}}
|
|
||||||
|
|
||||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
|
||||||
|
|
||||||
{{/model}}{{/models}}
|
|
@ -1,20 +0,0 @@
|
|||||||
name: {{pubName}}
|
|
||||||
version: {{pubVersion}}
|
|
||||||
description: {{pubDescription}}
|
|
||||||
environment:
|
|
||||||
sdk: ">=2.0.0 <3.0.0"
|
|
||||||
dependencies:
|
|
||||||
jaguar_retrofit: ^2.8.8
|
|
||||||
{{#jsonFormat}}
|
|
||||||
jaguar_serializer: ^2.2.12
|
|
||||||
{{/jsonFormat}}
|
|
||||||
{{#protoFormat}}
|
|
||||||
jaguar_serializer_protobuf: ^2.2.2
|
|
||||||
jaguar_mimetype: ^1.0.1
|
|
||||||
{{/protoFormat}}
|
|
||||||
dev_dependencies:
|
|
||||||
jaguar_retrofit_gen: ^2.8.10
|
|
||||||
{{#jsonFormat}}
|
|
||||||
jaguar_serializer_cli: ^2.2.8
|
|
||||||
{{/jsonFormat}}
|
|
||||||
build_runner: ^1.6.5
|
|
@ -1,11 +0,0 @@
|
|||||||
# https://docs.travis-ci.com/user/languages/dart/
|
|
||||||
#
|
|
||||||
language: dart
|
|
||||||
dart:
|
|
||||||
# Install a specific stable release
|
|
||||||
- "1.24.3"
|
|
||||||
install:
|
|
||||||
- pub get
|
|
||||||
|
|
||||||
script:
|
|
||||||
- pub run test
|
|
@ -19,7 +19,7 @@ For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Dart 2.0 or later
|
Dart 2.12 or later
|
||||||
|
|
||||||
## Installation & Usage
|
## Installation & Usage
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{{#operations}}
|
{{#operations}}
|
||||||
|
|
||||||
class {{{classname}}} {
|
class {{{classname}}} {
|
||||||
{{{classname}}}([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient;
|
{{{classname}}}([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
|
||||||
|
|
||||||
final ApiClient apiClient;
|
final ApiClient apiClient;
|
||||||
{{#operation}}
|
{{#operation}}
|
||||||
@ -49,24 +49,13 @@ class {{{classname}}} {
|
|||||||
///
|
///
|
||||||
{{/-last}}
|
{{/-last}}
|
||||||
{{/allParams}}
|
{{/allParams}}
|
||||||
Future<Response> {{{nickname}}}WithHttpInfo({{#allParams}}{{#required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async {
|
Future<Response> {{{nickname}}}WithHttpInfo({{#allParams}}{{#required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}}? {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async {
|
||||||
{{#hasParams}}
|
|
||||||
// Verify required params are set.
|
|
||||||
{{#allParams}}
|
|
||||||
{{#required}}
|
|
||||||
if ({{{paramName}}} == null) {
|
|
||||||
throw ApiException(HttpStatus.badRequest, 'Missing required param: {{{paramName}}}');
|
|
||||||
}
|
|
||||||
{{/required}}
|
|
||||||
{{/allParams}}
|
|
||||||
|
|
||||||
{{/hasParams}}
|
|
||||||
// ignore: prefer_const_declarations
|
// ignore: prefer_const_declarations
|
||||||
final path = r'{{{path}}}'{{#pathParams}}
|
final path = r'{{{path}}}'{{#pathParams}}
|
||||||
.replaceAll({{=<% %>=}}'{<% baseName %>}'<%={{ }}=%>, {{{paramName}}}{{^isString}}.toString(){{/isString}}){{/pathParams}};
|
.replaceAll({{=<% %>=}}'{<% baseName %>}'<%={{ }}=%>, {{{paramName}}}{{^isString}}.toString(){{/isString}}){{/pathParams}};
|
||||||
|
|
||||||
// ignore: prefer_final_locals
|
// ignore: prefer_final_locals
|
||||||
Object postBody{{#bodyParam}} = {{{paramName}}}{{/bodyParam}};
|
Object? postBody{{#bodyParam}} = {{{paramName}}}{{/bodyParam}};
|
||||||
|
|
||||||
final queryParams = <QueryParam>[];
|
final queryParams = <QueryParam>[];
|
||||||
final headerParams = <String, String>{};
|
final headerParams = <String, String>{};
|
||||||
@ -77,7 +66,7 @@ class {{{classname}}} {
|
|||||||
{{^required}}
|
{{^required}}
|
||||||
if ({{{paramName}}} != null) {
|
if ({{{paramName}}} != null) {
|
||||||
{{/required}}
|
{{/required}}
|
||||||
queryParams.addAll(_convertParametersForCollectionFormat('{{{collectionFormat}}}', '{{{baseName}}}', {{{paramName}}}));
|
queryParams.addAll(_queryParams('{{{collectionFormat}}}', '{{{baseName}}}', {{{paramName}}}));
|
||||||
{{^required}}
|
{{^required}}
|
||||||
}
|
}
|
||||||
{{/required}}
|
{{/required}}
|
||||||
@ -139,7 +128,7 @@ class {{{classname}}} {
|
|||||||
postBody,
|
postBody,
|
||||||
headerParams,
|
headerParams,
|
||||||
formParams,
|
formParams,
|
||||||
contentTypes.isEmpty ? null : contentTypes[0],
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
authNames,
|
authNames,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -174,7 +163,7 @@ class {{{classname}}} {
|
|||||||
///
|
///
|
||||||
{{/-last}}
|
{{/-last}}
|
||||||
{{/allParams}}
|
{{/allParams}}
|
||||||
Future<{{{returnType}}}{{^returnType}}void{{/returnType}}> {{{nickname}}}({{#allParams}}{{#required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async {
|
Future<{{#returnType}}{{{.}}}?{{/returnType}}{{^returnType}}void{{/returnType}}> {{{nickname}}}({{#allParams}}{{#required}}{{{dataType}}} {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}}? {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async {
|
||||||
final response = await {{{nickname}}}WithHttpInfo({{#allParams}}{{#required}}{{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}} {{#allParams}}{{^required}}{{{paramName}}}: {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} {{/hasOptionalParams}});
|
final response = await {{{nickname}}}WithHttpInfo({{#allParams}}{{#required}}{{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}}{{#hasOptionalParams}} {{#allParams}}{{^required}}{{{paramName}}}: {{{paramName}}},{{^-last}} {{/-last}}{{/required}}{{/allParams}} {{/hasOptionalParams}});
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
if (response.statusCode >= HttpStatus.badRequest) {
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
||||||
@ -183,13 +172,13 @@ class {{{classname}}} {
|
|||||||
// When a remote server returns no body with a status of 204, we shall not decode it.
|
// When a remote server returns no body with a status of 204, we shall not decode it.
|
||||||
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
||||||
// FormatException when trying to decode an empty string.
|
// FormatException when trying to decode an empty string.
|
||||||
if (response.body != null && response.statusCode != HttpStatus.noContent) {
|
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
||||||
{{#native_serialization}}
|
{{#native_serialization}}
|
||||||
{{#isArray}}
|
{{#isArray}}
|
||||||
final responseBody = await _decodeBodyBytes(response);
|
final responseBody = await _decodeBodyBytes(response);
|
||||||
return (await apiClient.deserializeAsync(responseBody, '{{{returnType}}}') as List)
|
return (await apiClient.deserializeAsync(responseBody, '{{{returnType}}}') as List)
|
||||||
.cast<{{{returnBaseType}}}>()
|
.cast<{{{returnBaseType}}}>()
|
||||||
.{{#uniqueItems}}toSet(){{/uniqueItems}}{{^uniqueItems}}toList(growable: false){{/uniqueItems}};
|
.{{#uniqueItems}}toSet(){{/uniqueItems}}{{^uniqueItems}}toList(){{/uniqueItems}};
|
||||||
{{/isArray}}
|
{{/isArray}}
|
||||||
{{^isArray}}
|
{{^isArray}}
|
||||||
{{#isMap}}
|
{{#isMap}}
|
||||||
@ -199,7 +188,7 @@ class {{{classname}}} {
|
|||||||
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), '{{{returnType}}}',) as {{{returnType}}};
|
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), '{{{returnType}}}',) as {{{returnType}}};
|
||||||
{{/isMap}}{{/isArray}}{{/native_serialization}}
|
{{/isMap}}{{/isArray}}{{/native_serialization}}
|
||||||
}
|
}
|
||||||
return Future<{{{returnType}}}>.value();
|
return null;
|
||||||
{{/returnType}}
|
{{/returnType}}
|
||||||
}
|
}
|
||||||
{{/operation}}
|
{{/operation}}
|
||||||
|
@ -33,12 +33,7 @@ class ApiClient {
|
|||||||
Client get client => _client;
|
Client get client => _client;
|
||||||
|
|
||||||
/// Requests to use a new HTTP [Client] in this class.
|
/// Requests to use a new HTTP [Client] in this class.
|
||||||
///
|
|
||||||
/// If the [newClient] is null, an [ArgumentError] is thrown.
|
|
||||||
set client(Client newClient) {
|
set client(Client newClient) {
|
||||||
if (newClient == null) {
|
|
||||||
throw ArgumentError('New client instance cannot be null.');
|
|
||||||
}
|
|
||||||
_client = newClient;
|
_client = newClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +50,7 @@ class ApiClient {
|
|||||||
/// or deleted.
|
/// or deleted.
|
||||||
Map<String, Authentication> get authentications => Map.unmodifiable(_authentications);
|
Map<String, Authentication> get authentications => Map.unmodifiable(_authentications);
|
||||||
|
|
||||||
T getAuthentication<T extends Authentication>(String name) {
|
T? getAuthentication<T extends Authentication>(String name) {
|
||||||
final authentication = _authentications[name];
|
final authentication = _authentications[name];
|
||||||
return authentication is T ? authentication : null;
|
return authentication is T ? authentication : null;
|
||||||
}
|
}
|
||||||
@ -66,35 +61,28 @@ class ApiClient {
|
|||||||
String path,
|
String path,
|
||||||
String method,
|
String method,
|
||||||
List<QueryParam> queryParams,
|
List<QueryParam> queryParams,
|
||||||
Object body,
|
Object? body,
|
||||||
Map<String, String> headerParams,
|
Map<String, String> headerParams,
|
||||||
Map<String, String> formParams,
|
Map<String, String> formParams,
|
||||||
String nullableContentType,
|
String? contentType,
|
||||||
List<String> authNames,
|
List<String> authNames,
|
||||||
) async {
|
) async {
|
||||||
_updateParamsForAuth(authNames, queryParams, headerParams);
|
_updateParamsForAuth(authNames, queryParams, headerParams);
|
||||||
|
|
||||||
headerParams.addAll(_defaultHeaderMap);
|
headerParams.addAll(_defaultHeaderMap);
|
||||||
|
if (contentType != null) {
|
||||||
final urlEncodedQueryParams = queryParams
|
headerParams['Content-Type'] = contentType;
|
||||||
.where((param) => param.value != null)
|
|
||||||
.map((param) => '$param');
|
|
||||||
|
|
||||||
final queryString = urlEncodedQueryParams.isNotEmpty
|
|
||||||
? '?${urlEncodedQueryParams.join('&')}'
|
|
||||||
: '';
|
|
||||||
|
|
||||||
final uri = Uri.parse('$basePath$path$queryString');
|
|
||||||
|
|
||||||
if (nullableContentType != null) {
|
|
||||||
headerParams['Content-Type'] = nullableContentType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final urlEncodedQueryParams = queryParams.map((param) => '$param');
|
||||||
|
final queryString = urlEncodedQueryParams.isNotEmpty ? '?${urlEncodedQueryParams.join('&')}' : '';
|
||||||
|
final uri = Uri.parse('$basePath$path$queryString');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Special case for uploading a single file which isn't a 'multipart/form-data'.
|
// Special case for uploading a single file which isn't a 'multipart/form-data'.
|
||||||
if (
|
if (
|
||||||
body is MultipartFile && (nullableContentType == null ||
|
body is MultipartFile && (contentType == null ||
|
||||||
!nullableContentType.toLowerCase().startsWith('multipart/form-data'))
|
!contentType.toLowerCase().startsWith('multipart/form-data'))
|
||||||
) {
|
) {
|
||||||
final request = StreamedRequest(method, uri);
|
final request = StreamedRequest(method, uri);
|
||||||
request.headers.addAll(headerParams);
|
request.headers.addAll(headerParams);
|
||||||
@ -120,7 +108,7 @@ class ApiClient {
|
|||||||
return Response.fromStream(response);
|
return Response.fromStream(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
final msgBody = nullableContentType == 'application/x-www-form-urlencoded'
|
final msgBody = contentType == 'application/x-www-form-urlencoded'
|
||||||
? formParams
|
? formParams
|
||||||
: await serializeAsync(body);
|
: await serializeAsync(body);
|
||||||
final nullableHeaderParams = headerParams.isEmpty ? null : headerParams;
|
final nullableHeaderParams = headerParams.isEmpty ? null : headerParams;
|
||||||
@ -133,43 +121,71 @@ class ApiClient {
|
|||||||
case 'HEAD': return await _client.head(uri, headers: nullableHeaderParams,);
|
case 'HEAD': return await _client.head(uri, headers: nullableHeaderParams,);
|
||||||
case 'GET': return await _client.get(uri, headers: nullableHeaderParams,);
|
case 'GET': return await _client.get(uri, headers: nullableHeaderParams,);
|
||||||
}
|
}
|
||||||
} on SocketException catch (e, trace) {
|
} on SocketException catch (error, trace) {
|
||||||
throw ApiException.withInner(HttpStatus.badRequest, 'Socket operation failed: $method $path', e, trace,);
|
throw ApiException.withInner(
|
||||||
} on TlsException catch (e, trace) {
|
HttpStatus.badRequest,
|
||||||
throw ApiException.withInner(HttpStatus.badRequest, 'TLS/SSL communication failed: $method $path', e, trace,);
|
'Socket operation failed: $method $path',
|
||||||
} on IOException catch (e, trace) {
|
error,
|
||||||
throw ApiException.withInner(HttpStatus.badRequest, 'I/O operation failed: $method $path', e, trace,);
|
trace,
|
||||||
} on ClientException catch (e, trace) {
|
);
|
||||||
throw ApiException.withInner(HttpStatus.badRequest, 'HTTP connection failed: $method $path', e, trace,);
|
} on TlsException catch (error, trace) {
|
||||||
} on Exception catch (e, trace) {
|
throw ApiException.withInner(
|
||||||
throw ApiException.withInner(HttpStatus.badRequest, 'Exception occurred: $method $path', e, trace,);
|
HttpStatus.badRequest,
|
||||||
|
'TLS/SSL communication failed: $method $path',
|
||||||
|
error,
|
||||||
|
trace,
|
||||||
|
);
|
||||||
|
} on IOException catch (error, trace) {
|
||||||
|
throw ApiException.withInner(
|
||||||
|
HttpStatus.badRequest,
|
||||||
|
'I/O operation failed: $method $path',
|
||||||
|
error,
|
||||||
|
trace,
|
||||||
|
);
|
||||||
|
} on ClientException catch (error, trace) {
|
||||||
|
throw ApiException.withInner(
|
||||||
|
HttpStatus.badRequest,
|
||||||
|
'HTTP connection failed: $method $path',
|
||||||
|
error,
|
||||||
|
trace,
|
||||||
|
);
|
||||||
|
} on Exception catch (error, trace) {
|
||||||
|
throw ApiException.withInner(
|
||||||
|
HttpStatus.badRequest,
|
||||||
|
'Exception occurred: $method $path',
|
||||||
|
error,
|
||||||
|
trace,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw ApiException(HttpStatus.badRequest, 'Invalid HTTP operation: $method $path',);
|
throw ApiException(
|
||||||
|
HttpStatus.badRequest,
|
||||||
|
'Invalid HTTP operation: $method $path',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
{{#native_serialization}}
|
{{#native_serialization}}
|
||||||
|
|
||||||
Future<dynamic> deserializeAsync(String json, String targetType, {bool growable}) async =>
|
Future<dynamic> deserializeAsync(String json, String targetType, {bool growable = false,}) async =>
|
||||||
// ignore: deprecated_member_use_from_same_package
|
// ignore: deprecated_member_use_from_same_package
|
||||||
deserialize(json, targetType, growable: growable);
|
deserialize(json, targetType, growable: growable);
|
||||||
|
|
||||||
@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use deserializeAsync() instead.')
|
@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use deserializeAsync() instead.')
|
||||||
dynamic deserialize(String json, String targetType, {bool growable}) {
|
dynamic deserialize(String json, String targetType, {bool growable = false,}) {
|
||||||
// Remove all spaces. Necessary for regular expressions as well.
|
// Remove all spaces. Necessary for regular expressions as well.
|
||||||
targetType = targetType.replaceAll(' ', ''); // ignore: parameter_assignments
|
targetType = targetType.replaceAll(' ', ''); // ignore: parameter_assignments
|
||||||
|
|
||||||
// If the expected target type is String, nothing to do...
|
// If the expected target type is String, nothing to do...
|
||||||
return targetType == 'String'
|
return targetType == 'String'
|
||||||
? json
|
? json
|
||||||
: _deserialize(jsonDecode(json), targetType, growable: growable == true);
|
: _deserialize(jsonDecode(json), targetType, growable: growable);
|
||||||
}
|
}
|
||||||
{{/native_serialization}}
|
{{/native_serialization}}
|
||||||
|
|
||||||
// ignore: deprecated_member_use_from_same_package
|
// ignore: deprecated_member_use_from_same_package
|
||||||
Future<String> serializeAsync(Object value) async => serialize(value);
|
Future<String> serializeAsync(Object? value) async => serialize(value);
|
||||||
|
|
||||||
@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
|
@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
|
||||||
String serialize(Object value) => value == null ? '' : json.encode(value);
|
String serialize(Object? value) => value == null ? '' : json.encode(value);
|
||||||
|
|
||||||
/// Update query and header parameters based on authentication settings.
|
/// Update query and header parameters based on authentication settings.
|
||||||
/// @param authNames The authentications to apply
|
/// @param authNames The authentications to apply
|
||||||
@ -188,7 +204,7 @@ class ApiClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{{#native_serialization}}
|
{{#native_serialization}}
|
||||||
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
|
static dynamic _deserialize(dynamic value, String targetType, {bool growable = false}) {
|
||||||
try {
|
try {
|
||||||
switch (targetType) {
|
switch (targetType) {
|
||||||
case 'String':
|
case 'String':
|
||||||
@ -215,24 +231,21 @@ class ApiClient {
|
|||||||
{{/model}}
|
{{/model}}
|
||||||
{{/models}}
|
{{/models}}
|
||||||
default:
|
default:
|
||||||
Match match;
|
dynamic match;
|
||||||
if (value is List && (match = _regList.firstMatch(targetType)) != null) {
|
if (value is List && (match = _regList.firstMatch(targetType)?.group(1)) != null) {
|
||||||
targetType = match[1]; // ignore: parameter_assignments
|
|
||||||
return value
|
return value
|
||||||
.map<dynamic>((dynamic v) => _deserialize(v, targetType, growable: growable))
|
.map<dynamic>((dynamic v) => _deserialize(v, match, growable: growable,))
|
||||||
.toList(growable: growable);
|
.toList(growable: growable);
|
||||||
}
|
}
|
||||||
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
|
if (value is Set && (match = _regSet.firstMatch(targetType)?.group(1)) != null) {
|
||||||
targetType = match[1]; // ignore: parameter_assignments
|
|
||||||
return value
|
return value
|
||||||
.map<dynamic>((dynamic v) => _deserialize(v, targetType, growable: growable))
|
.map<dynamic>((dynamic v) => _deserialize(v, match, growable: growable,))
|
||||||
.toSet();
|
.toSet();
|
||||||
}
|
}
|
||||||
if (value is Map && (match = _regMap.firstMatch(targetType)) != null) {
|
if (value is Map && (match = _regMap.firstMatch(targetType)?.group(1)) != null) {
|
||||||
targetType = match[1]; // ignore: parameter_assignments
|
|
||||||
return Map<String, dynamic>.fromIterables(
|
return Map<String, dynamic>.fromIterables(
|
||||||
value.keys.cast<String>(),
|
value.keys.cast<String>(),
|
||||||
value.values.map<dynamic>((dynamic v) => _deserialize(v, targetType, growable: growable)),
|
value.values.map<dynamic>((dynamic v) => _deserialize(v, match, growable: growable,)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -248,9 +261,9 @@ class ApiClient {
|
|||||||
/// Primarily intended for use in an isolate.
|
/// Primarily intended for use in an isolate.
|
||||||
class DeserializationMessage {
|
class DeserializationMessage {
|
||||||
const DeserializationMessage({
|
const DeserializationMessage({
|
||||||
@required this.json,
|
required this.json,
|
||||||
@required this.targetType,
|
required this.targetType,
|
||||||
this.growable,
|
this.growable = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
/// The JSON value to deserialize.
|
/// The JSON value to deserialize.
|
||||||
@ -274,10 +287,10 @@ Future<dynamic> deserializeAsync(DeserializationMessage message) async {
|
|||||||
: ApiClient._deserialize(
|
: ApiClient._deserialize(
|
||||||
jsonDecode(message.json),
|
jsonDecode(message.json),
|
||||||
targetType,
|
targetType,
|
||||||
growable: message.growable == true,
|
growable: message.growable,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
{{/native_serialization}}
|
{{/native_serialization}}
|
||||||
|
|
||||||
/// Primarily intended for use in an isolate.
|
/// Primarily intended for use in an isolate.
|
||||||
Future<String> serializeAsync(Object value) async => value == null ? '' : json.encode(value);
|
Future<String> serializeAsync(Object? value) async => value == null ? '' : json.encode(value);
|
||||||
|
@ -6,9 +6,9 @@ class ApiException implements Exception {
|
|||||||
ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace);
|
ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace);
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
String message;
|
String? message;
|
||||||
Exception innerException;
|
Exception? innerException;
|
||||||
StackTrace stackTrace;
|
StackTrace? stackTrace;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
|
@ -11,32 +11,27 @@ class QueryParam {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ported from the Java version.
|
// Ported from the Java version.
|
||||||
Iterable<QueryParam> _convertParametersForCollectionFormat(
|
Iterable<QueryParam> _queryParams(String collectionFormat, String name, dynamic value,) {
|
||||||
String collectionFormat,
|
// Assertions to run in debug mode only.
|
||||||
String name,
|
assert(name.isNotEmpty, 'Parameter cannot be an empty string.');
|
||||||
dynamic value,
|
|
||||||
) {
|
|
||||||
final params = <QueryParam>[];
|
final params = <QueryParam>[];
|
||||||
|
|
||||||
// preconditions
|
|
||||||
if (name != null && name.isNotEmpty && value != null) {
|
|
||||||
if (value is List) {
|
if (value is List) {
|
||||||
if (collectionFormat == 'multi') {
|
if (collectionFormat == 'multi') {
|
||||||
return value.map((dynamic v) => QueryParam(name, parameterToString(v)),);
|
return value.map((dynamic v) => QueryParam(name, parameterToString(v)),);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default collection format is 'csv'.
|
// Default collection format is 'csv'.
|
||||||
if (collectionFormat == null || collectionFormat.isEmpty) {
|
if (collectionFormat.isEmpty) {
|
||||||
// ignore: parameter_assignments
|
collectionFormat = 'csv'; // ignore: parameter_assignments
|
||||||
collectionFormat = 'csv';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final delimiter = _delimiters[collectionFormat] ?? ',';
|
final delimiter = _delimiters[collectionFormat] ?? ',';
|
||||||
|
|
||||||
params.add(QueryParam(name, value.map<dynamic>(parameterToString).join(delimiter)),);
|
params.add(QueryParam(name, value.map<dynamic>(parameterToString).join(delimiter),));
|
||||||
} else {
|
} else if (value != null) {
|
||||||
params.add(QueryParam(name, parameterToString(value),));
|
params.add(QueryParam(name, parameterToString(value)));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return params;
|
return params;
|
||||||
@ -67,27 +62,27 @@ String parameterToString(dynamic value) {
|
|||||||
Future<String> _decodeBodyBytes(Response response) async {
|
Future<String> _decodeBodyBytes(Response response) async {
|
||||||
final contentType = response.headers['content-type'];
|
final contentType = response.headers['content-type'];
|
||||||
return contentType != null && contentType.toLowerCase().startsWith('application/json')
|
return contentType != null && contentType.toLowerCase().startsWith('application/json')
|
||||||
? response.bodyBytes == null ? null : utf8.decode(response.bodyBytes)
|
? response.bodyBytes.isEmpty ? '' : utf8.decode(response.bodyBytes)
|
||||||
: response.body;
|
: response.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a valid [T] value found at the specified Map [key], null otherwise.
|
/// Returns a valid [T] value found at the specified Map [key], null otherwise.
|
||||||
T mapValueOfType<T>(dynamic map, String key) {
|
T? mapValueOfType<T>(dynamic map, String key) {
|
||||||
final dynamic value = map is Map ? map[key] : null;
|
final dynamic value = map is Map ? map[key] : null;
|
||||||
return value is T ? value : null;
|
return value is T ? value : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a valid Map<K, V> found at the specified Map [key], null otherwise.
|
/// Returns a valid Map<K, V> found at the specified Map [key], null otherwise.
|
||||||
Map<K, V> mapCastOfType<K, V>(dynamic map, String key) {
|
Map<K, V>? mapCastOfType<K, V>(dynamic map, String key) {
|
||||||
final dynamic value = map is Map ? map[key] : null;
|
final dynamic value = map is Map ? map[key] : null;
|
||||||
return value is Map ? value.cast<K, V>() : null;
|
return value is Map ? value.cast<K, V>() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a valid [DateTime] found at the specified Map [key], null otherwise.
|
/// Returns a valid [DateTime] found at the specified Map [key], null otherwise.
|
||||||
DateTime mapDateTime(dynamic map, String key, [String pattern]) {
|
DateTime? mapDateTime(dynamic map, String key, [String? pattern]) {
|
||||||
final dynamic value = map is Map ? map[key] : null;
|
final dynamic value = map is Map ? map[key] : null;
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
int millis;
|
int? millis;
|
||||||
if (value is int) {
|
if (value is int) {
|
||||||
millis = value;
|
millis = value;
|
||||||
} else if (value is String) {
|
} else if (value is String) {
|
||||||
|
@ -6,7 +6,7 @@ import 'package:test/test.dart';
|
|||||||
|
|
||||||
/// tests for {{{classname}}}
|
/// tests for {{{classname}}}
|
||||||
void main() {
|
void main() {
|
||||||
final instance = {{{classname}}}();
|
// final instance = {{{classname}}}();
|
||||||
|
|
||||||
group('tests for {{{classname}}}', () {
|
group('tests for {{{classname}}}', () {
|
||||||
{{#operation}}
|
{{#operation}}
|
||||||
|
@ -6,23 +6,25 @@ class ApiKeyAuth implements Authentication {
|
|||||||
final String location;
|
final String location;
|
||||||
final String paramName;
|
final String paramName;
|
||||||
|
|
||||||
String apiKeyPrefix;
|
String apiKeyPrefix = '';
|
||||||
String apiKey;
|
String apiKey = '';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
||||||
final value = apiKeyPrefix == null ? apiKey : '$apiKeyPrefix $apiKey';
|
final paramValue = apiKeyPrefix.isEmpty ? apiKey : '$apiKeyPrefix $apiKey';
|
||||||
|
|
||||||
if (location == 'query' && value != null) {
|
if (paramValue.isNotEmpty) {
|
||||||
queryParams.add(QueryParam(paramName, value));
|
if (location == 'query') {
|
||||||
} else if (location == 'header' && value != null) {
|
queryParams.add(QueryParam(paramName, paramValue));
|
||||||
headerParams[paramName] = value;
|
} else if (location == 'header') {
|
||||||
} else if (location == 'cookie' && value != null) {
|
headerParams[paramName] = paramValue;
|
||||||
|
} else if (location == 'cookie') {
|
||||||
headerParams.update(
|
headerParams.update(
|
||||||
'Cookie',
|
'Cookie',
|
||||||
(existingCookie) => '$existingCookie; $paramName=$value',
|
(existingCookie) => '$existingCookie; $paramName=$paramValue',
|
||||||
ifAbsent: () => '$paramName=$value',
|
ifAbsent: () => '$paramName=$paramValue',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// AUTO-GENERATED FILE, DO NOT MODIFY!
|
// AUTO-GENERATED FILE, DO NOT MODIFY!
|
||||||
//
|
//
|
||||||
// @dart=2.0
|
// @dart=2.12
|
||||||
|
|
||||||
// ignore_for_file: unused_element, unused_import
|
// ignore_for_file: unused_element, unused_import
|
||||||
// ignore_for_file: always_put_required_named_parameters_first
|
// ignore_for_file: always_put_required_named_parameters_first
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
{{>header}}
|
{{>header}}
|
||||||
{{>part_of}}
|
{{>part_of}}
|
||||||
class HttpBasicAuth implements Authentication {
|
class HttpBasicAuth implements Authentication {
|
||||||
|
HttpBasicAuth({this.username = '', this.password = ''});
|
||||||
|
|
||||||
String username;
|
String username;
|
||||||
String password;
|
String password;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
||||||
final credentials = '${username ?? ''}:${password ?? ''}';
|
if (username.isNotEmpty && password.isNotEmpty) {
|
||||||
|
final credentials = '$username:$password';
|
||||||
headerParams['Authorization'] = 'Basic ${base64.encode(utf8.encode(credentials))}';
|
headerParams['Authorization'] = 'Basic ${base64.encode(utf8.encode(credentials))}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -11,19 +11,29 @@ class HttpBearerAuth implements Authentication {
|
|||||||
|
|
||||||
set accessToken(dynamic accessToken) {
|
set accessToken(dynamic accessToken) {
|
||||||
if (accessToken is! String && accessToken is! HttpBearerAuthProvider) {
|
if (accessToken is! String && accessToken is! HttpBearerAuthProvider) {
|
||||||
throw ArgumentError('Type of Bearer accessToken should be a String or a String Function().');
|
throw ArgumentError('accessToken value must be either a String or a String Function().');
|
||||||
}
|
}
|
||||||
_accessToken = accessToken;
|
_accessToken = accessToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
||||||
|
if (_accessToken == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String accessToken;
|
||||||
|
|
||||||
if (_accessToken is String) {
|
if (_accessToken is String) {
|
||||||
headerParams['Authorization'] = 'Bearer $_accessToken';
|
accessToken = _accessToken;
|
||||||
} else if (_accessToken is HttpBearerAuthProvider) {
|
} else if (_accessToken is HttpBearerAuthProvider) {
|
||||||
headerParams['Authorization'] = 'Bearer ${_accessToken()}';
|
accessToken = _accessToken!();
|
||||||
} else {
|
} else {
|
||||||
throw ArgumentError('Type of Bearer accessToken should be a String or a String Function().');
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accessToken.isNotEmpty) {
|
||||||
|
headerParams['Authorization'] = 'Bearer $accessToken';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
{{>header}}
|
{{>header}}
|
||||||
{{>part_of}}
|
{{>part_of}}
|
||||||
class OAuth implements Authentication {
|
class OAuth implements Authentication {
|
||||||
OAuth({this.accessToken});
|
OAuth({this.accessToken = ''});
|
||||||
|
|
||||||
String accessToken;
|
String accessToken;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
void applyToParams(List<QueryParam> queryParams, Map<String, String> headerParams) {
|
||||||
if (accessToken != null) {
|
if (accessToken.isNotEmpty) {
|
||||||
headerParams['Authorization'] = 'Bearer $accessToken';
|
headerParams['Authorization'] = 'Bearer $accessToken';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
{{{classname}}}({
|
{{{classname}}}({
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
{{!
|
{{!
|
||||||
A field is @required in Dart when it is
|
A field is required in Dart when it is
|
||||||
required && !nullable && !defaultValue in OAS
|
required && !defaultValue in OAS
|
||||||
}}
|
}}
|
||||||
{{#required}}{{^isNullable}}{{^defaultValue}}@required {{/defaultValue}}{{/isNullable}}{{/required}}this.{{{name}}}{{^isNullable}}{{#defaultValue}} = {{#isEnum}}{{^isContainer}}const {{{enumName}}}._({{/isContainer}}{{/isEnum}}{{{defaultValue}}}{{#isEnum}}{{^isContainer}}){{/isContainer}}{{/isEnum}}{{/defaultValue}}{{/isNullable}},
|
{{#required}}{{^defaultValue}}required {{/defaultValue}}{{/required}}this.{{{name}}}{{#defaultValue}} = {{#isEnum}}{{^isContainer}}const {{{enumName}}}._({{/isContainer}}{{/isEnum}}{{{.}}}{{#isEnum}}{{^isContainer}}){{/isContainer}}{{/isEnum}}{{/defaultValue}},
|
||||||
{{/vars}}
|
{{/vars}}
|
||||||
});
|
});
|
@ -1,27 +1,17 @@
|
|||||||
# See https://www.dartlang.org/tools/private-files.html
|
# See https://dart.dev/guides/libraries/private-files
|
||||||
|
|
||||||
# Files and directories created by pub
|
.dart_tool/
|
||||||
.buildlog
|
|
||||||
.packages
|
.packages
|
||||||
.project
|
|
||||||
.pub/
|
|
||||||
build/
|
build/
|
||||||
**/packages/
|
pubspec.lock # Except for application packages
|
||||||
|
|
||||||
# Files created by dart2js
|
|
||||||
# (Most Dart developers will use pub build to compile Dart, use/modify these
|
|
||||||
# rules if you intend to use dart2js directly
|
|
||||||
# Convention is to use extension '.dart.js' for Dart compiled to Javascript to
|
|
||||||
# differentiate from explicit Javascript files)
|
|
||||||
*.dart.js
|
|
||||||
*.part.js
|
|
||||||
*.js.deps
|
|
||||||
*.js.map
|
|
||||||
*.info.json
|
|
||||||
|
|
||||||
# Directory created by dartdoc
|
|
||||||
doc/api/
|
doc/api/
|
||||||
|
|
||||||
# Don't commit pubspec lock file
|
# IntelliJ
|
||||||
# (Library packages only! Remove pattern if developing an application package)
|
*.iml
|
||||||
pubspec.lock
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Mac
|
||||||
|
.DS_Store
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// AUTO-GENERATED FILE, DO NOT MODIFY!
|
// AUTO-GENERATED FILE, DO NOT MODIFY!
|
||||||
//
|
//
|
||||||
// @dart=2.0
|
// @dart=2.12
|
||||||
|
|
||||||
// ignore_for_file: unused_element, unused_import
|
// ignore_for_file: unused_element, unused_import
|
||||||
// ignore_for_file: always_put_required_named_parameters_first
|
// ignore_for_file: always_put_required_named_parameters_first
|
||||||
|
@ -7,7 +7,7 @@ import 'package:test/test.dart';
|
|||||||
// tests for {{{classname}}}
|
// tests for {{{classname}}}
|
||||||
void main() {
|
void main() {
|
||||||
{{^isEnum}}
|
{{^isEnum}}
|
||||||
final instance = {{{classname}}}();
|
// final instance = {{{classname}}}();
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
|
|
||||||
group('test {{{classname}}}', () {
|
group('test {{{classname}}}', () {
|
||||||
|
@ -1,19 +1,38 @@
|
|||||||
class {{{classname}}} {
|
class {{{classname}}} {
|
||||||
{{>dart_constructor}}
|
{{>dart_constructor}}
|
||||||
|
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
{{#description}}
|
{{#description}}
|
||||||
/// {{{.}}}
|
/// {{{.}}}
|
||||||
{{/description}}
|
{{/description}}
|
||||||
{{^isEnum}}
|
{{^isEnum}}
|
||||||
{{#minimum}}
|
{{#minimum}}
|
||||||
// minimum: {{{.}}}
|
{{#description}}
|
||||||
|
///
|
||||||
|
{{/description}}
|
||||||
|
/// Minimum value: {{{.}}}
|
||||||
{{/minimum}}
|
{{/minimum}}
|
||||||
{{#maximum}}
|
{{#maximum}}
|
||||||
// maximum: {{{.}}}
|
{{#description}}
|
||||||
|
{{^minimum}}
|
||||||
|
///
|
||||||
|
{{/minimum}}
|
||||||
|
{{/description}}
|
||||||
|
/// Maximum value: {{{.}}}
|
||||||
{{/maximum}}
|
{{/maximum}}
|
||||||
|
{{^isNullable}}
|
||||||
|
{{^required}}
|
||||||
|
{{^defaultValue}}
|
||||||
|
///
|
||||||
|
/// Please note: This property should have been non-nullable! Since the specification file
|
||||||
|
/// does not include a default value (using the "default:" property), however, the generated
|
||||||
|
/// source code must fall back to having a nullable type.
|
||||||
|
/// Consider adding a "default:" property in the specification file to hide this note.
|
||||||
|
///
|
||||||
|
{{/defaultValue}}
|
||||||
|
{{/required}}
|
||||||
|
{{/isNullable}}
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
{{{datatypeWithEnum}}} {{{name}}};
|
{{{datatypeWithEnum}}}{{#isNullable}}?{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}?{{/defaultValue}}{{/required}}{{/isNullable}} {{{name}}};
|
||||||
|
|
||||||
{{/vars}}
|
{{/vars}}
|
||||||
@override
|
@override
|
||||||
@ -26,7 +45,7 @@ class {{{classname}}} {
|
|||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
// ignore: unnecessary_parenthesis
|
// ignore: unnecessary_parenthesis
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
({{{name}}} == null ? 0 : {{{name}}}.hashCode){{^-last}} +{{/-last}}{{#-last}};{{/-last}}
|
({{#isNullable}}{{{name}}} == null ? 0 : {{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}{{{name}}} == null ? 0 : {{/defaultValue}}{{/required}}{{/isNullable}}{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.hashCode){{^-last}} +{{/-last}}{{#-last}};{{/-last}}
|
||||||
{{/vars}}
|
{{/vars}}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -35,37 +54,51 @@ class {{{classname}}} {
|
|||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final json = <String, dynamic>{};
|
final json = <String, dynamic>{};
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
{{^required}}
|
{{#isNullable}}
|
||||||
if ({{{name}}} != null) {
|
if ({{{name}}} != null) {
|
||||||
|
{{/isNullable}}
|
||||||
|
{{^isNullable}}
|
||||||
|
{{^required}}
|
||||||
|
{{^defaultValue}}
|
||||||
|
if ({{{name}}} != null) {
|
||||||
|
{{/defaultValue}}
|
||||||
{{/required}}
|
{{/required}}
|
||||||
|
{{/isNullable}}
|
||||||
{{#isDateTime}}
|
{{#isDateTime}}
|
||||||
{{#pattern}}
|
{{#pattern}}
|
||||||
json[r'{{{baseName}}}'] = {{#required}}{{#isNullable}}{{{name}}} == null ? null : {{/isNullable}}{{/required}}_dateEpochMarker == '{{{pattern}}}'
|
json[r'{{{baseName}}}'] = _dateEpochMarker == '{{{pattern}}}'
|
||||||
? {{{name}}}.millisecondsSinceEpoch
|
? {{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.millisecondsSinceEpoch
|
||||||
: {{{name}}}.toUtc().toIso8601String();
|
: {{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc().toIso8601String();
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
{{^pattern}}
|
{{^pattern}}
|
||||||
json[r'{{{baseName}}}'] = {{#required}}{{#isNullable}}{{{name}}} == null ? null : {{/isNullable}}{{/required}}{{{name}}}.toUtc().toIso8601String();
|
json[r'{{{baseName}}}'] = {{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc().toIso8601String();
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
{{/isDateTime}}
|
{{/isDateTime}}
|
||||||
{{#isDate}}
|
{{#isDate}}
|
||||||
{{#pattern}}
|
{{#pattern}}
|
||||||
json[r'{{{baseName}}}'] = {{#required}}{{#isNullable}}{{{name}}} == null ? null : {{/isNullable}}{{/required}}_dateEpochMarker == '{{{pattern}}}'
|
json[r'{{{baseName}}}'] = _dateEpochMarker == '{{{pattern}}}'
|
||||||
? {{{name}}}.millisecondsSinceEpoch
|
? {{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.millisecondsSinceEpoch
|
||||||
: _dateFormatter.format({{{name}}}.toUtc());
|
: _dateFormatter.format({{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc());
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
{{^pattern}}
|
{{^pattern}}
|
||||||
json[r'{{{baseName}}}'] = {{#required}}{{#isNullable}}{{{name}}} == null ? null : {{/isNullable}}{{/required}}_dateFormatter.format({{{name}}}.toUtc());
|
json[r'{{{baseName}}}'] = _dateFormatter.format({{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc());
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
{{/isDate}}
|
{{/isDate}}
|
||||||
{{^isDateTime}}
|
{{^isDateTime}}
|
||||||
{{^isDate}}
|
{{^isDate}}
|
||||||
json[r'{{{baseName}}}'] = {{#required}}{{#isNullable}}{{{name}}} == null ? null : {{/isNullable}}{{/required}}{{{name}}};
|
json[r'{{{baseName}}}'] = {{{name}}};
|
||||||
{{/isDate}}
|
{{/isDate}}
|
||||||
{{/isDateTime}}
|
{{/isDateTime}}
|
||||||
{{^required}}
|
{{#isNullable}}
|
||||||
}
|
}
|
||||||
|
{{/isNullable}}
|
||||||
|
{{^isNullable}}
|
||||||
|
{{^required}}
|
||||||
|
{{^defaultValue}}
|
||||||
|
}
|
||||||
|
{{/defaultValue}}
|
||||||
{{/required}}
|
{{/required}}
|
||||||
|
{{/isNullable}}
|
||||||
{{/vars}}
|
{{/vars}}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
@ -73,16 +106,28 @@ class {{{classname}}} {
|
|||||||
/// Returns a new [{{{classname}}}] instance and imports its values from
|
/// Returns a new [{{{classname}}}] instance and imports its values from
|
||||||
/// [value] if it's a [Map], null otherwise.
|
/// [value] if it's a [Map], null otherwise.
|
||||||
// ignore: prefer_constructors_over_static_methods
|
// ignore: prefer_constructors_over_static_methods
|
||||||
static {{{classname}}} fromJson(dynamic value) {
|
static {{{classname}}}? fromJson(dynamic value) {
|
||||||
if (value is Map) {
|
if (value is Map) {
|
||||||
final json = value.cast<String, dynamic>();
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// Ensure that the map contains the required keys.
|
||||||
|
// Note 1: the values aren't checked for validity beyond being non-null.
|
||||||
|
// Note 2: this code is stripped in release mode!
|
||||||
|
assert(() {
|
||||||
|
requiredKeys.forEach((key) {
|
||||||
|
assert(json.containsKey(key), 'Required key "{{{classname}}}[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "{{{classname}}}[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
return {{{classname}}}(
|
return {{{classname}}}(
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
{{#isDateTime}}
|
{{#isDateTime}}
|
||||||
{{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'),
|
{{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isDateTime}}
|
{{/isDateTime}}
|
||||||
{{#isDate}}
|
{{#isDate}}
|
||||||
{{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'),
|
{{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isDate}}
|
{{/isDate}}
|
||||||
{{^isDateTime}}
|
{{^isDateTime}}
|
||||||
{{^isDate}}
|
{{^isDate}}
|
||||||
@ -97,18 +142,18 @@ class {{{classname}}} {
|
|||||||
{{^items.complexType}}
|
{{^items.complexType}}
|
||||||
(e) => e == null ? null : (e as List).cast<{{items.items.dataType}}>()
|
(e) => e == null ? null : (e as List).cast<{{items.items.dataType}}>()
|
||||||
{{/items.complexType}}
|
{{/items.complexType}}
|
||||||
).toList(growable: false)
|
).toList()
|
||||||
: null,
|
: null,
|
||||||
{{/items.isArray}}
|
{{/items.isArray}}
|
||||||
{{^items.isArray}}
|
{{^items.isArray}}
|
||||||
{{{name}}}: {{{complexType}}}.listFromJson(json[r'{{{baseName}}}']),
|
{{{name}}}: {{{complexType}}}.listFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/items.isArray}}
|
{{/items.isArray}}
|
||||||
{{/isArray}}
|
{{/isArray}}
|
||||||
{{^isArray}}
|
{{^isArray}}
|
||||||
{{#isMap}}
|
{{#isMap}}
|
||||||
{{#items.isArray}}
|
{{#items.isArray}}
|
||||||
{{{name}}}: json[r'{{{baseName}}}'] == null
|
{{{name}}}: json[r'{{{baseName}}}'] == null
|
||||||
? null
|
? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}
|
||||||
{{#items.complexType}}
|
{{#items.complexType}}
|
||||||
: {{items.complexType}}.mapListFromJson(json[r'{{{baseName}}}']),
|
: {{items.complexType}}.mapListFromJson(json[r'{{{baseName}}}']),
|
||||||
{{/items.complexType}}
|
{{/items.complexType}}
|
||||||
@ -119,14 +164,14 @@ class {{{classname}}} {
|
|||||||
{{^items.isArray}}
|
{{^items.isArray}}
|
||||||
{{#items.isMap}}
|
{{#items.isMap}}
|
||||||
{{#items.complexType}}
|
{{#items.complexType}}
|
||||||
{{{name}}}: {{items.complexType}}.mapFromJson(json[r'{{{baseName}}}']),
|
{{{name}}}: {{items.complexType}}.mapFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/items.complexType}}
|
{{/items.complexType}}
|
||||||
{{^items.complexType}}
|
{{^items.complexType}}
|
||||||
{{{name}}}: mapCastOfType<String, dynamic>(json, r'{{{baseName}}}'),
|
{{{name}}}: mapCastOfType<String, dynamic>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/items.complexType}}
|
{{/items.complexType}}
|
||||||
{{/items.isMap}}
|
{{/items.isMap}}
|
||||||
{{^items.isMap}}
|
{{^items.isMap}}
|
||||||
{{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'),
|
{{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/items.isMap}}
|
{{/items.isMap}}
|
||||||
{{/items.isArray}}
|
{{/items.isArray}}
|
||||||
{{/isMap}}
|
{{/isMap}}
|
||||||
@ -135,7 +180,7 @@ class {{{classname}}} {
|
|||||||
{{{name}}}: null, // No support for decoding binary content from JSON
|
{{{name}}}: null, // No support for decoding binary content from JSON
|
||||||
{{/isBinary}}
|
{{/isBinary}}
|
||||||
{{^isBinary}}
|
{{^isBinary}}
|
||||||
{{{name}}}: {{{complexType}}}.fromJson(json[r'{{{baseName}}}']),
|
{{{name}}}: {{{complexType}}}.fromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isBinary}}
|
{{/isBinary}}
|
||||||
{{/isMap}}
|
{{/isMap}}
|
||||||
{{/isArray}}
|
{{/isArray}}
|
||||||
@ -143,30 +188,30 @@ class {{{classname}}} {
|
|||||||
{{^complexType}}
|
{{^complexType}}
|
||||||
{{#isArray}}
|
{{#isArray}}
|
||||||
{{#isEnum}}
|
{{#isEnum}}
|
||||||
{{{name}}}: {{{items.datatypeWithEnum}}}.listFromJson(json[r'{{{baseName}}}']),
|
{{{name}}}: {{{items.datatypeWithEnum}}}.listFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
{{^isEnum}}
|
{{^isEnum}}
|
||||||
{{{name}}}: json[r'{{{baseName}}}'] is {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}
|
{{{name}}}: json[r'{{{baseName}}}'] is {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}
|
||||||
? (json[r'{{{baseName}}}'] as {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}).cast<{{{items.datatype}}}>()
|
? (json[r'{{{baseName}}}'] as {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}).cast<{{{items.datatype}}}>()
|
||||||
: null,
|
: {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}},
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
{{/isArray}}
|
{{/isArray}}
|
||||||
{{^isArray}}
|
{{^isArray}}
|
||||||
{{#isMap}}
|
{{#isMap}}
|
||||||
{{{name}}}: mapCastOfType<String, {{{items.datatype}}}>(json, r'{{{baseName}}}'),
|
{{{name}}}: mapCastOfType<String, {{{items.datatype}}}>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isMap}}
|
{{/isMap}}
|
||||||
{{^isMap}}
|
{{^isMap}}
|
||||||
{{#isNumber}}
|
{{#isNumber}}
|
||||||
{{{name}}}: json[r'{{{baseName}}}'] == null
|
{{{name}}}: json[r'{{{baseName}}}'] == null
|
||||||
? null
|
? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}
|
||||||
: {{{datatypeWithEnum}}}.parse(json[r'{{{baseName}}}'].toString()),
|
: {{{datatypeWithEnum}}}.parse(json[r'{{{baseName}}}'].toString()),
|
||||||
{{/isNumber}}
|
{{/isNumber}}
|
||||||
{{^isNumber}}
|
{{^isNumber}}
|
||||||
{{^isEnum}}
|
{{^isEnum}}
|
||||||
{{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'),
|
{{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
{{#isEnum}}
|
{{#isEnum}}
|
||||||
{{{name}}}: {{{enumName}}}.fromJson(json[r'{{{baseName}}}']),
|
{{{name}}}: {{{enumName}}}.fromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}},
|
||||||
{{/isEnum}}
|
{{/isEnum}}
|
||||||
{{/isNumber}}
|
{{/isNumber}}
|
||||||
{{/isMap}}
|
{{/isMap}}
|
||||||
@ -180,37 +225,56 @@ class {{{classname}}} {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static List<{{{classname}}}> listFromJson(dynamic json, {bool emptyIsNull, bool growable,}) =>
|
static List<{{{classname}}}>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
json is List && json.isNotEmpty
|
final result = <{{{classname}}}>[];
|
||||||
? json.map({{{classname}}}.fromJson).toList(growable: true == growable)
|
if (json is List && json.isNotEmpty) {
|
||||||
: true == emptyIsNull ? null : <{{{classname}}}>[];
|
for (final row in json) {
|
||||||
|
final value = {{{classname}}}.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
static Map<String, {{{classname}}}> mapFromJson(dynamic json) {
|
static Map<String, {{{classname}}}> mapFromJson(dynamic json) {
|
||||||
final map = <String, {{{classname}}}>{};
|
final map = <String, {{{classname}}}>{};
|
||||||
if (json is Map && json.isNotEmpty) {
|
if (json is Map && json.isNotEmpty) {
|
||||||
json
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
.cast<String, dynamic>()
|
for (final entry in json.entries) {
|
||||||
.forEach((key, dynamic value) => map[key] = {{{classname}}}.fromJson(value));
|
final value = {{{classname}}}.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
// maps a json object with a list of {{{classname}}}-objects as value to a dart map
|
// maps a json object with a list of {{{classname}}}-objects as value to a dart map
|
||||||
static Map<String, List<{{{classname}}}>> mapListFromJson(dynamic json, {bool emptyIsNull, bool growable,}) {
|
static Map<String, List<{{{classname}}}>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
final map = <String, List<{{{classname}}}>>{};
|
final map = <String, List<{{{classname}}}>>{};
|
||||||
if (json is Map && json.isNotEmpty) {
|
if (json is Map && json.isNotEmpty) {
|
||||||
json
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
.cast<String, dynamic>()
|
for (final entry in json.entries) {
|
||||||
.forEach((key, dynamic value) {
|
final value = {{{classname}}}.listFromJson(entry.value, growable: growable,);
|
||||||
map[key] = {{{classname}}}.listFromJson(
|
if (value != null) {
|
||||||
value,
|
map[entry.key] = value;
|
||||||
emptyIsNull: emptyIsNull,
|
}
|
||||||
growable: growable,
|
}
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The list of required keys that must be present in a JSON.
|
||||||
|
static const requiredKeys = <String>{
|
||||||
|
{{#vars}}
|
||||||
|
{{#required}}
|
||||||
|
'{{{baseName}}}',
|
||||||
|
{{/required}}
|
||||||
|
{{/vars}}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
{{#isEnum}}
|
{{#isEnum}}
|
||||||
|
@ -7,7 +7,7 @@ class {{{classname}}} {
|
|||||||
final {{{dataType}}} value;
|
final {{{dataType}}} value;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => {{#isString}}value ?? ''{{/isString}}{{^isString}}value == null ? '' : value.toString(){{/isString}};
|
String toString() => {{#isString}}value{{/isString}}{{^isString}}value.toString(){{/isString}};
|
||||||
|
|
||||||
{{{dataType}}} toJson() => value;
|
{{{dataType}}} toJson() => value;
|
||||||
|
|
||||||
@ -26,13 +26,20 @@ class {{{classname}}} {
|
|||||||
{{/allowableValues}}
|
{{/allowableValues}}
|
||||||
];
|
];
|
||||||
|
|
||||||
static {{{classname}}} fromJson(dynamic value) =>
|
static {{{classname}}}? fromJson(dynamic value) => {{{classname}}}TypeTransformer().decode(value);
|
||||||
{{{classname}}}TypeTransformer().decode(value);
|
|
||||||
|
|
||||||
static List<{{{classname}}}> listFromJson(dynamic json, {bool emptyIsNull, bool growable,}) =>
|
static List<{{{classname}}}>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
json is List && json.isNotEmpty
|
final result = <{{{classname}}}>[];
|
||||||
? json.map({{{classname}}}.fromJson).toList(growable: true == growable)
|
if (json is List && json.isNotEmpty) {
|
||||||
: true == emptyIsNull ? null : <{{{classname}}}>[];
|
for (final row in json) {
|
||||||
|
final value = {{{classname}}}.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transformation class that can [encode] an instance of [{{{classname}}}] to {{{dataType}}},
|
/// Transformation class that can [encode] an instance of [{{{classname}}}] to {{{dataType}}},
|
||||||
@ -52,7 +59,7 @@ class {{{classname}}}TypeTransformer {
|
|||||||
///
|
///
|
||||||
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
||||||
/// and users are still using an old app with the old code.
|
/// and users are still using an old app with the old code.
|
||||||
{{{classname}}} decode(dynamic data, {bool allowNull}) {
|
{{{classname}}}? decode(dynamic data, {bool allowNull = true}) {
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
switch (data.toString()) {
|
switch (data.toString()) {
|
||||||
{{#allowableValues}}
|
{{#allowableValues}}
|
||||||
@ -61,7 +68,7 @@ class {{{classname}}}TypeTransformer {
|
|||||||
{{/enumVars}}
|
{{/enumVars}}
|
||||||
{{/allowableValues}}
|
{{/allowableValues}}
|
||||||
default:
|
default:
|
||||||
if (allowNull == false) {
|
if (!allowNull) {
|
||||||
throw ArgumentError('Unknown enum value to decode: $data');
|
throw ArgumentError('Unknown enum value to decode: $data');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,5 +77,5 @@ class {{{classname}}}TypeTransformer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Singleton [{{{classname}}}TypeTransformer] instance.
|
/// Singleton [{{{classname}}}TypeTransformer] instance.
|
||||||
static {{{classname}}}TypeTransformer _instance;
|
static {{{classname}}}TypeTransformer? _instance;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ class {{{enumName}}} {
|
|||||||
final {{{dataType}}} value;
|
final {{{dataType}}} value;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => {{#isString}}value ?? ''{{/isString}}{{^isString}}value == null ? '' : value.toString(){{/isString}};
|
String toString() => {{#isString}}value{{/isString}}{{^isString}}value.toString(){{/isString}};
|
||||||
|
|
||||||
{{{dataType}}} toJson() => value;
|
{{{dataType}}} toJson() => value;
|
||||||
|
|
||||||
@ -26,13 +26,20 @@ class {{{enumName}}} {
|
|||||||
{{/allowableValues}}
|
{{/allowableValues}}
|
||||||
];
|
];
|
||||||
|
|
||||||
static {{{enumName}}} fromJson(dynamic value) =>
|
static {{{enumName}}}? fromJson(dynamic value) => {{{enumName}}}TypeTransformer().decode(value);
|
||||||
{{{enumName}}}TypeTransformer().decode(value);
|
|
||||||
|
|
||||||
static List<{{{enumName}}}> listFromJson(dynamic json, {bool emptyIsNull, bool growable,}) =>
|
static List<{{{enumName}}}>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
json is List && json.isNotEmpty
|
final result = <{{{enumName}}}>[];
|
||||||
? json.map({{{enumName}}}.fromJson).toList(growable: true == growable)
|
if (json is List && json.isNotEmpty) {
|
||||||
: true == emptyIsNull ? null : <{{{enumName}}}>[];
|
for (final row in json) {
|
||||||
|
final value = {{{enumName}}}.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transformation class that can [encode] an instance of [{{{enumName}}}] to {{{dataType}}},
|
/// Transformation class that can [encode] an instance of [{{{enumName}}}] to {{{dataType}}},
|
||||||
@ -52,7 +59,7 @@ class {{{enumName}}}TypeTransformer {
|
|||||||
///
|
///
|
||||||
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
||||||
/// and users are still using an old app with the old code.
|
/// and users are still using an old app with the old code.
|
||||||
{{{enumName}}} decode(dynamic data, {bool allowNull}) {
|
{{{enumName}}}? decode(dynamic data, {bool allowNull = true}) {
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
switch (data.toString()) {
|
switch (data.toString()) {
|
||||||
{{#allowableValues}}
|
{{#allowableValues}}
|
||||||
@ -61,7 +68,7 @@ class {{{enumName}}}TypeTransformer {
|
|||||||
{{/enumVars}}
|
{{/enumVars}}
|
||||||
{{/allowableValues}}
|
{{/allowableValues}}
|
||||||
default:
|
default:
|
||||||
if (allowNull == false) {
|
if (!allowNull) {
|
||||||
throw ArgumentError('Unknown enum value to decode: $data');
|
throw ArgumentError('Unknown enum value to decode: $data');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,5 +77,5 @@ class {{{enumName}}}TypeTransformer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Singleton [{{{enumName}}}TypeTransformer] instance.
|
/// Singleton [{{{enumName}}}TypeTransformer] instance.
|
||||||
static {{{enumName}}}TypeTransformer _instance;
|
static {{{enumName}}}TypeTransformer? _instance;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
language: dart
|
language: dart
|
||||||
dart:
|
dart:
|
||||||
# Install a specific stable release
|
# Install a specific stable release
|
||||||
- "2.2.0"
|
- "2.12"
|
||||||
install:
|
install:
|
||||||
- pub get
|
- pub get
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ type {{classname}}Router interface { {{#operations}}{{#operation}}
|
|||||||
|
|
||||||
// {{classname}}Servicer defines the api actions for the {{classname}} service
|
// {{classname}}Servicer defines the api actions for the {{classname}} service
|
||||||
// This interface intended to stay up to date with the openapi yaml used to generate it,
|
// This interface intended to stay up to date with the openapi yaml used to generate it,
|
||||||
// while the service implementation can ignored with the .openapi-generator-ignore file
|
// while the service implementation can be ignored with the .openapi-generator-ignore file
|
||||||
// and updated with the logic required for the API.
|
// and updated with the logic required for the API.
|
||||||
type {{classname}}Servicer interface { {{#operations}}{{#operation}}
|
type {{classname}}Servicer interface { {{#operations}}{{#operation}}
|
||||||
{{#isDeprecated}}
|
{{#isDeprecated}}
|
||||||
|
@ -46,7 +46,7 @@ func New{{classname}}Controller(s {{classname}}Servicer, opts ...{{classname}}Op
|
|||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
|
||||||
// Routes returns all of the api route for the {{classname}}Controller
|
// Routes returns all the api routes for the {{classname}}Controller
|
||||||
func (c *{{classname}}Controller) Routes() Routes {
|
func (c *{{classname}}Controller) Routes() Routes {
|
||||||
return Routes{ {{#operations}}{{#operation}}
|
return Routes{ {{#operations}}{{#operation}}
|
||||||
{
|
{
|
||||||
@ -130,10 +130,33 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
{{/isBoolean}}
|
{{/isBoolean}}
|
||||||
|
{{#isArray}}
|
||||||
|
{{#items.isLong}}
|
||||||
|
{{paramName}}Param, err := parseInt64ArrayParameter(query.Get("{{baseName}}"), ",", {{required}})
|
||||||
|
if err != nil {
|
||||||
|
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
{{/items.isLong}}
|
||||||
|
{{#items.isInteger}}
|
||||||
|
{{paramName}}Param, err := parseInt32ArrayParameter(query.Get("{{baseName}}"), ",", {{required}})
|
||||||
|
if err != nil {
|
||||||
|
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
{{/items.isInteger}}
|
||||||
|
{{^items.isLong}}
|
||||||
|
{{^items.isInteger}}
|
||||||
|
{{paramName}}Param := strings.Split(query.Get("{{baseName}}"), ",")
|
||||||
|
{{/items.isInteger}}
|
||||||
|
{{/items.isLong}}
|
||||||
|
{{/isArray}}
|
||||||
{{^isLong}}
|
{{^isLong}}
|
||||||
{{^isInteger}}
|
{{^isInteger}}
|
||||||
{{^isBoolean}}
|
{{^isBoolean}}
|
||||||
{{paramName}}Param := {{#isArray}}strings.Split({{/isArray}}query.Get("{{baseName}}"){{#isArray}}, ","){{/isArray}}
|
{{^isArray}}
|
||||||
|
{{paramName}}Param := query.Get("{{baseName}}")
|
||||||
|
{{/isArray}}
|
||||||
{{/isBoolean}}
|
{{/isBoolean}}
|
||||||
{{/isInteger}}
|
{{/isInteger}}
|
||||||
{{/isLong}}
|
{{/isLong}}
|
||||||
|
@ -32,13 +32,13 @@ func IsZeroValue(val interface{}) bool {
|
|||||||
return val == nil || reflect.DeepEqual(val, reflect.Zero(reflect.TypeOf(val)).Interface())
|
return val == nil || reflect.DeepEqual(val, reflect.Zero(reflect.TypeOf(val)).Interface())
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssertInterfaceRequired recursively checks each struct in a slice against the callback.
|
// AssertRecurseInterfaceRequired recursively checks each struct in a slice against the callback.
|
||||||
// This method traverse nested slices in a preorder fashion.
|
// This method traverse nested slices in a preorder fashion.
|
||||||
func AssertRecurseInterfaceRequired(obj interface{}, callback func(interface{}) error) error {
|
func AssertRecurseInterfaceRequired(obj interface{}, callback func(interface{}) error) error {
|
||||||
return AssertRecurseValueRequired(reflect.ValueOf(obj), callback)
|
return AssertRecurseValueRequired(reflect.ValueOf(obj), callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssertNestedValueRequired checks each struct in the nested slice against the callback.
|
// AssertRecurseValueRequired checks each struct in the nested slice against the callback.
|
||||||
// This method traverse nested slices in a preorder fashion.
|
// This method traverse nested slices in a preorder fashion.
|
||||||
func AssertRecurseValueRequired(value reflect.Value, callback func(interface{}) error) error {
|
func AssertRecurseValueRequired(value reflect.Value, callback func(interface{}) error) error {
|
||||||
switch value.Kind() {
|
switch value.Kind() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{{>partial_header}}
|
{{>partial_header}}
|
||||||
package {{packageName}}
|
package {{packageName}}
|
||||||
|
|
||||||
//Implementation response defines an error code with the associated body
|
// ImplResponse response defines an error code with the associated body
|
||||||
type ImplResponse struct {
|
type ImplResponse struct {
|
||||||
Code int
|
Code int
|
||||||
{{#addResponseHeaders}}
|
{{#addResponseHeaders}}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"target": "{{#supportsES6}}es6{{/supportsES6}}{{^supportsES6}}es5{{/supportsES6}}",
|
"target": "{{#supportsES6}}ES6{{/supportsES6}}{{^supportsES6}}ES5{{/supportsES6}}",
|
||||||
"module": "commonjs",
|
"module": "{{#supportsES6}}ES6{{/supportsES6}}{{^supportsES6}}CommonJS{{/supportsES6}}",
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"rootDir": ".",
|
"rootDir": ".",
|
||||||
|
@ -9,7 +9,6 @@ import org.openapitools.codegen.DefaultGenerator;
|
|||||||
import org.openapitools.codegen.languages.AbstractKotlinCodegen;
|
import org.openapitools.codegen.languages.AbstractKotlinCodegen;
|
||||||
import org.openapitools.codegen.languages.KotlinClientCodegen;
|
import org.openapitools.codegen.languages.KotlinClientCodegen;
|
||||||
import org.openapitools.codegen.languages.KotlinServerCodegen;
|
import org.openapitools.codegen.languages.KotlinServerCodegen;
|
||||||
import org.openapitools.codegen.languages.KotlinServerDeprecatedCodegen;
|
|
||||||
import org.openapitools.codegen.languages.KotlinSpringServerCodegen;
|
import org.openapitools.codegen.languages.KotlinSpringServerCodegen;
|
||||||
import org.openapitools.codegen.languages.KotlinVertxServerCodegen;
|
import org.openapitools.codegen.languages.KotlinVertxServerCodegen;
|
||||||
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.DataProvider;
|
||||||
@ -29,7 +28,6 @@ public class KotlinModelCodegenTest {
|
|||||||
return new Object[][]{
|
return new Object[][]{
|
||||||
{new KotlinClientCodegen()},
|
{new KotlinClientCodegen()},
|
||||||
{new KotlinServerCodegen()},
|
{new KotlinServerCodegen()},
|
||||||
{new KotlinServerDeprecatedCodegen()},
|
|
||||||
{new KotlinSpringServerCodegen()},
|
{new KotlinSpringServerCodegen()},
|
||||||
{new KotlinVertxServerCodegen()},
|
{new KotlinVertxServerCodegen()},
|
||||||
};
|
};
|
||||||
@ -90,7 +88,7 @@ public class KotlinModelCodegenTest {
|
|||||||
String outputPath = generateModels(codegen, "src/test/resources/3_0/issue_9848.yaml", false);
|
String outputPath = generateModels(codegen, "src/test/resources/3_0/issue_9848.yaml", false);
|
||||||
|
|
||||||
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/NonUniqueArray.kt"),
|
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/NonUniqueArray.kt"),
|
||||||
codegen instanceof KotlinVertxServerCodegen || codegen instanceof KotlinServerDeprecatedCodegen
|
codegen instanceof KotlinVertxServerCodegen
|
||||||
? "val array: kotlin.Array<kotlin.String>"
|
? "val array: kotlin.Array<kotlin.String>"
|
||||||
: "val array: kotlin.collections.List<kotlin.String>"
|
: "val array: kotlin.collections.List<kotlin.String>"
|
||||||
);
|
);
|
||||||
@ -104,7 +102,7 @@ public class KotlinModelCodegenTest {
|
|||||||
String outputPath = generateModels(codegen, "src/test/resources/3_0/issue_9848.yaml", true);
|
String outputPath = generateModels(codegen, "src/test/resources/3_0/issue_9848.yaml", true);
|
||||||
|
|
||||||
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/NonUniqueArray.kt"),
|
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/NonUniqueArray.kt"),
|
||||||
codegen instanceof KotlinVertxServerCodegen || codegen instanceof KotlinServerDeprecatedCodegen
|
codegen instanceof KotlinVertxServerCodegen
|
||||||
? "var array: kotlin.Array<kotlin.String>"
|
? "var array: kotlin.Array<kotlin.String>"
|
||||||
: "var array: kotlin.collections.MutableList<kotlin.String>"
|
: "var array: kotlin.collections.MutableList<kotlin.String>"
|
||||||
);
|
);
|
||||||
@ -112,26 +110,4 @@ public class KotlinModelCodegenTest {
|
|||||||
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/UniqueArray.kt"),
|
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/UniqueArray.kt"),
|
||||||
"var array: kotlin.collections.MutableSet<kotlin.String>");
|
"var array: kotlin.collections.MutableSet<kotlin.String>");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dataProvider = "generators")
|
|
||||||
public void mutableContainerTypes(AbstractKotlinCodegen codegen) throws IOException {
|
|
||||||
final String outputPath = generateModels(codegen, "src/test/resources/3_0/kotlin/issue11088-model-mutable-with-containers.yaml", true);
|
|
||||||
|
|
||||||
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/MyModel.kt"),
|
|
||||||
codegen instanceof KotlinVertxServerCodegen || codegen instanceof KotlinServerDeprecatedCodegen
|
|
||||||
? "var myIntArray: kotlin.Array<kotlin.Int>?"
|
|
||||||
: "var myIntArray: kotlin.collections.MutableList<kotlin.Int>?",
|
|
||||||
"var myStringSet: kotlin.collections.MutableSet<kotlin.String>?",
|
|
||||||
"var myFreeFormObjectWithPrimitiveValues: kotlin.collections.MutableMap<kotlin.String, kotlin.Int>?",
|
|
||||||
"var myFreeFormObjectWithComplexValues: kotlin.collections.MutableMap<kotlin.String, MyModelMyFreeFormObjectWithComplexValues>?",
|
|
||||||
"var myFreeFormObject: kotlin.collections.MutableMap<kotlin.String, kotlin.Any>?"
|
|
||||||
);
|
|
||||||
|
|
||||||
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/models/MyModelMyFreeFormObjectWithComplexValues.kt"),
|
|
||||||
codegen instanceof KotlinVertxServerCodegen || codegen instanceof KotlinServerDeprecatedCodegen
|
|
||||||
? "var myArrayOfInts: kotlin.Array<kotlin.Int>?"
|
|
||||||
: "var myArrayOfInts: kotlin.collections.MutableList<kotlin.Int>?",
|
|
||||||
"var mySetOfStrings: kotlin.collections.MutableSet<kotlin.String>?"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
|
||||||
* Copyright 2018 SmartBear Software
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.openapitools.codegen.silex;
|
|
||||||
|
|
||||||
import org.openapitools.codegen.AbstractOptionsTest;
|
|
||||||
import org.openapitools.codegen.CodegenConfig;
|
|
||||||
import org.openapitools.codegen.languages.PhpSilexServerCodegen;
|
|
||||||
import org.openapitools.codegen.options.PhpSilexServerOptionsProvider;
|
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
|
|
||||||
public class PhpSilexServerOptionsTest extends AbstractOptionsTest {
|
|
||||||
private PhpSilexServerCodegen clientCodegen = mock(PhpSilexServerCodegen.class, mockSettings);
|
|
||||||
|
|
||||||
public PhpSilexServerOptionsTest() {
|
|
||||||
super(new PhpSilexServerOptionsProvider());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected CodegenConfig getCodegenConfig() {
|
|
||||||
return clientCodegen;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Override
|
|
||||||
protected void verifyOptions() {
|
|
||||||
verify(clientCodegen).setSortParamsByRequiredFlag(Boolean.valueOf(PhpSilexServerOptionsProvider.SORT_PARAMS_VALUE));
|
|
||||||
verify(clientCodegen).setEnumUnknownDefaultCase(Boolean.parseBoolean(PhpSilexServerOptionsProvider.ENUM_UNKNOWN_DEFAULT_CASE_VALUE));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
|
||||||
* Copyright 2018 SmartBear Software
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.openapitools.codegen.typescript.typescriptangularjs;
|
|
||||||
|
|
||||||
import org.openapitools.codegen.AbstractOptionsTest;
|
|
||||||
import org.openapitools.codegen.CodegenConfig;
|
|
||||||
import org.openapitools.codegen.languages.TypeScriptAngularJsClientCodegen;
|
|
||||||
import org.openapitools.codegen.options.TypeScriptAngularJsClientOptionsProvider;
|
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
|
|
||||||
public class TypeScriptAngularJsClientOptionsTest extends AbstractOptionsTest {
|
|
||||||
private TypeScriptAngularJsClientCodegen clientCodegen = mock(TypeScriptAngularJsClientCodegen.class, mockSettings);
|
|
||||||
|
|
||||||
public TypeScriptAngularJsClientOptionsTest() {
|
|
||||||
super(new TypeScriptAngularJsClientOptionsProvider());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected CodegenConfig getCodegenConfig() {
|
|
||||||
return clientCodegen;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Override
|
|
||||||
protected void verifyOptions() {
|
|
||||||
verify(clientCodegen).setSortParamsByRequiredFlag(Boolean.valueOf(TypeScriptAngularJsClientOptionsProvider.SORT_PARAMS_VALUE));
|
|
||||||
verify(clientCodegen).setModelPropertyNaming(TypeScriptAngularJsClientOptionsProvider.MODEL_PROPERTY_NAMING_VALUE);
|
|
||||||
verify(clientCodegen).setParamNaming(TypeScriptAngularJsClientOptionsProvider.PARAM_NAMING_VALUE);
|
|
||||||
verify(clientCodegen).setSupportsES6(Boolean.valueOf(TypeScriptAngularJsClientOptionsProvider.SUPPORTS_ES6_VALUE));
|
|
||||||
verify(clientCodegen).setPrependFormOrBodyParameters(Boolean.valueOf(TypeScriptAngularJsClientOptionsProvider.PREPEND_FORM_OR_BODY_PARAMETERS_VALUE));
|
|
||||||
verify(clientCodegen).setEnumUnknownDefaultCase(Boolean.parseBoolean(TypeScriptAngularJsClientOptionsProvider.ENUM_UNKNOWN_DEFAULT_CASE_VALUE));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,286 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
|
||||||
* Copyright 2018 SmartBear Software
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.openapitools.codegen.typescript.typescriptangularjs;
|
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import io.swagger.v3.oas.models.OpenAPI;
|
|
||||||
import io.swagger.v3.oas.models.media.*;
|
|
||||||
import io.swagger.v3.parser.util.SchemaTypeUtil;
|
|
||||||
import org.openapitools.codegen.CodegenModel;
|
|
||||||
import org.openapitools.codegen.CodegenProperty;
|
|
||||||
import org.openapitools.codegen.DefaultCodegen;
|
|
||||||
import org.openapitools.codegen.TestUtils;
|
|
||||||
import org.openapitools.codegen.languages.TypeScriptAngularJsClientCodegen;
|
|
||||||
import org.openapitools.codegen.languages.TypeScriptFetchClientCodegen;
|
|
||||||
import org.testng.Assert;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
import java.time.ZoneOffset;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
@SuppressWarnings("static-method")
|
|
||||||
public class TypeScriptAngularJsModelTest {
|
|
||||||
|
|
||||||
@Test(description = "convert a simple TypeScript Angular model")
|
|
||||||
public void simpleModelTest() {
|
|
||||||
final Schema schema = new Schema()
|
|
||||||
.description("a sample model")
|
|
||||||
.addProperties("id", new IntegerSchema().format(SchemaTypeUtil.INTEGER64_FORMAT))
|
|
||||||
.addProperties("name", new StringSchema())
|
|
||||||
.addProperties("createdAt", new DateTimeSchema())
|
|
||||||
.addProperties("birthDate", new DateSchema())
|
|
||||||
.addProperties("active", new BooleanSchema())
|
|
||||||
.addRequiredItem("id")
|
|
||||||
.addRequiredItem("name");
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a sample model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 5);
|
|
||||||
|
|
||||||
final CodegenProperty property1 = cm.vars.get(0);
|
|
||||||
Assert.assertEquals(property1.baseName, "id");
|
|
||||||
Assert.assertEquals(property1.dataType, "number");
|
|
||||||
Assert.assertEquals(property1.name, "id");
|
|
||||||
Assert.assertEquals(property1.defaultValue, "undefined");
|
|
||||||
Assert.assertEquals(property1.baseType, "number");
|
|
||||||
Assert.assertTrue(property1.required);
|
|
||||||
Assert.assertFalse(property1.isContainer);
|
|
||||||
|
|
||||||
final CodegenProperty property2 = cm.vars.get(1);
|
|
||||||
Assert.assertEquals(property2.baseName, "name");
|
|
||||||
Assert.assertEquals(property2.dataType, "string");
|
|
||||||
Assert.assertEquals(property2.name, "name");
|
|
||||||
Assert.assertEquals(property2.defaultValue, "undefined");
|
|
||||||
Assert.assertEquals(property2.baseType, "string");
|
|
||||||
Assert.assertTrue(property2.required);
|
|
||||||
Assert.assertFalse(property2.isContainer);
|
|
||||||
|
|
||||||
final CodegenProperty property3 = cm.vars.get(2);
|
|
||||||
Assert.assertEquals(property3.baseName, "createdAt");
|
|
||||||
Assert.assertEquals(property3.complexType, null);
|
|
||||||
Assert.assertEquals(property3.dataType, "string");
|
|
||||||
Assert.assertEquals(property3.name, "createdAt");
|
|
||||||
Assert.assertEquals(property3.defaultValue, "undefined");
|
|
||||||
Assert.assertFalse(property3.required);
|
|
||||||
Assert.assertFalse(property3.isContainer);
|
|
||||||
|
|
||||||
final CodegenProperty property4 = cm.vars.get(3);
|
|
||||||
Assert.assertEquals(property4.baseName, "birthDate");
|
|
||||||
Assert.assertEquals(property4.complexType, null);
|
|
||||||
Assert.assertEquals(property4.dataType, "string");
|
|
||||||
Assert.assertEquals(property4.name, "birthDate");
|
|
||||||
Assert.assertEquals(property4.defaultValue, "undefined");
|
|
||||||
Assert.assertFalse(property4.required);
|
|
||||||
Assert.assertFalse(property4.isContainer);
|
|
||||||
|
|
||||||
final CodegenProperty property5 = cm.vars.get(4);
|
|
||||||
Assert.assertEquals(property5.baseName, "active");
|
|
||||||
Assert.assertEquals(property5.complexType, null);
|
|
||||||
Assert.assertEquals(property5.dataType, "boolean");
|
|
||||||
Assert.assertEquals(property5.name, "active");
|
|
||||||
Assert.assertEquals(property5.defaultValue, "undefined");
|
|
||||||
Assert.assertFalse(property5.required);
|
|
||||||
Assert.assertFalse(property5.isContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert and check default values for a simple TypeScript Angular model")
|
|
||||||
public void simpleModelDefaultValuesTest() throws ParseException {
|
|
||||||
IntegerSchema integerSchema = new IntegerSchema().format(SchemaTypeUtil.INTEGER64_FORMAT);
|
|
||||||
integerSchema.setDefault(1234);
|
|
||||||
|
|
||||||
StringSchema stringSchema = new StringSchema();
|
|
||||||
stringSchema.setDefault("Jack");
|
|
||||||
|
|
||||||
OffsetDateTime testOffsetDateTime = OffsetDateTime.of(LocalDateTime.of(2020, 1, 1, 12, 0), ZoneOffset.UTC);
|
|
||||||
DateTimeSchema dateTimeSchema = new DateTimeSchema();
|
|
||||||
dateTimeSchema.setDefault(testOffsetDateTime);
|
|
||||||
|
|
||||||
Date testDate = Date.from(testOffsetDateTime.toInstant());
|
|
||||||
DateSchema dateSchema = new DateSchema();
|
|
||||||
dateSchema.setDefault(testDate);
|
|
||||||
|
|
||||||
BooleanSchema booleanSchema = new BooleanSchema();
|
|
||||||
booleanSchema.setDefault(true);
|
|
||||||
|
|
||||||
final Schema model = new Schema()
|
|
||||||
.description("a sample model")
|
|
||||||
.addProperties("id", integerSchema)
|
|
||||||
.addProperties("name", stringSchema)
|
|
||||||
.addProperties("createdAt", dateTimeSchema)
|
|
||||||
.addProperties("birthDate", dateSchema)
|
|
||||||
.addProperties("active", booleanSchema)
|
|
||||||
.addRequiredItem("id")
|
|
||||||
.addRequiredItem("name");
|
|
||||||
|
|
||||||
final DefaultCodegen codegen = new TypeScriptFetchClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a sample model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 5);
|
|
||||||
|
|
||||||
final CodegenProperty property1 = cm.vars.get(0);
|
|
||||||
Assert.assertEquals(property1.baseName, "id");
|
|
||||||
Assert.assertEquals(property1.defaultValue, "1234");
|
|
||||||
|
|
||||||
final CodegenProperty property2 = cm.vars.get(1);
|
|
||||||
Assert.assertEquals(property2.baseName, "name");
|
|
||||||
Assert.assertEquals(property2.defaultValue, "'Jack'");
|
|
||||||
|
|
||||||
final CodegenProperty property3 = cm.vars.get(2);
|
|
||||||
Assert.assertEquals(property3.baseName, "createdAt");
|
|
||||||
Assert.assertEquals(OffsetDateTime.parse(property3.defaultValue), testOffsetDateTime);
|
|
||||||
|
|
||||||
final CodegenProperty property4 = cm.vars.get(3);
|
|
||||||
Assert.assertEquals(property4.baseName, "birthDate");
|
|
||||||
Assert.assertEquals(new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH).parse(property4.defaultValue), testDate);
|
|
||||||
|
|
||||||
final CodegenProperty property5 = cm.vars.get(4);
|
|
||||||
Assert.assertEquals(property5.baseName, "active");
|
|
||||||
Assert.assertEquals(property5.defaultValue, "true");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert a model with list property")
|
|
||||||
public void listPropertyTest() {
|
|
||||||
final Schema schema = new Schema()
|
|
||||||
.description("a sample model")
|
|
||||||
.addProperties("id", new IntegerSchema().format(SchemaTypeUtil.INTEGER64_FORMAT))
|
|
||||||
.addProperties("urls", new ArraySchema().items(new StringSchema()))
|
|
||||||
.addRequiredItem("id");
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a sample model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 2);
|
|
||||||
|
|
||||||
final CodegenProperty property1 = cm.vars.get(0);
|
|
||||||
Assert.assertEquals(property1.baseName, "id");
|
|
||||||
Assert.assertEquals(property1.dataType, "number");
|
|
||||||
Assert.assertEquals(property1.name, "id");
|
|
||||||
Assert.assertEquals(property1.defaultValue, "undefined");
|
|
||||||
Assert.assertEquals(property1.baseType, "number");
|
|
||||||
Assert.assertTrue(property1.required);
|
|
||||||
|
|
||||||
final CodegenProperty property2 = cm.vars.get(1);
|
|
||||||
Assert.assertEquals(property2.baseName, "urls");
|
|
||||||
Assert.assertEquals(property2.dataType, "Array<string>");
|
|
||||||
Assert.assertEquals(property2.name, "urls");
|
|
||||||
Assert.assertEquals(property2.baseType, "Array");
|
|
||||||
Assert.assertFalse(property2.required);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert a model with complex property")
|
|
||||||
public void complexPropertyTest() {
|
|
||||||
final Schema schema = new Schema()
|
|
||||||
.description("a sample model")
|
|
||||||
.addProperties("children", new Schema().$ref("#/definitions/Children"));
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a sample model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 1);
|
|
||||||
|
|
||||||
final CodegenProperty property1 = cm.vars.get(0);
|
|
||||||
Assert.assertEquals(property1.baseName, "children");
|
|
||||||
Assert.assertEquals(property1.dataType, "models.Children");
|
|
||||||
Assert.assertEquals(property1.name, "children");
|
|
||||||
Assert.assertEquals(property1.defaultValue, "undefined");
|
|
||||||
Assert.assertEquals(property1.baseType, "models.Children");
|
|
||||||
Assert.assertFalse(property1.required);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert a model with complex list property")
|
|
||||||
public void complexListPropertyTest() {
|
|
||||||
final Schema schema = new Schema()
|
|
||||||
.description("a sample model")
|
|
||||||
.addProperties("children", new ArraySchema()
|
|
||||||
.items(new Schema().$ref("#/definitions/Children")));
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a sample model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 1);
|
|
||||||
|
|
||||||
final CodegenProperty property1 = cm.vars.get(0);
|
|
||||||
Assert.assertEquals(property1.baseName, "children");
|
|
||||||
Assert.assertEquals(property1.complexType, "models.Children");
|
|
||||||
Assert.assertEquals(property1.dataType, "Array<models.Children>");
|
|
||||||
Assert.assertEquals(property1.name, "children");
|
|
||||||
Assert.assertEquals(property1.baseType, "Array");
|
|
||||||
Assert.assertFalse(property1.required);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert an array model")
|
|
||||||
public void arrayModelTest() {
|
|
||||||
final Schema schema = new ArraySchema()
|
|
||||||
.items(new Schema().$ref("#/definitions/Children"))
|
|
||||||
.description("an array model");
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "an array model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "convert a map model")
|
|
||||||
public void mapModelTest() {
|
|
||||||
final Schema schema = new Schema()
|
|
||||||
.description("a map model")
|
|
||||||
.additionalProperties(new Schema().$ref("#/definitions/Children"));
|
|
||||||
final DefaultCodegen codegen = new TypeScriptAngularJsClientCodegen();
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
|
||||||
codegen.setOpenAPI(openAPI);
|
|
||||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
|
||||||
|
|
||||||
Assert.assertEquals(cm.name, "sample");
|
|
||||||
Assert.assertEquals(cm.classname, "Sample");
|
|
||||||
Assert.assertEquals(cm.description, "a map model");
|
|
||||||
Assert.assertEquals(cm.vars.size(), 0);
|
|
||||||
Assert.assertEquals(cm.imports.size(), 1);
|
|
||||||
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("models.Children")).size(), 1);
|
|
||||||
}
|
|
||||||
}
|
|
5
pom.xml
5
pom.xml
@ -11,7 +11,7 @@
|
|||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>openapi-generator-project</name>
|
<name>openapi-generator-project</name>
|
||||||
<!-- RELEASE_VERSION -->
|
<!-- RELEASE_VERSION -->
|
||||||
<version>5.4.0</version>
|
<version>6.0.0-SNAPSHOT</version>
|
||||||
<!-- /RELEASE_VERSION -->
|
<!-- /RELEASE_VERSION -->
|
||||||
<url>https://github.com/openapitools/openapi-generator</url>
|
<url>https://github.com/openapitools/openapi-generator</url>
|
||||||
<scm>
|
<scm>
|
||||||
@ -1346,7 +1346,7 @@
|
|||||||
<module>samples/openapi3/client/petstore/java/jersey2-java8</module>
|
<module>samples/openapi3/client/petstore/java/jersey2-java8</module>
|
||||||
<module>samples/client/others/java/okhttp-gson-streaming</module>
|
<module>samples/client/others/java/okhttp-gson-streaming</module>
|
||||||
<module>samples/client/petstore/java/okhttp-gson</module>
|
<module>samples/client/petstore/java/okhttp-gson</module>
|
||||||
<module>samples/client/petstore/java/okhttp-gson-nextgen</module>
|
<!--<module>samples/client/petstore/java/okhttp-gson-nextgen</module>-->
|
||||||
<module>samples/client/petstore/java/retrofit2</module>
|
<module>samples/client/petstore/java/retrofit2</module>
|
||||||
<module>samples/client/petstore/java/retrofit2rx2</module>
|
<module>samples/client/petstore/java/retrofit2rx2</module>
|
||||||
<module>samples/client/petstore/java/retrofit2rx3</module>
|
<module>samples/client/petstore/java/retrofit2rx3</module>
|
||||||
@ -1449,7 +1449,6 @@
|
|||||||
</activation>
|
</activation>
|
||||||
<modules>
|
<modules>
|
||||||
<module>samples/openapi3/client/petstore/dart2/petstore_client_lib</module>
|
<module>samples/openapi3/client/petstore/dart2/petstore_client_lib</module>
|
||||||
<module>samples/openapi3/client/petstore/dart2/petstore</module>
|
|
||||||
<module>samples/openapi3/client/petstore/dart-dio-next/petstore_client_lib_fake</module>
|
<module>samples/openapi3/client/petstore/dart-dio-next/petstore_client_lib_fake</module>
|
||||||
</modules>
|
</modules>
|
||||||
</profile>
|
</profile>
|
||||||
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -39,7 +39,7 @@ public class ServerConfiguration {
|
|||||||
if (variables != null && variables.containsKey(name)) {
|
if (variables != null && variables.containsKey(name)) {
|
||||||
value = variables.get(name);
|
value = variables.get(name);
|
||||||
if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) {
|
if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) {
|
||||||
throw new RuntimeException("The variable " + name + " in the server URL has invalid value " + value + ".");
|
throw new IllegalArgumentException("The variable " + name + " in the server URL has invalid value " + value + ".");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url = url.replaceAll("\\{" + name + "\\}", value);
|
url = url.replaceAll("\\{" + name + "\\}", value);
|
||||||
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
@ -1 +1 @@
|
|||||||
5.4.0
|
6.0.0-SNAPSHOT
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user