[JAVA] RxJava3 support (#6622)

* rx3 support

* ran the shell script ./bin/generate-samples.sht

* added missing rx3 migration, removed tabs
This commit is contained in:
tgerth 2020-06-12 11:23:42 +02:00 committed by GitHub
parent 8689625af3
commit 146bfeb6d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 187 additions and 114 deletions

View File

@ -0,0 +1,9 @@
generatorName: java
outputDir: samples/client/petstore/java/retrofit2rx3
library: retrofit2
inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml
templateDir: modules/openapi-generator/src/main/resources/Java
additionalProperties:
useRxJava3: "true"
artifactId: petstore-retrofit2-rx3
hideGenerationTimestamp: "true"

View File

@ -61,6 +61,7 @@ If false: the 'additionalProperties' implementation is compliant with the OAS an
|useRuntimeException|Use RuntimeException instead of Exception| |false|
|useRxJava|Whether to use the RxJava adapter with the retrofit2 library.| |false|
|useRxJava2|Whether to use the RxJava2 adapter with the retrofit2 library.| |false|
|useRxJava3|Whether to use the RxJava3 adapter with the retrofit2 library.| |false|
|withXml|whether to include support for application/xml content type and include XML annotations in the model (works with libraries that provide support for JSON and XML)| |false|
## IMPORT MAPPING

View File

@ -51,6 +51,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
public static final String USE_RX_JAVA = "useRxJava";
public static final String USE_RX_JAVA2 = "useRxJava2";
public static final String USE_RX_JAVA3 = "useRxJava3";
public static final String DO_NOT_USE_RX = "doNotUseRx";
public static final String USE_PLAY_WS = "usePlayWS";
public static final String PLAY_VERSION = "playVersion";
@ -88,6 +89,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
protected String gradleWrapperPackage = "gradle.wrapper";
protected boolean useRxJava = false;
protected boolean useRxJava2 = false;
protected boolean useRxJava3 = false;
// backwards compatibility for openapi configs that specify neither rx1 nor rx2
// (mustache does not allow for boolean operators so we need this extra field)
protected boolean doNotUseRx = true;
@ -131,6 +133,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
cliOptions.add(CliOption.newBoolean(USE_RX_JAVA, "Whether to use the RxJava adapter with the retrofit2 library."));
cliOptions.add(CliOption.newBoolean(USE_RX_JAVA2, "Whether to use the RxJava2 adapter with the retrofit2 library."));
cliOptions.add(CliOption.newBoolean(USE_RX_JAVA3, "Whether to use the RxJava3 adapter with the retrofit2 library."));
cliOptions.add(CliOption.newBoolean(PARCELABLE_MODEL, "Whether to generate models for Android that implement Parcelable with the okhttp-gson library."));
cliOptions.add(CliOption.newBoolean(USE_PLAY_WS, "Use Play! Async HTTP client (Play WS API)"));
cliOptions.add(CliOption.newString(PLAY_VERSION, "Version of Play! Framework (possible values \"play24\", \"play25\" (default), \"play26\")"));
@ -148,7 +151,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
supportedLibraries.put(JERSEY2, "HTTP client: Jersey client 2.25.1. JSON processing: Jackson 2.9.x");
supportedLibraries.put(FEIGN, "HTTP client: OpenFeign 9.x (deprecated) or 10.x (default). JSON processing: Jackson 2.9.x.");
supportedLibraries.put(OKHTTP_GSON, "[DEFAULT] HTTP client: OkHttp 3.x. JSON processing: Gson 2.8.x. Enable Parcelable models on Android using '-DparcelableModel=true'. Enable gzip request encoding using '-DuseGzipFeature=true'.");
supportedLibraries.put(RETROFIT_2, "HTTP client: OkHttp 3.x. JSON processing: Gson 2.x (Retrofit 2.3.0). Enable the RxJava adapter using '-DuseRxJava[2]=true'. (RxJava 1.x or 2.x)");
supportedLibraries.put(RETROFIT_2, "HTTP client: OkHttp 3.x. JSON processing: Gson 2.x (Retrofit 2.3.0). Enable the RxJava adapter using '-DuseRxJava[2/3]=true'. (RxJava 1.x or 2.x or 3.x)");
supportedLibraries.put(RESTTEMPLATE, "HTTP client: Spring RestTemplate 4.x. JSON processing: Jackson 2.9.x");
supportedLibraries.put(WEBCLIENT, "HTTP client: Spring WebClient 5.x. JSON processing: Jackson 2.9.x");
supportedLibraries.put(RESTEASY, "HTTP client: Resteasy client 3.x. JSON processing: Jackson 2.9.x");
@ -213,15 +216,33 @@ public class JavaClientCodegen extends AbstractJavaCodegen
super.processOpts();
// RxJava
if (additionalProperties.containsKey(USE_RX_JAVA) && additionalProperties.containsKey(USE_RX_JAVA2)) {
LOGGER.warn("You specified both RxJava versions 1 and 2 but they are mutually exclusive. Defaulting to v2.");
} else if (additionalProperties.containsKey(USE_RX_JAVA)) {
this.setUseRxJava(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA).toString()));
if (additionalProperties.containsKey(USE_RX_JAVA) && additionalProperties.containsKey(USE_RX_JAVA2) && additionalProperties.containsKey(USE_RX_JAVA3)){
LOGGER.warn("You specified all RxJava versions 1, 2 and 3 but they are mutually exclusive. Defaulting to v3.");
this.setUseRxJava3(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA3).toString()));
}else {
if (additionalProperties.containsKey(USE_RX_JAVA) && additionalProperties.containsKey(USE_RX_JAVA2)){
LOGGER.warn("You specified both RxJava versions 1 and 2 but they are mutually exclusive. Defaulting to v2.");
this.setUseRxJava2(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA2).toString()));
}else if (additionalProperties.containsKey(USE_RX_JAVA) && additionalProperties.containsKey(USE_RX_JAVA3)) {
LOGGER.warn("You specified both RxJava versions 1 and 3 but they are mutually exclusive. Defaulting to v3.");
this.setUseRxJava3(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA3).toString()));
}else if(additionalProperties.containsKey(USE_RX_JAVA2) && additionalProperties.containsKey(USE_RX_JAVA3)){
LOGGER.warn("You specified both RxJava versions 2 and 3 but they are mutually exclusive. Defaulting to v3.");
this.setUseRxJava3(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA3).toString()));
}else{
if(additionalProperties.containsKey(USE_RX_JAVA)){
this.setUseRxJava(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA).toString()));
}
if(additionalProperties.containsKey(USE_RX_JAVA2)){
this.setUseRxJava2(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA2).toString()));
}
if(additionalProperties.containsKey(USE_RX_JAVA3)){
this.setUseRxJava3(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA3).toString()));
}
}
}
if (additionalProperties.containsKey(USE_RX_JAVA2)) {
this.setUseRxJava2(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA2).toString()));
}
if (!useRxJava && !useRxJava2) {
if (!useRxJava && !useRxJava2 && !useRxJava3) {
additionalProperties.put(DO_NOT_USE_RX, true);
}
@ -802,6 +823,11 @@ public class JavaClientCodegen extends AbstractJavaCodegen
this.useRxJava2 = useRxJava2;
doNotUseRx = false;
}
public void setUseRxJava3(boolean useRxJava3) {
this.useRxJava3 = useRxJava3;
doNotUseRx = false;
}
public void setDoNotUseRx(boolean doNotUseRx) {
this.doNotUseRx = doNotUseRx;

View File

@ -25,6 +25,9 @@ import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
{{#useRxJava2}}
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
{{/useRxJava2}}
{{#useRxJava3}}
import hu.akarnokd.rxjava3.retrofit.RxJava3CallAdapterFactory;
{{/useRxJava3}}
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import {{invokerPackage}}.auth.HttpBasicAuth;
@ -151,7 +154,9 @@ public class ApiClient {
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
{{/useRxJava}}{{#useRxJava2}}
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
{{/useRxJava2}}
{{/useRxJava2}}{{#useRxJava3}}
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
{{/useRxJava3}}
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonCustomConverterFactory.create(json.getGson()));
}

View File

@ -8,10 +8,16 @@ import rx.Observable;
{{#useRxJava2}}
import io.reactivex.Observable;
{{/useRxJava2}}
{{#useRxJava3}}
import io.reactivex.rxjava3.core.Observable;
{{/useRxJava3}}
{{^returnType}}
{{#useRxJava2}}
import io.reactivex.Completable;
{{/useRxJava2}}
{{#useRxJava3}}
import io.reactivex.rxjava3.core.Completable;
{{/useRxJava3}}
{{/returnType}}
{{#doNotUseRx}}
import retrofit2.Call;
@ -41,7 +47,7 @@ public interface {{classname}} {
{{#allParams}}
* @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}
{{/allParams}}
* @return {{^doNotUseRx}}{{#useRxJava}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/useRxJava}}{{#useRxJava2}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{returnType}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava2}}{{/doNotUseRx}}{{#doNotUseRx}}Call<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/doNotUseRx}}
* @return {{^doNotUseRx}}{{#useRxJava}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/useRxJava}}{{#useRxJava2}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{returnType}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava2}}{{#useRxJava3}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{returnType}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava3}}{{/doNotUseRx}}{{#doNotUseRx}}Call<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/doNotUseRx}}
{{#isDeprecated}}
* @deprecated
{{/isDeprecated}}
@ -68,7 +74,7 @@ public interface {{classname}} {
{{/prioritizedContentTypes}}
{{/formParams}}
@{{httpMethod}}("{{{path}}}")
{{^doNotUseRx}}{{#useRxJava}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/useRxJava}}{{#useRxJava2}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava2}}{{/doNotUseRx}}{{#doNotUseRx}}Call<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/doNotUseRx}} {{operationId}}({{^allParams}});{{/allParams}}
{{^doNotUseRx}}{{#useRxJava}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/useRxJava}}{{#useRxJava2}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava2}}{{#useRxJava3}}{{#returnType}}Observable<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}Completable{{/returnType}}{{/useRxJava3}}{{/doNotUseRx}}{{#doNotUseRx}}Call<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}{{/isResponseFile}}>{{/doNotUseRx}} {{operationId}}({{^allParams}});{{/allParams}}
{{#allParams}}{{>libraries/retrofit2/queryParams}}{{>libraries/retrofit2/pathParams}}{{>libraries/retrofit2/headerParams}}{{>libraries/retrofit2/bodyParams}}{{>libraries/retrofit2/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}}
);{{/hasMore}}{{/allParams}}

View File

@ -145,6 +145,9 @@ ext {
{{#useRxJava2}}
rx_java_version = "2.1.1"
{{/useRxJava2}}
{{#useRxJava3}}
rx_java_version = "3.0.4"
{{/useRxJava3}}
{{#joda}}
jodatime_version = "2.9.9"
{{/joda}}
@ -166,6 +169,10 @@ dependencies {
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile "io.reactivex.rxjava2:rxjava:$rx_java_version"
{{/useRxJava2}}
{{#useRxJava3}}
compile 'com.github.akarnokd:rxjava3-retrofit-adapter:3.0.0'
compile "io.reactivex.rxjava3:rxjava:$rx_java_version"
{{/useRxJava3}}
compile "io.swagger:swagger-annotations:$swagger_annotations_version"
compile "com.google.code.findbugs:jsr305:3.0.2"
compile ("org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version"){

View File

@ -44,6 +44,10 @@ lazy val root = (project in file(".")).
"com.squareup.retrofit2" % "adapter-rxjava2" % "2.3.0" % "compile",
"io.reactivex.rxjava2" % "rxjava" % "2.1.1" % "compile",
{{/useRxJava2}}
{{#useRxJava3}}
"com.github.akarnokd" % "rxjava3-retrofit-adapter" % "3.0.0" % "compile",
"io.reactivex.rxjava3" % "rxjava" % "3.0.4" % "compile",
{{/useRxJava3}}
"io.swagger" % "swagger-annotations" % "1.5.21" % "compile",
"org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile",
{{#joda}}

View File

@ -276,6 +276,18 @@
<version>${retrofit-version}</version>
</dependency>
{{/useRxJava2}}
{{#useRxJava3}}
<dependency>
<groupId>io.reactivex.rxjava3</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava-version}</version>
</dependency>
<dependency>
<groupId>com.github.akarnokd</groupId>
<artifactId>rxjava3-retrofit-adapter</artifactId>
<version>3.0.0</version>
</dependency>
{{/useRxJava3}}
{{#usePlayWS}}
<!-- JSON processing: jackson -->
<dependency>
@ -400,6 +412,9 @@
{{#useRxJava2}}
<rxjava-version>2.1.1</rxjava-version>
{{/useRxJava2}}
{{#useRxJava3}}
<rxjava-version>3.0.4</rxjava-version>
{{/useRxJava3}}
{{#joda}}
<jodatime-version>2.9.9</jodatime-version>
{{/joda}}

View File

@ -126,7 +126,7 @@ public class ApiClient {
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonCustomConverterFactory.create(json.getGson()));
}

View File

@ -9,11 +9,11 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
variables.ts

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,11 +9,11 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
variables.ts

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,11 +9,11 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
variables.ts

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,11 +9,11 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
variables.ts

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -9,12 +9,12 @@ configuration.ts
encoder.ts
git_push.sh
index.ts
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
ng-package.json
package.json

View File

@ -5,10 +5,10 @@ api/petApi.ts
api/storeApi.ts
api/userApi.ts
git_push.sh
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts

View File

@ -5,12 +5,12 @@ api/petApi.ts
api/storeApi.ts
api/userApi.ts
git_push.sh
model/./apiResponse.ts
model/./category.ts
model/./order.ts
model/./pet.ts
model/./tag.ts
model/./user.ts
model/apiResponse.ts
model/category.ts
model/order.ts
model/pet.ts
model/tag.ts
model/user.ts
model/models.ts
package.json
tsconfig.json

View File

@ -1,26 +1,26 @@
./Api/ApiServer.php
./Api/PetApiInterface.php
./Api/StoreApiInterface.php
./Api/UserApiInterface.php
./Controller/Controller.php
./Controller/PetController.php
./Controller/StoreController.php
./Controller/UserController.php
./Model/ApiResponse.php
./Model/Category.php
./Model/Order.php
./Model/Pet.php
./Model/Tag.php
./Model/User.php
./Service/JmsSerializer.php
./Service/SerializerInterface.php
./Service/StrictJsonDeserializationVisitor.php
./Service/SymfonyValidator.php
./Service/TypeMismatchException.php
./Service/ValidatorInterface.php
./Tests/AppKernel.php
./Tests/Controller/ControllerTest.php
./Tests/test_config.yml
Api/ApiServer.php
Api/PetApiInterface.php
Api/StoreApiInterface.php
Api/UserApiInterface.php
Controller/Controller.php
Controller/PetController.php
Controller/StoreController.php
Controller/UserController.php
Model/ApiResponse.php
Model/Category.php
Model/Order.php
Model/Pet.php
Model/Tag.php
Model/User.php
Service/JmsSerializer.php
Service/SerializerInterface.php
Service/StrictJsonDeserializationVisitor.php
Service/SymfonyValidator.php
Service/TypeMismatchException.php
Service/ValidatorInterface.php
Tests/AppKernel.php
Tests/Controller/ControllerTest.php
Tests/test_config.yml
.coveralls.yml
.gitignore
.php_cs.dist